|
|
@ -8,82 +8,69 @@ import com.techsor.datacenter.sender.config.DataSourceContextHolder; |
|
|
import com.techsor.datacenter.sender.dao.CsdjDao; |
|
|
import com.techsor.datacenter.sender.dao.CsdjDao; |
|
|
import com.techsor.datacenter.sender.dao.DashboardAlertDao; |
|
|
import com.techsor.datacenter.sender.dao.DashboardAlertDao; |
|
|
import com.techsor.datacenter.sender.dao.DeviceDao; |
|
|
import com.techsor.datacenter.sender.dao.DeviceDao; |
|
|
import com.techsor.datacenter.sender.dao.F10Dao; |
|
|
|
|
|
import com.techsor.datacenter.sender.dto.DeviceInfoVO; |
|
|
import com.techsor.datacenter.sender.dto.DeviceInfoVO; |
|
|
import com.techsor.datacenter.sender.entitiy.DeviceEntity; |
|
|
import com.techsor.datacenter.sender.entitiy.DeviceEntity; |
|
|
import com.techsor.datacenter.sender.entitiy.DynamodbEntity; |
|
|
import com.techsor.datacenter.sender.entitiy.DynamodbEntity; |
|
|
import com.techsor.datacenter.sender.entitiy.csdj.CsdjAlarmHistory; |
|
|
import com.techsor.datacenter.sender.entitiy.csdj.*; |
|
|
import com.techsor.datacenter.sender.entitiy.csdj.CsdjDigitalInputTerminal; |
|
|
|
|
|
import com.techsor.datacenter.sender.entitiy.csdj.CsdjEntity; |
|
|
|
|
|
import com.techsor.datacenter.sender.entitiy.csdj.CsdjNotificationData; |
|
|
|
|
|
import com.techsor.datacenter.sender.utils.RedisUtils; |
|
|
|
|
|
import com.techsor.datacenter.sender.utils.csdj.CsdjNotificationParser; |
|
|
import com.techsor.datacenter.sender.utils.csdj.CsdjNotificationParser; |
|
|
import jakarta.annotation.Resource; |
|
|
import com.fasterxml.jackson.core.JsonProcessingException; |
|
|
|
|
|
import com.fasterxml.jackson.databind.ObjectMapper; |
|
|
|
|
|
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; |
|
|
import lombok.RequiredArgsConstructor; |
|
|
import lombok.RequiredArgsConstructor; |
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
import org.springframework.beans.factory.annotation.Autowired; |
|
|
|
|
|
import org.springframework.stereotype.Service; |
|
|
import org.springframework.stereotype.Service; |
|
|
|
|
|
|
|
|
|
|
|
import java.util.HashMap; |
|
|
import java.util.List; |
|
|
import java.util.List; |
|
|
|
|
|
import java.util.Map; |
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* CSDJ 业务处理服务 |
|
|
|
|
|
*/ |
|
|
|
|
|
@Slf4j |
|
|
@Slf4j |
|
|
@Service |
|
|
@Service |
|
|
@RequiredArgsConstructor |
|
|
@RequiredArgsConstructor |
|
|
public class CsdjService { |
|
|
public class CsdjService { |
|
|
|
|
|
|
|
|
private final CsdjNotificationParser csdjNotificationParser; |
|
|
private final CsdjNotificationParser csdjNotificationParser; |
|
|
|
|
|
|
|
|
private final CommonOpt commonOpt; |
|
|
private final CommonOpt commonOpt; |
|
|
|
|
|
|
|
|
private final GuavaRedisCache guavaRedisCache; |
|
|
private final GuavaRedisCache guavaRedisCache; |
|
|
|
|
|
|
|
|
private final RedisUtils redisUtils; |
|
|
|
|
|
|
|
|
|
|
|
private final CsdjDao csdjDao; |
|
|
private final CsdjDao csdjDao; |
|
|
|
|
|
|
|
|
private final DeviceDao deviceDao; |
|
|
private final DeviceDao deviceDao; |
|
|
|
|
|
|
|
|
private final DashboardAlertDao dashboardAlertDao; |
|
|
private final DashboardAlertDao dashboardAlertDao; |
|
|
|
|
|
|
|
|
private final IDataProcessService dataProcessService; |
|
|
private final IDataProcessService dataProcessService; |
|
|
|
|
|
|
|
|
/** |
|
|
private final ObjectMapper objectMapper = new ObjectMapper() |
|
|
* 处理 CSDJ 通報数据 |
|
|
.registerModule(new JavaTimeModule()); |
|
|
* @param csdjEntity 接收到的数据 |
|
|
|
|
|
*/ |
|
|
|
|
|
public void handle(CsdjEntity csdjEntity) { |
|
|
public void handle(CsdjEntity csdjEntity) { |
|
|
try { |
|
|
try { |
|
|
log.info("[CSDJ] 开始处理 CSDJ 数据,terminalId:{}, data:{}", |
|
|
log.info("[CSDJ] 开始处理 CSDJ 数据,terminalId:{}, data:{}", |
|
|
csdjEntity.getTerminalId(), csdjEntity.getData()); |
|
|
csdjEntity.getTerminalId(), csdjEntity.getData()); |
|
|
|
|
|
|
|
|
String terminalId = csdjEntity.getTerminalId(); |
|
|
String terminalId = csdjEntity.getTerminalId(); |
|
|
|
|
|
|
|
|
String topCompanyId= commonOpt.getTopCompanyId(terminalId); |
|
|
String topCompanyId = commonOpt.getTopCompanyId(terminalId); |
|
|
if (topCompanyId==null || topCompanyId.equals("0")){ |
|
|
if (topCompanyId == null || topCompanyId.equals("0")) { |
|
|
log.error("no companyId is found========================>>>> {}",terminalId); |
|
|
log.error("no companyId is found========================>>>> {}", terminalId); |
|
|
return; |
|
|
return; |
|
|
} |
|
|
} |
|
|
DataSourceContextHolder.clearCurrentDataSourceKey(); |
|
|
DataSourceContextHolder.clearCurrentDataSourceKey(); |
|
|
DataSourceContextHolder.setCurrentDataSourceKey("dataSourceForCompany_"+topCompanyId); |
|
|
DataSourceContextHolder.setCurrentDataSourceKey("dataSourceForCompany_" + topCompanyId); |
|
|
|
|
|
|
|
|
log.info("Use datasource for company:"+topCompanyId); |
|
|
|
|
|
|
|
|
|
|
|
long currentTs = System.currentTimeMillis(); |
|
|
log.info("Use datasource for company:" + topCompanyId); |
|
|
|
|
|
|
|
|
//存入 csdj_log 表
|
|
|
List<DeviceEntity> deviceEntitys = this.deviceDao.getDeviceInfoByDeviceId(terminalId); |
|
|
csdjDao.insertCsdjLog( |
|
|
this.guavaRedisCache.incrementDailyDeviceIdCount(terminalId); |
|
|
csdjEntity.getTerminalId(), |
|
|
if (CollectionUtil.isEmpty(deviceEntitys)) { |
|
|
csdjEntity.getData(), |
|
|
log.error("no deviceEntity is found========================>>>> {}", terminalId); |
|
|
csdjEntity.getTs() |
|
|
return; |
|
|
); |
|
|
} |
|
|
|
|
|
DeviceEntity deviceEntity = deviceEntitys.get(0); |
|
|
|
|
|
|
|
|
// 1. 解析通報数据
|
|
|
// 1. 解析通報数据
|
|
|
CsdjNotificationData notificationData = csdjNotificationParser.parse(csdjEntity.getData()); |
|
|
CsdjNotificationData notificationData = csdjNotificationParser.parse(csdjEntity.getData()); |
|
|
if (notificationData == null) { |
|
|
if (notificationData == null) { |
|
|
log.warn("[CSDJ] 解析通報数据失败,terminalId:{}", csdjEntity.getTerminalId()); |
|
|
log.warn("[CSDJ] 解析通報数据失败,terminalId:{}", csdjEntity.getTerminalId()); |
|
|
|
|
|
// 即使解析失败,也先存入原始数据
|
|
|
|
|
|
csdjDao.insertCsdjLog(terminalId, csdjEntity.getData(), csdjEntity.getTs(), null, null); |
|
|
return; |
|
|
return; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@ -91,40 +78,39 @@ public class CsdjService { |
|
|
Integer.toHexString(notificationData.getNotificationType() & 0xFF).toUpperCase(), |
|
|
Integer.toHexString(notificationData.getNotificationType() & 0xFF).toUpperCase(), |
|
|
notificationData.getNotificationTime()); |
|
|
notificationData.getNotificationTime()); |
|
|
|
|
|
|
|
|
// 2. 处理デジタル入力端子(D开头,告警/恢复)
|
|
|
// 调试信息
|
|
|
|
|
|
log.info("[CSDJ] デジタル入力端子列表: {}", notificationData.getDigitalInputTerminals()); |
|
|
|
|
|
log.info("[CSDJ] デジタル入力端子数量: {}", |
|
|
|
|
|
(notificationData.getDigitalInputTerminals() == null) ? |
|
|
|
|
|
"null" : notificationData.getDigitalInputTerminals().size()); |
|
|
|
|
|
|
|
|
|
|
|
// 2. 构建解析后的 JSON 和内容描述
|
|
|
|
|
|
String parsedJson = buildParsedJson(notificationData); |
|
|
|
|
|
String parsedContent = buildParsedContent(notificationData); |
|
|
|
|
|
|
|
|
|
|
|
// 3. 存入 csdj_log 表
|
|
|
|
|
|
csdjDao.insertCsdjLog(terminalId, csdjEntity.getData(), csdjEntity.getTs(), parsedJson, parsedContent); |
|
|
|
|
|
|
|
|
|
|
|
// 4. 处理デジタル入力端子(告警/恢复)
|
|
|
List<CsdjDigitalInputTerminal> digitalTerminals = notificationData.getDigitalInputTerminals(); |
|
|
List<CsdjDigitalInputTerminal> digitalTerminals = notificationData.getDigitalInputTerminals(); |
|
|
if (digitalTerminals != null && !digitalTerminals.isEmpty()) { |
|
|
if (digitalTerminals != null && !digitalTerminals.isEmpty()) { |
|
|
for (CsdjDigitalInputTerminal terminal : digitalTerminals) { |
|
|
for (CsdjDigitalInputTerminal terminal : digitalTerminals) { |
|
|
processDigitalTerminal(csdjEntity, notificationData, terminal); |
|
|
processDigitalTerminal(csdjEntity, notificationData, terminal, deviceEntity); |
|
|
} |
|
|
} |
|
|
} else { |
|
|
|
|
|
log.info("[CSDJ] 没有デジタル入力端子数据"); |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 5. 更新 csdj_device_realtime 表
|
|
|
|
|
|
Long companyId = deviceEntity.getCompanyId(); |
|
|
|
|
|
saveDeviceRealtime(terminalId, companyId, csdjEntity.getData(), notificationData); |
|
|
|
|
|
|
|
|
log.info("[CSDJ] 处理 CSDJ 数据完成,terminalId:{}", csdjEntity.getTerminalId()); |
|
|
log.info("[CSDJ] 处理 CSDJ 数据完成,terminalId:{}", csdjEntity.getTerminalId()); |
|
|
} catch (Exception e) { |
|
|
} catch (Exception e) { |
|
|
log.error("[CSDJ] 处理 CSDJ 数据失败,terminalId:{}", csdjEntity.getTerminalId(), e); |
|
|
log.error("[CSDJ] 处理 CSDJ 数据失败,terminalId:{}", csdjEntity.getTerminalId(), e); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/** |
|
|
private void processDigitalTerminal(CsdjEntity csdjEntity, CsdjNotificationData notificationData, |
|
|
* 处理デジタル入力端子的告警/恢复 |
|
|
CsdjDigitalInputTerminal terminal, DeviceEntity deviceEntity) { |
|
|
* |
|
|
|
|
|
* 告警: |
|
|
|
|
|
* { |
|
|
|
|
|
* "terminalId": "TEST002", |
|
|
|
|
|
* "data": "00 0E 07 00 25 06 20 0E 00 00 00 C0 01 08 01 00 00 00 00", |
|
|
|
|
|
* "ts": "1782272698000" |
|
|
|
|
|
* } |
|
|
|
|
|
* |
|
|
|
|
|
* 恢复: |
|
|
|
|
|
* { |
|
|
|
|
|
* "terminalId": "TEST002", |
|
|
|
|
|
* "data": "00 0E 07 00 25 06 20 0E 00 00 00 C0 01 00 01 00 00 00 00", |
|
|
|
|
|
* "ts": "1782272698000" |
|
|
|
|
|
* } |
|
|
|
|
|
*/ |
|
|
|
|
|
private void processDigitalTerminal(CsdjEntity csdjEntity, CsdjNotificationData notificationData, CsdjDigitalInputTerminal terminal) { |
|
|
|
|
|
String terminalId = csdjEntity.getTerminalId(); |
|
|
String terminalId = csdjEntity.getTerminalId(); |
|
|
Integer terminalNo = terminal.getTerminalNo(); |
|
|
Integer terminalNo = terminal.getTerminalNo(); |
|
|
Boolean isAlarm = terminal.getIsAlarm(); |
|
|
Boolean isAlarm = terminal.getIsAlarm(); |
|
|
@ -133,56 +119,27 @@ public class CsdjService { |
|
|
log.info("[CSDJ] デジタル入力端子,terminalId:{}, No:{}, state:{}, isAlarm:{}", |
|
|
log.info("[CSDJ] デジタル入力端子,terminalId:{}, No:{}, state:{}, isAlarm:{}", |
|
|
terminalId, terminalNo, stateText, isAlarm); |
|
|
terminalId, terminalNo, stateText, isAlarm); |
|
|
|
|
|
|
|
|
// // ========== 在这里写你的告警/恢复逻辑 ==========
|
|
|
Long companyId = deviceEntity.getCompanyId(); |
|
|
// if (isAlarm) {
|
|
|
|
|
|
// // TODO: 告警逻辑(合上)
|
|
|
|
|
|
// // 比如:
|
|
|
|
|
|
// // - 查设备信息
|
|
|
|
|
|
// // - 保存告警记录
|
|
|
|
|
|
// // - 推送告警通知
|
|
|
|
|
|
// log.info("[CSDJ] 发生告警!terminalId:{}, terminalNo:{}, state:{}",
|
|
|
|
|
|
// terminalId, terminalNo, stateText);
|
|
|
|
|
|
// } else {
|
|
|
|
|
|
// // TODO: 恢复逻辑(断开)
|
|
|
|
|
|
// // 比如:
|
|
|
|
|
|
// // - 更新告警记录为恢复状态
|
|
|
|
|
|
// // - 发送恢复通知
|
|
|
|
|
|
// log.info("[CSDJ] 告警恢复!terminalId:{}, terminalNo:{}, state:{}",
|
|
|
|
|
|
// terminalId, terminalNo, stateText);
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
List<DeviceEntity> deviceEntity=this.deviceDao.getDeviceInfoByDeviceId(terminalId); |
|
|
|
|
|
this.guavaRedisCache.incrementDailyDeviceIdCount(terminalId); |
|
|
|
|
|
if (CollectionUtil.isEmpty(deviceEntity)){ |
|
|
|
|
|
log.error("no deviceEntity is found========================>>>> {}",terminalId); |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
Long companyId = deviceEntity.get(0).getCompanyId(); |
|
|
|
|
|
|
|
|
|
|
|
CsdjAlarmHistory csdjAlarmHistory = new CsdjAlarmHistory(); |
|
|
CsdjAlarmHistory csdjAlarmHistory = new CsdjAlarmHistory(); |
|
|
|
|
|
|
|
|
// 设置基础字段
|
|
|
|
|
|
csdjAlarmHistory.setCompanyId(companyId); |
|
|
csdjAlarmHistory.setCompanyId(companyId); |
|
|
csdjAlarmHistory.setTerminalId(terminalId); |
|
|
csdjAlarmHistory.setTerminalId(terminalId); |
|
|
csdjAlarmHistory.setTerminalNo(terminalNo); |
|
|
csdjAlarmHistory.setTerminalNo(terminalNo); |
|
|
csdjAlarmHistory.setStateRaw(terminal.getStateRaw()); |
|
|
csdjAlarmHistory.setStateRaw(terminal.getStateRaw()); |
|
|
csdjAlarmHistory.setAbnormalMode(terminal.getAbnormalMode()); |
|
|
csdjAlarmHistory.setAbnormalMode(terminal.getAbnormalMode()); |
|
|
|
|
|
|
|
|
// 设置原始HEX报文
|
|
|
|
|
|
String rawHex = csdjEntity.getData() != null ? csdjEntity.getData() : "N/A"; |
|
|
String rawHex = csdjEntity.getData() != null ? csdjEntity.getData() : "N/A"; |
|
|
csdjAlarmHistory.setRawHex(rawHex); |
|
|
csdjAlarmHistory.setRawHex(rawHex); |
|
|
|
|
|
|
|
|
DeviceInfoVO deviceInfoVO = new DeviceInfoVO(); |
|
|
DeviceInfoVO deviceInfoVO = new DeviceInfoVO(); |
|
|
deviceInfoVO.setDeviceId(deviceEntity.get(0).getDeviceId()); |
|
|
deviceInfoVO.setDeviceId(deviceEntity.getDeviceId()); |
|
|
deviceInfoVO.setBuildingId(deviceEntity.get(0).getBuildingId()); |
|
|
deviceInfoVO.setBuildingId(deviceEntity.getBuildingId()); |
|
|
deviceInfoVO.setBigClassId(deviceEntity.get(0).getBigClassId()); |
|
|
deviceInfoVO.setBigClassId(deviceEntity.getBigClassId()); |
|
|
|
|
|
|
|
|
DynamodbEntity entity = new DynamodbEntity(); |
|
|
DynamodbEntity entity = new DynamodbEntity(); |
|
|
entity.setDeviceId(terminalId); |
|
|
entity.setDeviceId(terminalId); |
|
|
|
|
|
|
|
|
if (isAlarm){ |
|
|
if (isAlarm) { |
|
|
// 告警逻辑
|
|
|
|
|
|
dataProcessService.setAlertBlock(deviceInfoVO); |
|
|
dataProcessService.setAlertBlock(deviceInfoVO); |
|
|
entity.setAlertBlock(deviceInfoVO.getAlertBlock()); |
|
|
entity.setAlertBlock(deviceInfoVO.getAlertBlock()); |
|
|
|
|
|
|
|
|
@ -190,21 +147,18 @@ public class CsdjService { |
|
|
Long dbId = dashboardAlertDao.insertAlertHistory(entity, 3); |
|
|
Long dbId = dashboardAlertDao.insertAlertHistory(entity, 3); |
|
|
csdjAlarmHistory.setAlertHistoryId(dbId); |
|
|
csdjAlarmHistory.setAlertHistoryId(dbId); |
|
|
|
|
|
|
|
|
// 设置告警相关字段
|
|
|
|
|
|
csdjAlarmHistory.setAlarmTime(notificationData.getNotificationTime()); |
|
|
csdjAlarmHistory.setAlarmTime(notificationData.getNotificationTime()); |
|
|
csdjAlarmHistory.setAlarmTimestamp(notificationData.getJapanTimestamp()); |
|
|
csdjAlarmHistory.setAlarmTimestamp(notificationData.getJapanTimestamp()); |
|
|
csdjAlarmHistory.setAlarmState(1); // 1=告警中
|
|
|
csdjAlarmHistory.setAlarmState(1); |
|
|
csdjAlarmHistory.setRecoveryTime(null); |
|
|
csdjAlarmHistory.setRecoveryTime(null); |
|
|
csdjAlarmHistory.setRecoveryTimestamp(null); |
|
|
csdjAlarmHistory.setRecoveryTimestamp(null); |
|
|
|
|
|
|
|
|
log.info("[CSDJ] 发生告警!terminalId:{}, terminalNo:{}, state:{}", |
|
|
log.info("[CSDJ] 发生告警!terminalId:{}, terminalNo:{}, state:{}", |
|
|
terminalId, terminalNo, stateText); |
|
|
terminalId, terminalNo, stateText); |
|
|
} else { |
|
|
} else { |
|
|
// 恢复逻辑
|
|
|
|
|
|
dashboardAlertDao.updateLatestAlertToAutoRecovered(entity); |
|
|
dashboardAlertDao.updateLatestAlertToAutoRecovered(entity); |
|
|
|
|
|
|
|
|
// 设置恢复相关字段
|
|
|
csdjAlarmHistory.setAlarmState(0); |
|
|
csdjAlarmHistory.setAlarmState(0); // 0=已恢复
|
|
|
|
|
|
csdjAlarmHistory.setRecoveryTime(notificationData.getNotificationTime()); |
|
|
csdjAlarmHistory.setRecoveryTime(notificationData.getNotificationTime()); |
|
|
csdjAlarmHistory.setRecoveryTimestamp(notificationData.getJapanTimestamp()); |
|
|
csdjAlarmHistory.setRecoveryTimestamp(notificationData.getJapanTimestamp()); |
|
|
|
|
|
|
|
|
@ -212,8 +166,177 @@ public class CsdjService { |
|
|
terminalId, terminalNo, stateText); |
|
|
terminalId, terminalNo, stateText); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 插入告警历史记录
|
|
|
|
|
|
csdjDao.insertAlarm(csdjAlarmHistory); |
|
|
csdjDao.insertAlarm(csdjAlarmHistory); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private void saveDeviceRealtime(String terminalId, Long companyId, String rawHex, |
|
|
|
|
|
CsdjNotificationData data) { |
|
|
|
|
|
try { |
|
|
|
|
|
// 1. 先从数据库读取旧数据
|
|
|
|
|
|
CsdjDeviceRealtime deviceRealtime = csdjDao.getDeviceRealtime(terminalId); |
|
|
|
|
|
if (deviceRealtime == null) { |
|
|
|
|
|
// 如果是新设备,初始化
|
|
|
|
|
|
deviceRealtime = new CsdjDeviceRealtime(); |
|
|
|
|
|
deviceRealtime.setTerminalId(terminalId); |
|
|
|
|
|
} |
|
|
|
|
|
deviceRealtime.setCompanyId(companyId); |
|
|
|
|
|
deviceRealtime.setLastNotificationTime(data.getNotificationTime()); |
|
|
|
|
|
deviceRealtime.setLastNotificationTimestamp(data.getJapanTimestamp()); |
|
|
|
|
|
deviceRealtime.setLastRawHex(rawHex); |
|
|
|
|
|
|
|
|
|
|
|
// 2. 只更新此次上报的数据
|
|
|
|
|
|
|
|
|
|
|
|
// 处理デジタル入力端子
|
|
|
|
|
|
if (data.getDigitalInputTerminals() != null && !data.getDigitalInputTerminals().isEmpty()) { |
|
|
|
|
|
List<CsdjDigitalInputTerminal> list = data.getDigitalInputTerminals(); |
|
|
|
|
|
deviceRealtime.setDigitalInputJson(objectMapper.writeValueAsString(list)); |
|
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < list.size(); i++) { |
|
|
|
|
|
CsdjDigitalInputTerminal t = list.get(i); |
|
|
|
|
|
if (i == 0) { |
|
|
|
|
|
deviceRealtime.setDi1No(t.getTerminalNo()); |
|
|
|
|
|
deviceRealtime.setDi1IsAlarm(t.getIsAlarm() ? 1 : 0); |
|
|
|
|
|
deviceRealtime.setDi1StateRaw(t.getStateRaw()); |
|
|
|
|
|
deviceRealtime.setDi1StateText(t.getStateText()); |
|
|
|
|
|
deviceRealtime.setDi1AbnormalMode(t.getAbnormalMode()); |
|
|
|
|
|
} else if (i == 1) { |
|
|
|
|
|
deviceRealtime.setDi2No(t.getTerminalNo()); |
|
|
|
|
|
deviceRealtime.setDi2IsAlarm(t.getIsAlarm() ? 1 : 0); |
|
|
|
|
|
deviceRealtime.setDi2StateRaw(t.getStateRaw()); |
|
|
|
|
|
deviceRealtime.setDi2StateText(t.getStateText()); |
|
|
|
|
|
deviceRealtime.setDi2AbnormalMode(t.getAbnormalMode()); |
|
|
|
|
|
} else if (i == 2) { |
|
|
|
|
|
deviceRealtime.setDi3No(t.getTerminalNo()); |
|
|
|
|
|
deviceRealtime.setDi3IsAlarm(t.getIsAlarm() ? 1 : 0); |
|
|
|
|
|
deviceRealtime.setDi3StateRaw(t.getStateRaw()); |
|
|
|
|
|
deviceRealtime.setDi3StateText(t.getStateText()); |
|
|
|
|
|
deviceRealtime.setDi3AbnormalMode(t.getAbnormalMode()); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 处理アナログ入力端子
|
|
|
|
|
|
if (data.getAnalogInputTerminals() != null && !data.getAnalogInputTerminals().isEmpty()) { |
|
|
|
|
|
List<CsdjAnalogInputTerminal> list = data.getAnalogInputTerminals(); |
|
|
|
|
|
deviceRealtime.setAnalogInputJson(objectMapper.writeValueAsString(list)); |
|
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < list.size(); i++) { |
|
|
|
|
|
CsdjAnalogInputTerminal t = list.get(i); |
|
|
|
|
|
if (i == 0) { |
|
|
|
|
|
deviceRealtime.setAi1No(t.getTerminalNo()); |
|
|
|
|
|
deviceRealtime.setAi1IsThresholdAlarm(t.getIsThresholdAlarm() ? 1 : 0); |
|
|
|
|
|
deviceRealtime.setAi1ThresholdNo(t.getThresholdNo()); |
|
|
|
|
|
deviceRealtime.setAi1AdditionalData(t.getAdditionalData()); |
|
|
|
|
|
deviceRealtime.setAi1StateRaw(t.getStateRaw()); |
|
|
|
|
|
} else if (i == 1) { |
|
|
|
|
|
deviceRealtime.setAi2No(t.getTerminalNo()); |
|
|
|
|
|
deviceRealtime.setAi2IsThresholdAlarm(t.getIsThresholdAlarm() ? 1 : 0); |
|
|
|
|
|
deviceRealtime.setAi2ThresholdNo(t.getThresholdNo()); |
|
|
|
|
|
deviceRealtime.setAi2AdditionalData(t.getAdditionalData()); |
|
|
|
|
|
deviceRealtime.setAi2StateRaw(t.getStateRaw()); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 处理デジタル出力端子
|
|
|
|
|
|
if (data.getDigitalOutputTerminals() != null && !data.getDigitalOutputTerminals().isEmpty()) { |
|
|
|
|
|
List<CsdjDigitalOutputTerminal> list = data.getDigitalOutputTerminals(); |
|
|
|
|
|
deviceRealtime.setDigitalOutputJson(objectMapper.writeValueAsString(list)); |
|
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < list.size(); i++) { |
|
|
|
|
|
CsdjDigitalOutputTerminal t = list.get(i); |
|
|
|
|
|
if (i == 0) { |
|
|
|
|
|
deviceRealtime.setDo1No(t.getTerminalNo()); |
|
|
|
|
|
deviceRealtime.setDo1OutputState(t.getOutputState()); |
|
|
|
|
|
deviceRealtime.setDo1StateRaw(t.getStateRaw()); |
|
|
|
|
|
deviceRealtime.setDo1AdditionalData(t.getAdditionalData()); |
|
|
|
|
|
} else if (i == 1) { |
|
|
|
|
|
deviceRealtime.setDo2No(t.getTerminalNo()); |
|
|
|
|
|
deviceRealtime.setDo2OutputState(t.getOutputState()); |
|
|
|
|
|
deviceRealtime.setDo2StateRaw(t.getStateRaw()); |
|
|
|
|
|
deviceRealtime.setDo2AdditionalData(t.getAdditionalData()); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 处理システム状態
|
|
|
|
|
|
if (data.getSystemState() != null) { |
|
|
|
|
|
CsdjSystemState s = data.getSystemState(); |
|
|
|
|
|
deviceRealtime.setSystemStateNo(s.getStateNo()); |
|
|
|
|
|
deviceRealtime.setSystemScheduledTimeNo(s.getScheduledTimeNo()); |
|
|
|
|
|
deviceRealtime.setSystemModeState(s.getModeState()); |
|
|
|
|
|
deviceRealtime.setSystemIsPowerOff(s.getIsPowerOff() ? 1 : 0); |
|
|
|
|
|
deviceRealtime.setSystemIsBatteryLow(s.getIsBatteryLow() ? 1 : 0); |
|
|
|
|
|
deviceRealtime.setSystemIsLineDisconnected(s.getIsLineDisconnected() ? 1 : 0); |
|
|
|
|
|
deviceRealtime.setSystemIsSlaveCommunicationError(s.getIsSlaveCommunicationError() ? 1 : 0); |
|
|
|
|
|
deviceRealtime.setSystemStateRaw(s.getStateRaw()); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 3. 保存
|
|
|
|
|
|
csdjDao.saveOrUpdateDeviceRealtime(deviceRealtime); |
|
|
|
|
|
} catch (JsonProcessingException e) { |
|
|
|
|
|
log.error("[CSDJ] 序列化 JSON 失败", e); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private String buildParsedJson(CsdjNotificationData data) { |
|
|
|
|
|
try { |
|
|
|
|
|
Map<String, Object> map = new HashMap<>(); |
|
|
|
|
|
map.put("notificationType", data.getNotificationType()); |
|
|
|
|
|
map.put("notificationTime", data.getNotificationTime()); |
|
|
|
|
|
map.put("japanTimestamp", data.getJapanTimestamp()); |
|
|
|
|
|
map.put("digitalInputTerminals", data.getDigitalInputTerminals()); |
|
|
|
|
|
map.put("analogInputTerminals", data.getAnalogInputTerminals()); |
|
|
|
|
|
map.put("digitalOutputTerminals", data.getDigitalOutputTerminals()); |
|
|
|
|
|
map.put("systemState", data.getSystemState()); |
|
|
|
|
|
return objectMapper.writeValueAsString(map); |
|
|
|
|
|
} catch (Exception e) { |
|
|
|
|
|
log.error("[CSDJ] 构建 parsedJson 失败", e); |
|
|
|
|
|
return null; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private String buildParsedContent(CsdjNotificationData data) { |
|
|
|
|
|
try { |
|
|
|
|
|
StringBuilder sb = new StringBuilder(); |
|
|
|
|
|
sb.append("通知时间: ").append(data.getNotificationTime()).append("; "); |
|
|
|
|
|
|
|
|
|
|
|
if (data.getDigitalInputTerminals() != null && !data.getDigitalInputTerminals().isEmpty()) { |
|
|
|
|
|
sb.append("数字输入: "); |
|
|
|
|
|
for (CsdjDigitalInputTerminal t : data.getDigitalInputTerminals()) { |
|
|
|
|
|
sb.append("端子").append(t.getTerminalNo()) |
|
|
|
|
|
.append("(").append(t.getStateText()).append("); "); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (data.getAnalogInputTerminals() != null && !data.getAnalogInputTerminals().isEmpty()) { |
|
|
|
|
|
sb.append("模拟输入: "); |
|
|
|
|
|
for (CsdjAnalogInputTerminal t : data.getAnalogInputTerminals()) { |
|
|
|
|
|
sb.append("端子").append(t.getTerminalNo()) |
|
|
|
|
|
.append("=").append(t.getAdditionalData()) |
|
|
|
|
|
.append("(").append(t.getStateText()).append("); "); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (data.getDigitalOutputTerminals() != null && !data.getDigitalOutputTerminals().isEmpty()) { |
|
|
|
|
|
sb.append("数字输出: "); |
|
|
|
|
|
for (CsdjDigitalOutputTerminal t : data.getDigitalOutputTerminals()) { |
|
|
|
|
|
sb.append("端子").append(t.getTerminalNo()) |
|
|
|
|
|
.append("=").append(t.getOutputState()).append("; "); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (data.getSystemState() != null) { |
|
|
|
|
|
sb.append("系统状态: "); |
|
|
|
|
|
sb.append("停电=").append(data.getSystemState().getIsPowerOff()) |
|
|
|
|
|
.append("; 电池=").append(data.getSystemState().getIsBatteryLow()) |
|
|
|
|
|
.append("; 线路=").append(data.getSystemState().getIsLineDisconnected()); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return sb.toString(); |
|
|
|
|
|
} catch (Exception e) { |
|
|
|
|
|
log.error("[CSDJ] 构建 parsedContent 失败", e); |
|
|
|
|
|
return null; |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|