Bladeren bron

refactor(alarm): 优化告警数据处理逻辑

- 将预警相关字段注解统一改为告警类型描述
- 移除告警数据服务中的分页和列表导入依赖
- 更新告警保存方法注释说明等级更新和工单创建规则
- 删除告警服务实现类中的案件自动创建功能
- 移除告警服务中的事务模板和设备基础信息查询相关代码
- 在设备状态服务中添加设备重新上线时自动处理离线告警功能
- 实现离线告警恢复的事务同步处理机制
林仔 3 weken geleden
bovenliggende
commit
d6de66209a

+ 4 - 4
zk-api-service/src/main/java/com/zksy/api/domain/AlarmData.java

@@ -31,19 +31,19 @@ public class AlarmData implements Serializable {
     private String deviceCode;
 
     @TableField(value = "warning_type")
-    @ApiModelProperty(value = "预警类型")
+    @ApiModelProperty(value = "告警类型")
     private String warningType;
 
     @TableField(value = "warning_code")
-    @ApiModelProperty(value = "预警编码")
+    @ApiModelProperty(value = "告警编码")
     private String warningCode;
 
     @TableField(value = "min_value")
-    @ApiModelProperty(value = "预警最小值,小于等于该值视为报警")
+    @ApiModelProperty(value = "告警最小值,小于等于该值视为报警")
     private BigDecimal minValue;
 
     @TableField(value = "max_value")
-    @ApiModelProperty(value = "预警最大值,大于等于该值视为报警")
+    @ApiModelProperty(value = "告警最大值,大于等于该值视为报警")
     private BigDecimal maxValue;
 
     @TableField(value = "actual_value")

+ 1 - 3
zk-api-service/src/main/java/com/zksy/api/service/AlarmDataService.java

@@ -1,14 +1,12 @@
 package com.zksy.api.service;
 
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.zksy.api.domain.AlarmData;
 
-import java.util.List;
 import java.math.BigDecimal;
 
 public interface AlarmDataService extends IService<AlarmData> {
-    /** 新增、同级跳过或更新未处理告警等级均返回true;只有新增才创建案件/工单。 */
+    /** 新增、同级跳过或等级更新均返回true;所有采集告警(含井盖)均不自动创建工单或案件。 */
     boolean saveAlarmData(AlarmData alarmData);
 
     /** 收到明确恢复状态时处理同设备、同编码的未处理告警;返回更新条数,0也是正常完成。 */

+ 3 - 81
zk-api-service/src/main/java/com/zksy/api/service/impl/AlarmDataServiceImpl.java

@@ -1,52 +1,25 @@
 package com.zksy.api.service.impl;
 
-import static com.zksy.common.utils.CollectionSideEffects.*;
-
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.zksy.api.domain.*;
-import com.zksy.api.enums.EquipmentTypeEnum;
-import com.zksy.api.mapper.*;
+import com.zksy.api.domain.AlarmData;
+import com.zksy.api.mapper.AlarmDataMapper;
 import com.zksy.api.service.AlarmDataService;
 import com.zksy.api.service.CollectionAlarmWriter;
 import com.zksy.api.utils.EarlyWarningLevelUtil;
-import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.PlatformTransactionManager;
-import org.springframework.transaction.support.TransactionTemplate;
 
-import java.time.LocalDateTime;
 import java.math.BigDecimal;
-import java.time.format.DateTimeFormatter;
-import java.util.Random;
 
-@Slf4j
 @Service
 public class AlarmDataServiceImpl extends ServiceImpl<AlarmDataMapper, AlarmData> implements AlarmDataService {
 
-    @Autowired
-    private EquipmentBaseApiMapper equipmentBaseApiMapper;
-
-    @Autowired
-    private CaseInfoApiMapper caseInfoApiMapper;
-
-    @Autowired
-    private PlatformTransactionManager transactionManager;
-
     @Autowired
     private CollectionAlarmWriter collectionAlarmWriter;
 
     @Override
     public boolean saveAlarmData(AlarmData alarmData) {
-        boolean inserted = collectionAlarmWriter.saveOrUpdateUnhandled(alarmData);
-        if (inserted) {
-            try {
-                new TransactionTemplate(transactionManager).executeWithoutResult(status -> syncCreateCase(alarmData));
-            } catch (Exception e) {
-                log.error("保存告警后同步创建案件失败,alarmId={}", alarmData.getId(), e);
-            }
-        }
+        collectionAlarmWriter.saveOrUpdateUnhandled(alarmData);
         // 复用原告警(等级更新/同级跳过)也是正常完成,不影响后续短信、设备状态和采集。
         return true;
     }
@@ -67,55 +40,4 @@ public class AlarmDataServiceImpl extends ServiceImpl<AlarmDataMapper, AlarmData
         return recoverAlarm(deviceCode, warningCode);
     }
 
-    /**
-     * 根据设备类别ID同步创建案件
-     */
-    private void syncCreateCase(AlarmData alarmData) {
-        log.info("保存设备告警后同步创建案件-入参:{}", alarmData);
-        // 根据设备编码查询设备基础信息
-        EquipmentBase equipmentBase = equipmentBaseApiMapper.selectOne(new LambdaQueryWrapper<EquipmentBase>().eq(EquipmentBase::getEquipmentCode, alarmData.getDeviceCode()).last("LIMIT 1"));
-        if (equipmentBase == null) {
-            log.warn("未找到设备编码对应的设备信息,deviceCode={}", alarmData.getDeviceCode());
-            return;
-        }
-
-        CaseInfo caseInfo = null;
-
-        int caseLevel = alarmData.getAlarmLevel() != null ? alarmData.getAlarmLevel() : 4;
-
-        // 构建告警描述
-        String desc = alarmData.getWarningType() != null ? alarmData.getWarningType() : "设备告警";
-        if (alarmData.getRemark() != null) {
-            desc += "-" + alarmData.getRemark();
-        }
-
-        if (EquipmentTypeEnum.MANHOLE_COVER_MONITOR.getId().equals(equipmentBase.getEquipmentTypeId())) {
-            // 同步新增案件信息
-            caseInfo = new CaseInfo();
-            caseInfo.setCaseNo(generateCaseNo());
-            caseInfo.setAlarmId(alarmData.getId());
-            caseInfo.setEquipmentId(equipmentBase.getEquipmentId());
-            caseInfo.setCaseLevel(caseLevel);
-            caseInfo.setCaseDesc(desc);
-            caseInfo.setCaseSource(1); // 1-系统自动报警
-            caseInfo.setCaseStatus(1); // 1-待核查
-            requireSaved(caseInfoApiMapper.insert(caseInfo) > 0);
-            log.info("同步新增案件信息成功,caseNo={}, alarmId={}", caseInfo.getCaseNo(), alarmData.getId());
-        }
-
-    }
-
-    /**
-     * 生成案件编号:CS + 年月日时分秒 + 4位随机数
-     */
-    public static String generateCaseNo() {
-        // 1. 获取当前时间,格式化为14位年月日时分秒
-        String currentDateTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
-        // 2. 生成4位随机数,不足补0
-        String randomNum = String.format("%04d", new Random().nextInt(10000));
-        // 3. 拼接完整编号
-        return "CS" + currentDateTime + randomNum;
-    }
-
-
 }

+ 19 - 0
zk-api-service/src/main/java/com/zksy/api/service/impl/EquipmentStatusApiServiceImpl.java

@@ -147,6 +147,10 @@ public class EquipmentStatusApiServiceImpl implements EquipmentStatusApiService
             if (previousOnlineStatus != null && previousOnlineStatus == 1 && onlineStatus == 0) {
                 saveOfflineAlarmAfterCommit(deviceCode);
             }
+            // 收到有效数据重新上线后,自动处理对应的离线告警;恢复失败不影响在线状态和后续采集。
+            if (previousOnlineStatus != null && previousOnlineStatus == 0 && onlineStatus == 1) {
+                recoverOfflineAlarmAfterCommit(deviceCode);
+            }
         } else {
             EquipmentStatus newStatus = new EquipmentStatus();
             newStatus.setEquipmentId(equipmentId);
@@ -199,4 +203,19 @@ public class EquipmentStatusApiServiceImpl implements EquipmentStatusApiService
             log.info("设备离线报警数据入库成功: deviceCode={}, alarmId={}", deviceCode, alarmData.getId());
         }
     }
+
+    private void recoverOfflineAlarmAfterCommit(String deviceCode) {
+        if (TransactionSynchronizationManager.isSynchronizationActive()) {
+            TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
+                @Override
+                public void afterCommit() {
+                    run(deviceCode, "离线告警恢复独立事务", () ->
+                            collectionAlarmWriter.markRecovered(deviceCode, "OFFLINE"));
+                }
+            });
+        } else {
+            run(deviceCode, "离线告警恢复", () ->
+                    collectionAlarmWriter.markRecovered(deviceCode, "OFFLINE"));
+        }
+    }
 }