浏览代码

设备管理统一管理

zengy 4 周之前
父节点
当前提交
cc1d227ab7
共有 33 个文件被更改,包括 395 次插入 和 427 次删除
  1. 2 2
      environment-service/src/main/java/com/zksy/environment/utils/DeviceOfflineCheckTask.java
  2. 12 2
      pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/base/EquipmentBaseController.java
  3. 0 44
      pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/base/EquipmentStatusController.java
  4. 4 83
      pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/base/EquipmentTypeController.java
  5. 5 4
      pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/gasbasic/GasPipePointController.java
  6. 6 5
      pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/manhole/ManholeDeviceController.java
  7. 4 4
      pipe-network-service/zksy-system/src/main/java/com/zksy/WaterSupply/MonitorAlarm/service/impl/WaterSupplyAlarmServiceImpl.java
  8. 4 4
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/domain/EquipmentBase.java
  9. 2 2
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/domain/vo/AbnormalDeviceVO.java
  10. 98 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/domain/vo/EquipmentBaseVO.java
  11. 2 2
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/domain/vo/EquipmentFullVO.java
  12. 2 2
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/drill/service/DrillAlarmSyncService.java
  13. 59 0
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/enums/DistrictEnum.java
  14. 2 2
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/DrillAlarmSyncService.java
  15. 7 4
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/EquipmentBaseService.java
  16. 0 12
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/EquipmentStatusService.java
  17. 3 3
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/impl/CaseInfoServiceImpl.java
  18. 110 47
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/impl/EquipmentBaseServiceImpl.java
  19. 0 80
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/impl/EquipmentStatusServiceImpl.java
  20. 0 90
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/impl/EquipmentTypeServiceImpl.java
  21. 1 1
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/impl/GasMonitorServiceImpl.java
  22. 11 7
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/impl/MaintenanceDataStatServiceImpl.java
  23. 5 8
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/impl/ManholeLayerServiceImpl.java
  24. 4 4
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/impl/MonitoringServiceImpl.java
  25. 4 3
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/impl/WaterSupplyDeviceServiceImpl.java
  26. 2 2
      pipe-network-service/zksy-system/src/main/java/com/zksy/base/warning/service/impl/WarningThresholdServiceImpl.java
  27. 3 3
      pipe-network-service/zksy-system/src/main/java/com/zksy/manhole/dto/in/ManholeDeviceStatisticsInDTO.java
  28. 2 2
      pipe-network-service/zksy-system/src/main/java/com/zksy/ops/service/impl/WorkOrderServiceImpl.java
  29. 1 1
      pipe-network-service/zksy-system/src/test/java/com/zksy/WaterSupply/MonitorAlarm/WaterSupplyAlarmAuditServiceTest.java
  30. 13 1
      pipe-network-service/zksy-system/src/test/java/com/zksy/WaterSupply/MonitorAlarm/WaterSupplyAlarmDashboardServiceTest.java
  31. 13 1
      pipe-network-service/zksy-system/src/test/java/com/zksy/base/service/impl/MonitoringServiceImplTest.java
  32. 13 1
      pipe-network-service/zksy-system/src/test/java/com/zksy/base/service/impl/WaterSupplyDeviceServiceImplTest.java
  33. 1 1
      pipe-network-service/zksy-system/src/test/java/com/zksy/ops/service/impl/WorkOrderServiceImplTest.java

+ 2 - 2
environment-service/src/main/java/com/zksy/environment/utils/DeviceOfflineCheckTask.java

@@ -42,8 +42,8 @@ public class DeviceOfflineCheckTask {
     private RestTemplate restTemplate;
 
     /** 离线判定超时,单位:分钟,默认30分钟 */
-    @Value("${device.offline.timeout-minutes:30}")
-    private int offlineTimeoutMinutes = 30;
+    @Value("${device.offline.timeout-minutes:5}")
+    private int offlineTimeoutMinutes = 5;
 
     /** 检查间隔,单位:毫秒,默认5分钟 */
     @Scheduled(fixedRateString = "${device.offline.check-interval-ms:300000}")

+ 12 - 2
pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/base/EquipmentBaseController.java

@@ -4,6 +4,7 @@ package com.zksy.web.controller.base;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.zksy.base.domain.EquipmentBase;
+import com.zksy.base.domain.vo.EquipmentBaseVO;
 import com.zksy.base.service.EquipmentBaseService;
 import com.zksy.common.annotation.Anonymous;
 import com.zksy.common.annotation.Log;
@@ -31,10 +32,10 @@ public class EquipmentBaseController {
     @GetMapping
     @ApiOperation(value = "设备基础信息分页")
     @Anonymous
-    public Page findByPage(long pageNum, long pageSize,
+    public Page<EquipmentBaseVO> findByPage(long pageNum, long pageSize,
                            @RequestParam(required = false) String equipmentCode,
                            @RequestParam(required = false) String equipmentName,
-                           @ApiParam("设备类型ID") @RequestParam(required = false) String equipmentTypeId,
+                           @ApiParam("设备类型ID") @RequestParam(required = false) Integer equipmentTypeId,
                            @ApiParam("设备根类型ID(菜单 rootTypeId 数据范围过滤,空=全部)")
                            @RequestParam(required = false) Integer rootTypeId,
                            @ApiParam("在线状态(0-离线,1-在线)") @RequestParam(required = false) Integer onlineStatus,
@@ -50,6 +51,15 @@ public class EquipmentBaseController {
         return AjaxResult.success(service.list());
     }
 
+    @GetMapping("/statistics")
+    @ApiOperation(value = "设备运行状态统计")
+    @Anonymous
+    public AjaxResult getEquipmentStatusStatistics(
+            @ApiParam("设备根类型ID(数据范围过滤,空=全部)")
+            @RequestParam(required = false) Integer rootTypeId) {
+        return AjaxResult.success(service.getEquipmentStatusStatistics(rootTypeId));
+    }
+
     @GetMapping("/{id}")
     @ApiOperation(value = "设备基础信息查询")
     @Anonymous

+ 0 - 44
pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/base/EquipmentStatusController.java

@@ -1,44 +0,0 @@
-package com.zksy.web.controller.base;
-
-import com.zksy.base.service.EquipmentStatusService;
-import com.zksy.common.annotation.Anonymous;
-import com.zksy.common.core.domain.AjaxResult;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
-import java.util.Map;
-
-/**
- * 设备状态
- */
-@RestController
-@RequestMapping("/equipment-status")
-@Api(tags = "物联感知设备-设备状态")
-public class EquipmentStatusController {
-
-    @Autowired
-    private EquipmentStatusService service;
-
-    @GetMapping("/all")
-    @ApiOperation(value = "查询所有设备状态")
-    @Anonymous
-    public AjaxResult getAll(@ApiParam("设备根类型ID(数据范围过滤,空=全部)")
-                             @RequestParam(required = false) Integer rootTypeId) {
-        return AjaxResult.success(service.listByRootType(rootTypeId));
-    }
-
-    @GetMapping("/statistics")
-    @ApiOperation(value = "设备状态统计:设备总数/在线/离线/报警")
-    @Anonymous
-    public AjaxResult statistics(@ApiParam("设备根类型ID(数据范围过滤,空=全部)")
-                                 @RequestParam(required = false) Integer rootTypeId) {
-        Map<String, Object> statistics = service.statistics(rootTypeId);
-        return AjaxResult.success(statistics);
-    }
-
-}

+ 4 - 83
pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/base/EquipmentTypeController.java

@@ -1,57 +1,28 @@
 package com.zksy.web.controller.base;
 
-import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.zksy.base.domain.EquipmentType;
 import com.zksy.base.service.EquipmentTypeService;
 import com.zksy.common.annotation.Anonymous;
-import com.zksy.common.annotation.Log;
 import com.zksy.common.core.domain.AjaxResult;
-import com.zksy.common.enums.BusinessType;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
-import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.List;
-
-@Slf4j
 @RestController
-@RequestMapping("/EquipmentType")
+@RequestMapping("/equipmentType")
 @Api(tags = "设备类型")
 public class EquipmentTypeController {
 
     @Autowired
     private EquipmentTypeService service;
 
-    @GetMapping("/getById/{id}")
-    @ApiOperation(value = "设备类型搜索getById")
-    @Anonymous
-    public AjaxResult getById(@PathVariable Integer id) {
-        EquipmentType equipmentType = service.getById(id);
-        if(equipmentType==null){
-            return AjaxResult.error("该设备类型不存在");
-        }
-        return AjaxResult.success(equipmentType);
-    }
-
-    @GetMapping("/findByPage")
-    @ApiOperation(value = "设备类型分页")
-    @Anonymous
-    public Page findByPage(long pageNum, long pageSize,
-                           @RequestParam(required = false)Integer typeId,
-                           @RequestParam(required = false)String typeName,
-                           @RequestParam(required = false)Integer parentTypeId) throws Exception {
-        return service.findByPage(pageNum, pageSize, typeId,typeName,parentTypeId);
-    }
-
-    @GetMapping("/getList")
+    @GetMapping
     @ApiOperation(value = "查询所有设备类型")
     @Anonymous
-    public AjaxResult getList(@ApiParam("设备根类型ID(仅返回该大类下的子类型,空=全部)")
-                              @RequestParam(required = false) Integer rootTypeId) {
+    public AjaxResult list(@ApiParam("设备根类型ID(仅返回该大类下的子类型,空=全部)")
+                           @RequestParam(required = false) Integer rootTypeId) {
         if (rootTypeId == null || rootTypeId <= 0) {
             return AjaxResult.success(service.list());
         }
@@ -60,54 +31,4 @@ public class EquipmentTypeController {
                 .orderByAsc(EquipmentType::getId)
                 .list());
     }
-
-    @PostMapping("/save")
-    @ApiOperation(value = "新增设备类型")
-    @Log(title = "新增设备类型", businessType = BusinessType.INSERT)
-    public AjaxResult save(@RequestBody EquipmentType entity) {
-        boolean saved = service.saveWithCheck(entity);
-        return saved ? AjaxResult.success("新增成功",saved)
-                : AjaxResult.error("新增失败",saved);
-    }
-
-    @PostMapping("/saveBatch")
-    @ApiOperation(value = "设备类型批量新增")
-    @Log(title = "批量新增设备类型", businessType = BusinessType.INSERT)
-    public AjaxResult saveBatch(@RequestBody List<EquipmentType> entityList) {
-        // 基础校验:列表不能为空
-        if (CollectionUtils.isEmpty(entityList)) {
-            return AjaxResult.error("批量新增失败:设备类型列表不能为空");
-        }
-
-        boolean saved = service.saveBatchWithCheck(entityList);
-        return saved ? AjaxResult.success("新增成功",saved)
-                : AjaxResult.error("新增失败",saved);
-    }
-
-    @PutMapping("/updateById")
-    @ApiOperation(value = "设备类型修改")
-    @Log(title = "修改设备类型", businessType = BusinessType.UPDATE)
-    public AjaxResult updateById(@RequestBody EquipmentType entity) {
-        boolean updated = service.updateWithCheck(entity);
-        return updated ? AjaxResult.success("修改成功",updated)
-                : AjaxResult.error("修改失败",updated);
-    }
-
-    @DeleteMapping("/deleteById")
-    @ApiOperation(value = "设备类型删除")
-    @Log(title = "删除设备类型", businessType = BusinessType.DELETE)
-    public AjaxResult deleteById(Integer id) {
-        boolean deleted = service.removeWithCheck(id);
-        return deleted ? AjaxResult.success("删除成功",deleted)
-                : AjaxResult.error("删除失败",deleted);
-    }
-
-    @DeleteMapping("/deleteBatchById")
-    @ApiOperation(value = "设备类型批量删除")
-    @Log(title = "设备类型批量删除", businessType = BusinessType.DELETE)
-    public AjaxResult deleteBatchById(@RequestParam List<Integer> ids) {
-        boolean deleted = service.removeBatchWithCheck(ids);
-        return deleted ? AjaxResult.success("删除成功",deleted)
-                : AjaxResult.error("删除失败",deleted);
-    }
 }

+ 5 - 4
pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/gasbasic/GasPipePointController.java

@@ -25,6 +25,7 @@ import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.stream.Collectors;
 
 @Slf4j
@@ -120,14 +121,14 @@ public class GasPipePointController {
             Map<String, EquipmentBase> equipMap = equipList.stream()
                     .collect(Collectors.toMap(EquipmentBase::getEquipmentId, e -> e, (a, b) -> a));
 
-            List<String> typeIds = equipList.stream()
+            List<Integer> typeIds = equipList.stream()
                     .map(EquipmentBase::getEquipmentTypeId)
-                    .filter(StrUtil::isNotBlank)
+                    .filter(Objects::nonNull)
                     .distinct()
                     .collect(Collectors.toList());
-            Map<String, String> typeNameMap = CollUtil.isEmpty(typeIds) ? Map.of() :
+            Map<Integer, String> typeNameMap = CollUtil.isEmpty(typeIds) ? Map.of() :
                     equipmentTypeMapper.selectBatchIds(typeIds).stream()
-                            .collect(Collectors.toMap(type -> String.valueOf(type.getId()), EquipmentType::getTypeName, (a, b) -> a));
+                            .collect(Collectors.toMap(EquipmentType::getId, EquipmentType::getTypeName, (a, b) -> a));
 
             for (GasPipePointDeviceRel rel : list) {
                 if (StrUtil.isBlank(rel.getEquipmentName()) || StrUtil.isBlank(rel.getEquipmentType())) {

+ 6 - 5
pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/manhole/ManholeDeviceController.java

@@ -41,6 +41,7 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.stream.Collectors;
 
 /**
@@ -314,7 +315,7 @@ public class ManholeDeviceController extends BaseController
         rel.setEquipmentId(equipmentId);
         if (equipment != null) {
             rel.setEquipmentName(equipment.getEquipmentName());
-            rel.setEquipmentType(equipment.getEquipmentTypeId());
+            rel.setEquipmentType(equipment.getEquipmentTypeId() == null ? null : String.valueOf(equipment.getEquipmentTypeId()));
         }
         rel.setCreateTime(LocalDateTime.now());
         boolean result = manholeDeviceRelMapper.insert(rel) > 0;
@@ -363,18 +364,18 @@ public class ManholeDeviceController extends BaseController
                 ? equipmentList.stream().collect(Collectors.toMap(EquipmentBase::getEquipmentId, e -> e, (a, b) -> a))
                 : new HashMap<>();
         // 3. 批量查询设备类型名称
-        List<String> typeIds = equipmentList.stream()
+        List<Integer> typeIds = equipmentList.stream()
                 .map(EquipmentBase::getEquipmentTypeId)
-                .filter(StringUtils::isNotEmpty)
+                .filter(Objects::nonNull)
                 .distinct()
                 .collect(Collectors.toList());
-        Map<String, EquipmentType> typeMap = new HashMap<>();
+        Map<Integer, EquipmentType> typeMap = new HashMap<>();
         if (CollUtil.isNotEmpty(typeIds)) {
             List<EquipmentType> typeList = equipmentTypeService.list(
                     new LambdaQueryWrapper<EquipmentType>().in(EquipmentType::getId, typeIds));
             if (CollUtil.isNotEmpty(typeList)) {
                 typeMap = typeList.stream()
-                        .collect(Collectors.toMap(type -> String.valueOf(type.getId()), t -> t, (a, b) -> b));
+                        .collect(Collectors.toMap(EquipmentType::getId, t -> t, (a, b) -> b));
             }
         }
         // 4. 逐个查询最新监测数据(按设备类型路由)

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

@@ -572,14 +572,14 @@ public class WaterSupplyAlarmServiceImpl implements IWaterSupplyAlarmService {
      */
     private List<AlarmDashboardOutDTO.RatioItem> buildDeviceTypeRatio(List<WaterAlarmOutDTO> rows,
                                                                       Map<String, EquipmentBase> eqMap) {
-        List<String> typeIds = eqMap.values().stream()
+        List<Integer> typeIds = eqMap.values().stream()
                 .map(EquipmentBase::getEquipmentTypeId)
-                .filter(StrUtil::isNotBlank)
+                .filter(Objects::nonNull)
                 .distinct()
                 .collect(Collectors.toList());
-        Map<String, String> typeNames = typeIds.isEmpty() ? Collections.emptyMap()
+        Map<Integer, String> typeNames = typeIds.isEmpty() ? Collections.emptyMap()
                 : equipmentTypeMapper.selectBatchIds(typeIds).stream()
-                .collect(Collectors.toMap(type -> String.valueOf(type.getId()), EquipmentType::getTypeName, (a, b) -> a));
+                .collect(Collectors.toMap(EquipmentType::getId, EquipmentType::getTypeName, (a, b) -> a));
         return buildRatio(rows, row -> {
             EquipmentBase eq = row.getDeviceCode() == null ? null : eqMap.get(row.getDeviceCode());
             return eq == null ? null : typeNames.get(eq.getEquipmentTypeId());

+ 4 - 4
pipe-network-service/zksy-system/src/main/java/com/zksy/base/domain/EquipmentBase.java

@@ -42,15 +42,15 @@ public class EquipmentBase {
     @ApiModelProperty("设备制造商")
     private String manufacturer;
 
-    @ApiModelProperty("所属片区(城南/城北/太常)")
-    private String district;
+    @ApiModelProperty("所属片区(0-城南 1-城北 2-太常),见 DistrictEnum")
+    private Integer district;
 
     @ApiModelProperty("设备生产日期")
     @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
     private Date productionDate;
 
-    @ApiModelProperty("设备类型ID")
-    private String equipmentTypeId;
+    @ApiModelProperty("设备类型ID(关联 equipment_type.id)")
+    private Integer equipmentTypeId;
 
     @TableField(exist = false)
     @ApiModelProperty("设备类别名称")

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

@@ -20,8 +20,8 @@ public class AbnormalDeviceVO {
     @ApiModelProperty("设备名称")
     private String equipmentName;
 
-    @ApiModelProperty("所属区域")
-    private String district;
+    @ApiModelProperty("所属片区(0-城南 1-城北 2-太常)")
+    private Integer district;
 
     @ApiModelProperty("设备类型ID")
     private String equipmentTypeId;

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

@@ -0,0 +1,98 @@
+package com.zksy.base.domain.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/** 设备基础信息及当前运行状态。 */
+@Data
+@ApiModel("设备基础信息及状态")
+public class EquipmentBaseVO {
+
+    @ApiModelProperty("设备ID")
+    private String equipmentId;
+
+    @ApiModelProperty("设备编码")
+    private String equipmentCode;
+
+    @ApiModelProperty("设备名称")
+    private String equipmentName;
+
+    @ApiModelProperty("设备型号")
+    private String equipmentModel;
+
+    @ApiModelProperty("设备规格参数")
+    private String equipmentSpec;
+
+    @ApiModelProperty("设备制造商")
+    private String manufacturer;
+
+    @ApiModelProperty("所属片区(0-城南 1-城北 2-太常)")
+    private Integer district;
+
+    @ApiModelProperty("设备生产日期")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date productionDate;
+
+    @ApiModelProperty("设备类型ID")
+    private String equipmentTypeId;
+
+    @ApiModelProperty("设备类别名称")
+    private String equipmentTypeName;
+
+    @ApiModelProperty("设备资产价值(元)")
+    private Double assetValue;
+
+    @ApiModelProperty("预计使用年限(年)")
+    private Integer useLife;
+
+    @ApiModelProperty("设备经度")
+    private BigDecimal longitude;
+
+    @ApiModelProperty("设备纬度")
+    private BigDecimal latitude;
+
+    @ApiModelProperty("设备位置描述")
+    private String equipmentLocation;
+
+    @ApiModelProperty("安装时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime installTime;
+
+    @ApiModelProperty("设备负责人")
+    private String maintainer;
+
+    @ApiModelProperty("联系方式")
+    private String maintainerPhone;
+
+    @ApiModelProperty("权属单位")
+    private String ownershipUnit;
+
+    @ApiModelProperty("备注信息")
+    private String remark;
+
+    @ApiModelProperty("设备图片URL")
+    private String equipmentImage;
+
+    @ApiModelProperty("创建时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("更新时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty("设备当前状态:0-在用,1-维修,2-报废")
+    private Integer currentStatus;
+
+    @ApiModelProperty("报警状态:0-正常,1-报警")
+    private Integer alarmStatus;
+
+    @ApiModelProperty("在线状态:0-离线,1-在线")
+    private Integer onlineStatus;
+}

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

@@ -30,8 +30,8 @@ public class EquipmentFullVO {
     @ApiModelProperty("规格参数")
     private String equipmentSpec;
 
-    @ApiModelProperty("所属片区(城南/城北/太常)")
-    private String district;
+    @ApiModelProperty("所属片区(0-城南 1-城北 2-太常),见 DistrictEnum")
+    private Integer district;
 
     @ApiModelProperty("制造商")
     private String manufacturer;

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

@@ -42,7 +42,7 @@ public class DrillAlarmSyncService {
     @Autowired
     private WorkOrderLogMapper workOrderLogMapper;
 
-    private static final List<String> CASE_REQUIRED_TYPE_IDS = Arrays.asList("5", "9", "10");
+    private static final List<Integer> CASE_REQUIRED_TYPE_IDS = Arrays.asList(5, 9, 10);
 
     public void syncCreateCaseAndWorkOrder(AlarmData alarmData) {
         EquipmentBase equipmentBase = equipmentBaseMapper.selectOne(
@@ -53,7 +53,7 @@ public class DrillAlarmSyncService {
             log.warn("未找到设备编码对应的设备信息,deviceCode={}", alarmData.getDeviceCode());
             return;
         }
-        String typeId = equipmentBase.getEquipmentTypeId();
+        Integer typeId = equipmentBase.getEquipmentTypeId();
         boolean needCreateCase = CASE_REQUIRED_TYPE_IDS.contains(typeId);
         int caseLevel = alarmData.getAlarmLevel() != null ? alarmData.getAlarmLevel() : 4;
         int orderLevel = caseLevel <= 2 ? 0 : (caseLevel == 3 ? 1 : 2);

+ 59 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/base/enums/DistrictEnum.java

@@ -0,0 +1,59 @@
+package com.zksy.base.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.Objects;
+
+/**
+ * 设备所属片区枚举
+ *
+ * <p>与 equipment_base.district 对应,库中所存为 code(整型)。</p>
+ */
+@Getter
+@AllArgsConstructor
+public enum DistrictEnum {
+
+    SOUTH_CITY(0, "城南"),
+    NORTH_CITY(1, "城北"),
+    TAI_CHANG(2, "太常");
+
+    /**
+     * 片区编码(库中所存值)
+     */
+    private final Integer code;
+    /**
+     * 片区名称
+     */
+    private final String desc;
+
+    /**
+     * 按编码获取枚举
+     */
+    public static DistrictEnum getByCode(Integer code) {
+        if (code == null) {
+            return null;
+        }
+        for (DistrictEnum item : values()) {
+            if (Objects.equals(item.code, code)) {
+                return item;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 按编码获取片区名称,编码非法时返回 null
+     */
+    public static String getDescByCode(Integer code) {
+        DistrictEnum item = getByCode(code);
+        return item == null ? null : item.getDesc();
+    }
+
+    /**
+     * 编码是否为合法片区
+     */
+    public static boolean isValid(Integer code) {
+        return getByCode(code) != null;
+    }
+}

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

@@ -36,7 +36,7 @@ public class DrillAlarmSyncService {
     @Autowired
     private WorkOrderLogMapper workOrderLogMapper;
 
-    private static final List<String> CASE_REQUIRED_TYPE_IDS = Arrays.asList("5", "9", "10");
+    private static final List<Integer> CASE_REQUIRED_TYPE_IDS = Arrays.asList(5, 9, 10);
 
     public void syncCreateCaseAndWorkOrder(AlarmData alarmData) {
         EquipmentBase equipmentBase = equipmentBaseMapper.selectOne(
@@ -47,7 +47,7 @@ public class DrillAlarmSyncService {
             log.warn("未找到设备编码对应的设备信息,deviceCode={}", alarmData.getDeviceCode());
             return;
         }
-        String typeId = equipmentBase.getEquipmentTypeId();
+        Integer typeId = equipmentBase.getEquipmentTypeId();
         boolean needCreateCase = CASE_REQUIRED_TYPE_IDS.contains(typeId);
         int caseLevel = alarmData.getAlarmLevel() != null ? alarmData.getAlarmLevel() : 4;
         int orderLevel = caseLevel <= 2 ? 0 : (caseLevel == 3 ? 1 : 2);

+ 7 - 4
pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/EquipmentBaseService.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.zksy.base.domain.EquipmentBase;
 import com.zksy.base.domain.vo.EquipmentFullVO;
+import com.zksy.base.domain.vo.EquipmentBaseVO;
 import com.zksy.manhole.dto.in.AlarmMonitorListInDTO;
 import com.zksy.manhole.dto.in.EquipmentCountByTypeInDTO;
 import com.zksy.manhole.dto.in.EquipmentExportInDTO;
@@ -25,10 +26,12 @@ public interface EquipmentBaseService extends IService<EquipmentBase> {
                                          String equipmentModel, String manufacturer,
                                          String equipmentTypeId);
 
-    Page<EquipmentBase> findByPage(long pageNum, long pageSize,
+    Page<EquipmentBaseVO> findByPage(long pageNum, long pageSize,
                                    String equipmentCode, String equipmentName,
-                                   String equipmentTypeId, Integer rootTypeId,
-                                   Integer onlineStatus, Integer alarmStatus);
+                                   Integer equipmentTypeId, Integer rootTypeId,
+                Integer onlineStatus, Integer alarmStatus);
+
+    Map<String, Object> getEquipmentStatusStatistics(Integer rootTypeId);
 
     boolean saveWithCheck(EquipmentBase entity);
 
@@ -97,4 +100,4 @@ public interface EquipmentBaseService extends IService<EquipmentBase> {
      * @return 设备列表 + 统计信息
      */
     AlarmMonitorListOutDTO getAlarmMonitorList(AlarmMonitorListInDTO inDTO);
-}
+}

+ 0 - 12
pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/EquipmentStatusService.java

@@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.zksy.base.domain.EquipmentStatus;
 
-import java.util.Map;
 import com.zksy.manhole.dto.in.EquipmentStatusInDTO;
 import org.springframework.stereotype.Service;
 
@@ -57,15 +56,4 @@ public interface EquipmentStatusService extends IService<EquipmentStatus> {
      */
     boolean existsByDeviceCode(String deviceCode);
 
-    /**
-     * 设备状态统计:设备总数 / 在线设备数 / 离线设备数 / 报警设备数。
-     * @param rootTypeId 设备根类型ID(数据范围过滤,空=全部)
-     */
-    Map<String, Object> statistics(Integer rootTypeId);
-
-    /**
-     * 查询指定根设备类型范围内所有设备的状态记录。
-     * @param rootTypeId 设备根类型ID(空=全部)
-     */
-    List<EquipmentStatus> listByRootType(Integer rootTypeId);
 }

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

@@ -86,12 +86,12 @@ public class CaseInfoServiceImpl extends ServiceImpl<CaseInfoMapper, CaseInfo>
             if(CollUtil.isNotEmpty(equipmentBaseList)){
                 equipmentBaseMap.putAll(equipmentBaseList.stream().collect(Collectors.toMap(EquipmentBase::getEquipmentId, Function.identity(), (key1, key2) -> key2)));
             }
-            List<String> equipmentTypeIdList = equipmentBaseList.stream().map(EquipmentBase::getEquipmentTypeId).distinct().collect(Collectors.toList());
+            List<Integer> equipmentTypeIdList = equipmentBaseList.stream().map(EquipmentBase::getEquipmentTypeId).distinct().collect(Collectors.toList());
             List<EquipmentType> equipmentTypeList = equipmentTypeMapper.selectBatchIds(equipmentTypeIdList);
-            Map<String, EquipmentType> equipmentTypeMap = new HashMap<>();
+            Map<Integer, EquipmentType> equipmentTypeMap = new HashMap<>();
             if(CollUtil.isNotEmpty(equipmentTypeList)){
                 equipmentTypeMap.putAll(equipmentTypeList.stream().collect(
-                        Collectors.toMap(type -> String.valueOf(type.getId()), Function.identity(), (key1, key2) -> key2)));
+                        Collectors.toMap(EquipmentType::getId, Function.identity(), (key1, key2) -> key2)));
             }
             for(CaseInfoOutDTO outDTO : outDTOList) {
                 EquipmentBase equipmentBase = equipmentBaseMap.get(outDTO.getDeviceId());

+ 110 - 47
pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/impl/EquipmentBaseServiceImpl.java

@@ -13,8 +13,10 @@ import com.zksy.base.constant.GasEquipmentTypeEnum;
 import com.zksy.base.domain.*;
 import com.zksy.base.enums.AlarmStatusEnum;
 import com.zksy.base.enums.CurrentStatusEnum;
+import com.zksy.base.enums.DistrictEnum;
 import com.zksy.base.enums.EquipmentTypeEnum;
 import com.zksy.base.enums.OnlineStatusEnum;
+import com.zksy.base.domain.vo.EquipmentBaseVO;
 import com.zksy.base.domain.vo.EquipmentFullVO;
 import com.zksy.base.event.DeviceStatusChangePublisher;
 import com.zksy.base.manhole.domain.ManholeData;
@@ -83,9 +85,9 @@ public class EquipmentBaseServiceImpl extends ServiceImpl<EquipmentBaseMapper, E
     private WorkOrderMapper workOrderMapper;
 
     @Override
-    public Page<EquipmentBase> findByPage(long pageNum, long pageSize,
+    public Page<EquipmentBaseVO> findByPage(long pageNum, long pageSize,
                                           String equipmentCode, String equipmentName,
-                                          String equipmentTypeId, Integer rootTypeId,
+                                          Integer equipmentTypeId, Integer rootTypeId,
                                           Integer onlineStatus, Integer alarmStatus) {
         Page<EquipmentBase> page = new Page<>(pageNum, pageSize);
         LambdaQueryWrapper<EquipmentBase> queryWrapper = new LambdaQueryWrapper<>();
@@ -95,7 +97,7 @@ public class EquipmentBaseServiceImpl extends ServiceImpl<EquipmentBaseMapper, E
         if (equipmentName != null && !equipmentName.isEmpty()) {
             queryWrapper.like(EquipmentBase::getEquipmentName, equipmentName);
         }
-        if (equipmentTypeId != null && !equipmentTypeId.isEmpty()) {
+        if (equipmentTypeId != null) {
             queryWrapper.eq(EquipmentBase::getEquipmentTypeId, equipmentTypeId);
         }
         // 在线/报警条件位于 equipment_status,先取出命中的设备ID再回主表过滤
@@ -113,23 +115,76 @@ public class EquipmentBaseServiceImpl extends ServiceImpl<EquipmentBaseMapper, E
                     .distinct()
                     .collect(Collectors.toList());
             if (matchedIds.isEmpty()) {
-                page.setRecords(Collections.emptyList());
-                page.setTotal(0);
-                return page;
+                return new Page<>(pageNum, pageSize, 0);
             }
             queryWrapper.in(EquipmentBase::getEquipmentId, matchedIds);
         }
         Set<String> allowedTypeIds = resolveChildTypeIds(rootTypeId);
         if (allowedTypeIds != null) {
             if (allowedTypeIds.isEmpty()) {
-                page.setRecords(Collections.emptyList());
-                page.setTotal(0);
-                return page;
+                return new Page<>(pageNum, pageSize, 0);
             }
             queryWrapper.in(EquipmentBase::getEquipmentTypeId, allowedTypeIds);
         }
         queryWrapper.orderByDesc(EquipmentBase::getCreateTime);
-        return this.page(page, queryWrapper);
+        Page<EquipmentBase> basePage = this.page(page, queryWrapper);
+        List<String> equipmentIds = basePage.getRecords().stream().map(EquipmentBase::getEquipmentId)
+                .filter(Objects::nonNull).collect(Collectors.toList());
+        Map<String, EquipmentStatus> statusMap = equipmentIds.isEmpty() ? Collections.emptyMap() :
+                equipmentStatusMapper.selectList(new LambdaQueryWrapper<EquipmentStatus>()
+                        .in(EquipmentStatus::getEquipmentId, equipmentIds)).stream()
+                        .collect(Collectors.toMap(EquipmentStatus::getEquipmentId, Function.identity(), (a, b) -> a));
+        Set<Integer> typeIds = basePage.getRecords().stream().map(EquipmentBase::getEquipmentTypeId)
+                .filter(Objects::nonNull).collect(Collectors.toSet());
+        Map<Integer, EquipmentType> typeMap = typeIds.isEmpty() ? Collections.emptyMap() :
+                equipmentTypeMapper.selectBatchIds(typeIds).stream()
+                        .collect(Collectors.toMap(EquipmentType::getId, Function.identity(), (a, b) -> a));
+        List<EquipmentBaseVO> records = new ArrayList<>();
+        for (EquipmentBase equipment : basePage.getRecords()) {
+            EquipmentBaseVO vo = new EquipmentBaseVO();
+            BeanUtil.copyProperties(equipment, vo);
+            EquipmentType type = typeMap.get(equipment.getEquipmentTypeId());
+            vo.setEquipmentTypeName(type == null ? equipment.getEquipmentTypeName() : type.getTypeName());
+            EquipmentStatus status = statusMap.get(equipment.getEquipmentId());
+            if (status != null) {
+                vo.setCurrentStatus(status.getCurrentStatus());
+                vo.setAlarmStatus(status.getAlarmStatus());
+                vo.setOnlineStatus(status.getOnlineStatus());
+            } else {
+                vo.setCurrentStatus(0);
+                vo.setAlarmStatus(0);
+                vo.setOnlineStatus(0);
+            }
+            records.add(vo);
+        }
+        Page<EquipmentBaseVO> result = new Page<>(pageNum, pageSize, basePage.getTotal());
+        result.setRecords(records);
+        return result;
+    }
+
+    @Override
+    public Map<String, Object> getEquipmentStatusStatistics(Integer rootTypeId) {
+        Set<String> allowedTypeIds = resolveChildTypeIds(rootTypeId);
+        LambdaQueryWrapper<EquipmentBase> baseWrapper = new LambdaQueryWrapper<>();
+        if (allowedTypeIds != null) {
+            baseWrapper.in(EquipmentBase::getEquipmentTypeId,
+                    allowedTypeIds.isEmpty() ? Collections.singleton("") : allowedTypeIds);
+        }
+        List<String> equipmentIds = this.list(baseWrapper).stream().map(EquipmentBase::getEquipmentId)
+                .filter(Objects::nonNull).collect(Collectors.toList());
+        Map<String, Object> result = new LinkedHashMap<>();
+        result.put("total", equipmentIds.size());
+        if (equipmentIds.isEmpty()) {
+            result.put("online", 0L); result.put("offline", 0L); result.put("alarm", 0L);
+            return result;
+        }
+        result.put("online", equipmentStatusMapper.selectCount(new LambdaQueryWrapper<EquipmentStatus>()
+                .in(EquipmentStatus::getEquipmentId, equipmentIds).eq(EquipmentStatus::getOnlineStatus, 1)));
+        result.put("offline", equipmentStatusMapper.selectCount(new LambdaQueryWrapper<EquipmentStatus>()
+                .in(EquipmentStatus::getEquipmentId, equipmentIds).eq(EquipmentStatus::getOnlineStatus, 0)));
+        result.put("alarm", equipmentStatusMapper.selectCount(new LambdaQueryWrapper<EquipmentStatus>()
+                .in(EquipmentStatus::getEquipmentId, equipmentIds).eq(EquipmentStatus::getAlarmStatus, 1)));
+        return result;
     }
 
     /**
@@ -154,7 +209,7 @@ public class EquipmentBaseServiceImpl extends ServiceImpl<EquipmentBaseMapper, E
 
     @Override
     public boolean saveWithCheck(EquipmentBase entity) {
-        String equipmentTypeId = entity.getEquipmentTypeId();
+        Integer equipmentTypeId = entity.getEquipmentTypeId();
         EquipmentType equipmentType = getEquipmentTypeById(equipmentTypeId);
         if (equipmentType == null) {
             throw new ServiceException("设备类型不存在,请检查equipment_type_id:" + equipmentTypeId);
@@ -231,6 +286,14 @@ public class EquipmentBaseServiceImpl extends ServiceImpl<EquipmentBaseMapper, E
             throw new ServiceException("设备不存在,无法修改:" + equipmentId);
         }
 
+        // 编辑时所属片区必填,且必须是 DistrictEnum 合法编码(0-城南 1-城北 2-太常)
+        if (entity.getDistrict() == null) {
+            throw new ServiceException("所属片区不能为空");
+        }
+        if (!DistrictEnum.isValid(entity.getDistrict())) {
+            throw new ServiceException("所属片区取值非法:" + entity.getDistrict());
+        }
+
         /*String newTypeId = entity.getEquipmentTypeId();
         if (newTypeId != null && getEquipmentTypeById(newTypeId) == null) {
             throw new ServiceException("设备类型不存在:" + newTypeId);
@@ -353,14 +416,14 @@ public class EquipmentBaseServiceImpl extends ServiceImpl<EquipmentBaseMapper, E
         List<EquipmentBaseOutDTO> outDTOList = BeanUtil.copyToList(rs.getRecords(), EquipmentBaseOutDTO.class);
         if (CollUtil.isNotEmpty(outDTOList)) {
             //查询设备类型
-            List<String> equipmentTypeIdList = outDTOList.stream().map(EquipmentBaseOutDTO::getEquipmentTypeId).distinct().collect(Collectors.toList());
+            List<Integer> equipmentTypeIdList = outDTOList.stream().map(EquipmentBaseOutDTO::getEquipmentTypeId).distinct().collect(Collectors.toList());
             LambdaQueryWrapper<EquipmentType> batchQw = new LambdaQueryWrapper<>();
             batchQw.in(EquipmentType::getId, equipmentTypeIdList);
             List<EquipmentType> equipmentTypeList = equipmentTypeMapper.selectList(batchQw);
-            Map<String, EquipmentType> equipmentTypeMap = new HashMap<>();
+            Map<Integer, EquipmentType> equipmentTypeMap = new HashMap<>();
             if(CollUtil.isNotEmpty(equipmentTypeList)){
                 equipmentTypeMap.putAll(equipmentTypeList.stream().collect(
-                    Collectors.toMap(t -> String.valueOf(t.getId()), Function.identity(), (key1, key2) -> key2)));
+                    Collectors.toMap(EquipmentType::getId, Function.identity(), (key1, key2) -> key2)));
             }
             //查询设备状态
             List<String> equipmentIdList = outDTOList.stream().map(EquipmentBaseOutDTO::getEquipmentId).distinct().collect(Collectors.toList());
@@ -413,22 +476,22 @@ public class EquipmentBaseServiceImpl extends ServiceImpl<EquipmentBaseMapper, E
     @Override
     public Map<String, Object> getManholeDeviceStatistics(ManholeDeviceStatisticsInDTO inDTO) {
         // 窨井设备:排水窨井(equipment_type_id=9)/供水窨井(equipment_type_id=10),筛选时仅统计所选类别
-        List<String> manholeTypeIds = StringUtils.isNotEmpty(inDTO.getEquipmentTypeId())
-                ? Collections.singletonList(inDTO.getEquipmentTypeId()) : Arrays.asList("5", "9", "10");
+        List<Integer> manholeTypeIds = inDTO.getEquipmentTypeId() != null
+                ? Collections.singletonList(inDTO.getEquipmentTypeId()) : Arrays.asList(5, 9, 10);
         List<EquipmentBase> devices = this.list(new LambdaQueryWrapper<EquipmentBase>()
                 .in(EquipmentBase::getEquipmentTypeId, manholeTypeIds)
-                .eq(StringUtils.isNotEmpty(inDTO.getDistrict()), EquipmentBase::getDistrict, inDTO.getDistrict()));
+                .eq(inDTO.getDistrict() != null, EquipmentBase::getDistrict, inDTO.getDistrict()));
         int total = devices.size();
 
-        // 区域分布:按所属片区(district)分组统计
-        Map<String, Long> regionCountMap = devices.stream()
-                .filter(d -> StringUtils.isNotBlank(d.getDistrict()))
+        // 区域分布:按所属片区(district)分组统计,展示用 DistrictEnum 名称
+        Map<Integer, Long> regionCountMap = devices.stream()
+                .filter(d -> d.getDistrict() != null)
                 .collect(Collectors.groupingBy(EquipmentBase::getDistrict, Collectors.counting()));
         List<Map<String, Object>> regionDistribution = regionCountMap.entrySet().stream()
                 .sorted((a, b) -> Long.compare(b.getValue(), a.getValue()))
                 .map(e -> {
                     Map<String, Object> item = new HashMap<>();
-                    item.put("name", e.getKey());
+                    item.put("name", DistrictEnum.getDescByCode(e.getKey()));
                     item.put("count", e.getValue());
                     item.put("percent", calcPercent(e.getValue(), total));
                     return item;
@@ -436,17 +499,17 @@ public class EquipmentBaseServiceImpl extends ServiceImpl<EquipmentBaseMapper, E
                 .collect(Collectors.toList());
 
         // 类型分布:按设备类型分组统计(9=排水窨井设备,10=供水窨井设备)
-        Map<String, String> typeNameMap = new HashMap<>();
-        typeNameMap.put("9", "排水窨井设备");
-        typeNameMap.put("10", "供水窨井设备");
-        Map<String, Long> typeCountMap = devices.stream()
-                .filter(d -> StringUtils.isNotBlank(d.getEquipmentTypeId()))
+        Map<Integer, String> typeNameMap = new HashMap<>();
+        typeNameMap.put(9, "排水窨井设备");
+        typeNameMap.put(10, "供水窨井设备");
+        Map<Integer, Long> typeCountMap = devices.stream()
+                .filter(d -> d.getEquipmentTypeId() != null)
                 .collect(Collectors.groupingBy(EquipmentBase::getEquipmentTypeId, Collectors.counting()));
         List<Map<String, Object>> typeDistribution = typeCountMap.entrySet().stream()
                 .sorted((a, b) -> Long.compare(b.getValue(), a.getValue()))
                 .map(e -> {
                     Map<String, Object> item = new HashMap<>();
-                    item.put("name", typeNameMap.getOrDefault(e.getKey(), e.getKey()));
+                    item.put("name", typeNameMap.getOrDefault(e.getKey(), String.valueOf(e.getKey())));
                     item.put("count", e.getValue());
                     item.put("percent", calcPercent(e.getValue(), total));
                     return item;
@@ -522,14 +585,14 @@ public class EquipmentBaseServiceImpl extends ServiceImpl<EquipmentBaseMapper, E
         List<EquipmentBaseOutDTO> outDTOList = BeanUtil.copyToList(rs.getRecords(), EquipmentBaseOutDTO.class);
         if (CollUtil.isNotEmpty(outDTOList)) {
             //查询设备类型
-            List<String> equipmentTypeIdList = outDTOList.stream().map(EquipmentBaseOutDTO::getEquipmentTypeId).distinct().collect(Collectors.toList());
+            List<Integer> equipmentTypeIdList = outDTOList.stream().map(EquipmentBaseOutDTO::getEquipmentTypeId).distinct().collect(Collectors.toList());
             LambdaQueryWrapper<EquipmentType> batchQw = new LambdaQueryWrapper<>();
             batchQw.in(EquipmentType::getId, equipmentTypeIdList);
             List<EquipmentType> equipmentTypeList = equipmentTypeMapper.selectList(batchQw);
-            Map<String, EquipmentType> equipmentTypeMap = new HashMap<>();
+            Map<Integer, EquipmentType> equipmentTypeMap = new HashMap<>();
             if(CollUtil.isNotEmpty(equipmentTypeList)){
                 equipmentTypeMap.putAll(equipmentTypeList.stream().collect(
-                    Collectors.toMap(t -> String.valueOf(t.getId()), Function.identity(), (key1, key2) -> key2)));
+                    Collectors.toMap(EquipmentType::getId, Function.identity(), (key1, key2) -> key2)));
             }
             //查询设备状态
             List<String> equipmentIdList = outDTOList.stream().map(EquipmentBaseOutDTO::getEquipmentId).distinct().collect(Collectors.toList());
@@ -684,12 +747,12 @@ public class EquipmentBaseServiceImpl extends ServiceImpl<EquipmentBaseMapper, E
         List<EquipmentBaseOutDTO> outDTOList = BeanUtil.copyToList(equipmentList, EquipmentBaseOutDTO.class);
 
         // 批量查询设备类型名称
-        List<String> typeIdList = outDTOList.stream().map(EquipmentBaseOutDTO::getEquipmentTypeId).distinct().collect(Collectors.toList());
+        List<Integer> typeIdList = outDTOList.stream().map(EquipmentBaseOutDTO::getEquipmentTypeId).distinct().collect(Collectors.toList());
         List<EquipmentType> equipmentTypeList = equipmentTypeMapper.selectList(new LambdaQueryWrapper<EquipmentType>()
                 .in(EquipmentType::getId, typeIdList));
-        Map<String, EquipmentType> equipmentTypeMap = new HashMap<>();
+        Map<Integer, EquipmentType> equipmentTypeMap = new HashMap<>();
         if (CollUtil.isNotEmpty(equipmentTypeList)) {
-            equipmentTypeMap.putAll(equipmentTypeList.stream().collect(Collectors.toMap(t -> String.valueOf(t.getId()), Function.identity(), (k1, k2) -> k2)));
+            equipmentTypeMap.putAll(equipmentTypeList.stream().collect(Collectors.toMap(EquipmentType::getId, Function.identity(), (k1, k2) -> k2)));
         }
 
         // 批量查询设备运维状态
@@ -981,18 +1044,18 @@ public class EquipmentBaseServiceImpl extends ServiceImpl<EquipmentBaseMapper, E
         }
 
         // 批量查设备类型(用于解析类型名称)
-        List<String> equipmentTypeIdList = equipmentList.stream()
+        List<Integer> equipmentTypeIdList = equipmentList.stream()
                 .map(EquipmentBase::getEquipmentTypeId)
                 .filter(Objects::nonNull)
                 .distinct().collect(Collectors.toList());
-        Map<String, EquipmentType> equipmentTypeMap = new HashMap<>();
+        Map<Integer, EquipmentType> equipmentTypeMap = new HashMap<>();
         if (CollUtil.isNotEmpty(equipmentTypeIdList)) {
             LambdaQueryWrapper<EquipmentType> batchTypeQw = new LambdaQueryWrapper<>();
             batchTypeQw.in(EquipmentType::getId, equipmentTypeIdList);
             List<EquipmentType> equipmentTypeList = equipmentTypeMapper.selectList(batchTypeQw);
             if (CollUtil.isNotEmpty(equipmentTypeList)) {
                 equipmentTypeMap.putAll(equipmentTypeList.stream().collect(
-                    Collectors.toMap(t -> String.valueOf(t.getId()), Function.identity(), (key1, key2) -> key2)));
+                    Collectors.toMap(EquipmentType::getId, Function.identity(), (key1, key2) -> key2)));
             }
         }
 
@@ -1105,7 +1168,7 @@ public class EquipmentBaseServiceImpl extends ServiceImpl<EquipmentBaseMapper, E
                 }
             } else {
                 // 无子类别:直接统计该类别的设备数量
-                EquipmentType equipmentType = getEquipmentTypeById(equipmentTypeId);
+                EquipmentType equipmentType = getEquipmentTypeById(Integer.valueOf(equipmentTypeId));
                 long count = this.count(new LambdaQueryWrapper<EquipmentBase>()
                         .eq(EquipmentBase::getEquipmentTypeId, equipmentTypeId));
                 EquipmentCountByTypeOutDTO outDTO = new EquipmentCountByTypeOutDTO();
@@ -1135,16 +1198,16 @@ public class EquipmentBaseServiceImpl extends ServiceImpl<EquipmentBaseMapper, E
             return new ArrayList<>();
         }
         // 一次性查询所有设备类别
-        List<String> typeIds = equipmentList.stream()
+        List<Integer> typeIds = equipmentList.stream()
                 .map(EquipmentBase::getEquipmentTypeId)
-                .filter(StringUtils::isNotEmpty)
+                .filter(Objects::nonNull)
                 .distinct()
                 .collect(Collectors.toList());
-        Map<String, String> typeNameMap = new HashMap<>();
+        Map<Integer, String> typeNameMap = new HashMap<>();
         if(CollUtil.isNotEmpty(typeIds)){
             List<EquipmentType> typeList = equipmentTypeMapper.selectBatchIds(typeIds);
             typeNameMap = typeList.stream()
-                    .collect(Collectors.toMap(t -> String.valueOf(t.getId()), EquipmentType::getTypeName, (k1, k2) -> k1));
+                    .collect(Collectors.toMap(EquipmentType::getId, EquipmentType::getTypeName, (k1, k2) -> k1));
         }
         // 一次性查询所有设备状态
         List<String> equipmentIds = equipmentList.stream()
@@ -1194,8 +1257,8 @@ public class EquipmentBaseServiceImpl extends ServiceImpl<EquipmentBaseMapper, E
      * @param id equipment_type 主键
      * @return 设备类型,未找到返回 null
      */
-    private EquipmentType getEquipmentTypeById(String id) {
-        if (StringUtils.isEmpty(id)) {
+    private EquipmentType getEquipmentTypeById(Integer id) {
+        if (id == null) {
             return null;
         }
         return equipmentTypeMapper.selectById(id);
@@ -1243,7 +1306,7 @@ public class EquipmentBaseServiceImpl extends ServiceImpl<EquipmentBaseMapper, E
             }
         }
 
-        // 排水模块的顶级名称在历史数据中可能不是“排水”,按稳定 type_id 兼容查询。
+        // 排水模块的顶级名称在历史数据中可能不是"排水",按稳定 type_id 兼容查询。
         if (typeIds.isEmpty() && StringUtils.isNotEmpty(typeName) && typeName.contains("排水")) {
             List<EquipmentType> drainageTypes = equipmentTypeMapper.selectList(
                     new LambdaQueryWrapper<EquipmentType>()
@@ -1282,18 +1345,18 @@ public class EquipmentBaseServiceImpl extends ServiceImpl<EquipmentBaseMapper, E
         List<EquipmentBase> equipmentList = this.list(wrapper);
 
         // 回填设备类型名称,供阈值配置、设备台账等页面直接展示。
-        Map<String, String> typeNameMap = new HashMap<>();
+        Map<Integer, String> typeNameMap = new HashMap<>();
         List<EquipmentType> equipmentTypes = equipmentTypeMapper.selectList(
                 new LambdaQueryWrapper<EquipmentType>().in(EquipmentType::getId, new ArrayList<>(typeIds)));
         for (EquipmentType type : equipmentTypes) {
             if (type != null && type.getId() != null) {
-                typeNameMap.put(String.valueOf(type.getId()), type.getTypeName());
+                typeNameMap.put(type.getId(), type.getTypeName());
             }
         }
         equipmentList.forEach(equipment -> {
             String resolvedTypeName = typeNameMap.get(equipment.getEquipmentTypeId());
             equipment.setEquipmentTypeName(StringUtils.isNotEmpty(resolvedTypeName)
-                    ? resolvedTypeName : equipment.getEquipmentTypeId());
+                    ? resolvedTypeName : String.valueOf(equipment.getEquipmentTypeId()));
         });
         return equipmentList;
     }

+ 0 - 80
pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/impl/EquipmentStatusServiceImpl.java

@@ -5,15 +5,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.zksy.base.domain.EquipmentBase;
 import com.zksy.base.domain.EquipmentStatus;
-import com.zksy.base.domain.EquipmentType;
-import com.zksy.base.enums.AlarmStatusEnum;
 import com.zksy.base.enums.CurrentStatusEnum;
-import com.zksy.base.enums.EquipmentTypeEnum;
-import com.zksy.base.enums.OnlineStatusEnum;
 import com.zksy.base.event.DeviceStatusChangePublisher;
 import com.zksy.base.mapper.EquipmentBaseMapper;
 import com.zksy.base.mapper.EquipmentStatusMapper;
-import com.zksy.base.mapper.EquipmentTypeMapper;
 import com.zksy.base.service.EquipmentStatusService;
 import com.zksy.common.exception.ServiceException;
 import com.zksy.manhole.dto.in.EquipmentStatusInDTO;
@@ -22,12 +17,9 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.Collections;
 import java.util.Date;
-import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
-import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
 import java.util.stream.Collectors;
@@ -40,9 +32,6 @@ public class EquipmentStatusServiceImpl extends ServiceImpl<EquipmentStatusMappe
     @Autowired
     private EquipmentBaseMapper equipmentBaseMapper;
 
-    @Autowired
-    private EquipmentTypeMapper equipmentTypeMapper;
-
     @Autowired
     private DeviceStatusChangePublisher deviceStatusChangePublisher;
 
@@ -285,75 +274,6 @@ public class EquipmentStatusServiceImpl extends ServiceImpl<EquipmentStatusMappe
         return equipmentBaseMapper.selectCount(wrapper) > 0;
     }
 
-    @Override
-    public Map<String, Object> statistics(Integer rootTypeId) {
-        Map<String, Object> result = new HashMap<>();
-        Set<String> allowedEquipmentIds = resolveRootEquipmentIds(rootTypeId);
-        // 设备总数以 equipment_base 为准
-        LambdaQueryWrapper<EquipmentBase> baseWrapper = new LambdaQueryWrapper<>();
-        if (allowedEquipmentIds != null) {
-            baseWrapper.in(EquipmentBase::getEquipmentId, allowedEquipmentIds.isEmpty() ? Collections.singleton("") : allowedEquipmentIds);
-        }
-        long total = equipmentBaseMapper.selectCount(baseWrapper);
-        LambdaQueryWrapper<EquipmentStatus> onlineWrapper = new LambdaQueryWrapper<EquipmentStatus>()
-                .eq(EquipmentStatus::getOnlineStatus, OnlineStatusEnum.ONLINE.getCode());
-        LambdaQueryWrapper<EquipmentStatus> offlineWrapper = new LambdaQueryWrapper<EquipmentStatus>()
-                .eq(EquipmentStatus::getOnlineStatus, OnlineStatusEnum.OFFLINE.getCode());
-        LambdaQueryWrapper<EquipmentStatus> alarmWrapper = new LambdaQueryWrapper<EquipmentStatus>()
-                .eq(EquipmentStatus::getAlarmStatus, AlarmStatusEnum.ALARM.getCode());
-        if (allowedEquipmentIds != null) {
-            onlineWrapper.in(EquipmentStatus::getEquipmentId, allowedEquipmentIds.isEmpty() ? Collections.singleton("") : allowedEquipmentIds);
-            offlineWrapper.in(EquipmentStatus::getEquipmentId, allowedEquipmentIds.isEmpty() ? Collections.singleton("") : allowedEquipmentIds);
-            alarmWrapper.in(EquipmentStatus::getEquipmentId, allowedEquipmentIds.isEmpty() ? Collections.singleton("") : allowedEquipmentIds);
-        }
-        result.put("total", total);
-        result.put("online", this.count(onlineWrapper));
-        result.put("offline", this.count(offlineWrapper));
-        result.put("alarm", this.count(alarmWrapper));
-        return result;
-    }
-
-    @Override
-    public List<EquipmentStatus> listByRootType(Integer rootTypeId) {
-        Set<String> allowedEquipmentIds = resolveRootEquipmentIds(rootTypeId);
-        if (allowedEquipmentIds == null) {
-            return this.list();
-        }
-        if (allowedEquipmentIds.isEmpty()) {
-            return Collections.emptyList();
-        }
-        return this.list(new LambdaQueryWrapper<EquipmentStatus>()
-                .in(EquipmentStatus::getEquipmentId, allowedEquipmentIds));
-    }
-
-    /**
-     * 解析根设备类型范围内的设备ID集合;rootTypeId 为空时返回 null(不过滤),
-     * 根类型无效时抛出异常,范围内无设备时返回空集合。
-     */
-    private Set<String> resolveRootEquipmentIds(Integer rootTypeId) {
-        if (rootTypeId == null || rootTypeId <= 0) {
-            return null;
-        }
-        EquipmentTypeEnum rootEnum = EquipmentTypeEnum.getById(rootTypeId);
-        if (rootEnum == null || !rootEnum.isRoot()) {
-            throw new ServiceException("无效的设备根类型:" + rootTypeId);
-        }
-        List<String> childTypeIds = equipmentTypeMapper.selectList(new LambdaQueryWrapper<EquipmentType>()
-                        .eq(EquipmentType::getParentId, rootTypeId)).stream()
-                .map(EquipmentType::getId)
-                .filter(Objects::nonNull)
-                .map(String::valueOf)
-                .collect(Collectors.toList());
-        if (childTypeIds.isEmpty()) {
-            return Collections.emptySet();
-        }
-        return equipmentBaseMapper.selectList(new LambdaQueryWrapper<EquipmentBase>()
-                        .in(EquipmentBase::getEquipmentTypeId, childTypeIds)).stream()
-                .map(EquipmentBase::getEquipmentId)
-                .filter(Objects::nonNull)
-                .collect(Collectors.toSet());
-    }
-
     private boolean hasStateChange(EquipmentStatus oldStatus, EquipmentStatus patch) {
         if (oldStatus == null || patch == null) {
             return false;

+ 0 - 90
pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/impl/EquipmentTypeServiceImpl.java

@@ -182,96 +182,6 @@ public class EquipmentTypeServiceImpl extends ServiceImpl<EquipmentTypeMapper, E
         return this.updateById(entity);
     }
 
-    /**
-     * 设备类别删除
-     * @param typeId
-     * @return
-     */
-    @Transactional
-    public boolean removeWithCheck1(Integer typeId) {
-        // 校验类别是否存在
-        EquipmentType type = this.getById(typeId);
-        if (type == null) {
-            throw new ServiceException("设备类别不存在:" + typeId);
-        }
-
-        //校验是否有子设备关联
-        LambdaQueryWrapper<EquipmentBase> eqWrapper = new LambdaQueryWrapper<>();
-        eqWrapper.eq(EquipmentBase::getEquipmentTypeId, String.valueOf(typeId));
-        //TODO 待完善
-        long relatedEqCount = equipmentBaseMapper.selectCount(eqWrapper);
-        if (relatedEqCount > 0) {
-            throw new ServiceException("该类别下存在" + relatedEqCount + "台设备,无法删除");
-        }
-
-        //校验是否有子类别依赖
-        LambdaQueryWrapper<EquipmentType> childWrapper = new LambdaQueryWrapper<>();
-        childWrapper.eq(EquipmentType::getParentId, typeId);
-        long childTypeCount = this.count(childWrapper);
-        if (childTypeCount > 0) {
-            throw new ServiceException("该类别下存在" + childTypeCount + "个子类别,无法删除");
-        }
-
-        return this.removeById(typeId);
-    }
-
-    /**
-     * 设备类别批量删除
-     * @param typeIds
-     * @return
-     */
-
-    @Transactional
-    //TODO 这部分逻辑待优化,考虑删还是不删除,的概率是要删的
-    public boolean removeBatchWithCheck1(List<Integer> typeIds) {
-        // 1. 基础校验:ID列表不能为空
-        if (CollectionUtils.isEmpty(typeIds)) {
-            throw new ServiceException("批量删除失败:类别ID列表不能为空");
-        }
-
-        // 2. 校验类别是否存在(过滤无效ID)
-        List<EquipmentType> existTypes = this.listByIds(typeIds);
-        if (existTypes.isEmpty()) {
-            throw new ServiceException("批量删除失败:所有类别ID均不存在");
-        }
-        List<Integer> existIds = existTypes.stream()
-                .map(EquipmentType::getId)
-                .collect(Collectors.toList());
-        // 记录无效ID(仅警告,不阻断)
-        List<Integer> invalidIds = typeIds.stream()
-                .filter(id -> !existIds.contains(id))
-                .collect(Collectors.toList());
-        if (!invalidIds.isEmpty()) {
-            log.warn("批量删除中存在无效类别ID:{}", invalidIds);
-        }
-
-        // 3. 校验是否有关联设备(批量检查)
-        LambdaQueryWrapper<EquipmentBase> eqWrapper = new LambdaQueryWrapper<>();
-        eqWrapper.in(EquipmentBase::getEquipmentTypeId, toTypeKeyTexts(existIds));
-        //TODO 待完善,不确定方法用对没
-        List<String> relatedTypeIds = equipmentBaseMapper.selectList(eqWrapper).stream()
-                .map(EquipmentBase::getEquipmentTypeId)
-                .distinct() // 去重,获取有设备关联的类别ID
-                .collect(Collectors.toList());
-        if (!relatedTypeIds.isEmpty()) {
-            throw new ServiceException("以下类别存在关联设备,无法删除:" + relatedTypeIds);
-        }
-
-        // 4. 校验是否有子类别依赖(批量检查)
-        LambdaQueryWrapper<EquipmentType> childWrapper = new LambdaQueryWrapper<>();
-        childWrapper.in(EquipmentType::getParentId, existIds);
-        List<Integer> hasChildTypeIds = this.list(childWrapper).stream()
-                .map(EquipmentType::getParentId)
-                .distinct() // 去重,获取有子类别依赖的类别ID
-                .collect(Collectors.toList());
-        if (!hasChildTypeIds.isEmpty()) {
-            throw new ServiceException("以下类别存在子类别,无法删除:" + hasChildTypeIds);
-        }
-
-        // 5. 执行批量删除
-        return this.removeByIds(existIds);
-    }
-
     /**
      * 设备类别删除(强制删除,先删关联数据)
      */

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

@@ -90,7 +90,7 @@ public class GasMonitorServiceImpl implements GasMonitorService {
                             item.put("alertStatus", methane > 20.0);
                         }
                     }
-                    if (eq.getEquipmentTypeId() != null && eq.getEquipmentTypeId().contains("ENV")) {
+                    if (eq.getEquipmentTypeId() != null && String.valueOf(eq.getEquipmentTypeId()).contains("ENV")) {
                         // 环境设备: device_id = Integer(equipment_code)
                         ERealTimeData latestEnv = getLatestEnvData(parseIntSafe(eq.getEquipmentCode()));
                         if (latestEnv != null) {

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

@@ -8,6 +8,7 @@ import com.zksy.base.domain.EquipmentBase;
 import com.zksy.base.domain.EquipmentStatus;
 import com.zksy.base.domain.EquipmentType;
 import com.zksy.base.domain.MaintenanceDataStat;
+import com.zksy.base.enums.DistrictEnum;
 import com.zksy.ops.domain.WorkOrder;
 import com.zksy.base.manhole.domain.ManholeData;
 import com.zksy.base.manhole.mapper.ManholeDataMapper;
@@ -202,12 +203,12 @@ public class MaintenanceDataStatServiceImpl extends ServiceImpl<MaintenanceDataS
         List<String> equipmentCodeList = deviceList.stream().map(EquipmentBaseOutDTO::getEquipmentCode).distinct().collect(Collectors.toList());
 
         // ============ 2. 批量查询设备类型名称 ============
-        Map<String, String> typeNameMap = new HashMap<>();
+        Map<Integer, String> typeNameMap = new HashMap<>();
         List<EquipmentType> equipmentTypeList = equipmentTypeMapper.selectList(
                 new LambdaQueryWrapper<EquipmentType>().in(EquipmentType::getId, equipmentTypeIdsOf(deviceList)));
         if (CollUtil.isNotEmpty(equipmentTypeList)) {
             typeNameMap = equipmentTypeList.stream()
-                    .collect(Collectors.toMap(t -> String.valueOf(t.getId()), EquipmentType::getTypeName, (a, b) -> b));
+                    .collect(Collectors.toMap(EquipmentType::getId, EquipmentType::getTypeName, (a, b) -> b));
         }
 
         // ============ 3. 批量查询设备运维状态 ============
@@ -281,7 +282,10 @@ public class MaintenanceDataStatServiceImpl extends ServiceImpl<MaintenanceDataS
                 abnormalDeviceList.add(out);
             }
             // 区域排行
-            String district = StringUtils.isNotBlank(out.getDistrict()) ? out.getDistrict() : "未分配";
+            String district = out.getDistrict() != null ? DistrictEnum.getDescByCode(out.getDistrict()) : null;
+            if (StringUtils.isBlank(district)) {
+                district = "未分配";
+            }
             int[] stat = districtStatMap.computeIfAbsent(district, k -> new int[2]);
             stat[0]++;
             if (isAbnormal) {
@@ -527,10 +531,10 @@ public class MaintenanceDataStatServiceImpl extends ServiceImpl<MaintenanceDataS
     /**
      * 设备类型ID列表(避免空集合导致SQL错误)
      */
-    private List<String> equipmentTypeIdsOf(List<EquipmentBaseOutDTO> deviceList) {
-        List<String> typeIds = deviceList.stream().map(EquipmentBaseOutDTO::getEquipmentTypeId)
-                .filter(StringUtils::isNotBlank).distinct().collect(Collectors.toList());
-        return typeIds.isEmpty() ? Collections.singletonList("-1") : typeIds;
+    private List<Integer> equipmentTypeIdsOf(List<EquipmentBaseOutDTO> deviceList) {
+        List<Integer> typeIds = deviceList.stream().map(EquipmentBaseOutDTO::getEquipmentTypeId)
+                .filter(Objects::nonNull).distinct().collect(Collectors.toList());
+        return typeIds.isEmpty() ? Collections.singletonList(-1) : typeIds;
     }
 
     /**

+ 5 - 8
pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/impl/ManholeLayerServiceImpl.java

@@ -94,21 +94,18 @@ public class ManholeLayerServiceImpl implements ManholeLayerService {
         }
 
         // 5. 查询设备类型名称
-        List<String> equipmentTypeIdList = deviceList.stream()
+        List<Integer> equipmentTypeIdList = deviceList.stream()
                 .map(EquipmentBase::getEquipmentTypeId)
+                .filter(Objects::nonNull)
                 .distinct()
                 .collect(Collectors.toList());
-        Map<String, EquipmentType> typeMap = new HashMap<>();
+        Map<Integer, EquipmentType> typeMap = new HashMap<>();
         if (CollUtil.isNotEmpty(equipmentTypeIdList)) {
-            List<Integer> typeIdNumbers = equipmentTypeIdList.stream()
-                    .filter(id -> id != null && id.matches("\\d+"))
-                    .map(Integer::valueOf)
-                    .collect(Collectors.toList());
             List<EquipmentType> typeList = equipmentTypeService.list(new LambdaQueryWrapper<EquipmentType>()
-                    .in(EquipmentType::getId, typeIdNumbers));
+                    .in(EquipmentType::getId, equipmentTypeIdList));
             if (CollUtil.isNotEmpty(typeList)) {
                 typeMap = typeList.stream().collect(
-                        Collectors.toMap(type -> String.valueOf(type.getId()), Function.identity(), (key1, key2) -> key2));
+                        Collectors.toMap(EquipmentType::getId, Function.identity(), (key1, key2) -> key2));
             }
         }
 

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

@@ -309,7 +309,7 @@ public class MonitoringServiceImpl implements MonitoringService {
     private Map<String, EquipmentType> selectTypeMap(List<EquipmentBase> devices) {
         boolean anyTypePresent = devices.stream()
                 .map(EquipmentBase::getEquipmentTypeId)
-                .anyMatch(StrUtil::isNotBlank);
+                .anyMatch(Objects::nonNull);
         if (!anyTypePresent) {
             return Collections.emptyMap();
         }
@@ -450,7 +450,7 @@ public class MonitoringServiceImpl implements MonitoringService {
         vo.setEquipmentCode(device.getEquipmentCode());
         vo.setEquipmentName(device.getEquipmentName());
         vo.setEquipmentLocation(device.getEquipmentLocation());
-        vo.setEquipmentTypeId(device.getEquipmentTypeId());
+        vo.setEquipmentTypeId(device.getEquipmentTypeId() == null ? null : String.valueOf(device.getEquipmentTypeId()));
         if (type != null) vo.setEquipmentTypeName(type.getTypeName());
         vo.setLongitude(device.getLongitude());
         vo.setLatitude(device.getLatitude());
@@ -464,7 +464,7 @@ public class MonitoringServiceImpl implements MonitoringService {
         vo.setEquipmentCode(device.getEquipmentCode());
         vo.setEquipmentName(device.getEquipmentName());
         vo.setEquipmentLocation(device.getEquipmentLocation());
-        vo.setEquipmentTypeId(device.getEquipmentTypeId());
+        vo.setEquipmentTypeId(device.getEquipmentTypeId() == null ? null : String.valueOf(device.getEquipmentTypeId()));
         if (type != null) vo.setEquipmentTypeName(type.getTypeName());
         vo.setLongitude(device.getLongitude());
         vo.setLatitude(device.getLatitude());
@@ -478,7 +478,7 @@ public class MonitoringServiceImpl implements MonitoringService {
         vo.setEquipmentCode(device.getEquipmentCode());
         vo.setEquipmentName(device.getEquipmentName());
         vo.setEquipmentLocation(device.getEquipmentLocation());
-        vo.setEquipmentTypeId(device.getEquipmentTypeId());
+        vo.setEquipmentTypeId(device.getEquipmentTypeId() == null ? null : String.valueOf(device.getEquipmentTypeId()));
         if (type != null) vo.setEquipmentTypeName(type.getTypeName());
         vo.setLongitude(device.getLongitude());
         vo.setLatitude(device.getLatitude());

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

@@ -110,7 +110,7 @@ public class WaterSupplyDeviceServiceImpl extends ServiceImpl<EquipmentBaseMappe
 
         Map<String, Long> typeCountMap = waterDevices.stream()
                 .filter(d -> d.getEquipmentTypeId() != null)
-                .collect(Collectors.groupingBy(EquipmentBase::getEquipmentTypeId, Collectors.counting()));
+                .collect(Collectors.groupingBy(d -> String.valueOf(d.getEquipmentTypeId()), Collectors.counting()));
 
         List<EquipmentType> allTypes = equipmentTypeMapper.selectList(
                 new LambdaQueryWrapper<EquipmentType>().orderByAsc(EquipmentType::getId)
@@ -246,7 +246,8 @@ public class WaterSupplyDeviceServiceImpl extends ServiceImpl<EquipmentBaseMappe
 
         fillGpsFields(vo, base.getLongitude(), base.getLatitude());
 
-        Map<String, Object> latestData = getLatestMonitorData(base.getEquipmentCode(), base.getEquipmentTypeId());
+        Map<String, Object> latestData = getLatestMonitorData(base.getEquipmentCode(),
+                base.getEquipmentTypeId() == null ? null : String.valueOf(base.getEquipmentTypeId()));
         vo.setLatestData(latestData);
         if (latestData != null && latestData.containsKey("createTime")) {
             vo.setLastDataTime((LocalDateTime) latestData.get("createTime"));
@@ -516,7 +517,7 @@ public class WaterSupplyDeviceServiceImpl extends ServiceImpl<EquipmentBaseMappe
         if (CollUtil.isEmpty(devices)) {
             return new HashMap<>();
         }
-        List<String> typeIds = devices.stream()
+        List<Integer> typeIds = devices.stream()
                 .map(EquipmentBase::getEquipmentTypeId)
                 .filter(Objects::nonNull).distinct().collect(Collectors.toList());
         if (CollUtil.isEmpty(typeIds)) {

+ 2 - 2
pipe-network-service/zksy-system/src/main/java/com/zksy/base/warning/service/impl/WarningThresholdServiceImpl.java

@@ -106,7 +106,7 @@ public class WarningThresholdServiceImpl extends ServiceImpl<WarningThresholdMap
         for (EquipmentBase device : devices) {
             WarningThresholdView view = new WarningThresholdView();
             view.setEquipmentId(device.getEquipmentId()); view.setEquipmentCode(device.getEquipmentCode());
-            view.setEquipmentName(device.getEquipmentName()); view.setEquipmentTypeId(device.getEquipmentTypeId());
+            view.setEquipmentName(device.getEquipmentName()); view.setEquipmentTypeId(device.getEquipmentTypeId() == null ? null : String.valueOf(device.getEquipmentTypeId()));
             EquipmentType type = typeMap.get(Integer.valueOf(device.getEquipmentTypeId()));
             view.setEquipmentTypeName(type == null ? device.getEquipmentTypeName() : type.getTypeName());
             for (WarningType meta : metadata.getOrDefault(Integer.valueOf(device.getEquipmentTypeId()), Collections.emptyList())) {
@@ -198,7 +198,7 @@ public class WarningThresholdServiceImpl extends ServiceImpl<WarningThresholdMap
             row.setEquipmentId(device.getEquipmentId());
             row.setEquipmentCode(device.getEquipmentCode());
             row.setEquipmentName(device.getEquipmentName());
-            row.setEquipmentTypeId(device.getEquipmentTypeId());
+            row.setEquipmentTypeId(device.getEquipmentTypeId() == null ? null : String.valueOf(device.getEquipmentTypeId()));
             EquipmentType type = typeMap.get(typeId);
             row.setEquipmentTypeName(type == null ? device.getEquipmentTypeName() : type.getTypeName());
             row.setId(warningType.getId());

+ 3 - 3
pipe-network-service/zksy-system/src/main/java/com/zksy/manhole/dto/in/ManholeDeviceStatisticsInDTO.java

@@ -16,9 +16,9 @@ import java.io.Serializable;
 public class ManholeDeviceStatisticsInDTO implements Serializable {
     private static final long serialVersionUID = 1L;
 
-    @ApiModelProperty(value = "所属区域(片区),为空统计全部区域")
-    private String district;
+    @ApiModelProperty(value = "所属片区编码(0-城南 1-城北 2-太常),为空统计全部片区")
+    private Integer district;
 
     @ApiModelProperty(value = "设备类型ID(9=排水窨井设备,10=供水窨井设备),为空统计全部类型")
-    private String equipmentTypeId;
+    private Integer equipmentTypeId;
 }

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

@@ -1008,8 +1008,8 @@ public class WorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, WorkOrder
     private Map<String, String> loadTypeNameMap(List<EquipmentBase> devices) {
         Set<String> typeIds = new HashSet<>();
         for (EquipmentBase device : devices) {
-            if (StringUtils.isNotEmpty(device.getEquipmentTypeId())) {
-                typeIds.add(device.getEquipmentTypeId());
+            if (device.getEquipmentTypeId() != null) {
+                typeIds.add(String.valueOf(device.getEquipmentTypeId()));
             }
         }
         if (typeIds.isEmpty()) {

+ 1 - 1
pipe-network-service/zksy-system/src/test/java/com/zksy/WaterSupply/MonitorAlarm/WaterSupplyAlarmAuditServiceTest.java

@@ -139,7 +139,7 @@ class WaterSupplyAlarmAuditServiceTest {
         device.setEquipmentId("EQ-PR-1");
         device.setEquipmentCode(DEVICE_CODE);
         device.setEquipmentName("城南加压站压力监测点");
-        device.setEquipmentTypeId("TYPE-P");
+        device.setEquipmentTypeId(12);
         return device;
     }
 

+ 13 - 1
pipe-network-service/zksy-system/src/test/java/com/zksy/WaterSupply/MonitorAlarm/WaterSupplyAlarmDashboardServiceTest.java

@@ -95,12 +95,24 @@ class WaterSupplyAlarmDashboardServiceTest {
         when(alarmAuditMapper.selectList(any())).thenReturn(Collections.emptyList());
     }
 
+    /** 设备类型ID 现为整型;非数字按 null 处理。 */
+    private static Integer parseTypeId(String value) {
+        if (value == null) {
+            return null;
+        }
+        try {
+            return Integer.valueOf(value);
+        } catch (NumberFormatException e) {
+            return null;
+        }
+    }
+
     private static EquipmentBase device(String id, String code, String typeId) {
         EquipmentBase device = new EquipmentBase();
         device.setEquipmentId(id);
         device.setEquipmentCode(code);
         device.setEquipmentName("监测点");
-        device.setEquipmentTypeId(typeId);
+        device.setEquipmentTypeId(parseTypeId(typeId));
         device.setLongitude(new BigDecimal("113.28"));
         device.setLatitude(new BigDecimal("23.12"));
         return device;

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

@@ -396,12 +396,24 @@ class MonitoringServiceImplTest {
         return type;
     }
 
+    /** 设备类型ID 现为整型;非数字(如历史脏值 unknown-type)按 null 处理。 */
+    private static Integer parseTypeId(String value) {
+        if (value == null) {
+            return null;
+        }
+        try {
+            return Integer.valueOf(value);
+        } catch (NumberFormatException e) {
+            return null;
+        }
+    }
+
     private static EquipmentBase device(String id, String code, String name, String typeId, LocalDateTime createTime) {
         EquipmentBase device = new EquipmentBase();
         device.setEquipmentId(id);
         device.setEquipmentCode(code);
         device.setEquipmentName(name);
-        device.setEquipmentTypeId(typeId);
+        device.setEquipmentTypeId(parseTypeId(typeId));
         device.setEquipmentLocation("测试位置-" + code);
         device.setCreateTime(createTime);
         return device;

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

@@ -318,12 +318,24 @@ class WaterSupplyDeviceServiceImplTest {
                 .collect(Collectors.toList()));
     }
 
+    /** 设备类型ID 现为整型;非数字按 null 处理。 */
+    private static Integer parseTypeId(String value) {
+        if (value == null) {
+            return null;
+        }
+        try {
+            return Integer.valueOf(value);
+        } catch (NumberFormatException e) {
+            return null;
+        }
+    }
+
     private static EquipmentBase device(String id, String code, String name, String typeId) {
         EquipmentBase device = new EquipmentBase();
         device.setEquipmentId(id);
         device.setEquipmentCode(code);
         device.setEquipmentName(name);
-        device.setEquipmentTypeId(typeId);
+        device.setEquipmentTypeId(parseTypeId(typeId));
         device.setEquipmentLocation("测试位置");
         return device;
     }

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

@@ -170,7 +170,7 @@ class WorkOrderServiceImplTest {
         device.setEquipmentCode("D-001");
         device.setEquipmentName("城南压力计");
         device.setEquipmentLocation("城南1号井");
-        device.setEquipmentTypeId("1");
+        device.setEquipmentTypeId(1);
         when(equipmentBaseMapper.selectBatchIds(any())).thenReturn(Collections.singletonList(device));
 
         EquipmentType type = new EquipmentType();