This commit is contained in:
2026-03-18 10:06:42 +08:00
parent 5ab2cb8f90
commit e4cfd15cb4
25 changed files with 2948 additions and 891 deletions

View File

@ -25,10 +25,6 @@ public class EmsDailyChargeData extends BaseEntity
@Excel(name = "站点id")
private String siteId;
/** 设备唯一标识符 */
@Excel(name = "设备唯一标识符")
private String deviceId;
/** 数据日期:yyyy-MM-dd */
@JsonFormat(pattern = "yyyy-MM-dd")
@Excel(name = "数据日期:yyyy-MM-dd", width = 30, dateFormat = "yyyy-MM-dd")
@ -50,6 +46,14 @@ public class EmsDailyChargeData extends BaseEntity
@Excel(name = "当日放电量")
private BigDecimal dischargeData;
/** 总收入 */
@Excel(name = "总收入")
private BigDecimal totalRevenue;
/** 当日实时收入 */
@Excel(name = "当日实时收入")
private BigDecimal dayRevenue;
public void setId(Long id)
{
this.id = id;
@ -70,16 +74,6 @@ public class EmsDailyChargeData extends BaseEntity
return siteId;
}
public void setDeviceId(String deviceId)
{
this.deviceId = deviceId;
}
public String getDeviceId()
{
return deviceId;
}
public void setDateTime(Date dateTime)
{
this.dateTime = dateTime;
@ -130,17 +124,38 @@ public class EmsDailyChargeData extends BaseEntity
return dischargeData;
}
public void setTotalRevenue(BigDecimal totalRevenue)
{
this.totalRevenue = totalRevenue;
}
public BigDecimal getTotalRevenue()
{
return totalRevenue;
}
public void setDayRevenue(BigDecimal dayRevenue)
{
this.dayRevenue = dayRevenue;
}
public BigDecimal getDayRevenue()
{
return dayRevenue;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("id", getId())
.append("siteId", getSiteId())
.append("deviceId", getDeviceId())
.append("dateTime", getDateTime())
.append("totalChargeData", getTotalChargeData())
.append("totalDischargeData", getTotalDischargeData())
.append("chargeData", getChargeData())
.append("dischargeData", getDischargeData())
.append("totalRevenue", getTotalRevenue())
.append("dayRevenue", getDayRevenue())
.append("createBy", getCreateBy())
.append("createTime", getCreateTime())
.append("updateBy", getUpdateBy())

View File

@ -30,13 +30,9 @@ public class EmsDailyEnergyData extends BaseEntity
@Excel(name = "数据日期:yyyy-MM-dd", width = 30, dateFormat = "yyyy-MM-dd")
private Date dataDate;
/** 总收入 */
@Excel(name = "总收入")
private BigDecimal totalRevenue;
/** 当日实时收入 */
@Excel(name = "当日实时收入")
private BigDecimal dayRevenue;
/** 数据小时(0-23) */
@Excel(name = "数据小时(0-23)")
private Integer dataHour;
/** 尖峰时段充电差值 */
@Excel(name = "尖峰时段充电差值")
@ -71,6 +67,7 @@ public class EmsDailyEnergyData extends BaseEntity
private BigDecimal valleyDischargeDiff;
/** 差值计算时间如2025-10-10 23:59:00 */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "差值计算时间", readConverterExp = "如=2025-10-10,2=3:59:00")
private Date calcTime;
@ -104,24 +101,14 @@ public class EmsDailyEnergyData extends BaseEntity
return dataDate;
}
public void setTotalRevenue(BigDecimal totalRevenue)
public void setDataHour(Integer dataHour)
{
this.totalRevenue = totalRevenue;
this.dataHour = dataHour;
}
public BigDecimal getTotalRevenue()
public Integer getDataHour()
{
return totalRevenue;
}
public void setDayRevenue(BigDecimal dayRevenue)
{
this.dayRevenue = dayRevenue;
}
public BigDecimal getDayRevenue()
{
return dayRevenue;
return dataHour;
}
public void setPeakChargeDiff(BigDecimal peakChargeDiff)
@ -220,8 +207,7 @@ public class EmsDailyEnergyData extends BaseEntity
.append("id", getId())
.append("siteId", getSiteId())
.append("dataDate", getDataDate())
.append("totalRevenue", getTotalRevenue())
.append("dayRevenue", getDayRevenue())
.append("dataHour", getDataHour())
.append("peakChargeDiff", getPeakChargeDiff())
.append("peakDischargeDiff", getPeakDischargeDiff())
.append("highChargeDiff", getHighChargeDiff())

View File

@ -2,6 +2,7 @@ package com.xzzn.ems.domain.vo;
public class PointConfigLatestValueItemVo {
private String siteId;
private String pointId;
private String deviceId;
private String dataKey;
@ -13,6 +14,14 @@ public class PointConfigLatestValueItemVo {
this.siteId = siteId;
}
public String getPointId() {
return pointId;
}
public void setPointId(String pointId) {
this.pointId = pointId;
}
public String getDeviceId() {
return deviceId;
}

View File

@ -4,6 +4,7 @@ import java.util.Date;
public class PointConfigLatestValueVo {
private String siteId;
private String pointId;
private String deviceId;
private String dataKey;
private Object pointValue;
@ -17,6 +18,14 @@ public class PointConfigLatestValueVo {
this.siteId = siteId;
}
public String getPointId() {
return pointId;
}
public void setPointId(String pointId) {
this.pointId = pointId;
}
public String getDeviceId() {
return deviceId;
}

View File

@ -69,6 +69,17 @@ public interface EmsDailyChargeDataMapper
// 插入或更新站点每日充放电数据
public void insertOrUpdateData(EmsDailyChargeData emsDailyChargeData);
// 按站点+日期(天)查询当日已存在记录
public EmsDailyChargeData selectBySiteIdAndDateTime(@Param("siteId") String siteId,
@Param("dateTime") Date dateTime);
// 按站点+日期(天)更新收入字段
public int updateRevenueBySiteAndDate(@Param("siteId") String siteId,
@Param("dateTime") Date dateTime,
@Param("totalRevenue") BigDecimal totalRevenue,
@Param("dayRevenue") BigDecimal dayRevenue,
@Param("updateBy") String updateBy);
// 获取所有站点总充总放
public Map<String, BigDecimal> getAllSiteChargeData(@Param("nowData")String nowData, @Param("siteId")String siteId);

View File

@ -68,6 +68,12 @@ public interface EmsDailyEnergyDataMapper
// 获取站点某日电表数据
public EmsDailyEnergyData getDataByDate(@Param("siteId")String siteId,@Param("today") String today);
// 按站点+日期+小时查询当小时已存在记录
public EmsDailyEnergyData selectBySiteIdAndDateHour(@Param("siteId") String siteId,
@Param("dataDate") java.util.Date dataDate,
@Param("dataHour") Integer dataHour);
// 插入或更新每日尖峰平谷差值
public void insertOrUpdateData(EmsDailyEnergyData energyData);
// 电表报表

View File

@ -17,6 +17,8 @@ public interface EmsPointConfigMapper {
int updateEmsPointConfig(EmsPointConfig emsPointConfig);
int updateEmsPointConfigForImport(EmsPointConfig emsPointConfig);
int deleteEmsPointConfigById(Long id);
int deleteEmsPointConfigByIds(Long[] ids);

View File

@ -9,6 +9,8 @@ import java.util.List;
* 单站监控字段点位映射 Mapper
*/
public interface EmsSiteMonitorPointMatchMapper {
List<String> selectDistinctSiteIds();
List<EmsSiteMonitorPointMatch> selectBySiteId(@Param("siteId") String siteId);
int deleteBySiteId(@Param("siteId") String siteId);

View File

@ -4,6 +4,7 @@ import com.xzzn.ems.domain.EmsPointConfig;
import com.xzzn.ems.domain.vo.ImportPointTemplateRequest;
import com.xzzn.ems.domain.vo.PointConfigCurveRequest;
import com.xzzn.ems.domain.vo.PointConfigCurveValueVo;
import com.xzzn.ems.domain.vo.PointConfigGenerateRecentRequest;
import com.xzzn.ems.domain.vo.PointConfigLatestValueRequest;
import com.xzzn.ems.domain.vo.PointConfigLatestValueVo;
import org.springframework.web.multipart.MultipartFile;
@ -30,4 +31,6 @@ public interface IEmsPointConfigService {
List<PointConfigLatestValueVo> getLatestValues(PointConfigLatestValueRequest request);
List<PointConfigCurveValueVo> getCurveData(PointConfigCurveRequest request);
String generateRecent7DaysData(PointConfigGenerateRecentRequest request);
}

View File

@ -13,6 +13,8 @@ public interface ISingleSiteService
public SiteMonitorHomeVo getSiteMonitorDataVo(String siteId);
public SiteMonitorHomeVo getSiteMonitorTotalDataVo(String siteId);
public SiteMonitorRunningHeadInfoVo getSiteRunningHeadInfo(String siteId);

View File

@ -204,24 +204,7 @@ public class InfluxPointDataWriter {
try {
String queryUrl = buildQueryUrl(influxQl);
List<PointValue> values = parseInfluxQlResponse(executeRequestWithResponse(methodOrDefault(readMethod, "GET"), queryUrl));
if (!values.isEmpty()) {
return values;
}
// 兼容 pointId 大小写差异
String regexQuery = String.format(
"SELECT \"value\" FROM \"%s\" WHERE \"site_id\" = '%s' AND \"point_key\" =~ /(?i)^%s$/ " +
"AND time >= %dms AND time <= %dms ORDER BY time ASC",
measurement,
escapeTagValue(normalizedSiteId),
escapeRegex(normalizedPointKey),
startTime.getTime(),
endTime.getTime()
);
return parseInfluxQlResponse(
executeRequestWithResponse(methodOrDefault(readMethod, "GET"), buildQueryUrl(regexQuery))
);
return parseInfluxQlResponse(executeRequestWithResponse(methodOrDefault(readMethod, "GET"), queryUrl));
} catch (Exception e) {
log.warn("按 pointKey 查询 InfluxDB 曲线失败: {}", e.getMessage());
return Collections.emptyList();

View File

@ -19,6 +19,7 @@ import com.xzzn.common.enums.WorkStatus;
import com.xzzn.common.exception.ServiceException;
import com.xzzn.common.utils.DateUtils;
import com.xzzn.common.utils.StringUtils;
import com.xzzn.ems.domain.EmsDailyChargeData;
import com.xzzn.ems.domain.EmsDevicesSetting;
import com.xzzn.ems.domain.EmsPointEnumMatch;
import com.xzzn.ems.domain.EmsPointConfig;
@ -32,11 +33,14 @@ import com.xzzn.ems.domain.vo.PointDataRequest;
import com.xzzn.ems.domain.vo.PointQueryResponse;
import com.xzzn.ems.domain.vo.SiteMonitorDataSaveItemVo;
import com.xzzn.ems.domain.vo.SiteMonitorDataSaveRequest;
import com.xzzn.ems.domain.vo.SiteMonitorDataVo;
import com.xzzn.ems.domain.vo.SiteMonitorProjectDisplayVo;
import com.xzzn.ems.domain.vo.SiteMonitorProjectPointMappingSaveRequest;
import com.xzzn.ems.domain.vo.SiteMonitorProjectPointMappingVo;
import com.xzzn.ems.domain.vo.WorkStatusEnumMappingVo;
import com.xzzn.ems.mapper.EmsBatteryDataMinutesMapper;
import com.xzzn.ems.mapper.EmsDailyChargeDataMapper;
import com.xzzn.ems.mapper.EmsDailyEnergyDataMapper;
import com.xzzn.ems.mapper.EmsDevicesSettingMapper;
import com.xzzn.ems.mapper.EmsPcsSettingMapper;
import com.xzzn.ems.mapper.EmsPointConfigMapper;
@ -52,6 +56,7 @@ import com.xzzn.system.domain.SysOperLog;
import com.xzzn.system.service.ISysOperLogService;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
@ -123,6 +128,12 @@ public class EmsDeviceSettingServiceImpl implements IEmsDeviceSettingService
private static final long PROJECT_DISPLAY_CACHE_TTL_MS = 15_000L;
private static final int MONITOR_POINT_MATCH_REDIS_TTL_SECONDS = 300;
private static final int DISPLAY_DEBUG_SAMPLE_SIZE = 20;
private static final Set<String> HOME_CHARGE_FIELD_SET = new HashSet<>(Arrays.asList(
"dayChargedCap", "dayDisChargedCap", "yesterdayChargedCap", "yesterdayDisChargedCap", "totalChargedCap", "totalDischargedCap"
));
private static final Set<String> HOME_REVENUE_FIELD_SET = new HashSet<>(Arrays.asList(
"totalRevenue", "dayRevenue", "yesterdayRevenue"
));
@Autowired
private EmsDevicesSettingMapper emsDevicesMapper;
@Autowired
@ -138,6 +149,10 @@ public class EmsDeviceSettingServiceImpl implements IEmsDeviceSettingService
@Autowired
private EmsBatteryDataMinutesMapper emsBatteryDataMinutesMapper;
@Autowired
private EmsDailyChargeDataMapper emsDailyChargeDataMapper;
@Autowired
private EmsDailyEnergyDataMapper emsDailyEnergyDataMapper;
@Autowired
private EmsBatteryClusterServiceImpl emsBatteryClusterServiceImpl;
@Autowired
private ModbusProcessor modbusProcessor;
@ -695,7 +710,6 @@ public class EmsDeviceSettingServiceImpl implements IEmsDeviceSettingService
.filter(fieldCodeSet::contains)
.forEach(deletedFieldCodeSet::add);
}
validatePcsCurvePointMappings(siteId, request.getMappings(), deletedFieldCodeSet);
int deletedRows = emsSiteMonitorPointMatchMapper.deleteBySiteId(siteId);
List<EmsSiteMonitorPointMatch> saveList = new ArrayList<>();
@ -936,45 +950,6 @@ public class EmsDeviceSettingServiceImpl implements IEmsDeviceSettingService
return StringUtils.defaultString(deviceCategory) + "-" + StringUtils.defaultString(matchField);
}
private void validatePcsCurvePointMappings(String siteId, List<SiteMonitorProjectPointMappingVo> mappings, Set<String> deletedFieldCodeSet) {
List<Map<String, Object>> pcsDevices = emsDevicesMapper.getDeviceInfosBySiteIdAndCategory(siteId, DeviceCategory.PCS.getCode());
Set<String> pcsDeviceIdSet = new HashSet<>();
if (pcsDevices != null) {
pcsDevices.stream()
.filter(Objects::nonNull)
.map(item -> item.get("id"))
.filter(Objects::nonNull)
.map(String::valueOf)
.map(String::trim)
.filter(StringUtils::isNotBlank)
.forEach(pcsDeviceIdSet::add);
}
validateSingleCurveFieldMapping(FIELD_CURVE_PCS_ACTIVE_POWER, "PCS有功功率曲线点位", pcsDeviceIdSet, mappings, deletedFieldCodeSet);
validateSingleCurveFieldMapping(FIELD_CURVE_PCS_REACTIVE_POWER, "PCS无功功率曲线点位", pcsDeviceIdSet, mappings, deletedFieldCodeSet);
}
private void validateSingleCurveFieldMapping(String fieldCode, String fieldName, Set<String> pcsDeviceIdSet,
List<SiteMonitorProjectPointMappingVo> mappings, Set<String> deletedFieldCodeSet) {
if (deletedFieldCodeSet != null && deletedFieldCodeSet.contains(fieldCode) && !pcsDeviceIdSet.isEmpty()) {
throw new ServiceException(fieldName + "不能删除且配置数量必须与PCS设备数量一致");
}
Set<String> configuredDeviceIdSet = new HashSet<>();
if (mappings != null) {
mappings.stream()
.filter(Objects::nonNull)
.filter(item -> fieldCode.equals(StringUtils.trim(item.getFieldCode())))
.filter(item -> StringUtils.isNotBlank(item.getDataPoint()))
.map(SiteMonitorProjectPointMappingVo::getDeviceId)
.map(StringUtils::trim)
.filter(StringUtils::isNotBlank)
.forEach(configuredDeviceIdSet::add);
}
if (configuredDeviceIdSet.size() != pcsDeviceIdSet.size() || !configuredDeviceIdSet.equals(pcsDeviceIdSet)) {
throw new ServiceException(String.format("%s数量需与PCS设备数量一致PCS设备%d个已配置%d个", fieldName, pcsDeviceIdSet.size(), configuredDeviceIdSet.size()));
}
}
private SiteMonitorProjectPointMappingVo buildMappingVo(EmsSiteMonitorItem item, EmsSiteMonitorPointMatch pointMatch,
String deviceId, String deviceName) {
SiteMonitorProjectPointMappingVo vo = new SiteMonitorProjectPointMappingVo();
@ -1117,6 +1092,7 @@ public class EmsDeviceSettingServiceImpl implements IEmsDeviceSettingService
Map<String, Object> tjbbLatestMap = safeRedisMap(redisCache.getCacheMap(buildSiteMonitorLatestRedisKey(normalizedSiteId, MODULE_TJBB)));
Map<String, Map<String, String>> enumDataCodeMapByScope = buildEnumDataCodeMapByScope(normalizedSiteId);
Map<String, PointLatestSnapshot> pointSnapshotCache = new HashMap<>();
HomeRunningSnapshot homeRunningSnapshot = buildHomeRunningSnapshot(normalizedSiteId);
List<SiteMonitorProjectDisplayVo> result = new ArrayList<>();
int totalCount = 0;
@ -1138,6 +1114,18 @@ public class EmsDeviceSettingServiceImpl implements IEmsDeviceSettingService
result.add(vo);
continue;
}
if (MODULE_HOME.equals(mapping.getModuleCode()) && homeRunningSnapshot != null) {
String homeFieldKey = resolveHomeFieldKey(mapping.getFieldCode());
if (StringUtils.isNotBlank(homeFieldKey)) {
String homeFieldValue = homeRunningSnapshot.getValue(homeFieldKey);
if (homeFieldValue != null) {
vo.setFieldValue(homeFieldValue);
vo.setValueTime(homeRunningSnapshot.getValueTime());
result.add(vo);
continue;
}
}
}
// 与“点位配置列表最新值”一致:按 pointId -> 点位配置(dataKey/deviceId) -> MQTT 最新报文读取
PointLatestSnapshot latestSnapshot = null;
String dataPoint = StringUtils.trim(mapping.getDataPoint());
@ -1207,6 +1195,91 @@ public class EmsDeviceSettingServiceImpl implements IEmsDeviceSettingService
return result;
}
private HomeRunningSnapshot buildHomeRunningSnapshot(String siteId) {
if (StringUtils.isBlank(siteId)) {
return null;
}
HomeRunningSnapshot snapshot = new HomeRunningSnapshot();
String today = DateUtils.getDate();
Map<String, BigDecimal> totalChargeData = emsDailyChargeDataMapper.getAllSiteChargeData(today, siteId);
if (totalChargeData != null) {
snapshot.put("totalChargedCap", totalChargeData.get("totalChargedCap"));
snapshot.put("totalDischargedCap", totalChargeData.get("totalDischargedCap"));
}
LocalDate now = LocalDate.now();
LocalDate yesterday = now.minusDays(1);
List<SiteMonitorDataVo> chargeList = emsDailyChargeDataMapper.getSingleSiteChargeData(
siteId,
DateUtils.toDate(yesterday),
DateUtils.toDate(now)
);
if (!CollectionUtils.isEmpty(chargeList)) {
for (SiteMonitorDataVo item : chargeList) {
if (item == null || StringUtils.isBlank(item.getAmmeterDate())) {
continue;
}
if (today.equals(item.getAmmeterDate())) {
snapshot.put("dayChargedCap", item.getChargedCap());
snapshot.put("dayDisChargedCap", item.getDisChargedCap());
} else if (DateUtils.getYesterdayDayString().equals(item.getAmmeterDate())) {
snapshot.put("yesterdayChargedCap", item.getChargedCap());
snapshot.put("yesterdayDisChargedCap", item.getDisChargedCap());
}
}
}
EmsDailyChargeData todayChargeData = emsDailyChargeDataMapper.selectBySiteIdAndDateTime(siteId, DateUtils.toDate(now));
EmsDailyChargeData yesterdayChargeData = emsDailyChargeDataMapper.selectBySiteIdAndDateTime(siteId, DateUtils.toDate(yesterday));
if (todayChargeData != null) {
snapshot.put("totalRevenue", todayChargeData.getTotalRevenue());
snapshot.put("dayRevenue", todayChargeData.getDayRevenue());
} else {
Map<String, BigDecimal> latestRevenueData = emsDailyEnergyDataMapper.getRealTimeRevenue(siteId);
if (latestRevenueData != null) {
snapshot.put("totalRevenue", latestRevenueData.get("totalRevenue"));
snapshot.put("dayRevenue", latestRevenueData.get("dayRevenue"));
}
}
if (yesterdayChargeData != null) {
snapshot.put("yesterdayRevenue", yesterdayChargeData.getDayRevenue());
}
return snapshot;
}
private String resolveHomeFieldKey(String fieldCode) {
String normalizedFieldCode = StringUtils.trim(fieldCode);
if (StringUtils.isBlank(normalizedFieldCode)) {
return null;
}
int splitIndex = normalizedFieldCode.lastIndexOf("__");
String fieldKey = splitIndex >= 0 ? normalizedFieldCode.substring(splitIndex + 2) : normalizedFieldCode;
if (HOME_CHARGE_FIELD_SET.contains(fieldKey) || HOME_REVENUE_FIELD_SET.contains(fieldKey)) {
return fieldKey;
}
return null;
}
private static class HomeRunningSnapshot {
private final Map<String, String> valueMap = new HashMap<>();
private final Date valueTime = new Date();
public void put(String key, BigDecimal value) {
if (StringUtils.isBlank(key) || value == null) {
return;
}
valueMap.put(key, value.stripTrailingZeros().toPlainString());
}
public String getValue(String key) {
return valueMap.get(key);
}
public Date getValueTime() {
return valueTime;
}
}
private Map<String, Map<String, String>> buildEnumDataCodeMapByScope(String siteId) {
Map<String, Map<String, String>> result = new HashMap<>();
if (StringUtils.isBlank(siteId)) {

View File

@ -4,11 +4,13 @@ import com.xzzn.common.constant.RedisKeyConstants;
import com.xzzn.common.core.redis.RedisCache;
import com.xzzn.common.utils.DateUtils;
import com.xzzn.common.utils.StringUtils;
import com.xzzn.ems.domain.EmsDailyChargeData;
import com.xzzn.ems.domain.EmsDailyEnergyData;
import com.xzzn.ems.domain.EmsEnergyPriceConfig;
import com.xzzn.ems.domain.EmsPriceTimeConfig;
import com.xzzn.ems.domain.vo.EnergyPriceTimeRange;
import com.xzzn.ems.domain.vo.EnergyPriceVo;
import com.xzzn.ems.mapper.EmsDailyChargeDataMapper;
import com.xzzn.ems.mapper.EmsDailyEnergyDataMapper;
import com.xzzn.ems.mapper.EmsEnergyPriceConfigMapper;
import com.xzzn.ems.mapper.EmsPriceTimeConfigMapper;
@ -17,6 +19,7 @@ import com.xzzn.ems.service.IEmsEnergyPriceConfigService;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate;
import java.util.Date;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
@ -45,6 +48,8 @@ public class EmsEnergyPriceConfigServiceImpl implements IEmsEnergyPriceConfigSer
@Autowired
private RedisCache redisCache;
@Autowired
private EmsDailyChargeDataMapper emsDailyChargeDataMapper;
@Autowired
private EmsDailyEnergyDataMapper emsDailyEnergyDataMapper;
/**
@ -280,22 +285,21 @@ public class EmsEnergyPriceConfigServiceImpl implements IEmsEnergyPriceConfigSer
BigDecimal dayRevenue = BigDecimal.ZERO;
BigDecimal yesterdayRevenue = BigDecimal.ZERO;
// 获取昨日数据
String yesterday = DateUtils.getYesterdayDayString();
EmsDailyEnergyData yesterdayData = emsDailyEnergyDataMapper.getDataByDate(siteId, yesterday);
Date yesterday = DateUtils.toDate(LocalDate.now().minusDays(1));
EmsDailyChargeData yesterdayData = emsDailyChargeDataMapper.selectBySiteIdAndDateTime(siteId, yesterday);
if (yesterdayData != null) {
yesterdayRevenue = yesterdayData.getDayRevenue() == null ? BigDecimal.ZERO : yesterdayData.getDayRevenue();
}
// 当日实时数据
String today = DateUtils.getDate();
Map<String, BigDecimal> lastData = emsDailyEnergyDataMapper.getRealTimeRevenue(siteId);
if (lastData != null) {
totalRevenue = lastData.get("totalRevenue") == null ? BigDecimal.ZERO : lastData.get("totalRevenue");
}
EmsDailyEnergyData todayData = emsDailyEnergyDataMapper.getDataByDate(siteId,today);
if (todayData == null) {
Map<String, BigDecimal> lastData = emsDailyEnergyDataMapper.getRealTimeRevenue(siteId);
if (lastData != null) {
totalRevenue = lastData.get("totalRevenue") == null ? BigDecimal.ZERO : lastData.get("totalRevenue");
}
} else {
totalRevenue = todayData.getTotalRevenue() == null ? BigDecimal.ZERO : todayData.getTotalRevenue();
if (todayData != null) {
// 获取当月电价
int currentMonth = LocalDate.now().getMonthValue();
int currentYear = LocalDate.now().getYear();

View File

@ -16,7 +16,7 @@ import java.util.stream.Collectors;
@Service
public class EmsPointCalcConfigServiceImpl implements IEmsPointCalcConfigService {
private static final Pattern CALC_EXPRESSION_PATTERN = Pattern.compile("^[0-9A-Za-z_+\\-*/().\\s]+$");
private static final Pattern CALC_EXPRESSION_PATTERN = Pattern.compile("^[0-9A-Za-z_+\\-*/().,?:<>=!&|\\s]+$");
private static final String CALC_POINT_TYPE = "calc";
@Autowired
@ -91,7 +91,7 @@ public class EmsPointCalcConfigServiceImpl implements IEmsPointCalcConfigService
throw new ServiceException("计算表达式不能为空");
}
if (!CALC_EXPRESSION_PATTERN.matcher(expression).matches()) {
throw new ServiceException("计算表达式仅支持数字、字母、下划线、空格和四则运算符");
throw new ServiceException("计算表达式仅支持数字、字母、下划线、空格、运算符和函数语法");
}
}

View File

@ -401,13 +401,8 @@ public class EmsStatsReportServiceImpl implements IEmsStatsReportService
ammeterRevenue.setActiveTotalPrice(activePeakPrice.add(activeHighPrice).add(activeFlatPrice).add(activeValleyPrice));
ammeterRevenue.setReActiveTotalPrice(reActivePeakPrice.add(reActiveHighPrice).add(reActiveFlatPrice).add(reActiveValleyPrice));
// 实际收益=放电价格(尖峰平谷)-充电价格(尖峰平谷)
ammeterRevenue.setActualRevenue(
reActivePeakPrice.subtract(activePeakPrice)
.add(reActiveHighPrice.subtract(activeHighPrice))
.add(reActiveFlatPrice.subtract(activeFlatPrice))
.add(reActiveValleyPrice.subtract(activeValleyPrice))
);
// 实际收益按“放电总价-充电总价”口径计算
ammeterRevenue.setActualRevenue(ammeterRevenue.getReActiveTotalPrice().subtract(ammeterRevenue.getActiveTotalPrice()));
});
int weatherMissingCount = 0;

View File

@ -12,6 +12,7 @@ import com.xzzn.ems.domain.EmsBatteryData;
import com.xzzn.ems.domain.EmsBatteryStack;
import com.xzzn.ems.domain.EmsCoolingData;
import com.xzzn.ems.domain.EmsDhData;
import com.xzzn.ems.domain.EmsDailyChargeData;
import com.xzzn.ems.domain.EmsDevicesSetting;
import com.xzzn.ems.domain.EmsEmsData;
import com.xzzn.ems.domain.EmsPcsBranchData;
@ -215,6 +216,60 @@ public class SingleSiteServiceImpl implements ISingleSiteService {
return siteMonitorHomeVo;
}
@Override
public SiteMonitorHomeVo getSiteMonitorTotalDataVo(String siteId) {
SiteMonitorHomeVo siteMonitorHomeVo = new SiteMonitorHomeVo();
if (StringUtils.isEmpty(siteId)) {
return siteMonitorHomeVo;
}
String nowDate = DateUtils.getDate();
Map<String, BigDecimal> chargeDataMap = emsDailyChargeDataMapper.getAllSiteChargeData(nowDate, siteId);
BigDecimal totalChargedCap = BigDecimal.ZERO;
BigDecimal totalDischargedCap = BigDecimal.ZERO;
if (chargeDataMap != null) {
totalChargedCap = chargeDataMap.get("totalChargedCap") == null ? BigDecimal.ZERO : chargeDataMap.get("totalChargedCap");
totalDischargedCap = chargeDataMap.get("totalDischargedCap") == null ? BigDecimal.ZERO : chargeDataMap.get("totalDischargedCap");
}
siteMonitorHomeVo.setTotalChargedCap(totalChargedCap);
siteMonitorHomeVo.setTotalDischargedCap(totalDischargedCap);
Map<String, BigDecimal> revenueMap = emsDailyEnergyDataMapper.getRealTimeRevenue(siteId);
siteMonitorHomeVo.setTotalRevenue(revenueMap == null || revenueMap.get("totalRevenue") == null ? BigDecimal.ZERO : revenueMap.get("totalRevenue"));
siteMonitorHomeVo.setDayRevenue(revenueMap == null || revenueMap.get("dayRevenue") == null ? BigDecimal.ZERO : revenueMap.get("dayRevenue"));
Date yesterdayDate = DateUtils.toDate(LocalDate.now().minusDays(1));
EmsDailyChargeData yesterdayChargeData = emsDailyChargeDataMapper.selectBySiteIdAndDateTime(siteId, yesterdayDate);
siteMonitorHomeVo.setYesterdayRevenue(yesterdayChargeData == null || yesterdayChargeData.getDayRevenue() == null
? BigDecimal.ZERO
: yesterdayChargeData.getDayRevenue());
List<SiteMonitorHomeAlarmVo> alarmList = emsAlarmRecordsMapper.getAlarmRecordsBySiteId(siteId);
siteMonitorHomeVo.setSiteMonitorHomeAlarmVo(alarmList);
LocalDate sevenDaysAgo = LocalDate.now().minusDays(6);
Date startDate = DateUtils.toDate(sevenDaysAgo);
Date endDate = new Date();
List<SiteMonitorDataVo> siteMonitorDataVoList = emsDailyChargeDataMapper.getSingleSiteChargeData(siteId, startDate, endDate);
if (!CollectionUtils.isEmpty(siteMonitorDataVoList)) {
for (SiteMonitorDataVo sitePcsData : siteMonitorDataVoList) {
String pcsDate = sitePcsData.getAmmeterDate();
if (DateUtils.checkIsToday(pcsDate)) {
siteMonitorHomeVo.setDayChargedCap(sitePcsData.getChargedCap());
siteMonitorHomeVo.setDayDisChargedCap(sitePcsData.getDisChargedCap());
}
if (DateUtils.getYesterdayDayString().equals(pcsDate)) {
siteMonitorHomeVo.setYesterdayChargedCap(sitePcsData.getChargedCap());
siteMonitorHomeVo.setYesterdayDisChargedCap(sitePcsData.getDisChargedCap());
}
}
}
siteMonitorHomeVo.setEnergyStorageAvailElec(totalDischargedCap.subtract(totalChargedCap));
siteMonitorHomeVo.setSiteMonitorDataVo(siteMonitorDataVoList);
return siteMonitorHomeVo;
}
// 获取单站监控实时运行头部数据
@Override
public SiteMonitorRunningHeadInfoVo getSiteRunningHeadInfo(String siteId) {