From b7aaf85a3ffaf146253fdaa2ed4b25a9468a362c Mon Sep 17 00:00:00 2001 From: zq Date: Mon, 8 Dec 2025 18:48:05 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B9=B3=E5=8F=B0=E4=BF=AE=E6=94=B9=E6=84=8F?= =?UTF-8?q?=E8=A7=8120251120-=E7=82=B9=E4=BD=8D=E4=B8=8A=E4=BC=A0=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E6=95=B0=E6=8D=AE=E6=9E=9A=E4=B8=BE=E6=98=A0=E5=B0=84?= =?UTF-8?q?=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/constant/RedisKeyConstants.java | 5 + .../xzzn/ems/domain/EmsPointEnumMatch.java | 147 ++++++++++++++++++ .../domain/vo/DevicePointMatchExportVo.java | 24 +++ .../ems/domain/vo/DevicePointMatchVo.java | 24 +++ .../ems/mapper/EmsPointEnumMatchMapper.java | 70 +++++++++ .../impl/DeviceDataProcessServiceImpl.java | 68 +++++--- .../impl/EmsPointMatchServiceImpl.java | 93 +++++++++-- .../utils/DevicePointMatchDataProcessor.java | 35 +++++ .../mapper/ems/EmsPointEnumMatchMapper.xml | 122 +++++++++++++++ 9 files changed, 555 insertions(+), 33 deletions(-) create mode 100644 ems-system/src/main/java/com/xzzn/ems/domain/EmsPointEnumMatch.java create mode 100644 ems-system/src/main/java/com/xzzn/ems/mapper/EmsPointEnumMatchMapper.java create mode 100644 ems-system/src/main/resources/mapper/ems/EmsPointEnumMatchMapper.xml diff --git a/ems-common/src/main/java/com/xzzn/common/constant/RedisKeyConstants.java b/ems-common/src/main/java/com/xzzn/common/constant/RedisKeyConstants.java index 78b682a..6163a90 100644 --- a/ems-common/src/main/java/com/xzzn/common/constant/RedisKeyConstants.java +++ b/ems-common/src/main/java/com/xzzn/common/constant/RedisKeyConstants.java @@ -67,6 +67,11 @@ public class RedisKeyConstants */ public static final String POINT_MATCH = "POINT_MATCH_"; + /** + * 点位枚举匹配数据 redis key + */ + public static final String POINT_ENUM_MATCH = "POINT_ENUM_MATCH_"; + /** * topic对应站点ID redis key */ diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/EmsPointEnumMatch.java b/ems-system/src/main/java/com/xzzn/ems/domain/EmsPointEnumMatch.java new file mode 100644 index 0000000..6c55f0b --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/EmsPointEnumMatch.java @@ -0,0 +1,147 @@ +package com.xzzn.ems.domain; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.xzzn.common.annotation.Excel; +import com.xzzn.common.core.domain.BaseEntity; + +/** + * 点位枚举匹配对象 ems_point_enum_match + * + * @author xzzn + * @date 2025-12-08 + */ +public class EmsPointEnumMatch extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 主键自增长 */ + private Long id; + + /** 点位匹配字段 */ + @Excel(name = "点位匹配字段") + private String matchField; + + /** 站点id */ + @Excel(name = "站点id") + private String siteId; + + /** 设备类别,例如“STACK/CLUSTER/PCS等” */ + @Excel(name = "设备类别,例如“STACK/CLUSTER/PCS等”") + private String deviceCategory; + + /** 系统枚举代码 */ + @Excel(name = "系统枚举代码") + private String enumCode; + + /** 系统枚举名称 */ + @Excel(name = "系统枚举名称") + private String enumName; + + /** 系统枚举描述 */ + @Excel(name = "系统枚举描述") + private String enumDesc; + + /** 数据枚举代码 */ + @Excel(name = "数据枚举代码") + private String dataEnumCode; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + + public void setMatchField(String matchField) + { + this.matchField = matchField; + } + + public String getMatchField() + { + return matchField; + } + + public void setSiteId(String siteId) + { + this.siteId = siteId; + } + + public String getSiteId() + { + return siteId; + } + + public void setDeviceCategory(String deviceCategory) + { + this.deviceCategory = deviceCategory; + } + + public String getDeviceCategory() + { + return deviceCategory; + } + + public void setEnumCode(String enumCode) + { + this.enumCode = enumCode; + } + + public String getEnumCode() + { + return enumCode; + } + + public void setEnumName(String enumName) + { + this.enumName = enumName; + } + + public String getEnumName() + { + return enumName; + } + + public void setEnumDesc(String enumDesc) + { + this.enumDesc = enumDesc; + } + + public String getEnumDesc() + { + return enumDesc; + } + + public void setDataEnumCode(String dataEnumCode) + { + this.dataEnumCode = dataEnumCode; + } + + public String getDataEnumCode() + { + return dataEnumCode; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("matchField", getMatchField()) + .append("siteId", getSiteId()) + .append("deviceCategory", getDeviceCategory()) + .append("enumCode", getEnumCode()) + .append("enumName", getEnumName()) + .append("enumDesc", getEnumDesc()) + .append("dataEnumCode", getDataEnumCode()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/DevicePointMatchExportVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/DevicePointMatchExportVo.java index cdaff1a..6dec12c 100644 --- a/ems-system/src/main/java/com/xzzn/ems/domain/vo/DevicePointMatchExportVo.java +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/DevicePointMatchExportVo.java @@ -18,6 +18,10 @@ public class DevicePointMatchExportVo implements Serializable { @Excel(name = "点位匹配字段名称") private String pointName; + /** 数据枚举映射-导出枚举名称 */ + @Excel(name = "数据枚举映射") + private String matchFieldEnum; + /** 数据点位 */ @Excel(name = "数据点位") private String dataPoint; @@ -30,6 +34,10 @@ public class DevicePointMatchExportVo implements Serializable { @Excel(name = "数据单位") private String dataUnit; + /** 数据枚举 */ + @Excel(name = "数据枚举") + private String dataEnum; + /** 是否告警点位 */ @Excel(name = "是否告警点位", readConverterExp = "0=否,1=是") private String isAlarm; @@ -54,6 +62,14 @@ public class DevicePointMatchExportVo implements Serializable { this.matchField = matchField; } + public String getMatchFieldEnum() { + return matchFieldEnum; + } + + public void setMatchFieldEnum(String matchFieldEnum) { + this.matchFieldEnum = matchFieldEnum; + } + public String getDataPoint() { return dataPoint; } @@ -78,6 +94,14 @@ public class DevicePointMatchExportVo implements Serializable { this.dataUnit = dataUnit; } + public String getDataEnum() { + return dataEnum; + } + + public void setDataEnum(String dataEnum) { + this.dataEnum = dataEnum; + } + public String getIsAlarm() { return isAlarm; } diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/DevicePointMatchVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/DevicePointMatchVo.java index a333f89..1730fc2 100644 --- a/ems-system/src/main/java/com/xzzn/ems/domain/vo/DevicePointMatchVo.java +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/DevicePointMatchVo.java @@ -18,6 +18,10 @@ public class DevicePointMatchVo implements Serializable { @Excel(name = "点位匹配字段名称") private String pointName; + /** 数据枚举映射 */ + @Excel(name = "数据枚举映射") + private String matchFieldEnum; + /** 数据点位 */ @Excel(name = "数据点位") private String dataPoint; @@ -30,6 +34,10 @@ public class DevicePointMatchVo implements Serializable { @Excel(name = "数据单位") private String dataUnit; + /** 数据枚举 */ + @Excel(name = "数据枚举") + private String dataEnum; + /** 是否告警点位 */ @Excel(name = "是否告警点位", readConverterExp = "0=否,1=是") private String isAlarm; @@ -58,6 +66,22 @@ public class DevicePointMatchVo implements Serializable { this.matchField = matchField; } + public String getMatchFieldEnum() { + return matchFieldEnum; + } + + public void setMatchFieldEnum(String matchFieldEnum) { + this.matchFieldEnum = matchFieldEnum; + } + + public String getDataEnum() { + return dataEnum; + } + + public void setDataEnum(String dataEnum) { + this.dataEnum = dataEnum; + } + public String getDataPoint() { return dataPoint; } diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsPointEnumMatchMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsPointEnumMatchMapper.java new file mode 100644 index 0000000..7b6a7f3 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsPointEnumMatchMapper.java @@ -0,0 +1,70 @@ +package com.xzzn.ems.mapper; + +import com.xzzn.ems.domain.EmsPointEnumMatch; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +/** + * 点位枚举匹配Mapper接口 + * + * @author xzzn + * @date 2025-12-08 + */ +public interface EmsPointEnumMatchMapper +{ + /** + * 查询点位枚举匹配 + * + * @param id 点位枚举匹配主键 + * @return 点位枚举匹配 + */ + public EmsPointEnumMatch selectEmsPointEnumMatchById(Long id); + + /** + * 查询点位枚举匹配列表 + * + * @param emsPointEnumMatch 点位枚举匹配 + * @return 点位枚举匹配集合 + */ + public List selectEmsPointEnumMatchList(EmsPointEnumMatch emsPointEnumMatch); + + /** + * 新增点位枚举匹配 + * + * @param emsPointEnumMatch 点位枚举匹配 + * @return 结果 + */ + public int insertEmsPointEnumMatch(EmsPointEnumMatch emsPointEnumMatch); + + /** + * 修改点位枚举匹配 + * + * @param emsPointEnumMatch 点位枚举匹配 + * @return 结果 + */ + public int updateEmsPointEnumMatch(EmsPointEnumMatch emsPointEnumMatch); + + public void updateDataEnumCodeById(EmsPointEnumMatch pointEnumMatch); + + /** + * 删除点位枚举匹配 + * + * @param id 点位枚举匹配主键 + * @return 结果 + */ + public int deleteEmsPointEnumMatchById(Long id); + + /** + * 批量删除点位枚举匹配 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteEmsPointEnumMatchByIds(Long[] ids); + + public List selectList(@Param("siteId") String siteId, + @Param("deviceCategory") String deviceCategory, + @Param("matchField") String matchField); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/impl/DeviceDataProcessServiceImpl.java b/ems-system/src/main/java/com/xzzn/ems/service/impl/DeviceDataProcessServiceImpl.java index 0bc8a93..ecfdee2 100644 --- a/ems-system/src/main/java/com/xzzn/ems/service/impl/DeviceDataProcessServiceImpl.java +++ b/ems-system/src/main/java/com/xzzn/ems/service/impl/DeviceDataProcessServiceImpl.java @@ -72,6 +72,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Optional; import java.util.Set; import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; @@ -214,10 +215,11 @@ public class DeviceDataProcessServiceImpl extends AbstractBatteryDataProcessor i log.info("未找到匹配的点位数据,无法处理中水冷却数据,siteId: " + siteId + ",deviceId: " + deviceId); return; } + Map> pointEnumMatchMap = devicePointMatchDataProcessor.getPointEnumMatchMap(siteId, DeviceMatchTable.COOLING.getCode()); EmsCoolingData coolingData = new EmsCoolingData(); - saveDeviceData(pointMatchList, obj, coolingData); + saveDeviceData(pointMatchList, obj, coolingData, pointEnumMatchMap); coolingData.setDataUpdateTime(dataUpdateTime); coolingData.setCreateBy("system"); @@ -243,13 +245,14 @@ public class DeviceDataProcessServiceImpl extends AbstractBatteryDataProcessor i log.info("未找到匹配的点位数据,无法处理动环数据,siteId: " + siteId + ",deviceId: " + deviceId); return; } + Map> pointEnumMatchMap = devicePointMatchDataProcessor.getPointEnumMatchMap(siteId, DeviceMatchTable.XF.getCode()); // 暂时只更新设备表的设备状态 ZDYBYDCZT-主电源备用电池状态 // 数据存表 EmsXfData xfData = new EmsXfData(); xfData.setDataTimestamp(dataUpdateTime); - saveDeviceData(pointMatchList, obj, xfData); + saveDeviceData(pointMatchList, obj, xfData, pointEnumMatchMap); xfData.setCreateBy("system"); xfData.setCreateTime(DateUtils.getNowDate()); @@ -277,11 +280,12 @@ public class DeviceDataProcessServiceImpl extends AbstractBatteryDataProcessor i log.info("未找到匹配的点位数据,无法处理动环数据,siteId: " + siteId + ",deviceId: " + deviceId); return; } + Map> pointEnumMatchMap = devicePointMatchDataProcessor.getPointEnumMatchMap(siteId, DeviceMatchTable.DH.getCode()); //DH EmsDhData dhData = new EmsDhData(); - saveDeviceData(pointMatchList, obj, dhData); + saveDeviceData(pointMatchList, obj, dhData, pointEnumMatchMap); dhData.setDataUpdateTime(dateUpdateTime); dhData.setCreateBy("system"); @@ -311,6 +315,7 @@ public class DeviceDataProcessServiceImpl extends AbstractBatteryDataProcessor i log.info("未找到匹配的点位数据,无法处理电池堆数据,siteId: " + siteId + ",deviceId: " + deviceId); return; } + Map> pointEnumMatchMap = devicePointMatchDataProcessor.getPointEnumMatchMap(siteId, DeviceMatchTable.STACK.getCode()); //BMS 电池簇 EmsBatteryStack dataStack = new EmsBatteryStack(); @@ -321,7 +326,7 @@ public class DeviceDataProcessServiceImpl extends AbstractBatteryDataProcessor i dataStack.setPcsCommunicationStatus(CommunicationStatus.OK.getCode()); dataStack.setEmsCommunicationStatus(CommunicationStatus.OK.getCode()); - saveDeviceData(pointMatchList, obj, dataStack); + saveDeviceData(pointMatchList, obj, dataStack, pointEnumMatchMap); dataStack.setCreateBy("system"); dataStack.setCreateTime(DateUtils.getNowDate()); @@ -533,7 +538,8 @@ public class DeviceDataProcessServiceImpl extends AbstractBatteryDataProcessor i } } - private void saveDeviceData(List pointMatchList, Map obj, Object entity) { + private void saveDeviceData(List pointMatchList, Map obj, + Object entity, Map> pointEnumMatchMap) { Map pointMatchMap = pointMatchList.stream() .collect(Collectors.toMap( data -> StringUtils.toCamelCase(data.getMatchField()), @@ -541,10 +547,21 @@ public class DeviceDataProcessServiceImpl extends AbstractBatteryDataProcessor i (existing, replacement) -> replacement)); Field[] fields = entity.getClass().getDeclaredFields(); for (Field field : fields) { - if (pointMatchMap.containsKey(field.getName())) { + String fieldName = field.getName(); + if (pointMatchMap.containsKey(fieldName)) { field.setAccessible(true); try { - Object matchValue = obj.get(pointMatchMap.get(field.getName())); + Object matchValue = obj.get(pointMatchMap.get(fieldName)); + //匹配枚举值转换 + List pointEnumMatchList = pointEnumMatchMap.get(fieldName); + if (CollectionUtils.isNotEmpty(pointEnumMatchList)) { + Object finalMatchValue = matchValue; + Optional enumMatch = pointEnumMatchList.stream() + .filter(data -> data.getDataEnumCode().equals(finalMatchValue)).findFirst(); + if (enumMatch.isPresent()) { + matchValue = enumMatch.get().getEnumCode(); + } + } Class fieldType = field.getType(); if (String.class.equals(fieldType)) { matchValue = StringUtils.getString(matchValue); @@ -553,7 +570,7 @@ public class DeviceDataProcessServiceImpl extends AbstractBatteryDataProcessor i } else if (BigDecimal.class.equals(fieldType)) { matchValue = StringUtils.getBigDecimal(matchValue); } else if (Integer.class.equals(fieldType)) { - matchValue = MapUtils.getInteger(obj, pointMatchMap.get(field.getName())); + matchValue = MapUtils.getInteger(obj, pointMatchMap.get(fieldName)); } field.set(entity, matchValue); } catch (IllegalAccessException e) { @@ -573,11 +590,12 @@ public class DeviceDataProcessServiceImpl extends AbstractBatteryDataProcessor i log.info("未找到匹配的点位数据,无法处理电池簇数据,siteId: " + siteId + ",deviceId: " + deviceId); return; } + Map> pointEnumMatchMap = devicePointMatchDataProcessor.getPointEnumMatchMap(siteId, DeviceMatchTable.CLUSTER.getCode()); String stackDeviceId = getStackDeviceId(deviceId); //BMS 电池簇 EmsBatteryCluster data = new EmsBatteryCluster(); - saveDeviceData(pointMatchList, obj, data); + saveDeviceData(pointMatchList, obj, data, pointEnumMatchMap); data.setDataUpdateTime(dataUpdateTime); data.setWorkStatus(WorkStatus.NORMAL.getCode()); // 或其他默认值 @@ -626,6 +644,7 @@ public class DeviceDataProcessServiceImpl extends AbstractBatteryDataProcessor i log.info("未找到匹配的点位数据,无法处理单体电池数据,siteId: " + siteId + ",deviceId: " + deviceId); return; } + Map> pointEnumMatchMap = devicePointMatchDataProcessor.getPointEnumMatchMap(siteId, DeviceMatchTable.BATTERY.getCode()); List list = new ArrayList<>(); List dailyList = new ArrayList<>(); List minutesList = new ArrayList<>(); @@ -642,7 +661,7 @@ public class DeviceDataProcessServiceImpl extends AbstractBatteryDataProcessor i batteryData.setDeviceId(recordId); batteryData.setBatteryCellId(recordId); - saveDeviceData(pointMatchList, fields, batteryData); + saveDeviceData(pointMatchList, fields, batteryData, pointEnumMatchMap); batteryData.setBatteryCluster(deviceId); batteryData.setBatteryPack(getStackDeviceId(deviceId)); @@ -706,11 +725,12 @@ public class DeviceDataProcessServiceImpl extends AbstractBatteryDataProcessor i log.info("未找到匹配的点位数据,无法处理PCS数据,siteId: " + siteId + ",deviceId: " + deviceId); return; } + Map> pointEnumMatchMap = devicePointMatchDataProcessor.getPointEnumMatchMap(siteId, DeviceMatchTable.PCS.getCode()); //pcs EmsPcsData pcsData = new EmsPcsData(); - saveDeviceData(pointMatchList, obj, pcsData); + saveDeviceData(pointMatchList, obj, pcsData, pointEnumMatchMap); // 状态指示类 pcsData.setBranchStatus(BranchStatus.NORMAL.getCode()); @@ -756,6 +776,7 @@ public class DeviceDataProcessServiceImpl extends AbstractBatteryDataProcessor i log.info("未找到匹配的点位数据,无法处理PCS支路数据,siteId: " + siteId + ",deviceId: " + deviceId); return; } + Map> pointEnumMatchMap = devicePointMatchDataProcessor.getPointEnumMatchMap(siteId, DeviceMatchTable.BRANCH.getCode()); //PCS支路 for (Map.Entry> record : records.entrySet()) { @@ -767,7 +788,7 @@ public class DeviceDataProcessServiceImpl extends AbstractBatteryDataProcessor i data.setSiteId(siteId); data.setGridStatus(GridStatus.GRID.getCode()); - saveDeviceData(pointMatchList, fields, data); + saveDeviceData(pointMatchList, fields, data, pointEnumMatchMap); data.setBranchId(recordId); data.setCreateBy("system"); @@ -796,12 +817,13 @@ public class DeviceDataProcessServiceImpl extends AbstractBatteryDataProcessor i log.info("未找到匹配的点位数据,无法处理LOAD总表数据,siteId: " + siteId + ",deviceId: " + deviceId); return; } + Map> pointEnumMatchMap = devicePointMatchDataProcessor.getPointEnumMatchMap(siteId, DeviceMatchTable.AMMETER.getCode()); EmsAmmeterData dataLoad = new EmsAmmeterData(); // 更新时间 dataLoad.setDataUpdateTime(dataUpdateTime); - saveDeviceData(pointMatchList, obj, dataLoad); + saveDeviceData(pointMatchList, obj, dataLoad, pointEnumMatchMap); dataLoad.setCreateBy("system"); dataLoad.setCreateTime(DateUtils.getNowDate()); @@ -832,6 +854,7 @@ public class DeviceDataProcessServiceImpl extends AbstractBatteryDataProcessor i log.info("未找到匹配的点位数据,无法处理LOAD总表数据,siteId: " + siteId + ",deviceId: " + deviceId); return; } + Map> pointEnumMatchMap = devicePointMatchDataProcessor.getPointEnumMatchMap(siteId, DeviceMatchTable.CLUSTER.getCode()); //BMSC 电池簇 EmsBatteryCluster data = new EmsBatteryCluster(); // 其他非 BigDecimal 字段 @@ -853,10 +876,10 @@ public class DeviceDataProcessServiceImpl extends AbstractBatteryDataProcessor i // 获取redis获取最新的BMSD数据 Map stackObj = redisCache.getCacheObject(RedisKeyConstants.ORIGINAL_BMSD + siteId + "_" + stackDeviceId); data.setDeviceId(deviceId); - saveDeviceData(pointMatchList, obj, data); + saveDeviceData(pointMatchList, obj, data, pointEnumMatchMap); // 取堆里面数据 - saveDeviceData(pointMatchList, stackObj, data); + saveDeviceData(pointMatchList, stackObj, data, pointEnumMatchMap); emsBatteryClusterMapper.insertEmsBatteryCluster(data); redisCache.setCacheObject(RedisKeyConstants.CLUSTER + siteId + "_" + deviceId, data); @@ -929,6 +952,7 @@ public class DeviceDataProcessServiceImpl extends AbstractBatteryDataProcessor i log.info("未找到匹配的点位数据,无法处理METE储能电表数据,siteId: " + siteId + ",deviceId: " + deviceId); return; } + Map> pointEnumMatchMap = devicePointMatchDataProcessor.getPointEnumMatchMap(siteId, DeviceMatchTable.AMMETER.getCode()); // 获取上次数据,便于后面计算差值均无则默认0 EmsAmmeterData lastAmmeterData = getLastAmmeterData(siteId, deviceId); @@ -937,7 +961,7 @@ public class DeviceDataProcessServiceImpl extends AbstractBatteryDataProcessor i // 更新时间 dataMete.setDataUpdateTime(dataUpdateTime); - saveDeviceData(pointMatchList, obj, dataMete); + saveDeviceData(pointMatchList, obj, dataMete, pointEnumMatchMap); dataMete.setCreateBy("system"); dataMete.setCreateTime(DateUtils.getNowDate()); @@ -1396,11 +1420,12 @@ public class DeviceDataProcessServiceImpl extends AbstractBatteryDataProcessor i log.info("未找到匹配的点位数据,无法处理中水冷却告警数据,siteId: " + siteId + ",deviceId: " + deviceId); return; } + Map> pointEnumMatchMap = devicePointMatchDataProcessor.getPointEnumMatchMap(siteId, DeviceMatchTable.PCS.getCode()); EmsPcsAlarmData pcsAlarmData = new EmsPcsAlarmData(); // 更新时间 pcsAlarmData.setDataTimestamp(dataUpdateTime); - saveDeviceData(pointMatchList, obj, pcsAlarmData); + saveDeviceData(pointMatchList, obj, pcsAlarmData, pointEnumMatchMap); pcsAlarmData.setCreateBy("system"); pcsAlarmData.setCreateTime(DateUtils.getNowDate()); @@ -1422,12 +1447,13 @@ public class DeviceDataProcessServiceImpl extends AbstractBatteryDataProcessor i log.info("未找到匹配的点位数据,无法处理电池堆告警数据,siteId: " + siteId + ",deviceId: " + deviceId); return; } + Map> pointEnumMatchMap = devicePointMatchDataProcessor.getPointEnumMatchMap(siteId, DeviceMatchTable.STACK.getCode()); EmsStackAlarmData stackAlarmData = new EmsStackAlarmData(); // 更新时间 stackAlarmData.setDataTimestamp(dataUpdateTime); - saveDeviceData(pointMatchList, obj, stackAlarmData); + saveDeviceData(pointMatchList, obj, stackAlarmData, pointEnumMatchMap); stackAlarmData.setCreateBy("system"); stackAlarmData.setCreateTime(DateUtils.getNowDate()); @@ -1448,11 +1474,12 @@ public class DeviceDataProcessServiceImpl extends AbstractBatteryDataProcessor i log.info("未找到匹配的点位数据,无法处理电池簇告警数据,siteId: " + siteId + ",deviceId: " + deviceId); return; } + Map> pointEnumMatchMap = devicePointMatchDataProcessor.getPointEnumMatchMap(siteId, DeviceMatchTable.CLUSTER.getCode()); EmsClusterAlarmData clusterAlarmData = new EmsClusterAlarmData(); // 更新时间 clusterAlarmData.setDataTimestamp(dataUpdateTime); - saveDeviceData(pointMatchList, obj, clusterAlarmData); + saveDeviceData(pointMatchList, obj, clusterAlarmData, pointEnumMatchMap); clusterAlarmData.setCreateBy("system"); clusterAlarmData.setCreateTime(DateUtils.getNowDate()); @@ -1474,12 +1501,13 @@ public class DeviceDataProcessServiceImpl extends AbstractBatteryDataProcessor i log.info("未找到匹配的点位数据,无法处理中水冷却告警数据,siteId: " + siteId + ",deviceId: " + deviceId); return; } + Map> pointEnumMatchMap = devicePointMatchDataProcessor.getPointEnumMatchMap(siteId, DeviceMatchTable.COOLING.getCode()); EmsCoolingAlarmData coolingAlarmData = new EmsCoolingAlarmData(); // 更新时间 coolingAlarmData.setDataTimestamp(dataUpdateTime); - saveDeviceData(pointMatchList, obj, coolingAlarmData); + saveDeviceData(pointMatchList, obj, coolingAlarmData, pointEnumMatchMap); coolingAlarmData.setCreateBy("system"); coolingAlarmData.setCreateTime(DateUtils.getNowDate()); diff --git a/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsPointMatchServiceImpl.java b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsPointMatchServiceImpl.java index 0e9d660..1a92c07 100644 --- a/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsPointMatchServiceImpl.java +++ b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsPointMatchServiceImpl.java @@ -28,10 +28,12 @@ import org.springframework.util.CollectionUtils; import org.springframework.web.multipart.MultipartFile; import com.xzzn.common.utils.poi.ExcelUtil; +import com.xzzn.ems.domain.EmsPointEnumMatch; import com.xzzn.ems.domain.vo.DevicePointMatchExportVo; import com.xzzn.ems.domain.vo.DevicePointMatchVo; import com.xzzn.ems.domain.vo.ImportPointDataRequest; import com.xzzn.ems.enums.DeviceMatchTable; +import com.xzzn.ems.mapper.EmsPointEnumMatchMapper; import com.xzzn.ems.mapper.EmsPointMatchMapper; import com.xzzn.ems.domain.EmsPointMatch; import com.xzzn.ems.service.IEmsPointMatchService; @@ -46,12 +48,14 @@ import javax.validation.Validator; * @date 2025-11-04 */ @Service -public class EmsPointMatchServiceImpl implements IEmsPointMatchService -{ +public class EmsPointMatchServiceImpl implements IEmsPointMatchService { private static final Logger log = LoggerFactory.getLogger(EmsPointMatchServiceImpl.class); + private static final String SEPARATOR = "#"; @Autowired private EmsPointMatchMapper emsPointMatchMapper; @Autowired + private EmsPointEnumMatchMapper emsPointEnumMatchMapper; + @Autowired protected Validator validator; @Autowired private RedisCache redisCache; @@ -63,13 +67,33 @@ public class EmsPointMatchServiceImpl implements IEmsPointMatchService * @return 点位匹配 */ @Override - public List selectEmsPointMatchList(EmsPointMatch emsPointMatch) - { - return emsPointMatchMapper.selectEmsPointMatchExportList(emsPointMatch); + public List selectEmsPointMatchList(EmsPointMatch emsPointMatch) { + List devicePointMatchExportVos = emsPointMatchMapper.selectEmsPointMatchExportList(emsPointMatch); + if (CollectionUtils.isEmpty(devicePointMatchExportVos)) { + return devicePointMatchExportVos; + } + + for (DevicePointMatchExportVo devicePointMatch : devicePointMatchExportVos) { + List pointEnumMatchList = emsPointEnumMatchMapper.selectList(emsPointMatch.getSiteId(), + emsPointMatch.getDeviceCategory(), devicePointMatch.getMatchField()); + if (!CollectionUtils.isEmpty(pointEnumMatchList)) { + String enumName = pointEnumMatchList.stream().map(EmsPointEnumMatch::getEnumName).filter(StringUtils::isNotBlank).collect(Collectors.joining(SEPARATOR)); + String dataEnumCode = pointEnumMatchList.stream().map(EmsPointEnumMatch::getDataEnumCode).filter(StringUtils::isNotBlank).collect(Collectors.joining(SEPARATOR)); +// List dataEnumCode = pointEnumMatchList.stream().map(EmsPointEnumMatch::getDataEnumCode).collect(Collectors.toList()); + +// devicePointMatch.setMatchFieldEnum(StringUtils.join(enumName, SEPARATOR)); +// devicePointMatch.setDataEnum(StringUtils.join(dataEnumCode, SEPARATOR)); + devicePointMatch.setMatchFieldEnum(enumName); + devicePointMatch.setDataEnum(dataEnumCode); + } + } + + return devicePointMatchExportVos; } /** * 上传点位清单 + * * @param pointMatchList * @param isUpdateSupport * @param operName @@ -77,8 +101,7 @@ public class EmsPointMatchServiceImpl implements IEmsPointMatchService */ @Override public String importPoint(List pointMatchList, boolean isUpdateSupport, String operName) { - if (StringUtils.isNull(pointMatchList) || pointMatchList.size() == 0) - { + if (StringUtils.isNull(pointMatchList) || pointMatchList.size() == 0) { throw new ServiceException("导入用户数据不能为空!"); } int successNum = 0; @@ -89,19 +112,19 @@ public class EmsPointMatchServiceImpl implements IEmsPointMatchService try { // 验证点位是否存在 EmsPointMatch point = emsPointMatchMapper.getUniquePoint(pointMatch.getSiteId(), - pointMatch.getDeviceCategory(),pointMatch.getDataPoint()); + pointMatch.getDeviceCategory(), pointMatch.getDataPoint()); if (StringUtils.isNull(point)) { BeanValidators.validateWithException(validator, pointMatch); pointMatch.setCreateBy(operName); emsPointMatchMapper.insertEmsPointMatch(pointMatch); successNum++; - successMsg.append("
" + successNum + "、站点 " + pointMatch.getSiteId() + "、点位 " + pointMatch.getDataPoint()+ " 导入成功"); + successMsg.append("
" + successNum + "、站点 " + pointMatch.getSiteId() + "、点位 " + pointMatch.getDataPoint() + " 导入成功"); } else if (isUpdateSupport) { BeanValidators.validateWithException(validator, pointMatch); pointMatch.setUpdateBy(operName); emsPointMatchMapper.updateEmsPointMatch(pointMatch); successNum++; - successMsg.append("
" + successNum + "、站点 " + pointMatch.getSiteId() + "、点位 " + pointMatch.getDataPoint()+ " 更新成功"); + successMsg.append("
" + successNum + "、站点 " + pointMatch.getSiteId() + "、点位 " + pointMatch.getDataPoint() + " 更新成功"); } else { failureNum++; failureMsg.append("
" + failureNum + "、站点" + pointMatch.getSiteId() + "、点位 " + pointMatch.getDataPoint() + " 已存在"); @@ -123,6 +146,7 @@ public class EmsPointMatchServiceImpl implements IEmsPointMatchService /** * 导入设备点位清单数据到数据库,并同步到Redis + * * @param request * @param operName * @return @@ -176,6 +200,9 @@ public class EmsPointMatchServiceImpl implements IEmsPointMatchService savePoint.setId(dbPoint.getId()); emsPointMatchMapper.updateEmsPointMatch(savePoint); } + // 保存点位枚举映射关系 + savePointMatchEnum(pointMatch.getMatchFieldEnum(), pointMatch.getDataEnum(), savePoint); + } catch (Exception e) { log.info("点位清单导入失败:{}", e.getMessage()); throw new ServiceException("点位清单导入失败!"); @@ -206,11 +233,51 @@ public class EmsPointMatchServiceImpl implements IEmsPointMatchService } private void syncToRedis(String siteId, String deviceCategory) { - // 同步到Redis + // 点位匹配数据同步到Redis String pointMatchKey = DevicePointMatchDataProcessor.getPointMacthCacheKey(siteId, deviceCategory); List pointMatchData = emsPointMatchMapper.getDevicePointMatchList(siteId, deviceCategory); // log.info("同步点位匹配数据到Redis key:{} data:{}", pointMatchKey, pointMatchData); - redisCache.setCacheObject(pointMatchKey, pointMatchData); - log.info("点位匹配数据同步完成 data:{}", JSON.toJSONString(redisCache.getCacheObject(pointMatchKey))); + if (redisCache.hasKey(pointMatchKey)) { + redisCache.deleteObject(pointMatchKey); + } + redisCache.setCacheList(pointMatchKey, pointMatchData); + log.info("点位匹配数据同步完成 data:{}", JSON.toJSONString(redisCache.getCacheList(pointMatchKey))); + + // 点位枚举匹配数据同步到Redis + String pointEnumMatchKey = DevicePointMatchDataProcessor.getPointEnumMacthCacheKey(siteId, deviceCategory); + List pointEnumMatchList = emsPointEnumMatchMapper.selectList(siteId, deviceCategory, null); + if (!CollectionUtils.isEmpty(pointEnumMatchList)) { + if (redisCache.hasKey(pointEnumMatchKey)) { + redisCache.deleteObject(pointEnumMatchKey); + } + redisCache.setCacheList(pointEnumMatchKey, pointEnumMatchList); + log.info("点位枚举匹配数据同步完成 data:{}", JSON.toJSONString(redisCache.getCacheList(pointEnumMatchKey))); + } + + } + + private void savePointMatchEnum(String matchFieldEnum, String dataEnum, EmsPointMatch savePoint) { + if (StringUtils.isAllBlank(matchFieldEnum, dataEnum)) { + return; + } + List pointEnumMatchList = emsPointEnumMatchMapper.selectList(savePoint.getSiteId(), savePoint.getDeviceCategory(), savePoint.getMatchField()); + if (CollectionUtils.isEmpty(pointEnumMatchList)) { + return; + } + String[] matchFieldEnums = matchFieldEnum.split(SEPARATOR); + String[] dataEnums = dataEnum.split(SEPARATOR); + if (matchFieldEnums.length != dataEnums.length) { + return; + } + for (int i = 0; i < matchFieldEnums.length; i++) { + String enumName = matchFieldEnums[i]; + String dataEnumCode = dataEnums[i]; + pointEnumMatchList.forEach(pointEnumMatch -> { + if (pointEnumMatch.getEnumName().equals(enumName)) { + pointEnumMatch.setDataEnumCode(dataEnumCode); + emsPointEnumMatchMapper.updateDataEnumCodeById(pointEnumMatch); + } + }); + } } } diff --git a/ems-system/src/main/java/com/xzzn/ems/utils/DevicePointMatchDataProcessor.java b/ems-system/src/main/java/com/xzzn/ems/utils/DevicePointMatchDataProcessor.java index 2b1c72c..6c5abe4 100644 --- a/ems-system/src/main/java/com/xzzn/ems/utils/DevicePointMatchDataProcessor.java +++ b/ems-system/src/main/java/com/xzzn/ems/utils/DevicePointMatchDataProcessor.java @@ -11,11 +11,13 @@ import com.xzzn.common.enums.PointType; import com.xzzn.common.utils.DataUtils; import com.xzzn.common.utils.StringUtils; import com.xzzn.ems.domain.EmsDevicesSetting; +import com.xzzn.ems.domain.EmsPointEnumMatch; import com.xzzn.ems.domain.EmsPointMatch; import com.xzzn.ems.domain.vo.DevicePointMatchInfo; import com.xzzn.ems.domain.vo.StackStatisListVo; import com.xzzn.ems.enums.DeviceMatchTable; import com.xzzn.ems.mapper.EmsDevicesSettingMapper; +import com.xzzn.ems.mapper.EmsPointEnumMatchMapper; import com.xzzn.ems.mapper.EmsPointMatchMapper; import java.lang.reflect.Field; @@ -25,6 +27,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.function.Function; import java.util.stream.Collectors; import javax.annotation.PostConstruct; @@ -47,6 +50,8 @@ public class DevicePointMatchDataProcessor { private EmsDevicesSettingMapper emsDevicesSettingMapper; @Autowired private EmsPointMatchMapper emsPointMatchMapper; + @Autowired + private EmsPointEnumMatchMapper emsPointEnumMatchMapper; @Autowired private RedisCache redisCache; @@ -115,6 +120,25 @@ public class DevicePointMatchDataProcessor { return pointMatchList; } + public List getPointEnumMatchList(String siteId, String deviceCategory) { + List pointEnumMatchList = redisCache.getCacheList(getPointEnumMacthCacheKey(siteId, deviceCategory)); + + if (CollectionUtils.isEmpty(pointEnumMatchList)) { + pointEnumMatchList = emsPointEnumMatchMapper.selectList(siteId, deviceCategory, null); + } + + return pointEnumMatchList; + } + + public Map> getPointEnumMatchMap(String siteId, String deviceCategory) { + List pointEnumMatchList = getPointEnumMatchList(siteId, deviceCategory); + if (CollectionUtils.isEmpty(pointEnumMatchList)) { + return new HashMap<>(); + } + return pointEnumMatchList.stream() + .collect(Collectors.groupingBy(data -> StringUtils.toCamelCase(data.getMatchField()))); + } + public void saveDevicePointMatch(String siteId, String deviceId, DeviceMatchTable pointMatchType, String dataDevice) { // EmsDevicesSetting devicesSetting = emsDevicesSettingMapper.getDeviceBySiteAndDeviceId(deviceId, siteId); // if (devicesSetting == null) { @@ -194,4 +218,15 @@ public class DevicePointMatchDataProcessor { { return RedisKeyConstants.POINT_MATCH + deviceCategory + "_" + siteId; } + + /** + * 设置点位枚举缓存key + * @param siteId + * @param deviceCategory + * @return 点位枚举缓存key + */ + public static String getPointEnumMacthCacheKey(String siteId, String deviceCategory) + { + return RedisKeyConstants.POINT_ENUM_MATCH + deviceCategory + "_" + siteId; + } } diff --git a/ems-system/src/main/resources/mapper/ems/EmsPointEnumMatchMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsPointEnumMatchMapper.xml new file mode 100644 index 0000000..7ba0254 --- /dev/null +++ b/ems-system/src/main/resources/mapper/ems/EmsPointEnumMatchMapper.xml @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + + + + select id, match_field, site_id, device_category, enum_code, enum_name, enum_desc, data_enum_code, create_by, create_time, update_by, update_time, remark from ems_point_enum_match + + + + + + + + insert into ems_point_enum_match + + match_field, + site_id, + device_category, + enum_code, + enum_name, + enum_desc, + data_enum_code, + create_by, + create_time, + update_by, + update_time, + remark, + + + #{matchField}, + #{siteId}, + #{deviceCategory}, + #{enumCode}, + #{enumName}, + #{enumDesc}, + #{dataEnumCode}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + + + + + update ems_point_enum_match + + match_field = #{matchField}, + site_id = #{siteId}, + device_category = #{deviceCategory}, + enum_code = #{enumCode}, + enum_name = #{enumName}, + enum_desc = #{enumDesc}, + data_enum_code = #{dataEnumCode}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + + where id = #{id} + + + + update ems_point_enum_match + set data_enum_code = #{dataEnumCode}, update_time = now() + where id = #{id} + + + + delete from ems_point_enum_match where id = #{id} + + + + delete from ems_point_enum_match where id in + + #{id} + + + + + + \ No newline at end of file