Przeglądaj źródła

fix(waterSupply): 实时报警列表不再按报警状态硬过滤,改为富化后排除已解除 (#58)

Kazerin 1 miesiąc temu
rodzic
commit
72017c3f6a

+ 1 - 1
pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/WaterSupply/MonitorAlarm/WaterSupplyAlarmController.java

@@ -55,7 +55,7 @@ public class WaterSupplyAlarmController {
     }
 
     @GetMapping("/realtime")
-    @ApiOperation("设备实时异常列表(未处理报警,信息卡片)")
+    @ApiOperation("设备实时异常列表(待审核/已转工单,已解除不返回)")
     @PreAuthorize("@ss.hasPermi('waterSupply:alarm:list')")
     public AjaxResult getRealtimeAlarmList() {
         List<WaterAlarmOutDTO> list = waterSupplyAlarmService.getRealtimeAlarmList();

+ 5 - 2
pipe-network-service/zksy-system/src/main/java/com/zksy/WaterSupply/MonitorAlarm/service/impl/WaterSupplyAlarmServiceImpl.java

@@ -242,13 +242,16 @@ public class WaterSupplyAlarmServiceImpl implements IWaterSupplyAlarmService {
         if (waterCodes.isEmpty()) {
             return new ArrayList<>();
         }
+        // 不能按 alarm_status 硬过滤为待处理:已处理但仍有未取消工单的报警
+        // 必须保留在实时列表中;已解除(展示状态 3)的报警在富化后排除。
         List<AlarmData> alarms = alarmDataService.list(new LambdaQueryWrapper<AlarmData>()
                 .in(AlarmData::getDeviceCode, waterCodes)
-                .eq(AlarmData::getAlarmStatus, 0)
                 .orderByDesc(AlarmData::getAlarmTime));
         // 实时列表复用台账富化口径:首页需按“待审核 / 已转工单”分流,
         // 行内必须携带展示状态、设备报警状态与关联工单号(T05R / Issue #58)。
-        return buildLedgerVoList(alarms);
+        return buildLedgerVoList(alarms).stream()
+                .filter(row -> !Integer.valueOf(DISPLAY_RELEASED).equals(row.getDisplayStatus()))
+                .collect(Collectors.toList());
     }
 
     @Override

+ 44 - 0
pipe-network-service/zksy-system/src/test/java/com/zksy/WaterSupply/MonitorAlarm/WaterSupplyAlarmRealtimeContractTest.java

@@ -29,6 +29,7 @@ import java.util.Collections;
 import java.util.List;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
@@ -156,4 +157,47 @@ class WaterSupplyAlarmRealtimeContractTest {
         assertEquals("待审核", row.getDisplayStatusText());
         assertEquals(1, row.getDeviceAlarmStatus());
     }
+
+    @Test
+    void realtimeAlarmHandledButWithLiveOrderAppearsAsTransferred() {
+        AlarmData transferred = alarm("alarm-3", "CN-GS-202609020001", "压力过低", 1, 1);
+        // 以数据库语义驱动:若查询硬过滤 alarm_status=0,
+        // 已处理(alarm_status=1)但仍有未取消工单的报警不会命中,要求不得排除。
+        when(alarmDataService.list(any(AbstractWrapper.class))).thenAnswer(inv -> {
+            AbstractWrapper<?, ?, ?> wrapper = inv.getArgument(0);
+            if (wrapper.getSqlSegment().toLowerCase().contains("alarm_status")) {
+                return Collections.emptyList();
+            }
+            return Collections.singletonList(transferred);
+        });
+        WorkOrder order = new WorkOrder();
+        order.setAlarmId("alarm-3");
+        order.setOrderNo("WO202609151800002345");
+        order.setOrderStatus(3);
+        when(workOrderMapper.selectList(any())).thenReturn(Collections.singletonList(order));
+        when(alarmAuditMapper.selectList(any())).thenReturn(Collections.emptyList());
+        when(equipmentStatusMapper.selectList(any())).thenReturn(Collections.singletonList(
+                status("EQ-P-1", 1, 1, 1)));
+
+        List<WaterAlarmOutDTO> rows = service.getRealtimeAlarmList();
+
+        assertEquals(1, rows.size());
+        WaterAlarmOutDTO row = rows.get(0);
+        assertEquals(2, row.getDisplayStatus());
+        assertEquals("已转工单", row.getDisplayStatusText());
+        assertEquals("WO202609151800002345", row.getOrderNo());
+        assertEquals(1, row.getDeviceAlarmStatus());
+    }
+
+    @Test
+    void releasedAlarmIsFilteredOutOfRealtimeList() {
+        when(alarmDataService.list(any(AbstractWrapper.class))).thenReturn(
+                Collections.singletonList(alarm("alarm-4", "CN-GS-202609020001", "流量异常", 1, 3)));
+        when(workOrderMapper.selectList(any())).thenReturn(Collections.emptyList());
+        when(alarmAuditMapper.selectList(any())).thenReturn(Collections.emptyList());
+        when(equipmentStatusMapper.selectList(any())).thenReturn(Collections.singletonList(
+                status("EQ-P-1", 0, 1, 1)));
+
+        assertTrue(service.getRealtimeAlarmList().isEmpty());
+    }
 }