瀏覽代碼

fix:工单bug修改

null 4 周之前
父節點
當前提交
4027f4ae94

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

@@ -125,10 +125,22 @@ public class BusinessWorkOrderController extends BaseController {
         return AjaxResult.success("提交验收成功");
     }
 
+    @PutMapping("/close")
+    @ApiOperation("验收通过/结案,同步联动隐患状态为已整改")
+    public AjaxResult close(@RequestBody Map<String, Object> body) {
+        Long orderId = Long.valueOf(body.get("orderId").toString());
+        String result = body.get("result") != null ? body.get("result").toString() : "";
+        Long userId = SecurityUtils.getUserId();
+        String userName = SecurityUtils.getUsername();
+        businessWorkOrderService.closeOrder(orderId, result, userId, userName);
+        return AjaxResult.success("验收通过");
+    }
+
     @PostMapping("/createFromHazard")
     @ApiOperation("从隐患创建工单")
     public AjaxResult createFromHazard(@RequestBody Map<String, Object> body) {
         String hazardId = (String) body.get("hazardId");
+        String hazardNo = (String) body.get("hazardNo");
         String hazardDesc = (String) body.get("hazardDesc");
         String equipmentId = (String) body.get("equipmentId");
         String hazardLevel = (String) body.get("hazardLevel");
@@ -144,7 +156,7 @@ public class BusinessWorkOrderController extends BaseController {
             planFinishTime = DateUtils.parseDate(planFinishTimeStr);
         }
 
-        Long orderId = businessWorkOrderService.createWorkOrderFromHazard(hazardId, hazardDesc, equipmentId, hazardLevel, hazardImages, planFinishTime);
+        Long orderId = businessWorkOrderService.createWorkOrderFromHazard(hazardId, hazardNo, hazardDesc, equipmentId, hazardLevel, hazardImages, planFinishTime);
         return AjaxResult.success("工单创建成功", orderId);
     }
 

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

@@ -55,6 +55,18 @@ public class WorkOrder implements Serializable {
     @ApiModelProperty(value = "案件编号")
     private String caseNo;
 
+    /**
+     * 关联隐患ID
+     */
+    @ApiModelProperty(value = "隐患ID")
+    private String hazardId;
+
+    /**
+     * 隐患编号
+     */
+    @ApiModelProperty(value = "隐患编号")
+    private String hazardNo;
+
     /**
      * 关联设备ID
      */

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

@@ -62,9 +62,15 @@ public interface BusinessWorkOrderService extends IService<WorkOrder> {
      */
     boolean cancelOrder(Long orderId, Long operUserId, String operUserName);
 
+    /**
+     * 验收通过/结案(status 5→6),同步联动隐患状态为"已整改"
+     */
+    boolean closeOrder(Long orderId, String result, Long operUserId, String operUserName);
+
     /**
      * 从隐患创建工单
      * @param hazardId 隐患ID
+     * @param hazardNo 隐患编号
      * @param hazardDesc 隐患描述
      * @param equipmentId 设备ID
      * @param hazardLevel 隐患等级
@@ -72,6 +78,6 @@ public interface BusinessWorkOrderService extends IService<WorkOrder> {
      * @param planFinishTime 计划完成时间
      * @return 工单ID
      */
-    Long createWorkOrderFromHazard(String hazardId, String hazardDesc, String equipmentId,
+    Long createWorkOrderFromHazard(String hazardId, String hazardNo, String hazardDesc, String equipmentId,
                                     String hazardLevel, String hazardImages, Date planFinishTime);
 }

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

@@ -4,8 +4,14 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 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.HazardHiddenAccount;
 import com.zksy.base.domain.WorkOrder;
 import com.zksy.base.domain.WorkOrderLog;
+import com.zksy.base.mapper.EquipmentBaseMapper;
+import com.zksy.base.mapper.EquipmentStatusMapper;
+import com.zksy.base.mapper.HazardHiddenAccountMapper;
 import com.zksy.base.mapper.WorkOrderLogMapper;
 import com.zksy.base.mapper.WorkOrderMapper;
 import com.zksy.base.service.BusinessWorkOrderService;
@@ -19,6 +25,7 @@ import org.springframework.transaction.annotation.Transactional;
 import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
+import java.time.LocalDateTime;
 import java.util.stream.Collectors;
 
 /**
@@ -31,6 +38,15 @@ public class BusinessWorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, W
     @Autowired
     private WorkOrderLogMapper workOrderLogMapper;
 
+    @Autowired
+    private EquipmentBaseMapper equipmentBaseMapper;
+
+    @Autowired
+    private HazardHiddenAccountMapper hazardHiddenAccountMapper;
+
+    @Autowired
+    private EquipmentStatusMapper equipmentStatusMapper;
+
     @Override
     public IPage<WorkOrder> selectWorkOrderList(Integer orderType, Integer orderLevel, Integer orderStatus, String deviceCode, String keyword, String equipmentType, Integer pageNum, Integer pageSize) {
         Page<WorkOrder> page = new Page<>(pageNum, pageSize);
@@ -95,6 +111,7 @@ public class BusinessWorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, W
         logEntry.setOperDesc("派单给处理人ID:" + handlerId + ",备注:" + (remarks != null ? remarks : ""));
         logEntry.setOperUserId(operUserId);
         logEntry.setOperUserName(operUserName);
+        logEntry.setOperTime(new Date());
         workOrderLogMapper.insert(logEntry);
         return true;
     }
@@ -130,6 +147,7 @@ public class BusinessWorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, W
             logEntry.setOperDesc("派单给处理人ID:" + handlerId + ",备注:" + (remarks != null ? remarks : ""));
             logEntry.setOperUserId(operUserId);
             logEntry.setOperUserName(operUserName);
+            logEntry.setOperTime(new Date());
             workOrderLogMapper.insert(logEntry);
         }
         return true;
@@ -154,6 +172,7 @@ public class BusinessWorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, W
         logEntry.setOperDesc("核查结果:" + handleResult + ",说明:" + solution);
         logEntry.setOperUserId(operUserId);
         logEntry.setOperUserName(operUserName);
+        logEntry.setOperTime(new Date());
         workOrderLogMapper.insert(logEntry);
         return true;
     }
@@ -171,12 +190,16 @@ public class BusinessWorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, W
         entity.setRepairResult(solution);
         this.updateById(entity);
 
+        // 工单处理中 → 同步隐患状态为"整改中"
+        syncHazardStatus(order, "整改中", solution);
+
         WorkOrderLog logEntry = new WorkOrderLog();
         logEntry.setOrderId(orderId);
         logEntry.setOperType(4);
         logEntry.setOperDesc("处理结果:" + handleResult + ",说明:" + solution);
         logEntry.setOperUserId(operUserId);
         logEntry.setOperUserName(operUserName);
+        logEntry.setOperTime(new Date());
         workOrderLogMapper.insert(logEntry);
         return true;
     }
@@ -201,13 +224,14 @@ public class BusinessWorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, W
         logEntry.setOperDesc("提交验收,结果:" + result);
         logEntry.setOperUserId(operUserId);
         logEntry.setOperUserName(operUserName);
+        logEntry.setOperTime(new Date());
         workOrderLogMapper.insert(logEntry);
         return true;
     }
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public Long createWorkOrderFromHazard(String hazardId, String hazardDesc, String equipmentId, String hazardLevel, String hazardImages, Date planFinishTime) {
+    public Long createWorkOrderFromHazard(String hazardId, String hazardNo, String hazardDesc, String equipmentId, String hazardLevel, String hazardImages, Date planFinishTime) {
         // 隐患等级映射到工单优先级:0-重大→紧急(1) 1-较大→一般(2) 2-一般→一般(2) 3-轻微→低(3)
         Integer orderLevel;
         if ("0".equals(hazardLevel)) {
@@ -220,7 +244,16 @@ public class BusinessWorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, W
 
         WorkOrder workOrder = new WorkOrder();
         workOrder.setOrderNo(generateOrderNo());
+        workOrder.setHazardId(hazardId);
+        workOrder.setHazardNo(hazardNo);
         workOrder.setDeviceId(equipmentId);
+        // 查询设备信息,填充设备编码
+        if (StringUtils.isNotEmpty(equipmentId)) {
+            EquipmentBase equipment = equipmentBaseMapper.selectById(equipmentId);
+            if (equipment != null) {
+                workOrder.setDeviceCode(equipment.getEquipmentCode());
+            }
+        }
         workOrder.setOrderType(1); // 默认故障维修
         workOrder.setOrderLevel(orderLevel);
         workOrder.setOrderDesc(hazardDesc);
@@ -267,7 +300,105 @@ public class BusinessWorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, W
         logEntry.setOperDesc("取消工单");
         logEntry.setOperUserId(operUserId);
         logEntry.setOperUserName(operUserName);
+        logEntry.setOperTime(new Date());
+        workOrderLogMapper.insert(logEntry);
+        return true;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean closeOrder(Long orderId, String result, Long operUserId, String operUserName) {
+        WorkOrder order = this.getById(orderId);
+        if (order == null) throw new ServiceException("工单不存在");
+        if (order.getOrderStatus() != 5) throw new ServiceException("当前工单状态不允许验收通过");
+
+        WorkOrder entity = new WorkOrder();
+        entity.setOrderId(orderId);
+        entity.setOrderStatus(6);
+        entity.setRealFinishTime(new Date());
+        this.updateById(entity);
+
+        // 工单已结案 → 同步隐患状态为"已整改"
+        syncHazardStatus(order, "已整改", result);
+
+        // 工单验收通过 → 重置关联设备报警状态为正常
+        resetEquipmentAlarmStatus(order);
+
+        WorkOrderLog logEntry = new WorkOrderLog();
+        logEntry.setOrderId(orderId);
+        logEntry.setOperType(6);
+        logEntry.setOperDesc("验收通过,结果:" + result);
+        logEntry.setOperUserId(operUserId);
+        logEntry.setOperUserName(operUserName);
+        logEntry.setOperTime(new Date());
         workOrderLogMapper.insert(logEntry);
         return true;
     }
+
+    /**
+     * 同步隐患状态:根据工单处理结果更新关联隐患记录的状态和整改反馈
+     * @param order 工单对象
+     * @param hazardStatus 隐患状态:整改中/已整改
+     * @param rectifyFeedback 整改反馈(说明/方案)
+     */
+    private void syncHazardStatus(WorkOrder order, String hazardStatus, String rectifyFeedback) {
+        if (StringUtils.isEmpty(order.getHazardNo())) {
+            return;
+        }
+        try {
+            LambdaQueryWrapper<HazardHiddenAccount> wrapper = new LambdaQueryWrapper<>();
+            wrapper.eq(HazardHiddenAccount::getHazardNo, order.getHazardNo());
+            HazardHiddenAccount hazard = hazardHiddenAccountMapper.selectOne(wrapper);
+            if (hazard != null) {
+                HazardHiddenAccount update = new HazardHiddenAccount();
+                update.setHazardId(hazard.getHazardId());
+                update.setHazardStatus(hazardStatus);
+                if (StringUtils.isNotEmpty(rectifyFeedback)) {
+                    update.setRectifyFeedback(rectifyFeedback);
+                }
+                hazardHiddenAccountMapper.updateById(update);
+                log.info("工单[{}]关联隐患[{}]状态同步为:{}, 整改反馈:{}",
+                        order.getOrderNo(), order.getHazardNo(), hazardStatus, rectifyFeedback);
+            }
+        } catch (Exception e) {
+            log.error("工单[{}]同步隐患状态失败", order.getOrderNo(), e);
+        }
+    }
+
+    /**
+     * 工单验收通过后,重置关联设备的报警状态为正常(0)
+     * 参考 EquipmentStatusApiServiceImpl.updateAlarmStatus 逻辑
+     */
+    private void resetEquipmentAlarmStatus(WorkOrder order) {
+        if (StringUtils.isEmpty(order.getDeviceId())) {
+            return;
+        }
+        try {
+            LambdaQueryWrapper<EquipmentStatus> wrapper = new LambdaQueryWrapper<>();
+            wrapper.eq(EquipmentStatus::getEquipmentId, order.getDeviceId()).last("LIMIT 1");
+            EquipmentStatus existingStatus = equipmentStatusMapper.selectOne(wrapper);
+            if (existingStatus != null) {
+                // 更新已有记录
+                existingStatus.setAlarmStatus(0);
+                existingStatus.setStatusUpdateTime(LocalDateTime.now());
+                equipmentStatusMapper.updateById(existingStatus);
+                log.info("工单[{}]验收通过,设备[{}]报警状态已重置为正常",
+                        order.getOrderNo(), order.getDeviceCode());
+            } else {
+                // 不存在则创建新记录
+                EquipmentStatus newStatus = new EquipmentStatus();
+                newStatus.setEquipmentId(order.getDeviceId());
+                newStatus.setAlarmStatus(0);
+                newStatus.setCurrentStatus(1); // 默认在用
+                newStatus.setOnlineStatus(1);  // 默认在线
+                newStatus.setStatusUpdateTime(LocalDateTime.now());
+                newStatus.setCreateTime(LocalDateTime.now());
+                equipmentStatusMapper.insert(newStatus);
+                log.info("工单[{}]验收通过,创建设备状态记录,设备[{}]报警状态为正常",
+                        order.getOrderNo(), order.getDeviceCode());
+            }
+        } catch (Exception e) {
+            log.error("工单[{}]重置设备报警状态失败", order.getOrderNo(), e);
+        }
+    }
 }

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

@@ -53,6 +53,13 @@ public class HazardHiddenAccountServiceImpl extends ServiceImpl<HazardHiddenAcco
 
     @Override
     public boolean saveWithCheck(HazardHiddenAccount entity) {
+        // 新增的隐患记录默认未报送
+        entity.setIsSubmitted(0);
+        entity.setSubmitTime(null);
+        // 默认状态为"待核查"
+        if (entity.getHazardStatus() == null || entity.getHazardStatus().isEmpty()) {
+            entity.setHazardStatus("待核查");
+        }
         LambdaQueryWrapper<HazardHiddenAccount> wrapper = new LambdaQueryWrapper<>();
         wrapper.eq(HazardHiddenAccount::getHazardNo, entity.getHazardNo());
         if (this.count(wrapper) > 0) {
@@ -113,6 +120,7 @@ public class HazardHiddenAccountServiceImpl extends ServiceImpl<HazardHiddenAcco
                 }
                 Long orderId = businessWorkOrderService.createWorkOrderFromHazard(
                         hazard.getHazardId(),
+                        hazard.getHazardNo(),
                         hazard.getHazardDesc(),
                         hazard.getEquipmentId(),
                         hazard.getHazardLevel(),
@@ -132,7 +140,7 @@ public class HazardHiddenAccountServiceImpl extends ServiceImpl<HazardHiddenAcco
     @Override
     public List<HazardHiddenAccount> getActiveMapPoints() {
         LambdaQueryWrapper<HazardHiddenAccount> wrapper = new LambdaQueryWrapper<>();
-        wrapper.ne(HazardHiddenAccount::getHazardStatus, "3");
+        wrapper.ne(HazardHiddenAccount::getHazardStatus, "已整改");
         wrapper.isNotNull(HazardHiddenAccount::getLongitude);
         wrapper.isNotNull(HazardHiddenAccount::getLatitude);
         wrapper.select(HazardHiddenAccount::getHazardId, HazardHiddenAccount::getHazardNo,