Commit c599198eff37a95292bef939ef34423b485c5b62

Authored by YunaiV
1 parent 3b7956cc

✨ feat(mes): 更新维修工单流程及状态管理

新增维修工单提交、确认和完成验收功能,优化状态流转逻辑。
- 提交维修工单时记录当前用户
- 完成维修后更新状态为待验收
- 完成验收时支持通过与不通过的结果记录

确保维修工单的状态管理更加清晰,提升用户体验
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/repair/MesDvRepairController.java
@@ -19,6 +19,7 @@ import cn.iocoder.yudao.module.system.api.user.AdminUserApi; @@ -19,6 +19,7 @@ import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
19 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; 19 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
20 import io.swagger.v3.oas.annotations.Operation; 20 import io.swagger.v3.oas.annotations.Operation;
21 import io.swagger.v3.oas.annotations.Parameter; 21 import io.swagger.v3.oas.annotations.Parameter;
  22 +import io.swagger.v3.oas.annotations.Parameters;
22 import io.swagger.v3.oas.annotations.tags.Tag; 23 import io.swagger.v3.oas.annotations.tags.Tag;
23 import jakarta.annotation.Resource; 24 import jakarta.annotation.Resource;
24 import jakarta.servlet.http.HttpServletResponse; 25 import jakarta.servlet.http.HttpServletResponse;
@@ -37,6 +38,7 @@ import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPOR @@ -37,6 +38,7 @@ import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPOR
37 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 38 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
38 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; 39 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
39 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSetByFlatMap; 40 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSetByFlatMap;
  41 +import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
40 42
41 @Tag(name = "管理后台 - MES 维修工单") 43 @Tag(name = "管理后台 - MES 维修工单")
42 @RestController 44 @RestController
@@ -110,28 +112,19 @@ public class MesDvRepairController { @@ -110,28 +112,19 @@ public class MesDvRepairController {
110 buildRepairRespVOList(list)); 112 buildRepairRespVOList(list));
111 } 113 }
112 114
  115 + // DONE @AI:submit=>confirm=>finish(然后里面有是 resultstatus 这样的字段【对齐实体?】)
  116 +
113 @PutMapping("/submit") 117 @PutMapping("/submit")
114 @Operation(summary = "提交维修工单(草稿→维修中)") 118 @Operation(summary = "提交维修工单(草稿→维修中)")
115 @Parameter(name = "id", description = "编号", required = true) 119 @Parameter(name = "id", description = "编号", required = true)
116 @PreAuthorize("@ss.hasPermission('mes:dv-repair:update')") 120 @PreAuthorize("@ss.hasPermission('mes:dv-repair:update')")
117 public CommonResult<Boolean> submitRepair(@RequestParam("id") Long id) { 121 public CommonResult<Boolean> submitRepair(@RequestParam("id") Long id) {
118 - repairService.submitRepair(id);  
119 - return success(true);  
120 - }  
121 -  
122 - // TODO @AI:submit=>confirm=>finish(然后里面有是 resultstatus 这样的字段【对齐实体?】)  
123 -  
124 - @PutMapping("/finish")  
125 - @Operation(summary = "完成维修(维修中→待验收)")  
126 - @Parameter(name = "id", description = "编号", required = true)  
127 - @PreAuthorize("@ss.hasPermission('mes:dv-repair:update')")  
128 - public CommonResult<Boolean> finishRepair(@RequestParam("id") Long id) {  
129 - repairService.finishRepair(id); 122 + repairService.submitRepair(id, getLoginUserId());
130 return success(true); 123 return success(true);
131 } 124 }
132 125
133 @PutMapping("/confirm") 126 @PutMapping("/confirm")
134 - @Operation(summary = "验收通过(待验收→已确认,结果=通过)") 127 + @Operation(summary = "确认维修完成(维修中→待验收)")
135 @Parameter(name = "id", description = "编号", required = true) 128 @Parameter(name = "id", description = "编号", required = true)
136 @PreAuthorize("@ss.hasPermission('mes:dv-repair:update')") 129 @PreAuthorize("@ss.hasPermission('mes:dv-repair:update')")
137 public CommonResult<Boolean> confirmRepair(@RequestParam("id") Long id) { 130 public CommonResult<Boolean> confirmRepair(@RequestParam("id") Long id) {
@@ -139,12 +132,16 @@ public class MesDvRepairController { @@ -139,12 +132,16 @@ public class MesDvRepairController {
139 return success(true); 132 return success(true);
140 } 133 }
141 134
142 - @PutMapping("/reject")  
143 - @Operation(summary = "验收不通过(待验收→已确认,结果=不通过)")  
144 - @Parameter(name = "id", description = "编号", required = true) 135 + @PutMapping("/finish")
  136 + @Operation(summary = "完成验收(待验收→已确认)")
  137 + @Parameters({
  138 + @Parameter(name = "id", description = "编号", required = true),
  139 + @Parameter(name = "result", description = "验收结果", required = true)
  140 + })
145 @PreAuthorize("@ss.hasPermission('mes:dv-repair:update')") 141 @PreAuthorize("@ss.hasPermission('mes:dv-repair:update')")
146 - public CommonResult<Boolean> rejectRepair(@RequestParam("id") Long id) {  
147 - repairService.rejectRepair(id); 142 + public CommonResult<Boolean> finishRepair(@RequestParam("id") Long id,
  143 + @RequestParam("result") Integer result) {
  144 + repairService.finishRepair(id, result, getLoginUserId());
148 return success(true); 145 return success(true);
149 } 146 }
150 147
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/repair/vo/MesDvRepairSaveReqVO.java
@@ -25,7 +25,8 @@ public class MesDvRepairSaveReqVO { @@ -25,7 +25,8 @@ public class MesDvRepairSaveReqVO {
25 @NotNull(message = "设备不能为空") 25 @NotNull(message = "设备不能为空")
26 private Long machineryId; 26 private Long machineryId;
27 27
28 - @Schema(description = "报修日期") 28 + @Schema(description = "报修日期", requiredMode = Schema.RequiredMode.REQUIRED)
  29 + @NotNull(message = "报修日期不能为空")
29 private LocalDateTime requireDate; 30 private LocalDateTime requireDate;
30 31
31 @Schema(description = "维修完成日期") 32 @Schema(description = "维修完成日期")
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/dv/repair/MesDvRepairDO.java
@@ -61,7 +61,6 @@ public class MesDvRepairDO extends BaseDO { @@ -61,7 +61,6 @@ public class MesDvRepairDO extends BaseDO {
61 * 维修结果 61 * 维修结果
62 * 62 *
63 * 枚举 {@link MesDvRepairResultEnum} 63 * 枚举 {@link MesDvRepairResultEnum}
64 - * 字典类型 mes_dv_repair_result  
65 */ 64 */
66 private Integer result; 65 private Integer result;
67 /** 66 /**
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/dv/MesDvRepairStatusEnum.java
@@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.mes.enums.dv; @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.mes.enums.dv;
2 2
3 import cn.iocoder.yudao.framework.common.core.ArrayValuable; 3 import cn.iocoder.yudao.framework.common.core.ArrayValuable;
4 import cn.iocoder.yudao.module.mes.enums.MesOrderStatusConstants; 4 import cn.iocoder.yudao.module.mes.enums.MesOrderStatusConstants;
  5 +import cn.iocoder.yudao.module.mes.service.dv.repair.MesDvRepairService;
5 import lombok.AllArgsConstructor; 6 import lombok.AllArgsConstructor;
6 import lombok.Getter; 7 import lombok.Getter;
7 8
@@ -18,25 +19,28 @@ import java.util.Arrays; @@ -18,25 +19,28 @@ import java.util.Arrays;
18 @AllArgsConstructor 19 @AllArgsConstructor
19 public enum MesDvRepairStatusEnum implements ArrayValuable<Integer> { 20 public enum MesDvRepairStatusEnum implements ArrayValuable<Integer> {
20 21
21 - // TODO @AI:不用 ktg 的注释,里面需要 @ 对应方法,对齐现有项目的规范;  
22 /** 22 /**
23 * 草稿 23 * 草稿
  24 + *
  25 + * 对应方法:{@link MesDvRepairService#createRepair}
24 */ 26 */
25 PREPARE(MesOrderStatusConstants.PREPARE, "草稿"), 27 PREPARE(MesOrderStatusConstants.PREPARE, "草稿"),
26 /** 28 /**
27 * 维修中(提交后,维修人接单) 29 * 维修中(提交后,维修人接单)
  30 + *
  31 + * 对应方法:{@link MesDvRepairService#submitRepair(Long, Long)}
28 */ 32 */
29 CONFIRMED(MesOrderStatusConstants.CONFIRMED, "维修中"), 33 CONFIRMED(MesOrderStatusConstants.CONFIRMED, "维修中"),
30 /** 34 /**
31 * 待验收(维修完成,等待验收) 35 * 待验收(维修完成,等待验收)
32 * 36 *
33 - * 对应 KTG: FINISHED 37 + * 对应方法:{@link MesDvRepairService#confirmRepair(Long)}
34 */ 38 */
35 APPROVING(MesOrderStatusConstants.APPROVING, "待验收"), 39 APPROVING(MesOrderStatusConstants.APPROVING, "待验收"),
36 /** 40 /**
37 * 已确认(验收通过或不通过,终态) 41 * 已确认(验收通过或不通过,终态)
38 * 42 *
39 - * 对应 KTG: CONFIRMED 43 + * 对应方法:{@link MesDvRepairService#finishRepair(Long, Integer, Long)}
40 */ 44 */
41 FINISHED(MesOrderStatusConstants.FINISHED, "已确认"); 45 FINISHED(MesOrderStatusConstants.FINISHED, "已确认");
42 46
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/md/autocode/MesMdAutoCodeRuleCodeEnum.java
@@ -40,7 +40,11 @@ public enum MesMdAutoCodeRuleCodeEnum { @@ -40,7 +40,11 @@ public enum MesMdAutoCodeRuleCodeEnum {
40 WM_OUTSOURCE_ISSUE_CODE("WM_OUTSOURCE_ISSUE_CODE", "外协发料单编码"), 40 WM_OUTSOURCE_ISSUE_CODE("WM_OUTSOURCE_ISSUE_CODE", "外协发料单编码"),
41 DV_MACHINERY_CODE("DV_MACHINERY_CODE", "设备编码"), 41 DV_MACHINERY_CODE("DV_MACHINERY_CODE", "设备编码"),
42 DV_MACHINERY_TYPE_CODE("DV_MACHINERY_TYPE_CODE", "设备类型编码"), 42 DV_MACHINERY_TYPE_CODE("DV_MACHINERY_TYPE_CODE", "设备类型编码"),
43 - DV_SUBJECT_CODE("DV_SUBJECT_CODE", "点检保养项目编码"); 43 + DV_SUBJECT_CODE("DV_SUBJECT_CODE", "点检保养项目编码"),
  44 + DV_REPAIR_CODE("DV_REPAIR_CODE", "维修单编码"),
  45 + WM_SALES_NOTICE_CODE("WM_SALES_NOTICE_CODE", "发货通知单编码"),
  46 + WM_RETURN_SALES_CODE("WM_RETURN_SALES_CODE", "销售退货单编码"),
  47 + WM_MISC_ISSUE_CODE("WM_MISC_ISSUE_CODE", "杂项出库单编码");
44 48
45 /** 49 /**
46 * 规则代码 50 * 规则代码
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/dv/repair/MesDvRepairService.java
@@ -73,27 +73,22 @@ public interface MesDvRepairService { @@ -73,27 +73,22 @@ public interface MesDvRepairService {
73 * 73 *
74 * @param id 编号 74 * @param id 编号
75 */ 75 */
76 - void submitRepair(Long id); 76 + void submitRepair(Long id, Long userId);
77 77
78 /** 78 /**
79 - * 完成维修(维修中→待验收)  
80 - *  
81 - * @param id 编号  
82 - */  
83 - void finishRepair(Long id);  
84 -  
85 - /**  
86 - * 验收通过(待验收→已确认,结果=通过) 79 + * 确认维修完成(维修中→待验收)
87 * 80 *
88 * @param id 编号 81 * @param id 编号
89 */ 82 */
90 void confirmRepair(Long id); 83 void confirmRepair(Long id);
91 84
92 /** 85 /**
93 - * 验收不通过(待验收→已确认,结果=不通过) 86 + * 完成验收(待验收→已确认)
94 * 87 *
95 * @param id 编号 88 * @param id 编号
  89 + * @param result 验收结果
  90 + * @param userId 当前登录用户编号
96 */ 91 */
97 - void rejectRepair(Long id); 92 + void finishRepair(Long id, Integer result, Long userId);
98 93
99 } 94 }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/dv/repair/MesDvRepairServiceImpl.java
@@ -7,7 +7,6 @@ import cn.iocoder.yudao.module.mes.controller.admin.dv.repair.vo.MesDvRepairPage @@ -7,7 +7,6 @@ import cn.iocoder.yudao.module.mes.controller.admin.dv.repair.vo.MesDvRepairPage
7 import cn.iocoder.yudao.module.mes.controller.admin.dv.repair.vo.MesDvRepairSaveReqVO; 7 import cn.iocoder.yudao.module.mes.controller.admin.dv.repair.vo.MesDvRepairSaveReqVO;
8 import cn.iocoder.yudao.module.mes.dal.dataobject.dv.repair.MesDvRepairDO; 8 import cn.iocoder.yudao.module.mes.dal.dataobject.dv.repair.MesDvRepairDO;
9 import cn.iocoder.yudao.module.mes.dal.mysql.dv.repair.MesDvRepairMapper; 9 import cn.iocoder.yudao.module.mes.dal.mysql.dv.repair.MesDvRepairMapper;
10 -import cn.iocoder.yudao.module.mes.enums.dv.MesDvRepairResultEnum;  
11 import cn.iocoder.yudao.module.mes.enums.dv.MesDvRepairStatusEnum; 10 import cn.iocoder.yudao.module.mes.enums.dv.MesDvRepairStatusEnum;
12 import cn.iocoder.yudao.module.mes.service.dv.machinery.MesDvMachineryService; 11 import cn.iocoder.yudao.module.mes.service.dv.machinery.MesDvMachineryService;
13 import jakarta.annotation.Resource; 12 import jakarta.annotation.Resource;
@@ -18,7 +17,6 @@ import org.springframework.validation.annotation.Validated; @@ -18,7 +17,6 @@ import org.springframework.validation.annotation.Validated;
18 import java.time.LocalDateTime; 17 import java.time.LocalDateTime;
19 18
20 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 19 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
21 -import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;  
22 import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; 20 import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
23 21
24 /** 22 /**
@@ -136,18 +134,17 @@ public class MesDvRepairServiceImpl implements MesDvRepairService { @@ -136,18 +134,17 @@ public class MesDvRepairServiceImpl implements MesDvRepairService {
136 } 134 }
137 135
138 @Override 136 @Override
139 - public void submitRepair(Long id) { 137 + public void submitRepair(Long id, Long userId) {
140 // 1. 校验存在,且状态为草稿 138 // 1. 校验存在,且状态为草稿
141 validateRepairPrepare(id); 139 validateRepairPrepare(id);
142 140
143 - // 2. 更新状态为维修中,自动设置维修人为当前用户 141 + // 2. 更新状态为维修中,设置维修人
144 repairMapper.updateById(new MesDvRepairDO().setId(id) 142 repairMapper.updateById(new MesDvRepairDO().setId(id)
145 - .setStatus(MesDvRepairStatusEnum.CONFIRMED.getStatus())  
146 - .setAcceptedUserId(getLoginUserId())); 143 + .setStatus(MesDvRepairStatusEnum.CONFIRMED.getStatus()).setAcceptedUserId(userId));
147 } 144 }
148 145
149 @Override 146 @Override
150 - public void finishRepair(Long id) { 147 + public void confirmRepair(Long id) {
151 // 1. 校验存在,且状态为维修中 148 // 1. 校验存在,且状态为维修中
152 MesDvRepairDO repair = validateRepairExists(id); 149 MesDvRepairDO repair = validateRepairExists(id);
153 if (ObjUtil.notEqual(MesDvRepairStatusEnum.CONFIRMED.getStatus(), repair.getStatus())) { 150 if (ObjUtil.notEqual(MesDvRepairStatusEnum.CONFIRMED.getStatus(), repair.getStatus())) {
@@ -156,40 +153,21 @@ public class MesDvRepairServiceImpl implements MesDvRepairService { @@ -156,40 +153,21 @@ public class MesDvRepairServiceImpl implements MesDvRepairService {
156 153
157 // 2. 更新状态为待验收,自动设置维修完成日期 154 // 2. 更新状态为待验收,自动设置维修完成日期
158 repairMapper.updateById(new MesDvRepairDO().setId(id) 155 repairMapper.updateById(new MesDvRepairDO().setId(id)
159 - .setStatus(MesDvRepairStatusEnum.APPROVING.getStatus())  
160 - .setFinishDate(LocalDateTime.now()));  
161 - }  
162 -  
163 - @Override  
164 - public void confirmRepair(Long id) {  
165 - // 1. 校验存在,且状态为待验收  
166 - MesDvRepairDO repair = validateRepairExists(id);  
167 - if (ObjUtil.notEqual(MesDvRepairStatusEnum.APPROVING.getStatus(), repair.getStatus())) {  
168 - throw exception(DV_REPAIR_NOT_APPROVING);  
169 - }  
170 -  
171 - // 2. 更新状态为已确认,结果为通过,自动设置验收人和验收日期  
172 - repairMapper.updateById(new MesDvRepairDO().setId(id)  
173 - .setStatus(MesDvRepairStatusEnum.FINISHED.getStatus())  
174 - .setResult(MesDvRepairResultEnum.PASS.getResult())  
175 - .setConfirmUserId(getLoginUserId())  
176 - .setConfirmDate(LocalDateTime.now())); 156 + .setStatus(MesDvRepairStatusEnum.APPROVING.getStatus()).setFinishDate(LocalDateTime.now()));
177 } 157 }
178 158
179 @Override 159 @Override
180 - public void rejectRepair(Long id) { 160 + public void finishRepair(Long id, Integer result, Long userId) {
181 // 1. 校验存在,且状态为待验收 161 // 1. 校验存在,且状态为待验收
182 MesDvRepairDO repair = validateRepairExists(id); 162 MesDvRepairDO repair = validateRepairExists(id);
183 if (ObjUtil.notEqual(MesDvRepairStatusEnum.APPROVING.getStatus(), repair.getStatus())) { 163 if (ObjUtil.notEqual(MesDvRepairStatusEnum.APPROVING.getStatus(), repair.getStatus())) {
184 throw exception(DV_REPAIR_NOT_APPROVING); 164 throw exception(DV_REPAIR_NOT_APPROVING);
185 } 165 }
186 166
187 - // 2. 更新状态为已确认,结果为不通过,自动设置验收人和验收日期 167 + // 2. 更新状态为已确认,设置验收结果、验收人和验收日期
188 repairMapper.updateById(new MesDvRepairDO().setId(id) 168 repairMapper.updateById(new MesDvRepairDO().setId(id)
189 - .setStatus(MesDvRepairStatusEnum.FINISHED.getStatus())  
190 - .setResult(MesDvRepairResultEnum.FAIL.getResult())  
191 - .setConfirmUserId(getLoginUserId())  
192 - .setConfirmDate(LocalDateTime.now())); 169 + .setStatus(MesDvRepairStatusEnum.FINISHED.getStatus()).setResult(result)
  170 + .setConfirmUserId(userId).setConfirmDate(LocalDateTime.now()));
193 } 171 }
194 172
195 } 173 }