|
|
|
@ -70,7 +70,7 @@ public class CsdjService { |
|
|
|
if (notificationData == null) { |
|
|
|
log.warn("[CSDJ] 解析通報数据失败,terminalId:{}", csdjEntity.getTerminalId()); |
|
|
|
// 即使解析失败,也先存入原始数据
|
|
|
|
csdjDao.insertCsdjLog(terminalId, csdjEntity.getData(), csdjEntity.getTs(), null, null); |
|
|
|
csdjDao.insertCsdjLog(terminalId, terminalId, csdjEntity.getData(), csdjEntity.getTs(), null, null); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
@ -78,6 +78,9 @@ public class CsdjService { |
|
|
|
Integer.toHexString(notificationData.getNotificationType() & 0xFF).toUpperCase(), |
|
|
|
notificationData.getNotificationTime()); |
|
|
|
|
|
|
|
// 给所有端子设置 deviceId(格式:terminalId-D04 / terminalId-A01 / terminalId-S01)
|
|
|
|
setDeviceIds(terminalId, notificationData); |
|
|
|
|
|
|
|
// 调试信息
|
|
|
|
log.info("[CSDJ] デジタル入力端子列表: {}", notificationData.getDigitalInputTerminals()); |
|
|
|
log.info("[CSDJ] デジタル入力端子数量: {}", |
|
|
|
@ -89,7 +92,8 @@ public class CsdjService { |
|
|
|
String parsedContent = buildParsedContent(notificationData); |
|
|
|
|
|
|
|
// 3. 存入 csdj_log 表
|
|
|
|
csdjDao.insertCsdjLog(terminalId, csdjEntity.getData(), csdjEntity.getTs(), parsedJson, parsedContent); |
|
|
|
String logDeviceId = collectDeviceIds(notificationData); |
|
|
|
csdjDao.insertCsdjLog(terminalId, logDeviceId, csdjEntity.getData(), csdjEntity.getTs(), parsedJson, parsedContent); |
|
|
|
|
|
|
|
// 4. 处理デジタル入力端子(告警/恢复)
|
|
|
|
List<CsdjDigitalInputTerminal> digitalTerminals = notificationData.getDigitalInputTerminals(); |
|
|
|
@ -112,17 +116,19 @@ public class CsdjService { |
|
|
|
private void processDigitalTerminal(CsdjEntity csdjEntity, CsdjNotificationData notificationData, |
|
|
|
CsdjDigitalInputTerminal terminal, DeviceEntity deviceEntity) { |
|
|
|
String terminalId = csdjEntity.getTerminalId(); |
|
|
|
String deviceId = terminal.getDeviceId(); |
|
|
|
Integer terminalNo = terminal.getTerminalNo(); |
|
|
|
Boolean isAlarm = terminal.getIsAlarm(); |
|
|
|
String stateText = terminal.getStateText(); |
|
|
|
|
|
|
|
log.info("[CSDJ] デジタル入力端子,terminalId:{}, No:{}, state:{}, isAlarm:{}", |
|
|
|
terminalId, terminalNo, stateText, isAlarm); |
|
|
|
log.info("[CSDJ] デジタル入力端子,terminalId:{}, deviceId:{}, No:{}, state:{}, isAlarm:{}", |
|
|
|
terminalId, deviceId, terminalNo, stateText, isAlarm); |
|
|
|
|
|
|
|
Long companyId = deviceEntity.getCompanyId(); |
|
|
|
|
|
|
|
CsdjAlarmHistory csdjAlarmHistory = new CsdjAlarmHistory(); |
|
|
|
csdjAlarmHistory.setCompanyId(companyId); |
|
|
|
csdjAlarmHistory.setDeviceId(deviceId); |
|
|
|
csdjAlarmHistory.setTerminalId(terminalId); |
|
|
|
csdjAlarmHistory.setTerminalNo(terminalNo); |
|
|
|
csdjAlarmHistory.setStateRaw(terminal.getStateRaw()); |
|
|
|
@ -132,13 +138,13 @@ public class CsdjService { |
|
|
|
csdjAlarmHistory.setRawHex(rawHex); |
|
|
|
|
|
|
|
DeviceInfoVO deviceInfoVO = new DeviceInfoVO(); |
|
|
|
deviceInfoVO.setDeviceId(deviceEntity.getDeviceId()); |
|
|
|
deviceInfoVO.setDeviceId(deviceId); |
|
|
|
deviceInfoVO.setBuildingId(deviceEntity.getBuildingId()); |
|
|
|
deviceInfoVO.setBigClassId(deviceEntity.getBigClassId()); |
|
|
|
deviceInfoVO.setCategoryId(deviceEntity.getCategoryId()); |
|
|
|
|
|
|
|
DynamodbEntity entity = new DynamodbEntity(); |
|
|
|
entity.setDeviceId(terminalId); |
|
|
|
entity.setDeviceId(terminal.getDeviceId()); |
|
|
|
entity.setRetainAlert(deviceEntity.getRetainAlert()); |
|
|
|
|
|
|
|
if (isAlarm) { |
|
|
|
@ -155,8 +161,8 @@ public class CsdjService { |
|
|
|
csdjAlarmHistory.setRecoveryTime(null); |
|
|
|
csdjAlarmHistory.setRecoveryTimestamp(null); |
|
|
|
|
|
|
|
log.info("[CSDJ] 发生告警!terminalId:{}, terminalNo:{}, state:{}", |
|
|
|
terminalId, terminalNo, stateText); |
|
|
|
log.info("[CSDJ] 发生告警!terminalId:{}, deviceId:{}, terminalNo:{}, state:{}", |
|
|
|
terminalId, deviceId, terminalNo, stateText); |
|
|
|
} else { |
|
|
|
dashboardAlertDao.updateLatestAlertToAutoRecovered(entity); |
|
|
|
|
|
|
|
@ -164,13 +170,74 @@ public class CsdjService { |
|
|
|
csdjAlarmHistory.setRecoveryTime(notificationData.getNotificationTime()); |
|
|
|
csdjAlarmHistory.setRecoveryTimestamp(notificationData.getJapanTimestamp()); |
|
|
|
|
|
|
|
log.info("[CSDJ] 告警恢复!terminalId:{}, terminalNo:{}, state:{}", |
|
|
|
terminalId, terminalNo, stateText); |
|
|
|
log.info("[CSDJ] 告警恢复!terminalId:{}, deviceId:{}, terminalNo:{}, state:{}", |
|
|
|
terminalId, deviceId, terminalNo, stateText); |
|
|
|
} |
|
|
|
|
|
|
|
csdjDao.insertAlarm(csdjAlarmHistory); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 给所有端子设置 deviceId |
|
|
|
* 格式:terminalId-前缀+端子号(如 031-D04, 031-A01, 031-S01) |
|
|
|
*/ |
|
|
|
private void setDeviceIds(String terminalId, CsdjNotificationData data) { |
|
|
|
// デジタル入力端子 → D 前缀
|
|
|
|
if (data.getDigitalInputTerminals() != null) { |
|
|
|
for (CsdjDigitalInputTerminal t : data.getDigitalInputTerminals()) { |
|
|
|
t.setDeviceId(terminalId + "-D" + String.format("%02d", t.getTerminalNo())); |
|
|
|
} |
|
|
|
} |
|
|
|
// アナログ入力端子 → A 前缀
|
|
|
|
if (data.getAnalogInputTerminals() != null) { |
|
|
|
for (CsdjAnalogInputTerminal t : data.getAnalogInputTerminals()) { |
|
|
|
t.setDeviceId(terminalId + "-A" + String.format("%02d", t.getTerminalNo())); |
|
|
|
} |
|
|
|
} |
|
|
|
// デジタル出力端子 → D 前缀
|
|
|
|
if (data.getDigitalOutputTerminals() != null) { |
|
|
|
for (CsdjDigitalOutputTerminal t : data.getDigitalOutputTerminals()) { |
|
|
|
t.setDeviceId(terminalId + "-D" + String.format("%02d", t.getTerminalNo())); |
|
|
|
} |
|
|
|
} |
|
|
|
// システム状態 → S 前缀(用 stateNo)
|
|
|
|
CsdjSystemState systemState = data.getSystemState(); |
|
|
|
if (systemState != null && systemState.getStateNo() != null) { |
|
|
|
systemState.setDeviceId(terminalId + "-S" + String.format("%02d", systemState.getStateNo())); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 收集通報数据中所有端子的 deviceId,用逗号拼接 |
|
|
|
*/ |
|
|
|
private String collectDeviceIds(CsdjNotificationData data) { |
|
|
|
StringBuilder sb = new StringBuilder(); |
|
|
|
if (data.getDigitalInputTerminals() != null) { |
|
|
|
for (CsdjDigitalInputTerminal t : data.getDigitalInputTerminals()) { |
|
|
|
if (sb.length() > 0) sb.append(","); |
|
|
|
sb.append(t.getDeviceId()); |
|
|
|
} |
|
|
|
} |
|
|
|
if (data.getAnalogInputTerminals() != null) { |
|
|
|
for (CsdjAnalogInputTerminal t : data.getAnalogInputTerminals()) { |
|
|
|
if (sb.length() > 0) sb.append(","); |
|
|
|
sb.append(t.getDeviceId()); |
|
|
|
} |
|
|
|
} |
|
|
|
if (data.getDigitalOutputTerminals() != null) { |
|
|
|
for (CsdjDigitalOutputTerminal t : data.getDigitalOutputTerminals()) { |
|
|
|
if (sb.length() > 0) sb.append(","); |
|
|
|
sb.append(t.getDeviceId()); |
|
|
|
} |
|
|
|
} |
|
|
|
CsdjSystemState systemState = data.getSystemState(); |
|
|
|
if (systemState != null && systemState.getDeviceId() != null) { |
|
|
|
if (sb.length() > 0) sb.append(","); |
|
|
|
sb.append(systemState.getDeviceId()); |
|
|
|
} |
|
|
|
return sb.toString(); |
|
|
|
} |
|
|
|
|
|
|
|
private void saveDeviceRealtime(String terminalId, Long companyId, String rawHex, |
|
|
|
CsdjNotificationData data) { |
|
|
|
try { |
|
|
|
@ -181,6 +248,7 @@ public class CsdjService { |
|
|
|
deviceRealtime = new CsdjDeviceRealtime(); |
|
|
|
deviceRealtime.setTerminalId(terminalId); |
|
|
|
} |
|
|
|
deviceRealtime.setDeviceId(terminalId); |
|
|
|
deviceRealtime.setCompanyId(companyId); |
|
|
|
deviceRealtime.setLastNotificationTime(data.getNotificationTime()); |
|
|
|
deviceRealtime.setLastNotificationTimestamp(data.getJapanTimestamp()); |
|
|
|
|