Bläddra i källkod

- 在 BusinessWorkOrderServiceImpl 中支持供水设备工单筛选,
覆盖“供水”顶级分类及其子类型
- 在 MonitoringServiceImpl 中为流量、压力和漏损监测增加类型约束,
按设备类型关键词过滤,确保分页结果仅包含对应监测设备
- 更新 .gitignore,忽略本地目录及供水菜单 SQL 文件,避免临时文件入库

Kazerin 2 veckor sedan
förälder
incheckning
62fdada65d

+ 2 - 0
.gitignore

@@ -39,6 +39,7 @@ build/
 .DS_Store
 
 logs/
+/.local/
 
 /pipe-network-service/供水监测报警接口冒烟测试.ps1
 /pipe-network-service/供水监测报警模块测试方案.md
@@ -49,3 +50,4 @@ logs/
 /findings.md
 /docs/superpowers/plans/2026-08-13-water-supply-statistics-gis.md
 /docs/superpowers/specs/2026-08-13-water-supply-statistics-gis-design.md
+/pipe-network-service/sql/water_supply_menu.sql

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

@@ -58,6 +58,9 @@ public class BusinessWorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, W
             } else if ("drainage".equals(equipmentType)) {
                 // 排水:typeId为drainage的顶级分类及其全部子类型
                 wrapper.inSql(WorkOrder::getDeviceId, "SELECT eb.equipment_id FROM app_user.equipment_base eb " + "INNER JOIN app_user.equipment_type et ON eb.equipment_type_id = et.id " + "WHERE et.id IN (SELECT id FROM app_user.equipment_type WHERE type_id = 'drainage' AND parent_type_id = '0' " + "UNION SELECT id FROM app_user.equipment_type WHERE parent_type_id = (SELECT id FROM app_user.equipment_type WHERE type_id = 'drainage' AND parent_type_id = '0'))");
+            } else if ("water".equals(equipmentType)) {
+                // 供水:顶级类型名称为“供水”的分类及其全部子类型
+                wrapper.inSql(WorkOrder::getDeviceId, "SELECT eb.equipment_id FROM app_user.equipment_base eb " + "INNER JOIN app_user.equipment_type et ON eb.equipment_type_id = et.id " + "WHERE et.id IN (SELECT id FROM app_user.equipment_type WHERE type_name = '供水' AND parent_type_id = '0' " + "UNION SELECT id FROM app_user.equipment_type WHERE parent_type_id = (SELECT id FROM app_user.equipment_type WHERE type_name = '供水' AND parent_type_id = '0'))");
             }
         } else {
             // 默认只查询燃气设备类工单(兼容旧逻辑)

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

@@ -61,6 +61,7 @@ public class MonitoringServiceImpl implements MonitoringService {
                 .like(StrUtil.isNotBlank(equipmentCode), EquipmentBase::getEquipmentCode, equipmentCode)
                 .like(StrUtil.isNotBlank(equipmentLocation), EquipmentBase::getEquipmentLocation, equipmentLocation)
                 .orderByDesc(EquipmentBase::getCreateTime);
+        constrainToMonitoringTypes(baseWrapper, "flow");
 
         Page<EquipmentBase> basePage = equipmentBaseMapper.selectPage(new Page<>(pageNum, pageSize), baseWrapper);
         Page<FlowMonitoringVO> resultPage = new Page<>(pageNum, pageSize, basePage.getTotal());
@@ -200,6 +201,7 @@ public class MonitoringServiceImpl implements MonitoringService {
                 .like(StrUtil.isNotBlank(equipmentCode), EquipmentBase::getEquipmentCode, equipmentCode)
                 .like(StrUtil.isNotBlank(equipmentLocation), EquipmentBase::getEquipmentLocation, equipmentLocation)
                 .orderByDesc(EquipmentBase::getCreateTime);
+        constrainToMonitoringTypes(baseWrapper, "pressure");
 
         Page<EquipmentBase> basePage = equipmentBaseMapper.selectPage(new Page<>(pageNum, pageSize), baseWrapper);
         Page<PressureMonitoringVO> resultPage = new Page<>(pageNum, pageSize, basePage.getTotal());
@@ -282,6 +284,7 @@ public class MonitoringServiceImpl implements MonitoringService {
                 .like(StrUtil.isNotBlank(equipmentCode), EquipmentBase::getEquipmentCode, equipmentCode)
                 .like(StrUtil.isNotBlank(equipmentLocation), EquipmentBase::getEquipmentLocation, equipmentLocation)
                 .orderByDesc(EquipmentBase::getCreateTime);
+        constrainToMonitoringTypes(baseWrapper, "leakage");
 
         Page<EquipmentBase> basePage = equipmentBaseMapper.selectPage(new Page<>(pageNum, pageSize), baseWrapper);
         Page<LeakageMonitoringVO> resultPage = new Page<>(pageNum, pageSize, basePage.getTotal());
@@ -454,4 +457,33 @@ public class MonitoringServiceImpl implements MonitoringService {
         }
         return result;
     }
+
+    /** Restrict the equipment query before pagination so each monitoring page only contains its sub-devices. */
+    private void constrainToMonitoringTypes(LambdaQueryWrapper<EquipmentBase> wrapper, String monitorKind) {
+        String[] keywords;
+        switch (monitorKind) {
+            case "pressure":
+                keywords = new String[]{"压力", "pressure", "消防"};
+                break;
+            case "leakage":
+                keywords = new String[]{"漏失", "漏损", "泄漏", "噪声", "音频", "noise"};
+                break;
+            default:
+                keywords = new String[]{"流量", "flow", "雷达", "遥测", "telemetry"};
+                break;
+        }
+        List<EquipmentType> types = equipmentTypeMapper.selectList(new LambdaQueryWrapper<EquipmentType>());
+        Set<String> ids = types.stream()
+                .filter(type -> {
+                    String value = ((type.getTypeId() == null ? "" : type.getTypeId()) + " "
+                            + (type.getTypeName() == null ? "" : type.getTypeName())).toLowerCase(Locale.ROOT);
+                    return Arrays.stream(keywords).anyMatch(keyword -> value.contains(keyword.toLowerCase(Locale.ROOT)));
+                })
+                .map(EquipmentType::getId)
+                .filter(StrUtil::isNotBlank)
+                .collect(Collectors.toSet());
+        // Keep an empty result portable across database drivers that reject IN ().
+        wrapper.in(EquipmentBase::getEquipmentTypeId,
+                ids.isEmpty() ? Collections.singleton("__NO_MONITORING_TYPE__") : ids);
+    }
 }