Explorar o código

fix:bug修改

null hai 1 semana
pai
achega
dbe3d98900

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

@@ -31,7 +31,7 @@ public class BusinessWorkOrderController extends BaseController {
 
     @GetMapping("/list")
     @ApiOperation("查询工单列表(equipmentType:gas-燃气 drainage-排水,为空默认燃气)")
-    public AjaxResult list(Integer orderType, Integer orderLevel, Integer orderStatus, String deviceCode, String keyword, String equipmentType, @RequestParam(defaultValue = "1") Integer pageNum, @RequestParam(defaultValue = "10") Integer pageSize) {
+    public AjaxResult list(Integer orderType, Integer orderLevel, String orderStatus, String deviceCode, String keyword, String equipmentType, @RequestParam(defaultValue = "1") Integer pageNum, @RequestParam(defaultValue = "10") Integer pageSize) {
 
         IPage<WorkOrder> page = businessWorkOrderService.selectWorkOrderList(orderType, orderLevel, orderStatus, deviceCode, keyword, equipmentType, pageNum, pageSize);
 
@@ -43,6 +43,16 @@ public class BusinessWorkOrderController extends BaseController {
         return AjaxResult.success(data);
     }
 
+    @PostMapping("/add")
+    @ApiOperation("手动新增工单(故障维修/日常巡检/设备保养)")
+    public AjaxResult add(@RequestBody WorkOrder workOrder) {
+        if (workOrder.getOrderDesc() == null || workOrder.getOrderDesc().isEmpty()) {
+            return AjaxResult.error("工单描述不能为空");
+        }
+        Long orderId = businessWorkOrderService.createWorkOrder(workOrder);
+        return AjaxResult.success("工单创建成功", orderId);
+    }
+
     @GetMapping("/{orderId}")
     @ApiOperation("查询工单详情(含操作日志)")
     public AjaxResult detail(@PathVariable Long orderId) {

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

@@ -131,9 +131,9 @@ public class WorkOrderController extends BaseController
     @PostMapping(value = "/addWorkOrder")
     @ApiOperation(value = "新增工单")
     public AjaxResult addWorkOrder(@RequestBody WorkOrderAddInDTO inDTO) {
-        boolean result = workOrderService.addWorkOrder(inDTO);
-        return result ? AjaxResult.success("新增成功", result)
-                : AjaxResult.error("新增失败", result);
+        Long orderId = workOrderService.addWorkOrder(inDTO);
+        return orderId != null ? AjaxResult.success("新增成功", orderId)
+                : AjaxResult.error("新增失败");
     }
 
     /**

+ 2 - 1
pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/warning/EarlyWarningController.java

@@ -262,11 +262,12 @@ List<String> alarmIds = alarmIdsJson != null && !alarmIdsJson.isEmpty()
             @ApiParam("状态") @RequestParam(required = false) String status,
             @ApiParam("预警位置") @RequestParam(required = false) String location,
             @ApiParam("发布人") @RequestParam(required = false) String publisher,
+            @ApiParam("排除发布人(如:系统自动)") @RequestParam(required = false) String excludePublisher,
             @ApiParam("权属单位") @RequestParam(required = false) String ownershipUnit,
             @ApiParam("开始时间") @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime startTime,
             @ApiParam("结束时间") @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime endTime) {
         Page<?> page = new Page<>(pageNum, pageSize);
-        IPage<Map<String, Object>> result = earlyWarningService.searchWarnings(page, warningName, warningNo, warningType, warningLevel, status, location, publisher, ownershipUnit, startTime, endTime);
+        IPage<Map<String, Object>> result = earlyWarningService.searchWarnings(page, warningName, warningNo, warningType, warningLevel, status, location, publisher, ownershipUnit, startTime, endTime, excludePublisher);
         return AjaxResult.success(result);
     }
 

+ 8 - 1
pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/BusinessWorkOrderService.java

@@ -18,7 +18,7 @@ public interface BusinessWorkOrderService extends IService<WorkOrder> {
      * @param equipmentType 设备类型:gas-燃气 drainage-排水,为空查询全部
      */
     IPage<WorkOrder> selectWorkOrderList(Integer orderType, Integer orderLevel,
-                                         Integer orderStatus, String deviceCode,
+                                         String orderStatus, String deviceCode,
                                          String keyword, String equipmentType,
                                          Integer pageNum, Integer pageSize);
 
@@ -80,4 +80,11 @@ public interface BusinessWorkOrderService extends IService<WorkOrder> {
      */
     Long createWorkOrderFromHazard(String hazardId, String hazardNo, String hazardDesc, String equipmentId,
                                     String hazardLevel, String hazardImages, Date planFinishTime);
+
+    /**
+     * 手动新增工单(故障维修/日常巡检/设备保养)
+     * @param workOrder 工单信息(orderType/orderLevel/orderDesc/deviceId/deviceCode/planFinishTime)
+     * @return 工单ID
+     */
+    Long createWorkOrder(WorkOrder workOrder);
 }

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

@@ -23,9 +23,9 @@ public interface WorkOrderService extends IService<WorkOrder> {
     /**
      * 新增工单
      * @param inDTO
-     * @return
+     * @return 工单ID(新增成功返回 orderId,失败返回 null)
      */
-    boolean addWorkOrder(WorkOrderAddInDTO inDTO);
+    Long addWorkOrder(WorkOrderAddInDTO inDTO);
 
     /**
      * 经办工单分页查询(处理中:待接单、已接单、处理中、待验收)

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

@@ -48,10 +48,10 @@ public class BusinessWorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, W
     private EquipmentStatusMapper equipmentStatusMapper;
 
     @Override
-    public IPage<WorkOrder> selectWorkOrderList(Integer orderType, Integer orderLevel, Integer orderStatus, String deviceCode, String keyword, String equipmentType, Integer pageNum, Integer pageSize) {
+    public IPage<WorkOrder> selectWorkOrderList(Integer orderType, Integer orderLevel, String orderStatus, String deviceCode, String keyword, String equipmentType, Integer pageNum, Integer pageSize) {
         Page<WorkOrder> page = new Page<>(pageNum, pageSize);
         LambdaQueryWrapper<WorkOrder> wrapper = new LambdaQueryWrapper<>();
-        // 按设备类型过滤工单:gas-燃气(父类别ID=3),drainage-排水(typeId为drainage的顶级分类)
+        // 按设备类型过滤工单:gas-燃气(父类别ID=3),drainage-排水(typeId为drainage的顶级分类),water-供水;为空查询全部设备工单
         if (StringUtils.isNotEmpty(equipmentType)) {
             if ("gas".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.parent_type_id = '3'");
@@ -62,13 +62,23 @@ public class BusinessWorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, W
                 // 供水:顶级类型名称为“供水”的分类及其全部子类型
                 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 {
-            // 默认只查询燃气设备类工单(兼容旧逻辑)
-            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.parent_type_id = '3'");
         }
         if (orderType != null) wrapper.eq(WorkOrder::getOrderType, orderType);
         if (orderLevel != null) wrapper.eq(WorkOrder::getOrderLevel, orderLevel);
-        if (orderStatus != null) wrapper.eq(WorkOrder::getOrderStatus, orderStatus);
+        // orderStatus 支持逗号分隔多值,如 1,2,3
+        if (StringUtils.isNotEmpty(orderStatus)) {
+            if (orderStatus.contains(",")) {
+                List<Integer> statusList = Arrays.stream(orderStatus.split(","))
+                        .filter(StringUtils::isNumeric)
+                        .map(Integer::valueOf)
+                        .collect(Collectors.toList());
+                if (!statusList.isEmpty()) {
+                    wrapper.in(WorkOrder::getOrderStatus, statusList);
+                }
+            } else {
+                wrapper.eq(WorkOrder::getOrderStatus, Integer.valueOf(orderStatus));
+            }
+        }
         if (StringUtils.isNotEmpty(deviceCode)) wrapper.eq(WorkOrder::getDeviceCode, deviceCode);
         if (StringUtils.isNotEmpty(keyword)) {
             wrapper.and(w -> w.like(WorkOrder::getOrderNo, keyword).or().like(WorkOrder::getDeviceCode, keyword).or().like(WorkOrder::getOrderDesc, keyword));
@@ -278,6 +288,39 @@ public class BusinessWorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, W
         return workOrder.getOrderId();
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Long createWorkOrder(WorkOrder workOrder) {
+        if (workOrder.getOrderType() == null) {
+            workOrder.setOrderType(1);
+        }
+        if (workOrder.getOrderLevel() == null) {
+            workOrder.setOrderLevel(2);
+        }
+        workOrder.setOrderNo(generateOrderNo());
+        // 设备ID存在但未填设备编码时自动补全
+        if (StringUtils.isNotEmpty(workOrder.getDeviceId()) && StringUtils.isEmpty(workOrder.getDeviceCode())) {
+            EquipmentBase equipment = equipmentBaseMapper.selectById(workOrder.getDeviceId());
+            if (equipment != null) {
+                workOrder.setDeviceCode(equipment.getEquipmentCode());
+            }
+        }
+        workOrder.setOrderStatus(1); // 待派单
+        workOrder.setCreateTime(new Date());
+        this.save(workOrder);
+
+        // 写入操作日志
+        WorkOrderLog logEntry = new WorkOrderLog();
+        logEntry.setOrderId(workOrder.getOrderId());
+        logEntry.setOperType(1);
+        logEntry.setOperDesc("手动创建工单");
+        logEntry.setOperTime(new Date());
+        workOrderLogMapper.insert(logEntry);
+
+        log.info("手动创建工单成功,工单ID={},类型={}", workOrder.getOrderId(), workOrder.getOrderType());
+        return workOrder.getOrderId();
+    }
+
     /**
      * 生成工单编号:WO-yyyyMMddHHmmssSSS
      */

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

@@ -8,6 +8,8 @@ import com.zksy.base.domain.CaseInfo;
 import com.zksy.base.domain.EquipmentBase;
 import com.zksy.base.domain.WorkOrder;
 import com.zksy.base.domain.WorkOrderLog;
+import com.zksy.base.warning.domain.EarlyWarning;
+import com.zksy.base.warning.service.EarlyWarningService;
 import com.zksy.base.mapper.CaseInfoMapper;
 import com.zksy.base.mapper.EquipmentBaseMapper;
 import com.zksy.base.mapper.WorkOrderLogMapper;
@@ -56,6 +58,9 @@ public class WorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, WorkOrder
     @Autowired
     private EquipmentBaseMapper equipmentBaseMapper;
 
+    @Autowired
+    private EarlyWarningService earlyWarningService;
+
     /**
      * 查询窨井类型设备ID列表(equipment_type_id: 9=排水窨井, 10=供水窨井)
      */
@@ -105,10 +110,10 @@ public class WorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, WorkOrder
     /**
      * 新增工单
      * @param inDTO
-     * @return
+     * @return 工单ID(新增成功返回 orderId,失败返回 null)
      */
     @Override
-    public boolean addWorkOrder(WorkOrderAddInDTO inDTO) {
+    public Long addWorkOrder(WorkOrderAddInDTO inDTO) {
         log.info("新增工单-入参:{}", inDTO);
         WorkOrder workOrder = BeanUtil.copyProperties(inDTO, WorkOrder.class);
         workOrder.setOrderNo(generateOrderNo());
@@ -139,7 +144,9 @@ public class WorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, WorkOrder
             workOrderLog.setOperUserId(loginUser.getUserId());
             workOrderLog.setOperUserName(loginUser.getUser().getNickName());
         }
-        return workOrderLogMapper.insert(workOrderLog) > 0;
+        workOrderLogMapper.insert(workOrderLog);
+        // 返回工单ID,供后续派单使用
+        return workOrder.getOrderId();
     }
 
     /**
@@ -273,6 +280,21 @@ public class WorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, WorkOrder
                     caseInfoMapper.updateById(caseEntity);
                 }
             }
+            // 若工单关联了预警(alarmId 对应 early_warning 记录),验收通过时自动解除预警
+            if(workOrder.getAlarmId() != null){
+                try {
+                    EarlyWarning warning = earlyWarningService.getById(workOrder.getAlarmId());
+                    if(warning != null){
+                        earlyWarningService.resolveWarning(warning.getWarningId(),
+                                "工单验收通过(" + workOrder.getOrderNo() + "),预警已解除");
+                        log.info("工单验收通过,自动解除预警: orderNo={}, warningId={}",
+                                workOrder.getOrderNo(), workOrder.getAlarmId());
+                    }
+                } catch (Exception e) {
+                    log.warn("工单验收通过后解除预警失败: orderNo={}, warningId={}",
+                            workOrder.getOrderNo(), workOrder.getAlarmId(), e);
+                }
+            }
         } else if(inDTO.getOperType() == 7){
             //7-驳回工单
             entity.setOrderStatus(7);

+ 1 - 1
pipe-network-service/zksy-system/src/main/java/com/zksy/base/warning/mapper/EarlyWarningMapper.java

@@ -16,7 +16,7 @@ public interface EarlyWarningMapper extends BaseMapper<EarlyWarning> {
 
     IPage<Map<String, Object>> selectWarningList(Page<?> page, @Param("warningName") String warningName, @Param("warningType") String warningType, @Param("warningLevel") String warningLevel, @Param("status") String status);
 
-    IPage<Map<String, Object>> searchWarnings(Page<?> page, @Param("warningName") String warningName, @Param("warningNo") String warningNo, @Param("warningType") String warningType, @Param("warningLevel") String warningLevel, @Param("status") String status, @Param("location") String location, @Param("publisher") String publisher, @Param("ownershipUnit") String ownershipUnit, @Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);
+    IPage<Map<String, Object>> searchWarnings(Page<?> page, @Param("warningName") String warningName, @Param("warningNo") String warningNo, @Param("warningType") String warningType, @Param("warningLevel") String warningLevel, @Param("status") String status, @Param("location") String location, @Param("publisher") String publisher, @Param("ownershipUnit") String ownershipUnit, @Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime, @Param("excludePublisher") String excludePublisher);
 
     IPage<Map<String, Object>> selectTodoList(Page<?> page, @Param("userId") String userId, @Param("todoType") String todoType, @Param("warningName") String warningName);
 

+ 1 - 1
pipe-network-service/zksy-system/src/main/java/com/zksy/base/warning/service/EarlyWarningService.java

@@ -16,7 +16,7 @@ public interface EarlyWarningService extends IService<EarlyWarning> {
 
     IPage<Map<String, Object>> getWarningList(Page<?> page, String warningName, String warningType, String warningLevel, String status);
 
-    IPage<Map<String, Object>> searchWarnings(Page<?> page, String warningName, String warningNo, String warningType, String warningLevel, String status, String location, String publisher, String ownershipUnit, LocalDateTime startTime, LocalDateTime endTime);
+    IPage<Map<String, Object>> searchWarnings(Page<?> page, String warningName, String warningNo, String warningType, String warningLevel, String status, String location, String publisher, String ownershipUnit, LocalDateTime startTime, LocalDateTime endTime, String excludePublisher);
 
     IPage<Map<String, Object>> getTodoList(Page<?> page, String userName, String todoType, String warningName);
 

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

@@ -45,8 +45,8 @@ public class EarlyWarningServiceImpl extends ServiceImpl<EarlyWarningMapper, Ear
     }
 
     @Override
-    public IPage<Map<String, Object>> searchWarnings(Page<?> page, String warningName, String warningNo, String warningType, String warningLevel, String status, String location, String publisher, String ownershipUnit, LocalDateTime startTime, LocalDateTime endTime) {
-        return earlyWarningMapper.searchWarnings(page, warningName, warningNo, warningType, warningLevel, status, location, publisher, ownershipUnit, startTime, endTime);
+    public IPage<Map<String, Object>> searchWarnings(Page<?> page, String warningName, String warningNo, String warningType, String warningLevel, String status, String location, String publisher, String ownershipUnit, LocalDateTime startTime, LocalDateTime endTime, String excludePublisher) {
+        return earlyWarningMapper.searchWarnings(page, warningName, warningNo, warningType, warningLevel, status, location, publisher, ownershipUnit, startTime, endTime, excludePublisher);
     }
 
     @Override

+ 3 - 0
pipe-network-service/zksy-system/src/main/resources/mapper/warning/EarlyWarningMapper.xml

@@ -439,6 +439,9 @@
             <if test="publisher != null and publisher != ''">
                 AND w.publisher LIKE CONCAT('%', #{publisher}, '%')
             </if>
+            <if test="excludePublisher != null and excludePublisher != ''">
+                AND (w.publisher IS NULL OR w.publisher NOT LIKE CONCAT('%', #{excludePublisher}, '%'))
+            </if>
             <if test="ownershipUnit != null and ownershipUnit != ''">
                 AND w.ownership_unit LIKE CONCAT('%', #{ownershipUnit}, '%')
             </if>