Ver Fonte

预警,报警等级类型统一

zengy há 1 dia atrás
pai
commit
3c734fe93f
42 ficheiros alterados com 189 adições e 211 exclusões
  1. 3 3
      pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/drainage/DrainageWarningController.java
  2. 1 1
      pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/gasbasic/GasAlarmController.java
  3. 1 1
      pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/gasbasic/PressureAlarmController.java
  4. 2 2
      pipe-network-service/zksy-admin/src/test/java/com/zksy/web/controller/cockpit/BusinessCockpitMonitoringSituationAdapterTest.java
  5. 1 1
      pipe-network-service/zksy-admin/src/test/java/com/zksy/web/controller/cockpit/BusinessCockpitOverviewWarningSettingsAdapterTest.java
  6. 6 1
      pipe-network-service/zksy-admin/src/test/java/com/zksy/web/controller/cockpit/CockpitContractDictionaryTest.java
  7. 6 0
      pipe-network-service/zksy-admin/src/test/java/com/zksy/web/controller/warning/AssignmentCandidateMapperTest.java
  8. 1 1
      pipe-network-service/zksy-system/src/main/java/com/zksy/WaterSupply/MonitorAlarm/dto/out/WaterAlarmOutDTO.java
  9. 2 2
      pipe-network-service/zksy-system/src/main/java/com/zksy/WaterSupply/MonitorAlarm/service/impl/WaterSupplyAlarmServiceImpl.java
  10. 2 2
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/alarm/domain/AlarmData.java
  11. 1 1
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/alarm/dto/AlarmReviewQuery.java
  12. 1 1
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/alarm/dto/MobileAlarmQuery.java
  13. 0 19
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/alarm/enums/AlarmLevelEnum.java
  14. 6 5
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/alarm/service/AlarmOperationsService.java
  15. 2 2
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/alarm/service/AlarmReviewService.java
  16. 2 2
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/domain/vo/AbnormalDeviceVO.java
  17. 2 2
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/domain/vo/DeviceDetailVO.java
  18. 2 2
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/domain/vo/DeviceGisVO.java
  19. 5 2
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/drill/service/DrillAlarmSyncService.java
  20. 1 1
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/drill/service/impl/DrillSimulationServiceImpl.java
  21. 5 2
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/DrillAlarmSyncService.java
  22. 1 1
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/impl/DrillSimulationServiceImpl.java
  23. 7 1
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/impl/RiskAssessmentServiceImpl.java
  24. 19 3
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/impl/WaterSupplyDeviceServiceImpl.java
  25. 6 6
      pipe-network-service/zksy-system/src/main/java/com/zksy/cockpit/event/BusinessCockpitEventAdapter.java
  26. 14 6
      pipe-network-service/zksy-system/src/main/java/com/zksy/cockpit/event/CockpitEventLevelColor.java
  27. 1 1
      pipe-network-service/zksy-system/src/main/java/com/zksy/cockpit/monitoring/BusinessCockpitMonitoringSituationAdapter.java
  28. 4 4
      pipe-network-service/zksy-system/src/main/java/com/zksy/cockpit/overview/BusinessCockpitOverviewWarningSettingsAdapter.java
  29. 5 2
      pipe-network-service/zksy-system/src/main/java/com/zksy/dispatch/mapper/DispatchUserMapper.java
  30. 1 1
      pipe-network-service/zksy-system/src/main/java/com/zksy/drainage/domain/DrainageWarning.java
  31. 4 4
      pipe-network-service/zksy-system/src/main/java/com/zksy/drainage/service/DrainageWarningService.java
  32. 5 5
      pipe-network-service/zksy-system/src/main/java/com/zksy/drainage/service/impl/DrainageWarningServiceImpl.java
  33. 13 96
      pipe-network-service/zksy-system/src/main/java/com/zksy/ops/service/impl/WorkOrderServiceImpl.java
  34. 18 3
      pipe-network-service/zksy-system/src/main/resources/mapper/system/SysUserMapper.xml
  35. 9 1
      pipe-network-service/zksy-system/src/main/resources/mapper/warning/WarningParticipantMapper.xml
  36. 10 7
      pipe-network-service/zksy-system/src/test/java/com/zksy/WaterSupply/MonitorAlarm/WaterSupplyAlarmRealtimeContractTest.java
  37. 1 1
      pipe-network-service/zksy-system/src/test/java/com/zksy/base/alarm/mapper/MobileAlarmMapperTest.java
  38. 5 5
      pipe-network-service/zksy-system/src/test/java/com/zksy/base/alarm/service/AlarmOperationsServiceTest.java
  39. 5 5
      pipe-network-service/zksy-system/src/test/java/com/zksy/base/alarm/service/AlarmReviewServiceTest.java
  40. 4 4
      pipe-network-service/zksy-system/src/test/java/com/zksy/base/service/impl/WaterSupplyDeviceServiceImplTest.java
  41. 2 2
      pipe-network-service/zksy-system/src/test/java/com/zksy/ops/service/impl/WorkOrderServiceImplTest.java
  42. 3 0
      pipe-network-service/zksy-system/src/test/java/com/zksy/system/mapper/SysUserContactsMapperContractTest.java

+ 3 - 3
pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/drainage/DrainageWarningController.java

@@ -37,7 +37,7 @@ public class DrainageWarningController {
     public Page<DrainageWarning> page(
             @ApiParam("页码") @RequestParam(defaultValue = "1") long pageNum,
             @ApiParam("每页数量") @RequestParam(defaultValue = "10") long pageSize,
-            @ApiParam("预警级别(1严重,2重要,3一般)") @RequestParam(required = false) Integer warningLevel,
+            @ApiParam("预警级别(alert_level 字典编码: 1严重,2重要,3一般,4常态)") @RequestParam(required = false) String warningLevel,
             @ApiParam("预警类型") @RequestParam(required = false) String warningType,
             @ApiParam("状态(DRAFT/PENDING/RECEIVED/PROCESSING/HANDLED/CLOSED)") @RequestParam(required = false) String status,
             @ApiParam("开始时间(yyyy-MM-dd HH:mm:ss)") @RequestParam(required = false) String startTime,
@@ -51,7 +51,7 @@ public class DrainageWarningController {
     public Page<DrainageWarning> currentPage(
             @ApiParam("页码") @RequestParam(defaultValue = "1") long pageNum,
             @ApiParam("每页数量") @RequestParam(defaultValue = "10") long pageSize,
-            @ApiParam("预警级别(1严重,2重要,3一般)") @RequestParam(required = false) Integer warningLevel,
+            @ApiParam("预警级别(alert_level 字典编码: 1严重,2重要,3一般,4常态)") @RequestParam(required = false) String warningLevel,
             @ApiParam("预警类型") @RequestParam(required = false) String warningType,
             @ApiParam("当前用户ID") @RequestParam(required = false) Long userId,
             @ApiParam("当前用户部门ID") @RequestParam(required = false) Long deptId,
@@ -71,7 +71,7 @@ public class DrainageWarningController {
     public Page<DrainageWarning> historyPage(
             @ApiParam("页码") @RequestParam(defaultValue = "1") long pageNum,
             @ApiParam("每页数量") @RequestParam(defaultValue = "10") long pageSize,
-            @ApiParam("预警级别(1严重,2重要,3一般)") @RequestParam(required = false) Integer warningLevel,
+            @ApiParam("预警级别(alert_level 字典编码: 1严重,2重要,3一般,4常态)") @RequestParam(required = false) String warningLevel,
             @ApiParam("预警类型") @RequestParam(required = false) String warningType,
             @ApiParam("状态(HANDLED/CLOSED)") @RequestParam(required = false) String status,
             @ApiParam("开始时间(yyyy-MM-dd HH:mm:ss)") @RequestParam(required = false) String startTime,

+ 1 - 1
pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/gasbasic/GasAlarmController.java

@@ -76,7 +76,7 @@ public class GasAlarmController {
         m.put("concentration", a.getActualValue());
         m.put("threshold", a.getMaxValue());
         m.put("alarmLevel", a.getAlarmLevel());
-        m.put("alarmLevelText", a.getAlarmLevel() != null && a.getAlarmLevel() == 1 ? "严重" : "预警");
+        m.put("alarmLevelText", "1".equals(a.getAlarmLevel()) ? "严重" : "预警");
         m.put("createTime", a.getCreateTime() != null ? a.getCreateTime().format(FMT) : "");
         m.put("alarmStatus", a.getAlarmStatus());
         m.put("statusText", a.getAlarmStatus() != null && a.getAlarmStatus() == 0 ? "待处理" : "已处理");

+ 1 - 1
pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/gasbasic/PressureAlarmController.java

@@ -71,7 +71,7 @@ public class PressureAlarmController {
         m.put("pointName", eq != null ? eq.getEquipmentName() : a.getDeviceCode());
         m.put("address", eq != null ? eq.getEquipmentLocation() : "");
         m.put("pressure", a.getActualValue()); m.put("threshold", a.getMaxValue());
-        m.put("alarmLevelText", a.getAlarmLevel() != null && a.getAlarmLevel() == 1 ? "严重" : "预警");
+        m.put("alarmLevelText", "1".equals(a.getAlarmLevel()) ? "严重" : "预警");
         m.put("createTime", a.getCreateTime() != null ? a.getCreateTime().format(FMT) : "");
         m.put("alarmStatus", a.getAlarmStatus());
         m.put("statusText", a.getAlarmStatus() != null && a.getAlarmStatus() == 0 ? "待处理" : "已处理");

+ 2 - 2
pipe-network-service/zksy-admin/src/test/java/com/zksy/web/controller/cockpit/BusinessCockpitMonitoringSituationAdapterTest.java

@@ -122,7 +122,7 @@ class BusinessCockpitMonitoringSituationAdapterTest {
         alarm.setId("A-1");
         alarm.setDeviceCode("ALARM-1");
         alarm.setDeviceType("流量监测");
-        alarm.setAlarmLevel(3);
+        alarm.setAlarmLevel("3");
         alarm.setCreateTime(LocalDateTime.parse("2026-09-02T09:40:00"));
         stubEvents(Collections.singletonList(warning), Collections.singletonList(alarm));
 
@@ -150,7 +150,7 @@ class BusinessCockpitMonitoringSituationAdapterTest {
         alarm.setId("A-ORPHAN");
         alarm.setDeviceCode("NOT-IN-LEDGER");
         alarm.setDeviceType("流量监测");
-        alarm.setAlarmLevel(1);
+        alarm.setAlarmLevel("1");
         alarm.setCreateTime(LocalDateTime.parse("2026-09-02T09:40:00"));
         stubEvents(Collections.emptyList(), Collections.singletonList(alarm));
 

+ 1 - 1
pipe-network-service/zksy-admin/src/test/java/com/zksy/web/controller/cockpit/BusinessCockpitOverviewWarningSettingsAdapterTest.java

@@ -77,7 +77,7 @@ class BusinessCockpitOverviewWarningSettingsAdapterTest {
         alarm.setDeviceCode("GAS-001");
         alarm.setWorkOrderId(1001L);
         alarm.setAlarmStatus(1);
-        alarm.setAlarmLevel(3);
+        alarm.setAlarmLevel("3");
         alarm.setCreateTime(LocalDateTime.parse("2026-09-02T10:00:00"));
         when(alarmDataService.list()).thenReturn(Collections.singletonList(alarm));
 

+ 6 - 1
pipe-network-service/zksy-admin/src/test/java/com/zksy/web/controller/cockpit/CockpitContractDictionaryTest.java

@@ -50,8 +50,13 @@ class CockpitContractDictionaryTest {
         assertEquals("YELLOW", CockpitEventLevelColor.resolve(2));
         assertEquals("BLUE", CockpitEventLevelColor.resolve(3));
         assertEquals("GREEN", CockpitEventLevelColor.resolve(4));
-        assertEquals("UNKNOWN", CockpitEventLevelColor.resolve(null));
         assertEquals("UNKNOWN", CockpitEventLevelColor.resolve(9));
+        // 字典编码入口(字符串)与归一化入口(Integer)同词表
+        assertEquals("RED", CockpitEventLevelColor.resolve("1"));
+        assertEquals("GREEN", CockpitEventLevelColor.resolve("4"));
+        assertEquals("UNKNOWN", CockpitEventLevelColor.resolve("9"));
+        assertEquals("UNKNOWN", CockpitEventLevelColor.resolve((Integer) null));
+        assertEquals("UNKNOWN", CockpitEventLevelColor.resolve((String) null));
     }
 
     @Test

+ 6 - 0
pipe-network-service/zksy-admin/src/test/java/com/zksy/web/controller/warning/AssignmentCandidateMapperTest.java

@@ -34,6 +34,9 @@ class AssignmentCandidateMapperTest {
                     "com.zksy.system.mapper.SysUserMapper.selectAssignmentCandidates", params);
             String sql = bound.getSql().replaceAll("\\s+", " ");
             assertTrue(sql.contains("LEFT JOIN app_user.sys_dept"));
+            assertTrue(sql.contains("LEFT JOIN app_user.sys_dept parent_dept"));
+            assertTrue(sql.contains("CONCAT(parent_dept.dept_name, '.', d.dept_name)"));
+            assertTrue(sql.contains("d.parent_id <> 100"));
             assertTrue(sql.contains("u.status = '0' AND u.del_flag = '0'"));
             assertEquals(company != null, sql.contains("d.status = '0'"));
             assertEquals(company != null, bound.getParameterMappings().stream()
@@ -50,6 +53,9 @@ class AssignmentCandidateMapperTest {
                 "com.zksy.base.warning.mapper.WarningParticipantMapper.selectCandidates", params)
                 .getSql().replaceAll("\\s+", " ");
         assertTrue(sql.contains("LEFT JOIN app_user.sys_dept"));
+        assertTrue(sql.contains("LEFT JOIN app_user.sys_dept parent_dept"));
+        assertTrue(sql.contains("CONCAT(parent_dept.dept_name, '.', d.dept_name)"));
+        assertTrue(sql.contains("d.parent_id <> 100"));
         assertTrue(sql.contains("et.parent_id = 4 OR (d.status = '0' AND d.del_flag = '0' AND ("));
         for (int parent = 1; parent <= 3; parent++)
             assertTrue(sql.contains("et.parent_id = " + parent + " AND (d.dept_id = " + (100 + parent)));

+ 1 - 1
pipe-network-service/zksy-system/src/main/java/com/zksy/WaterSupply/MonitorAlarm/dto/out/WaterAlarmOutDTO.java

@@ -61,7 +61,7 @@ public class WaterAlarmOutDTO implements Serializable {
     private BigDecimal deviationRatio;
 
     @ApiModelProperty(value = "报警等级:alarm_level 字典,保留1-4计算编码,1级最高", example = "1")
-    private Integer alarmLevel;
+    private String alarmLevel;
 
     @ApiModelProperty(value = "报警等级文本", example = "一级报警")
     private String alarmLevelText;

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

@@ -259,8 +259,8 @@ public class WaterSupplyAlarmServiceImpl implements IWaterSupplyAlarmService {
         return waterSupplyQueryService.statusesByDeviceIds(equipmentIds);
     }
 
-    private String formatAlarmLevel(Integer alarmLevel) {
-        String label = alarmLevel == null ? null : dictDataService.selectDictLabel("alarm_level", String.valueOf(alarmLevel));
+    private String formatAlarmLevel(String alarmLevel) {
+        String label = StrUtil.isBlank(alarmLevel) ? null : dictDataService.selectDictLabel("alarm_level", alarmLevel.trim());
         return StrUtil.isBlank(label) ? "未知等级" : label;
     }
 }

+ 2 - 2
pipe-network-service/zksy-system/src/main/java/com/zksy/base/alarm/domain/AlarmData.java

@@ -60,8 +60,8 @@ public class AlarmData implements Serializable {
     private BigDecimal actualValue;
 
     @TableField(value = "alarm_level")
-    @ApiModelProperty(value = "报警等级:alarm_level 字典,保留1-4计算编码,1级最高,名称与样式由字典配置")
-    private Integer alarmLevel;
+    @ApiModelProperty(value = "报警等级:alarm_level 字典编码(1最高~4最低),与 sys_dict_data.dict_value 对齐")
+    private String alarmLevel;
 
     @TableField(value = "deviation_ratio")
     @ApiModelProperty(value = "偏差率(百分比)")

+ 1 - 1
pipe-network-service/zksy-system/src/main/java/com/zksy/base/alarm/dto/AlarmReviewQuery.java

@@ -18,7 +18,7 @@ public class AlarmReviewQuery {
     @Size(max = 100)
     private String keyword;
     @ApiModelProperty("报警等级:alarm_level 字典启用值,保留1-4编码,1级最高")
-    private Integer alarmLevel;
+    private String alarmLevel;
     private Integer auditStatus;
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss[.SSSSSS]")
     private LocalDateTime startTime;

+ 1 - 1
pipe-network-service/zksy-system/src/main/java/com/zksy/base/alarm/dto/MobileAlarmQuery.java

@@ -9,7 +9,7 @@ public class MobileAlarmQuery {
     private Integer rootTypeId;
     @Size(max = 100)
     private String keyword;
-    private Integer alarmLevel;
+    private String alarmLevel;
     private Integer auditStatus;
     @Min(1)
     private long pageNum = 1;

+ 0 - 19
pipe-network-service/zksy-system/src/main/java/com/zksy/base/alarm/enums/AlarmLevelEnum.java

@@ -1,19 +0,0 @@
-package com.zksy.base.alarm.enums;
-
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-import java.util.Arrays;
-
-/** 报警等级。 */
-@Getter
-@AllArgsConstructor
-public enum AlarmLevelEnum {
-    LEVEL_ONE(1, "一级报警"), LEVEL_TWO(2, "二级报警"), LEVEL_THREE(3, "三级报警"), LEVEL_FOUR(4, "四级报警");
-
-    private final int code;
-    private final String label;
-
-    public static AlarmLevelEnum fromCode(Integer code) {
-        return Arrays.stream(values()).filter(value -> code != null && value.code == code).findFirst().orElse(null);
-    }
-}

+ 6 - 5
pipe-network-service/zksy-system/src/main/java/com/zksy/base/alarm/service/AlarmOperationsService.java

@@ -109,7 +109,8 @@ public class AlarmOperationsService {
             String date = first.plusDays(offset).toString();
             Map<String, Object> item = new LinkedHashMap<>();
             item.put("date", date);
-            for (AlarmLevelEnum level : AlarmLevelEnum.values()) item.put("level" + level.getCode() + "Count", 0L);
+            // 等级桶按 alarm_level 字典动态生成(字典为权威来源,不硬编码等级集合)
+            for (SysDictData level : alarmLevels()) item.put("level" + level.getDictValue() + "Count", 0L);
             trend.put(date, item);
         }
         AlarmDashboardVO result = new AlarmDashboardVO();
@@ -117,10 +118,10 @@ public class AlarmOperationsService {
             result = mapper.selectDashboardCounts(query, typeIds, AlarmStatusEnum.ALARM.getCode());
             for (Map<String, Object> row : mapper.selectDashboardTrend(query, typeIds,
                     first.atStartOfDay(), today.plusDays(1).atStartOfDay())) {
-                Number code = (Number) row.get("level");
-                AlarmLevelEnum level = AlarmLevelEnum.fromCode(code == null ? null : code.intValue());
+                Object levelCode = row.get("level");
+                String level = levelCode == null ? null : String.valueOf(levelCode).trim();
                 Map<String, Object> day = trend.get(String.valueOf(row.get("date")));
-                if (day != null && level != null) day.put("level" + level.getCode() + "Count", row.get("total"));
+                if (day != null && level != null && level.matches("[1-4]")) day.put("level" + level + "Count", row.get("total"));
             }
             result.setWarningTypeRatio(mapper.countByWarningType(query, typeIds));
             result.setDeviceTypeRatio(mapper.countByDeviceType(query, typeIds));
@@ -200,7 +201,7 @@ public class AlarmOperationsService {
     }
     private void validate(AlarmQuery query) {
         if (query.getPageNum() < 1 || query.getPageSize() < 1 || query.getPageSize() > 100) throw new ServiceException("分页参数无效");
-        if (query.getAlarmLevel() != null && alarmLevels().stream().noneMatch(v -> String.valueOf(query.getAlarmLevel()).equals(v.getDictValue()))) throw new ServiceException("报警等级无效");
+        if (query.getAlarmLevel() != null && alarmLevels().stream().noneMatch(v -> v.getDictValue().equals(query.getAlarmLevel()))) throw new ServiceException("报警等级无效");
         if (query.getAuditStatus() != null && AlarmAuditStatusEnum.fromCode(query.getAuditStatus()) == null) throw new ServiceException("审核结果无效");
         if (query.getAlarmStatus() != null && AlarmRecordStatusEnum.fromCode(query.getAlarmStatus()) == null) throw new ServiceException("监测状态无效");
         if (query.getDisplayStatus() != null && (query.getDisplayStatus() < 1 || query.getDisplayStatus() > 4)) throw new ServiceException("报警展示状态无效");

+ 2 - 2
pipe-network-service/zksy-system/src/main/java/com/zksy/base/alarm/service/AlarmReviewService.java

@@ -138,7 +138,7 @@ public class AlarmReviewService {
         options.put("auditStatuses", Arrays.stream(AlarmAuditStatusEnum.values())
                 .map(value -> option(value.name(), value.getCode(), value.getLabel())).collect(Collectors.toList()));
         options.put("alarmLevels", alarmLevels().stream()
-                .map(value -> option(AlarmLevelEnum.fromCode(Integer.valueOf(value.getDictValue())).name(),
+                .map(value -> option(value.getDictValue(),
                         Integer.parseInt(value.getDictValue()), value.getDictLabel())).collect(Collectors.toList()));
         options.put("rootTypes", Arrays.stream(EquipmentTypeEnum.values()).filter(EquipmentTypeEnum::isRoot)
                 .map(value -> option(value.name(), value.getId(), value.getDesc())).collect(Collectors.toList()));
@@ -154,7 +154,7 @@ public class AlarmReviewService {
     private void validate(AlarmReviewQuery query) {
         if (query.getPageNum() < 1 || query.getPageSize() < 1 || query.getPageSize() > 100)
             throw new ServiceException("分页参数无效");
-        if (query.getAlarmLevel() != null && alarmLevels().stream().noneMatch(v -> String.valueOf(query.getAlarmLevel()).equals(v.getDictValue())))
+        if (query.getAlarmLevel() != null && alarmLevels().stream().noneMatch(v -> v.getDictValue().equals(query.getAlarmLevel())))
             throw new ServiceException("报警等级无效");
         if (query.getAuditStatus() != null && AlarmAuditStatusEnum.fromCode(query.getAuditStatus()) == null)
             throw new ServiceException("审核结果无效");

+ 2 - 2
pipe-network-service/zksy-system/src/main/java/com/zksy/base/domain/vo/AbnormalDeviceVO.java

@@ -56,8 +56,8 @@ public class AbnormalDeviceVO {
     @ApiModelProperty("在线状态 0-离线 1-在线")
     private Integer onlineStatus;
 
-    @ApiModelProperty("告警等级 1-4,1级最高")
-    private Integer alertLevel;
+    @ApiModelProperty("告警等级:alarm_level 字典编码,1-4,1级最高")
+    private String alertLevel;
 
     @ApiModelProperty("异常原因(来自未处理报警或维修状态)")
     private String abnormalReason;

+ 2 - 2
pipe-network-service/zksy-system/src/main/java/com/zksy/base/domain/vo/DeviceDetailVO.java

@@ -69,8 +69,8 @@ public class DeviceDetailVO {
     @ApiModelProperty("当前状态")
     private Integer currentStatus;
 
-    @ApiModelProperty("告警等级 1-4,1级最高")
-    private Integer alertLevel;
+    @ApiModelProperty("告警等级:alarm_level 字典编码,1-4,1级最高")
+    private String alertLevel;
 
     @ApiModelProperty("异常原因")
     private String abnormalReason;

+ 2 - 2
pipe-network-service/zksy-system/src/main/java/com/zksy/base/domain/vo/DeviceGisVO.java

@@ -55,8 +55,8 @@ public class DeviceGisVO {
     @ApiModelProperty("当前状态 1-在用 2-闲置 3-维修 4-报废 5-待入库")
     private Integer currentStatus;
 
-    @ApiModelProperty("告警等级 1-4,1级最高(异常设备用)")
-    private Integer alertLevel;
+    @ApiModelProperty("告警等级:alarm_level 字典编码,1-4,1级最高(异常设备用)")
+    private String alertLevel;
 
     @ApiModelProperty("最新监测数据(按设备类型动态返回)")
     private Map<String, Object> latestData;

+ 5 - 2
pipe-network-service/zksy-system/src/main/java/com/zksy/base/drill/service/DrillAlarmSyncService.java

@@ -5,7 +5,6 @@ import com.zksy.base.alarm.domain.AlarmData;
 import com.zksy.base.alarm.mapper.AlarmDataMapper;
 import com.zksy.base.domain.CaseInfo;
 import com.zksy.base.enums.EquipmentTypeEnum;
-import com.zksy.base.alarm.enums.AlarmLevelEnum;
 import com.zksy.base.domain.EquipmentBase;
 import com.zksy.base.mapper.CaseInfoMapper;
 import com.zksy.base.mapper.EquipmentBaseMapper;
@@ -25,6 +24,9 @@ import java.util.Random;
 @Service("drillAlarmSyncServiceDrill")
 public class DrillAlarmSyncService {
 
+    /** 报警等级缺失或无法识别时按最低等级(4)建案。 */
+    private static final int DEFAULT_ALARM_LEVEL = 4;
+
     @Autowired
     private EquipmentBaseMapper equipmentBaseMapper;
 
@@ -52,7 +54,8 @@ public class DrillAlarmSyncService {
         }
         Integer typeId = equipmentBase.getEquipmentTypeId();
         boolean needCreateCase = EquipmentTypeEnum.MANHOLE_COVER_MONITOR.getId().equals(typeId);
-        int caseLevel = alarmData.getAlarmLevel() != null ? alarmData.getAlarmLevel() : AlarmLevelEnum.LEVEL_FOUR.getCode();
+        String level = alarmData.getAlarmLevel() == null ? null : alarmData.getAlarmLevel().trim();
+        int caseLevel = level != null && level.matches("[1-4]") ? Integer.parseInt(level) : DEFAULT_ALARM_LEVEL;
         String desc = "设备告警";
         if (alarmData.getAlarmContent() != null) {
             desc += "-" + alarmData.getAlarmContent();

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

@@ -64,7 +64,7 @@ public class DrillSimulationServiceImpl implements DrillSimulationService {
                 alarm.setMinValue(new BigDecimal("0"));
                 alarm.setMaxValue(new BigDecimal("100"));
                 alarm.setActualValue(new BigDecimal("150"));
-                alarm.setAlarmLevel(1);
+                alarm.setAlarmLevel("1");
                 alarm.setAlarmStatus(0);
                 alarm.setDeviationRatio(new BigDecimal("50"));
                 alarm.setCreateTime(now);

+ 5 - 2
pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/DrillAlarmSyncService.java

@@ -5,7 +5,6 @@ import com.zksy.base.alarm.domain.AlarmData;
 import com.zksy.base.alarm.mapper.AlarmDataMapper;
 import com.zksy.base.domain.CaseInfo;
 import com.zksy.base.enums.EquipmentTypeEnum;
-import com.zksy.base.alarm.enums.AlarmLevelEnum;
 import com.zksy.base.domain.EquipmentBase;
 import com.zksy.base.mapper.CaseInfoMapper;
 import com.zksy.base.mapper.EquipmentBaseMapper;
@@ -22,6 +21,9 @@ import java.util.Random;
 @Service
 public class DrillAlarmSyncService {
 
+    /** 报警等级缺失或无法识别时按最低等级(4)建案。 */
+    private static final int DEFAULT_ALARM_LEVEL = 4;
+
     @Autowired
     private EquipmentBaseMapper equipmentBaseMapper;
     @Autowired
@@ -47,7 +49,8 @@ public class DrillAlarmSyncService {
         }
         Integer typeId = equipmentBase.getEquipmentTypeId();
         boolean needCreateCase = EquipmentTypeEnum.MANHOLE_COVER_MONITOR.getId().equals(typeId);
-        int caseLevel = alarmData.getAlarmLevel() != null ? alarmData.getAlarmLevel() : AlarmLevelEnum.LEVEL_FOUR.getCode();
+        String level = alarmData.getAlarmLevel() == null ? null : alarmData.getAlarmLevel().trim();
+        int caseLevel = level != null && level.matches("[1-4]") ? Integer.parseInt(level) : DEFAULT_ALARM_LEVEL;
         String desc = "设备告警";
         if (alarmData.getAlarmContent() != null) {
             desc += "-" + alarmData.getAlarmContent();

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

@@ -64,7 +64,7 @@ public class DrillSimulationServiceImpl implements DrillSimulationService {
                 alarm.setMinValue(new BigDecimal("0"));
                 alarm.setMaxValue(new BigDecimal("100"));
                 alarm.setActualValue(new BigDecimal("150"));
-                alarm.setAlarmLevel(1);
+                alarm.setAlarmLevel("1");
                 alarm.setAlarmStatus(0);
                 alarm.setDeviationRatio(new BigDecimal("50"));
                 alarm.setCreateTime(now);

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

@@ -152,7 +152,7 @@ public class RiskAssessmentServiceImpl extends ServiceImpl<RiskAssessmentMapper,
             int unresolvedScore = (int) Math.min(20, networkAlarms.stream()
                     .filter(a -> Objects.equals(a.getAlarmStatus(), 0)).count() * 5);
             int highLevelScore = (int) Math.min(15, networkAlarms.stream()
-                    .filter(a -> a.getAlarmLevel() != null && a.getAlarmLevel() <= 2).count() * 5);
+                    .filter(a -> isHighRiskAlarmLevel(a.getAlarmLevel())).count() * 5);
             int pressureScore = pressureScore(pipe.getNetworkLevel());
             int materialScore = "钢管".equals(pipe.getMaterial()) ? 5 : 2;
             int score = Math.min(100, ageScore + alarmScore + unresolvedScore + highLevelScore + pressureScore + materialScore);
@@ -203,6 +203,12 @@ public class RiskAssessmentServiceImpl extends ServiceImpl<RiskAssessmentMapper,
     private int ageScore(Date date) { int age = ageYears(date); return age == 0 ? 0 : age <= 5 ? 5 : age <= 10 ? 15 : age <= 15 ? 22 : 30; }
     private int alarmFrequencyScore(int count) { return count == 0 ? 0 : count <= 2 ? 10 : count <= 5 ? 20 : 30; }
     private int pressureScore(String level) { if (level == null) return 0; return level.contains("高") || level.toLowerCase().contains("high") ? 20 : level.contains("中") || level.toLowerCase().contains("medium") ? 12 : 5; }
+    /** 高危报警:alarm_level 字典编码 1(最高)或 2;无法识别不计入。 */
+    private boolean isHighRiskAlarmLevel(String level) {
+        if (level == null) return false;
+        String code = level.trim();
+        return "1".equals(code) || "2".equals(code);
+    }
     private String pressureValue(String level) { if (level == null) return null; if (level.contains("高")) return "1.6"; if (level.contains("中")) return "0.4"; if (level.contains("低")) return "0.1"; return null; }
     private Map<String, Integer> dimensions(int age, int alarms, int severity, int pressure, int material) {
         Map<String, Integer> d = new LinkedHashMap<>(); d.put("leakProbability", Math.min(100, alarms * 3 + age * 2)); d.put("consequenceSeverity", Math.min(100, pressure * 4 + severity * 2)); d.put("corrosionRisk", Math.min(100, age * 3 + material * 4)); d.put("thirdPartyRisk", Math.min(100, alarms * 2 + pressure * 2)); d.put("agingLevel", Math.min(100, age * 3)); return d;

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

@@ -400,7 +400,7 @@ public class WaterSupplyDeviceServiceImpl extends ServiceImpl<EquipmentBaseMappe
         if (candidate.getAlarmLevel() == null) {
             return false;
         }
-        if (existing.getAlarmLevel() == null || candidate.getAlarmLevel() < existing.getAlarmLevel()) {
+        if (existing.getAlarmLevel() == null || isMoreSevereLevel(candidate.getAlarmLevel(), existing.getAlarmLevel())) {
             return true;
         }
         return Objects.equals(candidate.getAlarmLevel(), existing.getAlarmLevel())
@@ -408,6 +408,22 @@ public class WaterSupplyDeviceServiceImpl extends ServiceImpl<EquipmentBaseMappe
                 && (existing.getCreateTime() == null || candidate.getCreateTime().isAfter(existing.getCreateTime()));
     }
 
+    /** 报警等级字典编码 '1'(最高)~ '4'(最低):数值越小越严重;非数字编码按最低处理。 */
+    private boolean isMoreSevereLevel(String candidate, String existing) {
+        return alarmLevelRank(candidate) < alarmLevelRank(existing);
+    }
+
+    private int alarmLevelRank(String level) {
+        if (level == null) {
+            return Integer.MAX_VALUE;
+        }
+        try {
+            return Integer.parseInt(level.trim());
+        } catch (NumberFormatException ignored) {
+            return Integer.MAX_VALUE;
+        }
+    }
+
     private Map<String, WorkOrder> getLatestWorkOrderMap(List<EquipmentBase> devices) {
         if (CollUtil.isEmpty(devices)) {
             return new HashMap<>();
@@ -435,12 +451,12 @@ public class WaterSupplyDeviceServiceImpl extends ServiceImpl<EquipmentBaseMappe
         return result;
     }
 
-    private Integer resolveAlertLevel(EquipmentBase device, EquipmentStatus status, Map<String, AlarmData> alarmMap) {
+    private String resolveAlertLevel(EquipmentBase device, EquipmentStatus status, Map<String, AlarmData> alarmMap) {
         if (status != null && !Objects.equals(status.getAlarmStatus(), 1)) {
             return null;
         }
         AlarmData alarm = alarmMap.get(device.getEquipmentCode());
-        return alarm != null && alarm.getAlarmLevel() != null ? alarm.getAlarmLevel() : 4;
+        return alarm != null && alarm.getAlarmLevel() != null ? alarm.getAlarmLevel() : "4";
     }
 
     private void fillAbnormalDeviceVO(AbnormalDeviceVO vo, EquipmentBase base, EquipmentStatus status,

+ 6 - 6
pipe-network-service/zksy-system/src/main/java/com/zksy/cockpit/event/BusinessCockpitEventAdapter.java

@@ -234,7 +234,7 @@ public class BusinessCockpitEventAdapter {
                 trimToNull(warning.getWarningNo()),
                 trimToNull(warning.getWarningType()),
                 level(warning.getWarningLevel()),
-                CockpitEventLevelColor.resolve(level(warning.getWarningLevel())),
+                CockpitEventLevelColor.resolve(warning.getWarningLevel()),
                 trimToNull(warning.getStatus()),
                 offsetTime(warning.getPublishTime()),
                 null,
@@ -253,7 +253,7 @@ public class BusinessCockpitEventAdapter {
                 trimToNull(alarm.getWarningCode()),
                 firstNonBlank(warningTypeName(metadata), alarm.getWarningCode()),
                 null,
-                alarm.getAlarmLevel(),
+                level(alarm.getAlarmLevel()),
                 CockpitEventLevelColor.resolve(alarm.getAlarmLevel()),
                 alarmStatus(alarm.getAlarmStatus()),
                 offsetTime(alarm.getCreateTime()),
@@ -354,7 +354,7 @@ public class BusinessCockpitEventAdapter {
                 trimToNull(alarm.getId()),
                 firstNonBlank(warningTypeName(metadata), alarm.getWarningCode()),
                 null,
-                alarm.getAlarmLevel(),
+                level(alarm.getAlarmLevel()),
                 alarmStatus(alarm.getAlarmStatus()),
                 offsetTime(alarm.getCreateTime()),
                 offsetTime(alarm.getUpdateTime()),
@@ -438,7 +438,7 @@ public class BusinessCockpitEventAdapter {
             EquipmentBase device = facts.devicesByCode.get(normalize(alarm.getDeviceCode()));
             result.add(new CockpitHistoryAnalysisSnapshot.SourceAlarm(
                     trimToNull(alarm.getId()),
-                    alarm.getAlarmLevel(),
+                    level(alarm.getAlarmLevel()),
                     offsetTime(alarm.getCreateTime()),
                     typeCode(alarm.getDeviceCode(), facts),
                     trimToNull(alarm.getDeviceCode()),
@@ -482,7 +482,7 @@ public class BusinessCockpitEventAdapter {
         return facts.alarms.stream()
                 .map(item -> new CockpitHandlingEfficiencySnapshot.SourceAlarm(
                         trimToNull(item.alarm.getId()),
-                        item.alarm.getAlarmLevel(),
+                        level(item.alarm.getAlarmLevel()),
                         offsetTime(item.alarm.getCreateTime()),
                         typeCode(item.alarm.getDeviceCode(), facts),
                         trimToNull(item.alarm.getDeviceCode()),
@@ -551,7 +551,7 @@ public class BusinessCockpitEventAdapter {
                         trimToNull(item.alarm.getId()),
                         null,
                         null,
-                        item.alarm.getAlarmLevel(),
+                        level(item.alarm.getAlarmLevel()),
                         offsetTime(item.alarm.getCreateTime()),
                         districtCode(item.alarm.getDeviceCode(), facts),
                         typeCode(item.alarm.getDeviceCode(), facts),

+ 14 - 6
pipe-network-service/zksy-system/src/main/java/com/zksy/cockpit/event/CockpitEventLevelColor.java

@@ -4,16 +4,24 @@ public final class CockpitEventLevelColor {
     private CockpitEventLevelColor() {
     }
 
-    public static String resolve(Integer level) {
+    public static String resolve(String level) {
         if (level == null) {
             return "UNKNOWN";
         }
-        switch (level) {
-            case 1: return "RED";
-            case 2: return "YELLOW";
-            case 3: return "BLUE";
-            case 4: return "GREEN";
+        switch (level.trim()) {
+            case "1": return "RED";
+            case "2": return "YELLOW";
+            case "3": return "BLUE";
+            case "4": return "GREEN";
             default: return "UNKNOWN";
         }
     }
+
+    /**
+     * 等级配色:快照与服务层以 {@link Integer} 归一化等级,与 {@link #resolve(String)} 同一词表
+     * (1红 2黄 3蓝 4绿,缺失/越期为 UNKNOWN)。
+     */
+    public static String resolve(Integer level) {
+        return level == null ? resolve((String) null) : resolve(String.valueOf(level));
+    }
 }

+ 1 - 1
pipe-network-service/zksy-system/src/main/java/com/zksy/cockpit/monitoring/BusinessCockpitMonitoringSituationAdapter.java

@@ -149,7 +149,7 @@ public class BusinessCockpitMonitoringSituationAdapter implements CockpitMonitor
             EquipmentType type = deviceCode == null ? null : typeByDeviceCode.get(deviceCode);
             alarms.add(new CockpitMonitoringSituationSnapshot.SourceEvent(
                     alarm.getId().trim(),
-                    alarm.getAlarmLevel() == null ? null : String.valueOf(alarm.getAlarmLevel()),
+                    alarm.getAlarmLevel(),
                     offsetTime(alarm.getCreateTime()),
                     industryOf(type, types),
                     typeCodeOf(type),

+ 4 - 4
pipe-network-service/zksy-system/src/main/java/com/zksy/cockpit/overview/BusinessCockpitOverviewWarningSettingsAdapter.java

@@ -118,7 +118,7 @@ public class BusinessCockpitOverviewWarningSettingsAdapter
                     order == null ? null : order.getOrderNo(),
                     order == null || order.getOrderStatus() == null ? null : order.getOrderStatus(),
                     alarmStatus(alarm.getAlarmStatus()),
-                    alarm.getAlarmLevel(),
+                    level(alarm.getAlarmLevel()),
                     districtCode(alarm.getDeviceCode(), deviceByCode),
                     industryCode(alarm.getDeviceCode(), deviceByCode, typesById)));
         }
@@ -138,7 +138,7 @@ public class BusinessCockpitOverviewWarningSettingsAdapter
                     null,
                     null,
                     trimToNull(warning.getStatus()),
-                    warningLevel(warning.getWarningLevel()),
+                    level(warning.getWarningLevel()),
                     districtCode(warning.getDeviceCode(), deviceByCode),
                     industryCode(warning.getDeviceCode(), deviceByCode, typesById)));
         }
@@ -236,8 +236,8 @@ public class BusinessCockpitOverviewWarningSettingsAdapter
         return null;
     }
 
-    /** 预警等级:{@code warning_level} 是字符串,仅 1–4 计算编码有效;其余回 {@code null}。 */
-    private static Integer warningLevel(String level) {
+    /** 等级:{@code alarm_level} / {@code warning_level} 均为字符串字典编码,仅 1–4 有效;其余回 {@code null}。 */
+    private static Integer level(String level) {
         if (level == null) {
             return null;
         }

+ 5 - 2
pipe-network-service/zksy-system/src/main/java/com/zksy/dispatch/mapper/DispatchUserMapper.java

@@ -24,11 +24,14 @@ public interface DispatchUserMapper {
      * 选人下拉:全部启用状态的系统用户(昵称 + 联系电话 + 所属部门ID/名称)
      * 「初判核实」处置人及核验人由此选择,部门名称仅用于区分候选用户。
      */
-    @Select("SELECT u.user_id, u.nick_name, u.phonenumber, u.dept_id, d.dept_name "
+    @Select("SELECT u.user_id, u.nick_name, u.phonenumber, u.dept_id, "
+            + "CASE WHEN d.parent_id IS NOT NULL AND d.parent_id <> 100 AND parent_dept.dept_name IS NOT NULL "
+            + "THEN CONCAT(parent_dept.dept_name, '.', d.dept_name) ELSE d.dept_name END AS dept_name "
             + "FROM app_user.sys_user u "
             + "LEFT JOIN app_user.sys_dept d ON d.dept_id = u.dept_id "
+            + "LEFT JOIN app_user.sys_dept parent_dept ON parent_dept.dept_id = d.parent_id "
             + "WHERE u.del_flag = '0' AND u.status = '0' "
-            + "ORDER BY d.dept_name, u.nick_name")
+            + "ORDER BY parent_dept.order_num, d.order_num, d.dept_id, u.nick_name")
     List<DisUserOptionVO> selectUserOptions();
 
     /**

+ 1 - 1
pipe-network-service/zksy-system/src/main/java/com/zksy/drainage/domain/DrainageWarning.java

@@ -42,7 +42,7 @@ public class DrainageWarning {
     private String equipmentName;
 
     @ApiModelProperty("预警级别(1严重,2重要,3一般)")
-    private Integer warningLevel;
+    private String warningLevel;
 
     @ApiModelProperty("预警类型")
     private String warningType;

+ 4 - 4
pipe-network-service/zksy-system/src/main/java/com/zksy/drainage/service/DrainageWarningService.java

@@ -24,14 +24,14 @@ public interface DrainageWarningService extends IService<DrainageWarning> {
      * @param endTime       结束时间(yyyy-MM-dd HH:mm:ss)
      */
     Page<DrainageWarning> findByPage(long pageNum, long pageSize,
-                                     Integer warningLevel, String warningType,
+                                     String warningLevel, String warningType,
                                      String status, String startTime, String endTime);
 
     /**
      * 查询当前预警(status IN DRAFT/PENDING/RECEIVED/PROCESSING)
      */
     Page<DrainageWarning> findCurrentPage(long pageNum, long pageSize,
-                                          Integer warningLevel, String warningType);
+                                          String warningLevel, String warningType);
 
     /**
      * 查询历史预警(status IN HANDLED/CLOSED)
@@ -40,7 +40,7 @@ public interface DrainageWarningService extends IService<DrainageWarning> {
      * @param equipmentType 设备模块类型(drainage=排水),按 early_warning.device_code 匹配 equipment_type.type_id
      */
     Page<DrainageWarning> findHistoryPage(long pageNum, long pageSize,
-                                          Integer warningLevel, String warningType,
+                                          String warningLevel, String warningType,
                                           String status, String startTime, String endTime,
                                           boolean historyOnly, String equipmentName, String equipmentType);
 
@@ -100,7 +100,7 @@ public interface DrainageWarningService extends IService<DrainageWarning> {
      */
     Page<DrainageWarning> findVisibleCurrentPage(long pageNum, long pageSize,
                                                   Long userId, Long deptId, boolean isAdmin,
-                                                  Integer warningLevel, String warningType,
+                                                  String warningLevel, String warningType,
                                                   String status, boolean currentOnly,
                                                   String equipmentName, String startTime, String endTime,
                                                   String equipmentType);

+ 5 - 5
pipe-network-service/zksy-system/src/main/java/com/zksy/drainage/service/impl/DrainageWarningServiceImpl.java

@@ -50,7 +50,7 @@ public class DrainageWarningServiceImpl extends ServiceImpl<DrainageWarningMappe
 
     @Override
     public Page<DrainageWarning> findByPage(long pageNum, long pageSize,
-                                            Integer warningLevel, String warningType,
+                                            String warningLevel, String warningType,
                                             String status, String startTime, String endTime) {
         Page<DrainageWarning> page = new Page<>(pageNum, pageSize);
         LambdaQueryWrapper<DrainageWarning> wrapper = buildQueryWrapper(warningLevel, warningType, status, startTime, endTime);
@@ -62,7 +62,7 @@ public class DrainageWarningServiceImpl extends ServiceImpl<DrainageWarningMappe
 
     @Override
     public Page<DrainageWarning> findCurrentPage(long pageNum, long pageSize,
-                                                  Integer warningLevel, String warningType) {
+                                                  String warningLevel, String warningType) {
         Page<DrainageWarning> page = new Page<>(pageNum, pageSize);
         LambdaQueryWrapper<DrainageWarning> wrapper = new LambdaQueryWrapper<>();
         // 当前预警:status IN ('DRAFT','PENDING','RECEIVED','PROCESSING')
@@ -82,7 +82,7 @@ public class DrainageWarningServiceImpl extends ServiceImpl<DrainageWarningMappe
 
     @Override
     public Page<DrainageWarning> findHistoryPage(long pageNum, long pageSize,
-                                                  Integer warningLevel, String warningType,
+                                                  String warningLevel, String warningType,
                                                   String status, String startTime, String endTime,
                                                   boolean historyOnly, String equipmentName, String equipmentType) {
         Page<DrainageWarning> page = new Page<>(pageNum, pageSize);
@@ -252,7 +252,7 @@ public class DrainageWarningServiceImpl extends ServiceImpl<DrainageWarningMappe
     @Override
     public Page<DrainageWarning> findVisibleCurrentPage(long pageNum, long pageSize,
                                                          Long userId, Long deptId, boolean isAdmin,
-                                                         Integer warningLevel, String warningType,
+                                                         String warningLevel, String warningType,
                                                          String status, boolean currentOnly,
                                                          String equipmentName, String startTime, String endTime,
                                                          String equipmentType) {
@@ -312,7 +312,7 @@ public class DrainageWarningServiceImpl extends ServiceImpl<DrainageWarningMappe
     /**
      * 构建通用查询条件
      */
-    private LambdaQueryWrapper<DrainageWarning> buildQueryWrapper(Integer warningLevel, String warningType,
+    private LambdaQueryWrapper<DrainageWarning> buildQueryWrapper(String warningLevel, String warningType,
                                                                    String status, String startTime, String endTime) {
         LambdaQueryWrapper<DrainageWarning> wrapper = new LambdaQueryWrapper<>();
         if (warningLevel != null) {

+ 13 - 96
pipe-network-service/zksy-system/src/main/java/com/zksy/ops/service/impl/WorkOrderServiceImpl.java

@@ -337,7 +337,6 @@ public class WorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, WorkOrder
         String permission = assignmentPermission(type);
         WorkOrder order = getOrderById(requireOrderId(orderId));
         requireStatus(order, WorkOrderStatusEnum.PENDING_DISPATCH, "仅待派单工单允许选择人员");
-        requireDispatchScope(order);
         if (deptId != null && deptId <= 0) throw new ServiceException("请选择有效部门");
         return assignmentUserMapper.selectAssignmentCandidates(assignmentCompanyDeptId(order), deptId).stream()
                 .filter(this::isNormalUser)
@@ -532,7 +531,6 @@ public class WorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, WorkOrder
         if (!Objects.equals(WorkOrderStatusEnum.PENDING_DISPATCH.getCode(), order.getOrderStatus())) {
             throw new ServiceException("仅待派单工单允许派单");
         }
-        requireDispatchScope(order);
         SysUser handler = sysUserService.selectUserById(handlerId);
         if (handler == null || !UserConstants.NORMAL.equals(String.valueOf(handler.getStatus())) || !UserConstants.NORMAL.equals(String.valueOf(handler.getDelFlag()))) {
             throw new ServiceException("处置人不存在或已停用");
@@ -875,82 +873,10 @@ public class WorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, WorkOrder
 
     private boolean isDeviceInCurrentCompany(String deviceId) {
         if (StringUtils.isEmpty(deviceId)) return true;
-        // 超级管理员按部门路径推断会落到某个具体公司(如 admin 挂在研发部门下),
-        // 只有该公司设备能派单,其余子系统全部报「无权操作其他公司范围」,与实际授权不符。
-        if (assignScopeSupport.isAdmin()) return true;
         EquipmentBase equipment = equipmentBaseMapper.selectById(deviceId);
         if (equipment == null || equipment.getEquipmentTypeId() == null) return false;
-        Integer rootTypeId = rootEquipmentTypeId(equipment.getEquipmentTypeId());
-        if (rootTypeId == null) return false;
-        Set<Integer> scope = currentCompanyParentTypeIds();
-        // 当前部门不属于任何一家公司(集团/管理端账号)时公司边界不适用:
-        // 这类账号能看到全部子系统的设备,若按空范围判定会导致排水页面完全无法派单。
-        if (scope.isEmpty()) {
-            log.warn("当前部门不在供水/排水/燃气公司范围内,跳过设备公司范围校验,设备ID={}", deviceId);
-            return true;
-        }
-        return scope.contains(rootTypeId);
-    }
-
-    /**
-     * 沿设备类型的 parent_id 向上追溯到一级根类型。
-     *
-     * 设备类型表允许三级扩展(如 排水设备 → 液位计 → 平升液位流量终端),
-     * 直接取 parent_id 判断公司范围会把三级类型误判成其他公司。
-     */
-    private Integer rootEquipmentTypeId(Integer typeId) {
-        Integer current = typeId;
-        Set<Integer> visited = new HashSet<>();
-        while (current != null && visited.add(current)) {
-            EquipmentType type = equipmentTypeMapper.selectById(current);
-            if (type == null) return null;
-            Integer parentId = type.getParentId();
-            if (parentId == null || parentId == 0) return type.getId();
-            current = parentId;
-        }
-        return null;
-    }
-
-    private void requireDeviceCompanyScope(WorkOrder order) {
-        if (order == null || StringUtils.isEmpty(order.getDeviceId())) return;
-        if (isDeviceInCurrentCompany(order.getDeviceId())) return;
-        throw new ServiceException("无权操作其他公司范围的工单(设备属于" + deviceCompanyName(order.getDeviceId())
-                + ",当前账号属于" + currentCompanyName() + ")");
-    }
-
-    /** 设备所属公司名称(按设备类型一级根节点推断),仅用于错误提示。 */
-    private String deviceCompanyName(String deviceId) {
-        EquipmentBase equipment = equipmentBaseMapper.selectById(deviceId);
-        Integer rootTypeId = equipment == null || equipment.getEquipmentTypeId() == null
-                ? null : rootEquipmentTypeId(equipment.getEquipmentTypeId());
-        return companyNameOf(rootTypeId);
-    }
-
-    /** 当前账号所属公司名称,仅用于错误提示。 */
-    private String currentCompanyName() {
-        Set<Integer> scope = currentCompanyParentTypeIds();
-        if (scope.isEmpty()) return "未归属任一子公司";
-        return scope.stream().filter(id -> id != 4).sorted().findFirst()
-                .map(this::companyNameOf).orElse("未归属任一子公司");
-    }
-
-    private String companyNameOf(Integer rootTypeId) {
-        if (rootTypeId == null) return "未知设备类型";
-        switch (rootTypeId) {
-            case 1: return "供水公司";
-            case 2: return "排水公司";
-            case 3: return "燃气公司";
-            case 4: return "窨井共享设备";
-            default: return "未知设备类型";
-        }
-    }
-
-    private void requireDispatchScope(WorkOrder order) {
-        if (StringUtils.isEmpty(order.getDeviceId())) {
-            // 派单接口已由 Controller 校验 ops:workOrder:dispatch 权限;无设备工单不再限制创建人。
-            return;
-        }
-        requireDeviceCompanyScope(order);
+        EquipmentType type = equipmentTypeMapper.selectById(equipment.getEquipmentTypeId());
+        return type != null && type.getParentId() != null && currentCompanyParentTypeIds().contains(type.getParentId());
     }
 
     private String assignmentPermission(String type) {
@@ -962,24 +888,13 @@ public class WorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, WorkOrder
     /** 无设备及共享类型不按候选人的部门限制;关联损坏不可当作无设备放宽。 */
     private Long assignmentCompanyDeptId(WorkOrder order) {
         if (StringUtils.isEmpty(order.getDeviceId())) return null;
-        if (assignScopeSupport.isAdmin()) return null;
         EquipmentBase device = equipmentBaseMapper.selectById(order.getDeviceId());
-        if (device == null || device.getEquipmentTypeId() == null) {
-            throw new ServiceException("工单关联设备或设备类型无效,无法选择人员");
-        }
-        Integer rootTypeId = rootEquipmentTypeId(device.getEquipmentTypeId());
-        if (rootTypeId == null) {
-            throw new ServiceException("工单关联设备或设备类型无效,无法选择人员");
-        }
-        // 窨井为三家公司共享类型
-        if (Objects.equals(rootTypeId, 4)) return null;
-        if (rootTypeId < 1 || rootTypeId > 3) {
-            throw new ServiceException("工单关联设备或设备类型无效,无法选择人员");
-        }
-        long companyDeptId = 100L + rootTypeId;
-        // 公司部门未按 101/102/103 建账时,按部门过滤只会得到空候选人;
-        // 此时退化为不限部门,由角色权限与可指派范围继续约束。
-        return assignmentDeptMapper.selectDeptById(companyDeptId) == null ? null : companyDeptId;
+        EquipmentType type = device == null || device.getEquipmentTypeId() == null ? null
+                : equipmentTypeMapper.selectById(device.getEquipmentTypeId());
+        Integer parent = type == null ? null : type.getParentId();
+        if (Objects.equals(parent, 4)) return null;
+        if (parent != null && parent >= 1 && parent <= 3) return 100L + parent;
+        throw new ServiceException("工单关联设备或设备类型无效,无法选择人员");
     }
 
     private void requireAssignmentCompany(WorkOrder order, Long userId, String label) {
@@ -1211,9 +1126,11 @@ public class WorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, WorkOrder
     }
 
     /** 报警等级映射工单优先级:1级最高为紧急,4级最低为低,其余为一般。 */
-    private Integer mapAlarmLevelToOrderLevel(Integer alarmLevel) {
-        if (alarmLevel == null || alarmLevel == 1) return 0;
-        if (alarmLevel == 4) return 2;
+    private Integer mapAlarmLevelToOrderLevel(String alarmLevel) {
+        if (alarmLevel == null || alarmLevel.trim().isEmpty()) return 0;
+        String level = alarmLevel.trim();
+        if ("1".equals(level)) return 0;
+        if ("4".equals(level)) return 2;
         return 1;
     }
 

+ 18 - 3
pipe-network-service/zksy-system/src/main/resources/mapper/system/SysUserMapper.xml

@@ -6,9 +6,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
     <select id="selectAssignmentCandidates" resultMap="SysUserResult">
         SELECT u.user_id, u.user_name, u.nick_name, u.dept_id, u.status, u.del_flag,
-               d.dept_name, d.ancestors, d.parent_id, d.status AS dept_status
+               CASE
+                   WHEN d.parent_id IS NOT NULL
+                        AND d.parent_id &lt;&gt; 100
+                        AND parent_dept.dept_name IS NOT NULL
+                       THEN CONCAT(parent_dept.dept_name, '.', d.dept_name)
+                   ELSE d.dept_name
+               END AS dept_name,
+               d.ancestors, d.parent_id, d.status AS dept_status
         FROM app_user.sys_user u
         LEFT JOIN app_user.sys_dept d ON d.dept_id = u.dept_id
+        LEFT JOIN app_user.sys_dept parent_dept ON parent_dept.dept_id = d.parent_id
         WHERE u.status = '0' AND u.del_flag = '0'
         <if test="companyDeptId != null">
           AND d.status = '0' AND d.del_flag = '0'
@@ -134,11 +142,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                u.nick_name,
                u.phonenumber,
                u.dept_id,
-               d.dept_name,
+               case
+                   when d.parent_id is not null
+                        and d.parent_id &lt;&gt; 100
+                        and parent_dept.dept_name is not null
+                       then concat(parent_dept.dept_name, '.', d.dept_name)
+                   else d.dept_name
+               end as dept_name,
                up.post_id,
                p.post_name
         from app_user.sys_user u
         left join app_user.sys_dept d on d.dept_id = u.dept_id
+        left join app_user.sys_dept parent_dept on parent_dept.dept_id = d.parent_id
         left join app_user.sys_user_post up on up.user_id = u.user_id
         left join app_user.sys_post p on p.post_id = up.post_id and p.status = '0'
         where u.del_flag = '0'
@@ -221,7 +236,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		select user_id, email from app_user.sys_user where email = #{email} and del_flag = '0' limit 1
 	</select>
 	
-	<insert id="insertUser" parameterType="SysUser">
+	<insert id="insertUser" parameterType="SysUser" useGeneratedKeys="true" keyProperty="userId" keyColumn="user_id">
  		insert into app_user.sys_user(
  			<if test="userId != null and userId != 0">user_id,</if>
  			<if test="deptId != null and deptId != 0">dept_id,</if>

+ 9 - 1
pipe-network-service/zksy-system/src/main/resources/mapper/warning/WarningParticipantMapper.xml

@@ -2,9 +2,17 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.zksy.base.warning.mapper.WarningParticipantMapper">
     <select id="selectCandidates" resultType="com.zksy.base.warning.domain.WarningParticipant">
-        SELECT u.user_id, u.user_name, u.nick_name, u.dept_id, d.dept_name
+        SELECT u.user_id, u.user_name, u.nick_name, u.dept_id,
+               CASE
+                   WHEN d.parent_id IS NOT NULL
+                        AND d.parent_id &lt;&gt; 100
+                        AND parent_dept.dept_name IS NOT NULL
+                       THEN CONCAT(parent_dept.dept_name, '.', d.dept_name)
+                   ELSE d.dept_name
+               END AS dept_name
         FROM app_user.sys_user u
         LEFT JOIN app_user.sys_dept d ON d.dept_id = u.dept_id
+        LEFT JOIN app_user.sys_dept parent_dept ON parent_dept.dept_id = d.parent_id
         WHERE u.status = '0' AND u.del_flag = '0'
           AND EXISTS (
             SELECT 1 FROM app_user.early_warning w

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

@@ -69,8 +69,11 @@ class WaterSupplyAlarmRealtimeContractTest {
         com.zksy.system.service.ISysDictDataService dictionaries = mock(com.zksy.system.service.ISysDictDataService.class);
         ReflectionTestUtils.setField(service, "dictDataService", dictionaries);
         when(dictionaries.selectDictLabel(any(), any())).thenAnswer(call -> {
-            com.zksy.base.alarm.enums.AlarmLevelEnum level = com.zksy.base.alarm.enums.AlarmLevelEnum.fromCode(Integer.valueOf(call.getArgument(1)));
-            return level == null ? null : level.getLabel();
+            // 模拟字典服务:仅 alarm_level 字典有标签,其余返回 null 走“未知等级”
+            if (!"alarm_level".equals(call.getArgument(0))) return null;
+            String code = String.valueOf(call.getArgument(1));
+            return ("1".equals(code) ? "一级报警" : "2".equals(code) ? "二级报警"
+                    : "3".equals(code) ? "三级报警" : "4".equals(code) ? "四级报警" : null);
         });
         alarmDataService = mock(AlarmDataService.class);
         alarmDataMapper = mock(AlarmDataMapper.class);
@@ -102,7 +105,7 @@ class WaterSupplyAlarmRealtimeContractTest {
     }
 
     private static AlarmData alarm(String id, String deviceCode, String warningType, Integer alarmStatus,
-                                   Integer alarmLevel) {
+                                   String alarmLevel) {
         AlarmData alarm = new AlarmData();
         alarm.setId(id);
         alarm.setDeviceCode(deviceCode);
@@ -124,7 +127,7 @@ class WaterSupplyAlarmRealtimeContractTest {
 
     @Test
     void realtimeAlarmWithLiveWorkOrderIsEnrichedAsTransferred() {
-        AlarmData linkedAlarm = alarm("alarm-1", "CN-GS-202609020001", "压力过低", 0, 1);
+        AlarmData linkedAlarm = alarm("alarm-1", "CN-GS-202609020001", "压力过低", 0, "1");
         linkedAlarm.setWorkOrderId(101L);
         when(alarmDataMapper.selectList(any())).thenReturn(Collections.singletonList(linkedAlarm));
         when(alarmDataService.list(any(AbstractWrapper.class))).thenReturn(Collections.singletonList(linkedAlarm));
@@ -150,7 +153,7 @@ class WaterSupplyAlarmRealtimeContractTest {
     @Test
     void realtimeAlarmWithoutOrderStaysPendingAudit() {
         when(alarmDataService.list(any(AbstractWrapper.class))).thenReturn(
-                Collections.singletonList(alarm("alarm-2", "CN-GS-202609020001", "流量异常", 0, 3)));
+                Collections.singletonList(alarm("alarm-2", "CN-GS-202609020001", "流量异常", 0, "3")));
         when(workOrderMapper.selectBatchIds(any())).thenReturn(Collections.emptyList());
         when(equipmentStatusMapper.selectList(any())).thenReturn(Collections.singletonList(
                 status("EQ-P-1", 1, 1, 1)));
@@ -164,7 +167,7 @@ class WaterSupplyAlarmRealtimeContractTest {
 
     @Test
     void realtimeAlarmHandledButWithLiveOrderAppearsAsTransferred() {
-        AlarmData transferred = alarm("alarm-3", "CN-GS-202609020001", "压力过低", 1, 1);
+        AlarmData transferred = alarm("alarm-3", "CN-GS-202609020001", "压力过低", 1, "1");
         // 以数据库语义驱动:若查询硬过滤 alarm_status=0,
         // 已处理(alarm_status=1)但仍有未取消工单的报警不会命中,要求不得排除。
         when(alarmDataService.list(any(AbstractWrapper.class))).thenAnswer(inv -> {
@@ -197,7 +200,7 @@ class WaterSupplyAlarmRealtimeContractTest {
     @Test
     void releasedAlarmIsFilteredOutOfRealtimeList() {
         when(alarmDataService.list(any(AbstractWrapper.class))).thenReturn(
-                Collections.singletonList(alarm("alarm-4", "CN-GS-202609020001", "流量异常", 1, 3)));
+                Collections.singletonList(alarm("alarm-4", "CN-GS-202609020001", "流量异常", 1, "3")));
         when(workOrderMapper.selectBatchIds(any())).thenReturn(Collections.emptyList());
         when(equipmentStatusMapper.selectList(any())).thenReturn(Collections.singletonList(
                 status("EQ-P-1", 0, 1, 1)));

+ 1 - 1
pipe-network-service/zksy-system/src/test/java/com/zksy/base/alarm/mapper/MobileAlarmMapperTest.java

@@ -18,7 +18,7 @@ class MobileAlarmMapperTest {
             }
         }
         AlarmQuery query = new AlarmQuery(); query.setAlarmStatus(0); query.setKeyword("BJ001");
-        query.setAuditStatus(2); query.setAlarmLevel(1);
+        query.setAuditStatus(2); query.setAlarmLevel("1");
         query.setStartTime(LocalDateTime.of(2026, 10, 14, 0, 0));
         query.setEndTime(LocalDateTime.of(2026, 10, 15, 0, 0));
         Map<String,Object> params = new HashMap<>(); params.put("query",query);

+ 5 - 5
pipe-network-service/zksy-system/src/test/java/com/zksy/base/alarm/service/AlarmOperationsServiceTest.java

@@ -24,10 +24,10 @@ class AlarmOperationsServiceTest {
     private final AlarmVO alarm = new AlarmVO();
     @BeforeEach void setup() {
         List<com.zksy.common.core.domain.entity.SysDictData> levels = new ArrayList<>();
-        for (AlarmLevelEnum level : AlarmLevelEnum.values()) {
+        for (String[] level : new String[][] { { "1", "一级报警" }, { "2", "二级报警" }, { "3", "三级报警" }, { "4", "四级报警" } }) {
             com.zksy.common.core.domain.entity.SysDictData data = new com.zksy.common.core.domain.entity.SysDictData();
-            data.setDictType("alarm_level"); data.setDictValue(String.valueOf(level.getCode()));
-            data.setDictLabel(level.getLabel()); data.setStatus("0"); levels.add(data);
+            data.setDictType("alarm_level"); data.setDictValue(level[0]);
+            data.setDictLabel(level[1]); data.setStatus("0"); levels.add(data);
             when(dictionaries.selectDictLabel("alarm_level", data.getDictValue())).thenReturn(data.getDictLabel());
         }
         when(dictionaries.selectDictDataList(any())).thenReturn(levels);
@@ -35,7 +35,7 @@ class AlarmOperationsServiceTest {
         alarm.setId("a1"); alarm.setDeviceCode("D1"); alarm.setWarningCode("WARN-INSTANT-FLOW");
         alarm.setCreateTime(LocalDateTime.of(2026,1,10,12,0));
         alarm.setActualValue(BigDecimal.ZERO);
-        alarm.setAlarmStatus(1); alarm.setAuditStatus(1); alarm.setAlarmLevel(2); alarm.setWorkOrderId(9L); alarm.setOrderStatus(3);
+        alarm.setAlarmStatus(1); alarm.setAuditStatus(1); alarm.setAlarmLevel("2"); alarm.setWorkOrderId(9L); alarm.setOrderStatus(3);
         when(scope.resolveOperations(query)).thenReturn(Arrays.asList(2,21));
         when(mapper.selectDetail(eq("a1"),eq(query),anyList())).thenReturn(alarm);
     }
@@ -48,7 +48,7 @@ class AlarmOperationsServiceTest {
         assertEquals("管理员配置报警", service.detail("a1", query).getAlarmLevelName());
         level.setStatus("1");
         assertEquals(Collections.emptyList(), service.options(query).get("alarmLevels"));
-        query.setAlarmLevel(2);
+        query.setAlarmLevel("2");
         assertThrows(ServiceException.class, () -> service.statistics(query));
     }
     @Test void ledgerUsesServerPaginationAndKeepsRecoveredEvents() {

+ 5 - 5
pipe-network-service/zksy-system/src/test/java/com/zksy/base/alarm/service/AlarmReviewServiceTest.java

@@ -48,10 +48,10 @@ class AlarmReviewServiceTest {
     }
     @BeforeEach void setup() {
         List<com.zksy.common.core.domain.entity.SysDictData> levels = new ArrayList<>();
-        for (AlarmLevelEnum level : AlarmLevelEnum.values()) {
+        for (String[] level : new String[][] { { "1", "一级报警" }, { "2", "二级报警" }, { "3", "三级报警" }, { "4", "四级报警" } }) {
             com.zksy.common.core.domain.entity.SysDictData data = new com.zksy.common.core.domain.entity.SysDictData();
-            data.setDictType("alarm_level"); data.setDictValue(String.valueOf(level.getCode()));
-            data.setDictLabel(level.getLabel()); data.setStatus("0"); levels.add(data);
+            data.setDictType("alarm_level"); data.setDictValue(level[0]);
+            data.setDictLabel(level[1]); data.setStatus("0"); levels.add(data);
             when(dictionaries.selectDictLabel("alarm_level", data.getDictValue())).thenReturn(data.getDictLabel());
         }
         when(dictionaries.selectDictDataList(any())).thenReturn(levels);
@@ -63,7 +63,7 @@ class AlarmReviewServiceTest {
         SecurityContextHolder.getContext().setAuthentication(new UsernamePasswordAuthenticationToken(principal, null));
         query.setRootTypeId(1);
         when(scope.resolve(query)).thenReturn(Arrays.asList(1, 12));
-        alarm = new AlarmReviewVO(); alarm.setId("a1"); alarm.setAlarmLevel(1);
+        alarm = new AlarmReviewVO(); alarm.setId("a1"); alarm.setAlarmLevel("1");
         alarm.setAlarmStatus(AlarmRecordStatusEnum.UNHANDLED.getCode());
         alarm.setAuditStatus(AlarmAuditStatusEnum.UNREVIEWED.getCode());
         when(queries.selectDetail(eq("a1"), eq(query), anyList())).thenReturn(alarm);
@@ -199,7 +199,7 @@ class AlarmReviewServiceTest {
     }
     @Test void invalidPageLevelAndDateRangeAreRejected() {
         query.setPageSize(101); assertThrows(ServiceException.class, () -> service.page(query));
-        query.setPageSize(10); query.setAlarmLevel(5); assertThrows(ServiceException.class, () -> service.page(query));
+        query.setPageSize(10); query.setAlarmLevel("5"); assertThrows(ServiceException.class, () -> service.page(query));
         query.setAlarmLevel(null); query.setStartTime(java.time.LocalDateTime.now()); query.setEndTime(query.getStartTime().minusDays(1));
         assertThrows(ServiceException.class, () -> service.page(query)); verifyNoInteractions(queries);
     }

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

@@ -187,7 +187,7 @@ class WaterSupplyDeviceServiceImplTest {
     void deviceDetailIncludesAlarmAndRelatedWorkOrderSummary() {
         when(equipmentStatusMapper.selectOne(any())).thenReturn(status(pressureDevice.getEquipmentId(), 1, 1, 1));
         when(alarmDataMapper.selectList(any())).thenReturn(Collections.singletonList(
-                alarm(pressureDevice.getEquipmentCode(), "供水压力超限", 1)));
+                alarm(pressureDevice.getEquipmentCode(), "供水压力超限", "1"))));
         when(workOrderMapper.selectList(any())).thenReturn(Collections.singletonList(
                 workOrder(pressureDevice.getEquipmentId(), "WO-DETAIL", 2, 1L)));
         when(sysUserService.selectUserById(1L)).thenReturn(sysUser(1L, "zhangsan", "张三"));
@@ -223,7 +223,7 @@ class WaterSupplyDeviceServiceImplTest {
         AlarmData processedAlarm = new AlarmData();
         processedAlarm.setDeviceCode(repairDevice.getEquipmentCode());
         processedAlarm.setAlarmStatus(0);
-        processedAlarm.setAlarmLevel(1);
+        processedAlarm.setAlarmLevel("1");
         when(alarmDataMapper.selectList(any())).thenReturn(Collections.singletonList(processedAlarm));
         when(workOrderMapper.selectList(any())).thenReturn(Collections.emptyList());
 
@@ -265,7 +265,7 @@ class WaterSupplyDeviceServiceImplTest {
                 status(pressureDevice.getEquipmentId(), 1, 1, 1),
                 status(repairDevice.getEquipmentId(), 3, 0, 1)));
         when(alarmDataMapper.selectList(any())).thenReturn(Collections.singletonList(
-                alarm(pressureDevice.getEquipmentCode(), "供水压力超限", 1)));
+                alarm(pressureDevice.getEquipmentCode(), "供水压力超限", "1"))));
         when(workOrderMapper.selectList(any())).thenReturn(Collections.singletonList(
                 workOrder(pressureDevice.getEquipmentId(), "WO-A", 2, 1L)));
         when(equipmentMaintainMapper.selectList(any())).thenReturn(Collections.singletonList(
@@ -358,7 +358,7 @@ class WaterSupplyDeviceServiceImplTest {
         return status;
     }
 
-    private static AlarmData alarm(String deviceCode, String warningType, int level) {
+    private static AlarmData alarm(String deviceCode, String warningType, String level) {
         AlarmData alarm = new AlarmData();
         alarm.setDeviceCode(deviceCode);
         alarm.setAlarmLevel(level);

+ 2 - 2
pipe-network-service/zksy-system/src/test/java/com/zksy/ops/service/impl/WorkOrderServiceImplTest.java

@@ -313,7 +313,7 @@ class WorkOrderServiceImplTest {
     @Test
     void alarmConfirmationLinksNewOrderWithoutHandlingAlarmOrClearingDevice() {
         AlarmData alarm = new AlarmData();
-        alarm.setId("a-new"); alarm.setDeviceCode("DEVICE-NEW"); alarm.setAlarmLevel(1);
+        alarm.setId("a-new"); alarm.setDeviceCode("DEVICE-NEW"); alarm.setAlarmLevel("1");
         alarm.setAlarmNo("BJ2026092400000001");
         alarm.setWarningCode("WARN-PRESSURE");
         alarm.setAlarmStatus(0); alarm.setAuditStatus(1);
@@ -359,7 +359,7 @@ class WorkOrderServiceImplTest {
     }
 
     private WorkOrder createAlarmOrderWithGeneratedDescription(AlarmData alarm) {
-        alarm.setId("a-description"); alarm.setDeviceCode("DEVICE-DESC"); alarm.setAlarmLevel(1);
+        alarm.setId("a-description"); alarm.setDeviceCode("DEVICE-DESC"); alarm.setAlarmLevel("1");
         alarm.setWarningCode("WARN-DESCRIPTION");
         when(alarmDataService.getById("a-description")).thenReturn(alarm);
         EquipmentBase device = new EquipmentBase(); device.setEquipmentId("eq-description");

+ 3 - 0
pipe-network-service/zksy-system/src/test/java/com/zksy/system/mapper/SysUserContactsMapperContractTest.java

@@ -25,6 +25,9 @@ class SysUserContactsMapperContractTest {
         assertTrue(statement.contains("u.status = '0'"));
         assertTrue(statement.contains("u.user_id &lt;&gt; #{excludeUserId}"));
         assertTrue(statement.contains("u.user_id &lt;&gt; 1"));
+        assertTrue(statement.contains("left join app_user.sys_dept parent_dept on parent_dept.dept_id = d.parent_id"));
+        assertTrue(statement.contains("d.parent_id &lt;&gt; 100"));
+        assertTrue(statement.contains("concat(parent_dept.dept_name, '.', d.dept_name)"));
         assertFalse(statement.contains("limit #{pageSize}"));
         assertFalse(statement.contains("#{keyword}"));
         assertFalse(statement.contains("#{deptId}"));