From e11534828e5d672d2f646d538fdbd44e5513da6c Mon Sep 17 00:00:00 2001 From: "review512jwy@163.com" <“review512jwy@163.com”> Date: Thu, 2 Jul 2026 23:20:17 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84csdj=E5=91=8A=E8=AD=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../datacenter/sender/dao/CsdjDao.java | 14 +- .../entitiy/csdj/CsdjDeviceRealtime.java | 1 + .../sender/service/CsdjService.java | 243 +++++++++++------- 3 files changed, 157 insertions(+), 101 deletions(-) diff --git a/src/main/java/com/techsor/datacenter/sender/dao/CsdjDao.java b/src/main/java/com/techsor/datacenter/sender/dao/CsdjDao.java index 6433531..9ed8db6 100644 --- a/src/main/java/com/techsor/datacenter/sender/dao/CsdjDao.java +++ b/src/main/java/com/techsor/datacenter/sender/dao/CsdjDao.java @@ -18,8 +18,8 @@ public class CsdjDao { /** * 从数据库读取设备实时数据 */ - public CsdjDeviceRealtime getDeviceRealtime(String terminalId) { - String sql = "SELECT * FROM csdj_device_realtime WHERE terminal_id = ?"; + public CsdjDeviceRealtime getDeviceRealtime(String terminalId, String deviceId) { + String sql = "SELECT * FROM csdj_device_realtime WHERE terminal_id = ? AND device_id = ?"; try { return jdbcTemplate.queryForObject(sql, (rs, rowNum) -> { CsdjDeviceRealtime device = new CsdjDeviceRealtime(); @@ -86,7 +86,7 @@ public class CsdjDao { device.setSystemStateRaw(rs.getObject("system_state_raw", Integer.class)); return device; - }, terminalId); + }, terminalId, deviceId); } catch (Exception e) { // 如果没有找到记录,返回null return null; @@ -158,8 +158,9 @@ public class CsdjDao { "system_state_no, system_scheduled_time_no, system_mode_state, " + "system_is_power_off, system_is_battery_low, system_is_line_disconnected, " + "system_is_slave_communication_error, system_state_raw, " + + "alert_history_id, " + "created_at, updated_at" + - ") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) " + + ") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) " + "ON DUPLICATE KEY UPDATE " + "company_id = VALUES(company_id), " + "last_notification_time = VALUES(last_notification_time), " + @@ -178,6 +179,7 @@ public class CsdjDao { "system_state_no = VALUES(system_state_no), system_scheduled_time_no = VALUES(system_scheduled_time_no), system_mode_state = VALUES(system_mode_state), " + "system_is_power_off = VALUES(system_is_power_off), system_is_battery_low = VALUES(system_is_battery_low), system_is_line_disconnected = VALUES(system_is_line_disconnected), " + "system_is_slave_communication_error = VALUES(system_is_slave_communication_error), system_state_raw = VALUES(system_state_raw), " + + "alert_history_id = IFNULL(VALUES(alert_history_id), alert_history_id), " + "updated_at = VALUES(updated_at)"; jdbcTemplate.update(sql, @@ -241,7 +243,9 @@ public class CsdjDao { device.getSystemIsLineDisconnected(), device.getSystemIsSlaveCommunicationError(), device.getSystemStateRaw(), - + + device.getAlertHistoryId(), + java.sql.Timestamp.valueOf(LocalDateTime.now()), java.sql.Timestamp.valueOf(LocalDateTime.now()) ); diff --git a/src/main/java/com/techsor/datacenter/sender/entitiy/csdj/CsdjDeviceRealtime.java b/src/main/java/com/techsor/datacenter/sender/entitiy/csdj/CsdjDeviceRealtime.java index c1c9936..2544133 100644 --- a/src/main/java/com/techsor/datacenter/sender/entitiy/csdj/CsdjDeviceRealtime.java +++ b/src/main/java/com/techsor/datacenter/sender/entitiy/csdj/CsdjDeviceRealtime.java @@ -79,6 +79,7 @@ public class CsdjDeviceRealtime { private Integer systemStateRaw; // ===== 时间 ===== + private Long alertHistoryId; private LocalDateTime createdAt; private LocalDateTime updatedAt; } diff --git a/src/main/java/com/techsor/datacenter/sender/service/CsdjService.java b/src/main/java/com/techsor/datacenter/sender/service/CsdjService.java index 7e47521..7b3ce93 100644 --- a/src/main/java/com/techsor/datacenter/sender/service/CsdjService.java +++ b/src/main/java/com/techsor/datacenter/sender/service/CsdjService.java @@ -20,6 +20,8 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import java.util.AbstractMap; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -97,15 +99,19 @@ public class CsdjService { // 4. 处理デジタル入力端子(告警/恢复) List digitalTerminals = notificationData.getDigitalInputTerminals(); + Map deviceAlertHistoryMap = new HashMap<>(); if (digitalTerminals != null && !digitalTerminals.isEmpty()) { for (CsdjDigitalInputTerminal terminal : digitalTerminals) { - processDigitalTerminal(csdjEntity, notificationData, terminal, deviceEntity); + Map.Entry entry = processDigitalTerminal(csdjEntity, notificationData, terminal, deviceEntity); + if (entry.getValue() != null) { + deviceAlertHistoryMap.put(entry.getKey(), entry.getValue()); + } } } // 5. 更新 csdj_device_realtime 表 Long companyId = deviceEntity.getCompanyId(); - saveDeviceRealtime(terminalId, companyId, csdjEntity.getData(), notificationData); + saveDeviceRealtime(terminalId, companyId, csdjEntity.getData(), notificationData, deviceAlertHistoryMap); log.info("[CSDJ] 处理 CSDJ 数据完成,terminalId:{}", csdjEntity.getTerminalId()); } catch (Exception e) { @@ -113,7 +119,7 @@ public class CsdjService { } } - private void processDigitalTerminal(CsdjEntity csdjEntity, CsdjNotificationData notificationData, + private Map.Entry processDigitalTerminal(CsdjEntity csdjEntity, CsdjNotificationData notificationData, CsdjDigitalInputTerminal terminal, DeviceEntity deviceEntity) { String terminalId = csdjEntity.getTerminalId(); String deviceId = terminal.getDeviceId(); @@ -147,12 +153,14 @@ public class CsdjService { entity.setDeviceId(terminal.getDeviceId()); entity.setRetainAlert(deviceEntity.getRetainAlert()); + Long dbId = null; + if (isAlarm) { dataProcessService.setAlertBlock(deviceInfoVO); entity.setAlertBlock(deviceInfoVO.getAlertBlock()); entity.setReceive_ts(csdjEntity.getTs()); - Long dbId = dashboardAlertDao.insertAlertHistory(entity, 3); + dbId = dashboardAlertDao.insertAlertHistory(entity, 3); csdjAlarmHistory.setAlertHistoryId(dbId); csdjAlarmHistory.setAlarmTime(notificationData.getNotificationTime()); @@ -175,6 +183,7 @@ public class CsdjService { } csdjDao.insertAlarm(csdjAlarmHistory); + return new AbstractMap.SimpleEntry<>(deviceId, dbId); } /** @@ -239,113 +248,155 @@ public class CsdjService { } private void saveDeviceRealtime(String terminalId, Long companyId, String rawHex, - CsdjNotificationData data) { + CsdjNotificationData data, Map deviceAlertHistoryMap) { try { - // 1. 先从数据库读取旧数据 - CsdjDeviceRealtime deviceRealtime = csdjDao.getDeviceRealtime(terminalId); - if (deviceRealtime == null) { - // 如果是新设备,初始化 - deviceRealtime = new CsdjDeviceRealtime(); - deviceRealtime.setTerminalId(terminalId); + // 1. 收集所有 deviceId + List deviceIds = new ArrayList<>(); + if (data.getDigitalInputTerminals() != null) { + for (CsdjDigitalInputTerminal t : data.getDigitalInputTerminals()) { + if (t.getDeviceId() != null) deviceIds.add(t.getDeviceId()); + } + } + if (data.getAnalogInputTerminals() != null) { + for (CsdjAnalogInputTerminal t : data.getAnalogInputTerminals()) { + if (t.getDeviceId() != null) deviceIds.add(t.getDeviceId()); + } + } + if (data.getDigitalOutputTerminals() != null) { + for (CsdjDigitalOutputTerminal t : data.getDigitalOutputTerminals()) { + if (t.getDeviceId() != null) deviceIds.add(t.getDeviceId()); + } + } + CsdjSystemState systemState = data.getSystemState(); + if (systemState != null && systemState.getDeviceId() != null) { + deviceIds.add(systemState.getDeviceId()); } - deviceRealtime.setDeviceId(terminalId); - deviceRealtime.setCompanyId(companyId); - deviceRealtime.setLastNotificationTime(data.getNotificationTime()); - deviceRealtime.setLastNotificationTimestamp(data.getJapanTimestamp()); - deviceRealtime.setLastRawHex(rawHex); - // 2. 只更新此次上报的数据 + // 2. 为每个 deviceId 创建/更新一行 + String digitalInputJson = data.getDigitalInputTerminals() != null && !data.getDigitalInputTerminals().isEmpty() + ? objectMapper.writeValueAsString(data.getDigitalInputTerminals()) : null; + String analogInputJson = data.getAnalogInputTerminals() != null && !data.getAnalogInputTerminals().isEmpty() + ? objectMapper.writeValueAsString(data.getAnalogInputTerminals()) : null; + String digitalOutputJson = data.getDigitalOutputTerminals() != null && !data.getDigitalOutputTerminals().isEmpty() + ? objectMapper.writeValueAsString(data.getDigitalOutputTerminals()) : null; + + for (String deviceId : deviceIds) { + // 先读取旧数据,没有则新建 + CsdjDeviceRealtime row = csdjDao.getDeviceRealtime(terminalId, deviceId); + if (row == null) { + row = new CsdjDeviceRealtime(); + } + row.setTerminalId(terminalId); + row.setDeviceId(deviceId); + row.setCompanyId(companyId); + row.setLastNotificationTime(data.getNotificationTime()); + row.setLastNotificationTimestamp(data.getJapanTimestamp()); + row.setLastRawHex(rawHex); + + // JSON字段所有行都设置 + row.setDigitalInputJson(digitalInputJson); + row.setAnalogInputJson(analogInputJson); + row.setDigitalOutputJson(digitalOutputJson); + + // 根据 deviceId 填充匹配的端子数据 + fillDigitalInput(row, deviceId, data.getDigitalInputTerminals()); + fillAnalogInput(row, deviceId, data.getAnalogInputTerminals()); + fillDigitalOutput(row, deviceId, data.getDigitalOutputTerminals()); + + // 系统状态所有行都设置 + if (systemState != null) { + row.setSystemStateNo(systemState.getStateNo()); + row.setSystemScheduledTimeNo(systemState.getScheduledTimeNo()); + row.setSystemModeState(systemState.getModeState()); + row.setSystemIsPowerOff(systemState.getIsPowerOff() ? 1 : 0); + row.setSystemIsBatteryLow(systemState.getIsBatteryLow() ? 1 : 0); + row.setSystemIsLineDisconnected(systemState.getIsLineDisconnected() ? 1 : 0); + row.setSystemIsSlaveCommunicationError(systemState.getIsSlaveCommunicationError() ? 1 : 0); + row.setSystemStateRaw(systemState.getStateRaw()); + } - // 处理デジタル入力端子 - if (data.getDigitalInputTerminals() != null && !data.getDigitalInputTerminals().isEmpty()) { - List 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()); + // 设置告警历史ID + if (deviceAlertHistoryMap != null) { + Long alertHistoryId = deviceAlertHistoryMap.get(deviceId); + if (alertHistoryId != null) { + row.setAlertHistoryId(alertHistoryId); } } + + csdjDao.saveOrUpdateDeviceRealtime(row); } + } catch (JsonProcessingException e) { + log.error("[CSDJ] 序列化 JSON 失败", e); + } + } - // 处理アナログ入力端子 - if (data.getAnalogInputTerminals() != null && !data.getAnalogInputTerminals().isEmpty()) { - List 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()); - } + private void fillDigitalInput(CsdjDeviceRealtime row, String deviceId, List terminals) { + if (terminals == null) return; + for (int i = 0; i < terminals.size() && i < 3; i++) { + CsdjDigitalInputTerminal t = terminals.get(i); + if (deviceId.equals(t.getDeviceId())) { + if (i == 0) { + row.setDi1No(t.getTerminalNo()); + row.setDi1IsAlarm(t.getIsAlarm() ? 1 : 0); + row.setDi1StateRaw(t.getStateRaw()); + row.setDi1StateText(t.getStateText()); + row.setDi1AbnormalMode(t.getAbnormalMode()); + } else if (i == 1) { + row.setDi2No(t.getTerminalNo()); + row.setDi2IsAlarm(t.getIsAlarm() ? 1 : 0); + row.setDi2StateRaw(t.getStateRaw()); + row.setDi2StateText(t.getStateText()); + row.setDi2AbnormalMode(t.getAbnormalMode()); + } else { + row.setDi3No(t.getTerminalNo()); + row.setDi3IsAlarm(t.getIsAlarm() ? 1 : 0); + row.setDi3StateRaw(t.getStateRaw()); + row.setDi3StateText(t.getStateText()); + row.setDi3AbnormalMode(t.getAbnormalMode()); } } + } + } - // 处理デジタル出力端子 - if (data.getDigitalOutputTerminals() != null && !data.getDigitalOutputTerminals().isEmpty()) { - List 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()); - } + private void fillAnalogInput(CsdjDeviceRealtime row, String deviceId, List terminals) { + if (terminals == null) return; + for (int i = 0; i < terminals.size() && i < 2; i++) { + CsdjAnalogInputTerminal t = terminals.get(i); + if (deviceId.equals(t.getDeviceId())) { + if (i == 0) { + row.setAi1No(t.getTerminalNo()); + row.setAi1IsThresholdAlarm(t.getIsThresholdAlarm() ? 1 : 0); + row.setAi1ThresholdNo(t.getThresholdNo()); + row.setAi1AdditionalData(t.getAdditionalData()); + row.setAi1StateRaw(t.getStateRaw()); + } else { + row.setAi2No(t.getTerminalNo()); + row.setAi2IsThresholdAlarm(t.getIsThresholdAlarm() ? 1 : 0); + row.setAi2ThresholdNo(t.getThresholdNo()); + row.setAi2AdditionalData(t.getAdditionalData()); + row.setAi2StateRaw(t.getStateRaw()); } } + } + } - // 处理システム状態 - 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()); + private void fillDigitalOutput(CsdjDeviceRealtime row, String deviceId, List terminals) { + if (terminals == null) return; + for (int i = 0; i < terminals.size() && i < 2; i++) { + CsdjDigitalOutputTerminal t = terminals.get(i); + if (deviceId.equals(t.getDeviceId())) { + if (i == 0) { + row.setDo1No(t.getTerminalNo()); + row.setDo1OutputState(t.getOutputState()); + row.setDo1StateRaw(t.getStateRaw()); + row.setDo1AdditionalData(t.getAdditionalData()); + } else { + row.setDo2No(t.getTerminalNo()); + row.setDo2OutputState(t.getOutputState()); + row.setDo2StateRaw(t.getStateRaw()); + row.setDo2AdditionalData(t.getAdditionalData()); + } } - - // 3. 保存 - csdjDao.saveOrUpdateDeviceRealtime(deviceRealtime); - } catch (JsonProcessingException e) { - log.error("[CSDJ] 序列化 JSON 失败", e); } }