瀏覽代碼

fix:工单bug修改

null 1 周之前
父節點
當前提交
79d192766d

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

@@ -118,20 +118,25 @@ public class BusinessWorkOrderController extends BaseController {
         Long orderId = Long.valueOf(body.get("orderId").toString());
         String handleResult = body.get("handleResult") != null ? body.get("handleResult").toString() : "";
         String solution = body.get("solution") != null ? body.get("solution").toString() : "";
+        String maintenanceBeforeImg = body.get("maintenanceBeforeImg") != null ? body.get("maintenanceBeforeImg").toString() : "";
         Long userId = SecurityUtils.getUserId();
         String userName = SecurityUtils.getUsername();
 
-        businessWorkOrderService.processOrder(orderId, handleResult, solution, userId, userName);
+        businessWorkOrderService.processOrder(orderId, handleResult, solution, maintenanceBeforeImg, userId, userName);
         return AjaxResult.success("处理完成");
     }
 
     @PutMapping("/complete")
     @ApiOperation("完成/提交验收")
-    public AjaxResult complete(@RequestParam Long orderId, @RequestParam String result) {
+    public AjaxResult complete(@RequestBody Map<String, Object> body) {
+        Long orderId = Long.valueOf(body.get("orderId").toString());
+        String result = body.get("result") != null ? body.get("result").toString() : "";
+        String maintenanceAfterImg = body.get("maintenanceAfterImg") != null
+                ? body.get("maintenanceAfterImg").toString() : "";
         Long userId = SecurityUtils.getUserId();
         String userName = SecurityUtils.getUsername();
 
-        businessWorkOrderService.completeOrder(orderId, result, userId, userName);
+        businessWorkOrderService.completeOrder(orderId, result, maintenanceAfterImg, userId, userName);
         return AjaxResult.success("提交验收成功");
     }
 
@@ -170,6 +175,18 @@ public class BusinessWorkOrderController extends BaseController {
         return AjaxResult.success("工单创建成功", orderId);
     }
 
+    @PutMapping("/reject")
+    @ApiOperation("驳回工单(待派单/待接单 -> 已驳回)")
+    public AjaxResult reject(@RequestBody Map<String, Object> body) {
+        Long orderId = Long.valueOf(body.get("orderId").toString());
+        String reason = body.get("reason") != null ? body.get("reason").toString() : "";
+        Long userId = SecurityUtils.getUserId();
+        String userName = SecurityUtils.getUsername();
+
+        businessWorkOrderService.rejectOrder(orderId, reason, userId, userName);
+        return AjaxResult.success("驳回成功");
+    }
+
     @DeleteMapping("/{orderId}")
     @ApiOperation("取消工单")
     public AjaxResult cancel(@PathVariable Long orderId) {

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

@@ -162,10 +162,16 @@ public class WorkOrder implements Serializable {
     private String repairResult;
 
     /**
-     * 工单图片(多个图片用逗号分隔)
+     * 维修前图片 URL,多个图片使用逗号分隔
      */
-    @ApiModelProperty(value = "工单图片,多个用逗号分隔")
-    private String workImage;
+    @ApiModelProperty(value = "维修前图片 URL")
+    private String maintenanceBeforeImg;
+
+    /**
+     * 维修后图片 URL,多个图片使用逗号分隔
+     */
+    @ApiModelProperty(value = "维修后图片 URL")
+    private String maintenanceAfterImg;
 
     /**
      * 验收人ID
@@ -193,4 +199,4 @@ public class WorkOrder implements Serializable {
     @ApiModelProperty(value = "更新时间")
     @JsonFormat(locale = "zh",pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
     private Date updateTime;
-}
+}

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

@@ -50,18 +50,24 @@ public interface BusinessWorkOrderService extends IService<WorkOrder> {
     /**
      * 处理
      */
-    boolean processOrder(Long orderId, String handleResult, String solution, Long operUserId, String operUserName);
+    boolean processOrder(Long orderId, String handleResult, String solution, String maintenanceBeforeImg, Long operUserId, String operUserName);
 
     /**
      * 完成/提交验收
      */
-    boolean completeOrder(Long orderId, String result, Long operUserId, String operUserName);
+    boolean completeOrder(Long orderId, String result, String maintenanceAfterImg, Long operUserId, String operUserName);
 
     /**
      * 取消工单
      */
     boolean cancelOrder(Long orderId, Long operUserId, String operUserName);
 
+    /**
+     * 驳回工单(待派单/待接单 -> 已驳回)
+     * @param reason 驳回原因
+     */
+    boolean rejectOrder(Long orderId, String reason, Long operUserId, String operUserName);
+
     /**
      * 验收通过/结案(status 5→6),同步联动隐患状态为"已整改"
      */

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

@@ -192,7 +192,7 @@ public class BusinessWorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, W
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public boolean processOrder(Long orderId, String handleResult, String solution, Long operUserId, String operUserName) {
+    public boolean processOrder(Long orderId, String handleResult, String solution, String maintenanceBeforeImg, Long operUserId, String operUserName) {
         WorkOrder order = this.getById(orderId);
         if (order == null) throw new ServiceException("工单不存在");
         if (!Arrays.asList(3, 4).contains(order.getOrderStatus())) throw new ServiceException("当前工单状态不允许处理");
@@ -201,6 +201,9 @@ public class BusinessWorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, W
         entity.setOrderId(orderId);
         entity.setOrderStatus(4);
         entity.setRepairResult(solution);
+        if (StringUtils.isNotBlank(maintenanceBeforeImg)) {
+            entity.setMaintenanceBeforeImg(maintenanceBeforeImg);
+        }
         this.updateById(entity);
 
         // 工单处理中 → 同步隐患状态为"整改中"
@@ -219,7 +222,7 @@ public class BusinessWorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, W
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public boolean completeOrder(Long orderId, String result, Long operUserId, String operUserName) {
+    public boolean completeOrder(Long orderId, String result, String maintenanceAfterImg, Long operUserId, String operUserName) {
         WorkOrder order = this.getById(orderId);
         if (order == null) throw new ServiceException("工单不存在");
         if (order.getOrderStatus() != 4)
@@ -229,6 +232,9 @@ public class BusinessWorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, W
         entity.setOrderId(orderId);
         entity.setOrderStatus(5);
         entity.setRepairResult(result);
+        if (StringUtils.isNotBlank(maintenanceAfterImg)) {
+            entity.setMaintenanceAfterImg(maintenanceAfterImg);
+        }
         this.updateById(entity);
 
         WorkOrderLog logEntry = new WorkOrderLog();
@@ -245,6 +251,9 @@ public class BusinessWorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, W
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Long createWorkOrderFromHazard(String hazardId, String hazardNo, String hazardDesc, String equipmentId, String hazardLevel, String hazardImages, Date planFinishTime) {
+        // 同一设备存在进行中工单(状态非 6 已结案/7 已驳回)时禁止重复建单
+        checkDeviceOrderConflict(equipmentId);
+
         // 隐患等级映射到工单优先级:0-重大→紧急(1) 1-较大→一般(2) 2-一般→一般(2) 3-轻微→低(3)
         Integer orderLevel;
         if ("0".equals(hazardLevel)) {
@@ -271,7 +280,10 @@ public class BusinessWorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, W
         workOrder.setOrderLevel(orderLevel);
         workOrder.setOrderDesc(hazardDesc);
         workOrder.setOrderStatus(1); // 待派单
-        workOrder.setWorkImage(hazardImages);
+        // 隐患图片作为维修前图片(如有)
+        if (StringUtils.isNotEmpty(hazardImages)) {
+            workOrder.setMaintenanceBeforeImg(hazardImages);
+        }
         workOrder.setPlanFinishTime(planFinishTime);
         workOrder.setCreateTime(new Date());
         this.save(workOrder);
@@ -291,6 +303,9 @@ public class BusinessWorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, W
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Long createWorkOrder(WorkOrder workOrder) {
+        // 同一设备存在进行中工单(状态非 6 已结案/7 已驳回)时禁止重复建单
+        checkDeviceOrderConflict(workOrder.getDeviceId());
+
         if (workOrder.getOrderType() == null) {
             workOrder.setOrderType(1);
         }
@@ -321,6 +336,23 @@ public class BusinessWorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, W
         return workOrder.getOrderId();
     }
 
+    /**
+     * 校验设备是否存在进行中工单(状态 1-5/8/9),存在则禁止再次创建工单
+     * 业务规则:同一设备同一时间只能有一个进行中的工单,结案(6)或驳回(7)后方可再次创建
+     */
+    private void checkDeviceOrderConflict(String deviceId) {
+        if (StringUtils.isEmpty(deviceId)) {
+            return;
+        }
+        Long count = this.lambdaQuery()
+                .eq(WorkOrder::getDeviceId, deviceId)
+                .notIn(WorkOrder::getOrderStatus, 6, 7)
+                .count();
+        if (count > 0) {
+            throw new ServiceException("该设备已有处理中的工单,需结案或驳回后才能创建新工单");
+        }
+    }
+
     /**
      * 生成工单编号:WO-yyyyMMddHHmmssSSS
      */
@@ -351,6 +383,30 @@ public class BusinessWorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, W
         return true;
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean rejectOrder(Long orderId, String reason, Long operUserId, String operUserName) {
+        WorkOrder order = this.getById(orderId);
+        if (order == null) throw new ServiceException("工单不存在");
+        // 仅待派单/待接单可驳回,已流转的工单请使用取消
+        if (!Arrays.asList(1, 2).contains(order.getOrderStatus())) throw new ServiceException("当前工单状态不允许驳回");
+
+        WorkOrder entity = new WorkOrder();
+        entity.setOrderId(orderId);
+        entity.setOrderStatus(7);
+        this.updateById(entity);
+
+        WorkOrderLog logEntry = new WorkOrderLog();
+        logEntry.setOrderId(orderId);
+        logEntry.setOperType(7);
+        logEntry.setOperDesc("驳回工单,原因:" + (reason != null ? reason : ""));
+        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) {

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

@@ -115,6 +115,16 @@ public class WorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, WorkOrder
     @Override
     public Long addWorkOrder(WorkOrderAddInDTO inDTO) {
         log.info("新增工单-入参:{}", inDTO);
+        // 同一设备存在进行中工单(状态非 6 已结案/7 已驳回)时禁止重复建单
+        if (inDTO.getDeviceId() != null) {
+            Long count = this.lambdaQuery()
+                    .eq(WorkOrder::getDeviceId, inDTO.getDeviceId())
+                    .notIn(WorkOrder::getOrderStatus, 6, 7)
+                    .count();
+            if (count > 0) {
+                throw new ServiceException("该设备已有处理中的工单,需结案或驳回后才能创建新工单");
+            }
+        }
         WorkOrder workOrder = BeanUtil.copyProperties(inDTO, WorkOrder.class);
         workOrder.setOrderNo(generateOrderNo());
         // 初始状态:1-待派单
@@ -133,6 +143,13 @@ public class WorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, WorkOrder
                 workOrder.setDeviceCode(equipmentBase.getEquipmentCode());
             }
         }
+        // 设置维修前后图片(如果 DTO 中有传递)
+        if (inDTO.getMaintenanceBeforeImg() != null) {
+            workOrder.setMaintenanceBeforeImg(inDTO.getMaintenanceBeforeImg());
+        }
+        if (inDTO.getMaintenanceAfterImg() != null) {
+            workOrder.setMaintenanceAfterImg(inDTO.getMaintenanceAfterImg());
+        }
         this.save(workOrder);
         WorkOrderLog workOrderLog = new WorkOrderLog();
         workOrderLog.setOrderId(workOrder.getOrderId());
@@ -260,10 +277,16 @@ public class WorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, WorkOrder
         } else if(inDTO.getOperType() == 4){
             //4-开始维修
             entity.setOrderStatus(4);
+            if (StringUtils.isNotBlank(inDTO.getMaintenanceBeforeImg())) {
+                entity.setMaintenanceBeforeImg(inDTO.getMaintenanceBeforeImg());
+            }
         } else if(inDTO.getOperType() == 5){
             //5-提交验收
             entity.setOrderStatus(5);
             entity.setVerifyUser(workOrder.getDispatchUser());
+            if (StringUtils.isNotBlank(inDTO.getMaintenanceAfterImg())) {
+                entity.setMaintenanceAfterImg(inDTO.getMaintenanceAfterImg());
+            }
         } else if(inDTO.getOperType() == 6){
             //6-验收通过
             entity.setOrderStatus(6);

+ 6 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/manhole/dto/in/WorkOrderAddInDTO.java

@@ -42,4 +42,10 @@ public class WorkOrderAddInDTO implements Serializable {
     @ApiModelProperty(value = "计划完成时间")
     @JsonFormat(locale = "zh", pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date planFinishTime;
+
+    @ApiModelProperty(value = "维修前图片 URL")
+    private String maintenanceBeforeImg;
+
+    @ApiModelProperty(value = "维修后图片 URL")
+    private String maintenanceAfterImg;
 }

+ 4 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/manhole/dto/in/WorkOrderOperInDTO.java

@@ -39,4 +39,8 @@ public class WorkOrderOperInDTO implements Serializable {
     @ApiModelProperty(value = "延期截止时间(操作类型为 8-申请延期 时,必填)")
     @JsonFormat(locale = "zh",pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
     private Date delayedDeadline;
+
+    private String maintenanceBeforeImg;
+
+    private String maintenanceAfterImg;
 }

+ 3 - 2
pipe-network-service/zksy-system/src/main/resources/mapper/WorkOrderMapper.xml

@@ -25,7 +25,8 @@
             <result property="planFinishTime" column="plan_finish_time" jdbcType="TIMESTAMP"/>
             <result property="realFinishTime" column="real_finish_time" jdbcType="TIMESTAMP"/>
             <result property="repairResult" column="repair_result" jdbcType="VARCHAR"/>
-            <result property="workImage" column="work_image" jdbcType="VARCHAR"/>
+            <result property="maintenanceBeforeImg" column="maintenance_before_img" jdbcType="VARCHAR"/>
+            <result property="maintenanceAfterImg" column="maintenance_after_img" jdbcType="VARCHAR"/>
             <result property="verifyUser" column="verify_user" jdbcType="BIGINT"/>
             <result property="verifyTime" column="verify_time" jdbcType="TIMESTAMP"/>
             <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
@@ -39,7 +40,7 @@
         order_desc,dept_id,dispatch_user,
         dispatch_time,receive_user,order_status,
         delayed_reason,delayed_deadline,plan_finish_time,
-        real_finish_time,repair_result,work_image,verify_user,
+        real_finish_time,repair_result,maintenance_before_img,maintenance_after_img,verify_user,
         verify_time,create_time,update_time
     </sql>
 </mapper>

+ 10 - 4
zk-api-service/src/main/java/com/zksy/api/domain/WorkOrder.java

@@ -150,10 +150,16 @@ public class WorkOrder implements Serializable {
     private String repairResult;
 
     /**
-     * 工单图片(多个图片用逗号分隔)
+     * 维修前图片 URL,多个图片使用逗号分隔
      */
-    @ApiModelProperty(value = "工单图片,多个用逗号分隔")
-    private String workImage;
+    @ApiModelProperty(value = "维修前图片 URL")
+    private String maintenanceBeforeImg;
+
+    /**
+     * 维修后图片 URL,多个图片使用逗号分隔
+     */
+    @ApiModelProperty(value = "维修后图片 URL")
+    private String maintenanceAfterImg;
 
     /**
      * 验收人ID
@@ -181,4 +187,4 @@ public class WorkOrder implements Serializable {
     @ApiModelProperty(value = "更新时间")
     @JsonFormat(locale = "zh",pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
     private Date updateTime;
-}
+}