LAPTOP-JI2IUVG1\26646 1 mēnesi atpakaļ
vecāks
revīzija
1df8c9da19

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

@@ -60,8 +60,9 @@ public class DrainageWarningController {
             @ApiParam("是否只返回当前预警") @RequestParam(defaultValue = "false") boolean currentOnly,
             @ApiParam("设备名称") @RequestParam(required = false) String equipmentName,
             @ApiParam("开始时间(yyyy-MM-dd HH:mm:ss)") @RequestParam(required = false) String startTime,
-            @ApiParam("结束时间(yyyy-MM-dd HH:mm:ss)") @RequestParam(required = false) String endTime) {
-        return service.findVisibleCurrentPage(pageNum, pageSize, userId, deptId, isAdmin, warningLevel, warningType, status, currentOnly, equipmentName, startTime, endTime);
+            @ApiParam("结束时间(yyyy-MM-dd HH:mm:ss)") @RequestParam(required = false) String endTime,
+            @ApiParam("设备模块类型(drainage=排水)") @RequestParam(required = false) String equipmentType) {
+        return service.findVisibleCurrentPage(pageNum, pageSize, userId, deptId, isAdmin, warningLevel, warningType, status, currentOnly, equipmentName, startTime, endTime, equipmentType);
     }
 
     @Anonymous
@@ -76,8 +77,9 @@ public class DrainageWarningController {
             @ApiParam("开始时间(yyyy-MM-dd HH:mm:ss)") @RequestParam(required = false) String startTime,
             @ApiParam("结束时间(yyyy-MM-dd HH:mm:ss)") @RequestParam(required = false) String endTime,
             @ApiParam("是否只返回历史预警") @RequestParam(defaultValue = "false") boolean historyOnly,
-            @ApiParam("设备名称") @RequestParam(required = false) String equipmentName) {
-        return service.findHistoryPage(pageNum, pageSize, warningLevel, warningType, status, startTime, endTime, historyOnly, equipmentName);
+            @ApiParam("设备名称") @RequestParam(required = false) String equipmentName,
+            @ApiParam("设备模块类型(drainage=排水)") @RequestParam(required = false) String equipmentType) {
+        return service.findHistoryPage(pageNum, pageSize, warningLevel, warningType, status, startTime, endTime, historyOnly, equipmentName, equipmentType);
     }
 
     @Anonymous

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

@@ -103,6 +103,18 @@ public class AlarmData implements Serializable {
     @ApiModelProperty(value = "纬度")
     private String latitude;
 
+    /** 是否已经关联运维工单(由查询接口补充) */
+    @TableField(exist = false)
+    private Boolean hasWorkOrder;
+
+    /** 关联工单ID(由查询接口补充) */
+    @TableField(exist = false)
+    private Long workOrderId;
+
+    /** 审核状态:1待审核,2已审核(由报警和工单状态综合计算) */
+    @TableField(exist = false)
+    private Integer auditStatus;
+
     @TableField(exist = false)
     private static final long serialVersionUID = 1L;
 }

+ 35 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/base/alarm/service/impl/AlarmDataServiceImpl.java

@@ -8,6 +8,7 @@ import com.zksy.base.alarm.mapper.AlarmDataMapper;
 import com.zksy.base.alarm.service.AlarmDataService;
 import com.zksy.base.domain.EquipmentBase;
 import com.zksy.base.mapper.EquipmentBaseMapper;
+import com.zksy.base.mapper.WorkOrderMapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -22,6 +23,9 @@ public class AlarmDataServiceImpl extends ServiceImpl<AlarmDataMapper, AlarmData
     @Autowired
     private EquipmentBaseMapper equipmentBaseMapper;
 
+    @Autowired
+    private WorkOrderMapper workOrderMapper;
+
     @Override
     public Page<AlarmData> findByPage(long pageNum, long pageSize, String deviceCode,
                                         String warningType, String warningCode,
@@ -63,10 +67,41 @@ public class AlarmDataServiceImpl extends ServiceImpl<AlarmDataMapper, AlarmData
 
         // 填充 deviceName/longitude/latitude:通过 device_code 从 equipment_base 表关联查询
         fillDeviceInfo(result.getRecords());
+        // 报警可能已经创建工单但 alarm_status 未同步,列表状态以工单关联为准补齐。
+        fillWorkOrderStatus(result.getRecords());
 
         return result;
     }
 
+    private void fillWorkOrderStatus(List<AlarmData> records) {
+        if (records == null || records.isEmpty()) {
+            return;
+        }
+        List<String> alarmIds = records.stream()
+                .map(AlarmData::getId)
+                .filter(id -> id != null && !id.isEmpty())
+                .distinct()
+                .collect(Collectors.toList());
+        if (alarmIds.isEmpty()) {
+            return;
+        }
+        List<com.zksy.base.domain.WorkOrder> orders = workOrderMapper.selectList(
+                new LambdaQueryWrapper<com.zksy.base.domain.WorkOrder>()
+                        .in(com.zksy.base.domain.WorkOrder::getAlarmId, alarmIds)
+                        .orderByDesc(com.zksy.base.domain.WorkOrder::getOrderId));
+        java.util.Map<String, com.zksy.base.domain.WorkOrder> orderMap = orders.stream()
+                .filter(order -> order.getAlarmId() != null)
+                .collect(Collectors.toMap(com.zksy.base.domain.WorkOrder::getAlarmId,
+                        order -> order, (first, ignored) -> first));
+        for (AlarmData record : records) {
+            com.zksy.base.domain.WorkOrder order = orderMap.get(record.getId());
+            boolean hasOrder = order != null;
+            record.setHasWorkOrder(hasOrder);
+            record.setWorkOrderId(hasOrder ? order.getOrderId() : null);
+            record.setAuditStatus(hasOrder || Integer.valueOf(1).equals(record.getAlarmStatus()) ? 2 : 1);
+        }
+    }
+
     private LocalDateTime parseDateTime(String value) {
         return LocalDateTime.parse(value, java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
     }

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

@@ -33,6 +33,10 @@ public class DrainageWarning {
     @TableField(exist = false)
     private String equipmentId;
 
+    @ApiModelProperty("设备类型业务编码,对应 equipment_type.type_id")
+    @TableField("device_code")
+    private String deviceCode;
+
     @ApiModelProperty("设备名称")
     @TableField("warning_name")
     private String equipmentName;

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

@@ -37,11 +37,12 @@ public interface DrainageWarningService extends IService<DrainageWarning> {
      * 查询历史预警(status IN HANDLED/CLOSED)
      *
      * @param historyOnly   为true时强制限定 status IN ('HANDLED','CLOSED')
+     * @param equipmentType 设备模块类型(drainage=排水),按 early_warning.device_code 匹配 equipment_type.type_id
      */
     Page<DrainageWarning> findHistoryPage(long pageNum, long pageSize,
                                           Integer warningLevel, String warningType,
                                           String status, String startTime, String endTime,
-                                          boolean historyOnly, String equipmentName);
+                                          boolean historyOnly, String equipmentName, String equipmentType);
 
     /**
      * 发布新预警(自动生成预警编号、设置发布时间和默认状态)
@@ -101,7 +102,8 @@ public interface DrainageWarningService extends IService<DrainageWarning> {
                                                   Long userId, Long deptId, boolean isAdmin,
                                                   Integer warningLevel, String warningType,
                                                   String status, boolean currentOnly,
-                                                  String equipmentName, String startTime, String endTime);
+                                                  String equipmentName, String startTime, String endTime,
+                                                  String equipmentType);
 
     /**
      * 处理(指定人员处理)

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

@@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.zksy.common.exception.ServiceException;
+import com.zksy.base.domain.EquipmentBase;
+import com.zksy.base.mapper.EquipmentBaseMapper;
 import com.zksy.drainage.domain.DrainageWarning;
 import com.zksy.drainage.domain.WarningScopeUser;
 import com.zksy.drainage.mapper.DrainageWarningMapper;
@@ -17,7 +19,9 @@ import org.springframework.transaction.annotation.Transactional;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.Arrays;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 /**
@@ -34,6 +38,9 @@ public class DrainageWarningServiceImpl extends ServiceImpl<DrainageWarningMappe
     @Autowired
     private WarningScopeUserMapper warningScopeUserMapper;
 
+    @Autowired
+    private EquipmentBaseMapper equipmentBaseMapper;
+
     private static final List<String> CURRENT_STATUSES = Arrays.asList("DRAFT", "PENDING", "PROCESSING", "RELEASED");
     private static final List<String> HISTORY_STATUSES = Arrays.asList("HANDLED", "CLOSED");
 
@@ -44,7 +51,9 @@ public class DrainageWarningServiceImpl extends ServiceImpl<DrainageWarningMappe
         Page<DrainageWarning> page = new Page<>(pageNum, pageSize);
         LambdaQueryWrapper<DrainageWarning> wrapper = buildQueryWrapper(warningLevel, warningType, status, startTime, endTime);
         wrapper.orderByDesc(DrainageWarning::getCreateTime);
-        return this.page(page, wrapper);
+        Page<DrainageWarning> result = this.page(page, wrapper);
+        fillMissingCoordinates(result);
+        return result;
     }
 
     @Override
@@ -62,14 +71,16 @@ public class DrainageWarningServiceImpl extends ServiceImpl<DrainageWarningMappe
             wrapper.eq(DrainageWarning::getWarningType, warningType);
         }
         wrapper.orderByDesc(DrainageWarning::getCreateTime);
-        return this.page(page, wrapper);
+        Page<DrainageWarning> result = this.page(page, wrapper);
+        fillMissingCoordinates(result);
+        return result;
     }
 
     @Override
     public Page<DrainageWarning> findHistoryPage(long pageNum, long pageSize,
                                                   Integer warningLevel, String warningType,
                                                   String status, String startTime, String endTime,
-                                                  boolean historyOnly, String equipmentName) {
+                                                  boolean historyOnly, String equipmentName, String equipmentType) {
         Page<DrainageWarning> page = new Page<>(pageNum, pageSize);
         LambdaQueryWrapper<DrainageWarning> wrapper = new LambdaQueryWrapper<>();
         // 历史查询默认只返回已处置或已解除的记录;传入 status 时允许
@@ -77,6 +88,14 @@ public class DrainageWarningServiceImpl extends ServiceImpl<DrainageWarningMappe
         if (historyOnly && (status == null || status.isEmpty())) {
             wrapper.in(DrainageWarning::getStatus, HISTORY_STATUSES);
         }
+        // device_code 保存设备类型业务编码;历史预警按排水设备类型树筛选。
+        if ("drainage".equalsIgnoreCase(equipmentType)) {
+            wrapper.inSql(DrainageWarning::getDeviceCode,
+                    "SELECT et.type_id FROM app_user.equipment_type et "
+                            + "WHERE et.type_id IS NOT NULL AND "
+                            + "(et.type_id = 'drainage' OR et.parent_type_id = '2' OR et.parent_type_id IN "
+                            + "(SELECT id FROM app_user.equipment_type WHERE type_id = 'drainage'))");
+        }
         // 附加筛选条件
         if (warningLevel != null) {
             wrapper.eq(DrainageWarning::getWarningLevel, warningLevel);
@@ -97,7 +116,9 @@ public class DrainageWarningServiceImpl extends ServiceImpl<DrainageWarningMappe
             wrapper.le(DrainageWarning::getCreateTime, LocalDateTime.parse(endTime, DATE_TIME_FORMATTER));
         }
         wrapper.orderByDesc(DrainageWarning::getCreateTime);
-        return this.page(page, wrapper);
+        Page<DrainageWarning> result = this.page(page, wrapper);
+        fillMissingCoordinates(result);
+        return result;
     }
 
     @Override
@@ -180,7 +201,8 @@ public class DrainageWarningServiceImpl extends ServiceImpl<DrainageWarningMappe
                                                          Long userId, Long deptId, boolean isAdmin,
                                                          Integer warningLevel, String warningType,
                                                          String status, boolean currentOnly,
-                                                         String equipmentName, String startTime, String endTime) {
+                                                         String equipmentName, String startTime, String endTime,
+                                                         String equipmentType) {
         Page<DrainageWarning> page = new Page<>(pageNum, pageSize);
         LambdaQueryWrapper<DrainageWarning> wrapper = new LambdaQueryWrapper<>();
 
@@ -201,6 +223,14 @@ public class DrainageWarningServiceImpl extends ServiceImpl<DrainageWarningMappe
         if (warningType != null && !warningType.isEmpty()) {
             wrapper.eq(DrainageWarning::getWarningType, warningType);
         }
+        // device_code 保存设备类型的 type_id;当前预警按排水设备类型树筛选。
+        if ("drainage".equalsIgnoreCase(equipmentType)) {
+            wrapper.inSql(DrainageWarning::getDeviceCode,
+                    "SELECT et.type_id FROM app_user.equipment_type et "
+                            + "WHERE et.type_id IS NOT NULL AND "
+                            + "(et.type_id = 'drainage' OR et.parent_type_id = '2' OR et.parent_type_id IN "
+                            + "(SELECT id FROM app_user.equipment_type WHERE type_id = 'drainage'))");
+        }
         if (equipmentName != null && !equipmentName.isEmpty()) {
             wrapper.like(DrainageWarning::getEquipmentName, equipmentName);
         }
@@ -212,7 +242,9 @@ public class DrainageWarningServiceImpl extends ServiceImpl<DrainageWarningMappe
         }
 
         wrapper.orderByDesc(DrainageWarning::getCreateTime);
-        return this.page(page, wrapper);
+        Page<DrainageWarning> result = this.page(page, wrapper);
+        fillMissingCoordinates(result);
+        return result;
     }
 
     @Override
@@ -294,4 +326,44 @@ public class DrainageWarningServiceImpl extends ServiceImpl<DrainageWarningMappe
         }
         return wrapper;
     }
+
+    /**
+     * 预警历史数据可能只保存了设备名称,坐标为空时从设备基础表补齐真实坐标,
+     * 供列表和 GIS 页面统一使用。仅补齐缺失坐标,不覆盖预警表已有坐标。
+     */
+    private void fillMissingCoordinates(Page<DrainageWarning> page) {
+        if (page == null || page.getRecords() == null || page.getRecords().isEmpty()) {
+            return;
+        }
+        List<String> names = page.getRecords().stream()
+                .filter(item -> item.getLongitude() == null || item.getLatitude() == null)
+                .map(DrainageWarning::getEquipmentName)
+                .filter(name -> name != null && !name.trim().isEmpty())
+                .distinct()
+                .collect(Collectors.toList());
+        if (names.isEmpty()) {
+            return;
+        }
+        List<EquipmentBase> equipments = equipmentBaseMapper.selectList(
+                new LambdaQueryWrapper<EquipmentBase>().in(EquipmentBase::getEquipmentName, names));
+        Map<String, EquipmentBase> equipmentMap = new HashMap<>();
+        for (EquipmentBase equipment : equipments) {
+            if (equipment.getLongitude() != null && equipment.getLatitude() != null) {
+                equipmentMap.putIfAbsent(equipment.getEquipmentName(), equipment);
+            }
+        }
+        for (DrainageWarning warning : page.getRecords()) {
+            if (warning.getLongitude() != null && warning.getLatitude() != null) {
+                continue;
+            }
+            EquipmentBase equipment = equipmentMap.get(warning.getEquipmentName());
+            if (equipment != null) {
+                warning.setLongitude(equipment.getLongitude());
+                warning.setLatitude(equipment.getLatitude());
+                if (warning.getLocation() == null || warning.getLocation().trim().isEmpty()) {
+                    warning.setLocation(equipment.getEquipmentLocation());
+                }
+            }
+        }
+    }
 }