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 ce08e73..3af54d1 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 @@ -153,7 +153,10 @@ public class DeviceDataProcessServiceImpl extends AbstractBatteryDataProcessor i @Override public void handleDeviceData(String message, String siteId) { + log.info("=== handleDeviceData 开始 === siteId:{}, message length:{}", siteId, message != null ? message.length() : 0); + JSONArray arraylist = JSONArray.parseArray(message); + log.info("解析到{}条设备数据", arraylist.size()); for (int i = 0; i < arraylist.size(); i++) { JSONObject obj = JSONObject.parseObject(arraylist.get(i).toString()); @@ -163,10 +166,13 @@ public class DeviceDataProcessServiceImpl extends AbstractBatteryDataProcessor i Long timestamp = obj.getLong("timestamp"); Date dataUpdateTime = DateUtils.convertUpdateTime(timestamp); - log.info("deviceId:" + deviceId); + log.info("处理第{}条设备数据 - deviceId:{}, timestamp:{}, dataUpdateTime:{}, jsonData length:{}", + i + 1, deviceId, timestamp, dataUpdateTime, jsonData != null ? jsonData.length() : 0); + boolean isEmpty = checkJsonDataEmpty(jsonData); if (isEmpty) { // 添加设备告警 + log.warn("设备数据为空 - deviceId:{}", deviceId); iEmsAlarmRecordsService.addEmptyDataAlarmRecord(siteId, deviceId); return; } @@ -184,11 +190,17 @@ public class DeviceDataProcessServiceImpl extends AbstractBatteryDataProcessor i public void processingDeviceData(String siteId, String deviceId, String jsonData, Date dataUpdateTime) { // 判断设备类型,并调用对应的方法处理数据 String deviceCategory = getDeviceCategory(siteId, deviceId); + log.info("processingDeviceData - siteId:{}, deviceId:{}, deviceCategory:{}", siteId, deviceId, deviceCategory); + if (deviceId.contains(SiteDevice.BMSD.name())) { + log.info("设备类型是BMSD"); batteryStackDataProcess(siteId, deviceId, jsonData, dataUpdateTime); if (SiteEnum.DDS.getCode().equals(siteId)) { + log.info("siteId是DDS,调用batteryGroupDataProcess和batteryDataProcessFromBmsd"); batteryGroupDataProcess(siteId, deviceId, jsonData); batteryDataProcessFromBmsd(siteId, deviceId, jsonData, dataUpdateTime); + } else { + log.info("siteId不是DDS (期望:{}, 实际:{}),跳过batteryDataProcessFromBmsd", SiteEnum.DDS.getCode(), siteId); } } else if (deviceId.contains(SiteDevice.BMSC.name())) { batteryClusterDataProcess(siteId, deviceId, jsonData, dataUpdateTime); @@ -441,12 +453,12 @@ public class DeviceDataProcessServiceImpl extends AbstractBatteryDataProcessor i } private void batteryDataProcessFromBmsd(String siteId, String deviceId, String dataJson, Date dataUpdateTime) { -// if (!SiteEnum.DDS.getCode().equals(siteId)) { -// return; -// } - //电池组 + log.info("=== batteryDataProcessFromBmsd 开始 === siteId:{}, deviceId:{}", siteId, deviceId); + Map obj = JSON.parseObject(dataJson, new TypeReference>() { }); + log.info("解析后的数据键数量:{}", obj.size()); + List dataList = new ArrayList<>(); // 前一个小时 @@ -459,32 +471,51 @@ public class DeviceDataProcessServiceImpl extends AbstractBatteryDataProcessor i Map minutesMap = new HashMap<>(); String clusterId = getClusterDeviceIdByParentDeviceId(siteId, deviceId); + log.info("clusterId:{}", clusterId); + + int dtdcCount = 0; + int matchedCount = 0; + for (Map.Entry entry : obj.entrySet()) { String key = entry.getKey(); if (key.startsWith("DTDC")) { + dtdcCount++; Matcher matcher = DTDC_PATTERN.matcher(key); if (matcher.matches()) { + matchedCount++; String batteryCellId = matcher.group(1); String property = matcher.group(2); + Object value = entry.getValue(); - EmsBatteryData data = dataMap.getOrDefault(batteryCellId, new EmsBatteryData()); - if (StringUtils.isNotEmpty(batteryCellId)) { - data.setDataTimestamp(dataUpdateTime); - data.setBatteryPack(deviceId); - data.setBatteryCluster(clusterId); - data.setClusterDeviceId(clusterId); - data.setBatteryCellId(batteryCellId); - data.setSiteId(siteId); - data.setDeviceId(batteryCellId); - data.setCreateBy("system"); - data.setCreateTime(DateUtils.getNowDate()); - data.setUpdateBy("system"); - data.setUpdateTime(DateUtils.getNowDate()); + log.info("匹配到DTDC数据 - key:{}, batteryCellId:{}, property:{}, value:{}, value type:{}", + key, batteryCellId, property, value, value != null ? value.getClass().getName() : "null"); + + EmsBatteryData data = dataMap.get(batteryCellId); + boolean isNew = (data == null); + if (isNew) { + data = new EmsBatteryData(); + if (StringUtils.isNotEmpty(batteryCellId)) { + data.setDataTimestamp(dataUpdateTime); + data.setBatteryPack(deviceId); + data.setBatteryCluster(clusterId); + data.setClusterDeviceId(clusterId); + data.setBatteryCellId(batteryCellId); + data.setSiteId(siteId); + data.setDeviceId(batteryCellId+clusterId); + data.setCreateBy("system"); + data.setCreateTime(DateUtils.getNowDate()); + data.setUpdateBy("system"); + data.setUpdateTime(DateUtils.getNowDate()); + } + dataMap.put(batteryCellId, data); + log.info("创建新的电池数据对象 - batteryCellId:{}", batteryCellId); + } else { + log.info("使用已有的电池数据对象 - batteryCellId:{}", batteryCellId); } + // 根据后缀设置对应属性 setDTDCPropertyValue(data, property, entry.getValue()); - dataMap.put(batteryCellId, data); // 每日最新数据:按batteryCellId去重 EmsBatteryDataDailyLatest daily = dailyMap.getOrDefault(batteryCellId, new EmsBatteryDataDailyLatest()); @@ -499,9 +530,23 @@ public class DeviceDataProcessServiceImpl extends AbstractBatteryDataProcessor i } } } + + log.info("=== DTDC数据处理完成 === DTDC键数量:{}, 成功匹配数量:{}, 最终电池数据数量:{}", + dtdcCount, matchedCount, dataMap.size()); + if (!CollectionUtils.sizeIsEmpty(dataMap)) { dataList = new ArrayList<>(dataMap.values()); + + // 打印前5条数据用于调试 + int printCount = Math.min(5, dataList.size()); + for (int i = 0; i < printCount; i++) { + EmsBatteryData data = dataList.get(i); + log.info("准备插入的第{}条数据 - batteryCellId:{}, voltage:{}, temperature:{}, interResistance:{}", + i + 1, data.getBatteryCellId(), data.getVoltage(), data.getTemperature(), data.getInterResistance()); + } + emsBatteryDataMapper.insertEmsBatteryDataList(new ArrayList<>(dataList)); + log.info("成功插入{}条电池数据", dataList.size()); redisCache.deleteList(RedisKeyConstants.BATTERY + siteId + "_" + clusterId); redisCache.setCacheList(RedisKeyConstants.BATTERY + siteId + "_" + clusterId, dataList); @@ -549,20 +594,44 @@ public class DeviceDataProcessServiceImpl extends AbstractBatteryDataProcessor i private void setDTDCPropertyValue(EmsBatteryData data, String property, Object value) { BigDecimal numberValue = null; + + log.info("setDTDCPropertyValue 开始 - property:{}, value:{}, value type:{}", + property, value, value != null ? value.getClass().getName() : "null"); + if (value instanceof Number) { numberValue = new BigDecimal(value.toString()); + log.info("值是Number类型,转换为BigDecimal: {}", numberValue); + } else if (value != null) { + log.warn("值不是Number类型,尝试从字符串转换。Value: {}, type: {}", value, value.getClass().getName()); + try { + numberValue = new BigDecimal(value.toString()); + log.info("成功从字符串转换为BigDecimal: {}", numberValue); + } catch (Exception e) { + log.error("无法将值转换为BigDecimal: {}", value, e); + } + } else { + log.warn("值为null"); } + switch (property) { case "DY": data.setVoltage(numberValue); + log.info("设置 voltage: {}", numberValue); break; case "WD": data.setTemperature(numberValue); + log.info("设置 temperature: {}", numberValue); break; case "NZ": data.setInterResistance(numberValue); + log.info("设置 interResistance: {}", numberValue); break; + default: + log.warn("未知的属性类型: {}", property); } + + log.info("setDTDCPropertyValue 结束 - 当前对象状态 voltage:{}, temperature:{}, interResistance:{}", + data.getVoltage(), data.getTemperature(), data.getInterResistance()); } //根据属性名设置对应的值