Ver código fonte

fix(water): harden device work order dispatch and shared pump contract

Kazerin 1 dia atrás
pai
commit
224a506867

+ 3 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/base/domain/vo/MaintainOrderVO.java

@@ -32,6 +32,9 @@ public class MaintainOrderVO {
     @ApiModelProperty("单一接单责任人用户ID")
     private Long receiveUserId;
 
+    @ApiModelProperty("工单优先级:1-紧急 2-一般 3-低")
+    private Integer orderLevel;
+
     @ApiModelProperty("维护人")
     private String maintainPerson;
 

+ 4 - 1
pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/impl/WaterSupplyDeviceServiceImpl.java

@@ -398,11 +398,14 @@ public class WaterSupplyDeviceServiceImpl extends ServiceImpl<EquipmentBaseMappe
         if (device == null) {
             throw new RuntimeException("仅支持供水设备派发维修工单");
         }
+        if (getLatestWorkOrderMap(Collections.singletonList(device)).containsKey(device.getEquipmentId())) {
+            throw new RuntimeException("该设备已有未结束故障维修工单,不能重复创建");
+        }
         WorkOrder workOrder = new WorkOrder();
         workOrder.setDeviceId(device.getEquipmentId());
         workOrder.setDeviceCode(device.getEquipmentCode());
         workOrder.setOrderType(1);
-        workOrder.setOrderLevel(2);
+        workOrder.setOrderLevel(vo.getOrderLevel() == null ? 2 : vo.getOrderLevel());
         workOrder.setOrderDesc(StrUtil.isNotBlank(vo.getFaultDescription()) ? vo.getFaultDescription() : vo.getMaintainContent());
         Long orderId = businessWorkOrderService.createWorkOrder(workOrder);
         workOrder.setOrderId(orderId);

+ 2 - 2
pipe-network-service/zksy-system/src/main/resources/mapper/WaterSupply/WaterSupplyGisMap/WaterSupplyGisMapMapper.xml

@@ -11,7 +11,7 @@
     </select>
     <select id="selectPumpStationFeatures" resultType="java.util.Map">
         SELECT id, station_code code, station_name name, status, "location", longitude, latitude
-        FROM app_user.water_pump_station WHERE del_flag = '0' AND longitude IS NOT NULL AND latitude IS NOT NULL
+        FROM app_user.pump_station WHERE del_flag = '0' AND station_type = 'water_supply' AND longitude IS NOT NULL AND latitude IS NOT NULL
     </select>
     <select id="selectPipeFeatures" resultType="java.util.Map">
         SELECT id, pipe_code code, pipe_name name, status, start_point AS "location",
@@ -34,7 +34,7 @@
         FROM app_user.water_plant_info WHERE del_flag = '0'
         UNION ALL
         SELECT 'pumpStation', '泵站', COUNT(*), COALESCE(SUM(CASE WHEN longitude IS NOT NULL AND latitude IS NOT NULL THEN 1 ELSE 0 END), 0), COALESCE(SUM(CASE WHEN longitude IS NULL OR latitude IS NULL THEN 1 ELSE 0 END), 0)
-        FROM app_user.water_pump_station WHERE del_flag = '0'
+        FROM app_user.pump_station WHERE del_flag = '0' AND station_type = 'water_supply'
         UNION ALL
         SELECT 'pipe', '供水管网', COUNT(*), COALESCE(SUM(CASE WHEN start_longitude IS NOT NULL AND start_latitude IS NOT NULL AND end_longitude IS NOT NULL AND end_latitude IS NOT NULL THEN 1 ELSE 0 END), 0), COALESCE(SUM(CASE WHEN start_longitude IS NULL OR start_latitude IS NULL OR end_longitude IS NULL OR end_latitude IS NULL THEN 1 ELSE 0 END), 0)
         FROM app_user.water_pipe_info WHERE del_flag = '0'

+ 26 - 1
pipe-network-service/zksy-system/src/test/java/com/zksy/base/service/impl/WaterSupplyDeviceServiceImplTest.java

@@ -513,6 +513,7 @@ class WaterSupplyDeviceServiceImplTest {
         MaintainOrderVO request = new MaintainOrderVO();
         request.setEquipmentId(pressureDevice.getEquipmentId());
         request.setMaintainContent("压力异常");
+        request.setOrderLevel(1);
         request.setMaintainRemark("请尽快处理");
         request.setReceiveUserId(88L);
         when(businessWorkOrderService.createWorkOrder(any(WorkOrder.class))).thenAnswer(invocation -> {
@@ -527,10 +528,34 @@ class WaterSupplyDeviceServiceImplTest {
         assertTrue(service.createMaintainOrder(request));
 
         verify(equipmentMaintainMapper, never()).insert(any(EquipmentMaintain.class));
-        verify(businessWorkOrderService).createWorkOrder(any(WorkOrder.class));
+        ArgumentCaptor<WorkOrder> orderCaptor = ArgumentCaptor.forClass(WorkOrder.class);
+        verify(businessWorkOrderService).createWorkOrder(orderCaptor.capture());
+        assertEquals(1, orderCaptor.getValue().getOrderType());
+        assertEquals(1, orderCaptor.getValue().getOrderLevel());
         verify(businessWorkOrderService).dispatchOrder(100L, 88L, "请尽快处理", null, null);
     }
 
+    @Test
+    void createAbnormalWorkOrderRejectsWhenDeviceHasActiveWorkOrder() {
+        MaintainOrderVO request = new MaintainOrderVO();
+        request.setEquipmentId(pressureDevice.getEquipmentId());
+        request.setMaintainContent("压力异常");
+        doReturn(pressureDevice).when(service).getById(pressureDevice.getEquipmentId());
+
+        WorkOrder activeOrder = new WorkOrder();
+        activeOrder.setDeviceId(pressureDevice.getEquipmentId());
+        activeOrder.setOrderNo("WO-ACTIVE");
+        activeOrder.setOrderType(1);
+        activeOrder.setOrderStatus(2);
+        when(workOrderMapper.selectList(any())).thenReturn(Collections.singletonList(activeOrder));
+
+        RuntimeException error = assertThrows(RuntimeException.class,
+                () -> service.createAbnormalWorkOrder(request));
+
+        assertEquals("该设备已有未结束故障维修工单,不能重复创建", error.getMessage());
+        verify(businessWorkOrderService, never()).createWorkOrder(any(WorkOrder.class));
+    }
+
     @Test
     void maintainRecordListDoesNotExposeNonWaterDevices() {
         EquipmentMaintain gasRecord = new EquipmentMaintain();