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