Commit 62699136d2af4d9d57b85c7150d0a140d779797f

Authored by YunaiV
1 parent 049a0f1b

✨ feat(mes): 更新生产退料单提交逻辑及状态校验

重构生产退料单的提交功能,合并确认与提交操作,简化状态流转逻辑。新增状态校验,确保只有草稿状态的退料单可提交,并根据物料质检状态自动决定目标状态(待检验或待上架)。
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnissue/MesWmReturnIssueController.java
@@ -115,17 +115,8 @@ public class MesWmReturnIssueController { @@ -115,17 +115,8 @@ public class MesWmReturnIssueController {
115 return success(true); 115 return success(true);
116 } 116 }
117 117
118 - @PutMapping("/confirm")  
119 - @Operation(summary = "确认生产退料单")  
120 - @Parameter(name = "id", description = "编号", required = true)  
121 - @PreAuthorize("@ss.hasPermission('mes:wm-return-issue:update')")  
122 - public CommonResult<Boolean> confirmReturnIssue(@RequestParam("id") Long id) {  
123 - issueService.confirmReturnIssue(id);  
124 - return success(true);  
125 - }  
126 -  
127 @PutMapping("/submit") 118 @PutMapping("/submit")
128 - @Operation(summary = "提交生产退料单") 119 + @Operation(summary = "提交生产退料单(草稿 → 待检验/待上架)")
129 @Parameter(name = "id", description = "编号", required = true) 120 @Parameter(name = "id", description = "编号", required = true)
130 @PreAuthorize("@ss.hasPermission('mes:wm-return-issue:update')") 121 @PreAuthorize("@ss.hasPermission('mes:wm-return-issue:update')")
131 public CommonResult<Boolean> submitReturnIssue(@RequestParam("id") Long id) { 122 public CommonResult<Boolean> submitReturnIssue(@RequestParam("id") Long id) {
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java
@@ -381,9 +381,13 @@ public interface ErrorCodeConstants { @@ -381,9 +381,13 @@ public interface ErrorCodeConstants {
381 // ========== MES 仓库管理-生产退料单(1-040-710-000) ========== 381 // ========== MES 仓库管理-生产退料单(1-040-710-000) ==========
382 ErrorCode WM_RETURN_ISSUE_NOT_EXISTS = new ErrorCode(1_040_710_000, "生产退料单不存在"); 382 ErrorCode WM_RETURN_ISSUE_NOT_EXISTS = new ErrorCode(1_040_710_000, "生产退料单不存在");
383 ErrorCode WM_RETURN_ISSUE_STATUS_INVALID = new ErrorCode(1_040_710_001, "生产退料单状态不正确,无法执行该操作"); 383 ErrorCode WM_RETURN_ISSUE_STATUS_INVALID = new ErrorCode(1_040_710_001, "生产退料单状态不正确,无法执行该操作");
384 - ErrorCode WM_RETURN_ISSUE_NO_LINE = new ErrorCode(1_040_710_002, "生产退料单至少需要一条行数据");  
385 - ErrorCode WM_RETURN_ISSUE_DETAIL_QUANTITY_MISMATCH = new ErrorCode(1_040_710_003, "退料单行数量与明细数量不一致");  
386 - ErrorCode WM_RETURN_ISSUE_CANCEL_NOT_ALLOWED = new ErrorCode(1_040_710_004, "生产退料单已完成或已取消,无法取消"); 384 + ErrorCode WM_RETURN_ISSUE_NOT_PREPARE = new ErrorCode(1_040_710_002, "只有草稿状态的退料单才可操作");
  385 + ErrorCode WM_RETURN_ISSUE_NOT_CONFIRMED = new ErrorCode(1_040_710_003, "只有待检验状态的退料单才可提交");
  386 + ErrorCode WM_RETURN_ISSUE_NOT_APPROVING = new ErrorCode(1_040_710_004, "只有待上架状态的退料单才可入库上架");
  387 + ErrorCode WM_RETURN_ISSUE_NOT_APPROVED = new ErrorCode(1_040_710_005, "只有待执行退料状态的退料单才可完成");
  388 + ErrorCode WM_RETURN_ISSUE_NO_LINE = new ErrorCode(1_040_710_006, "生产退料单至少需要一条行数据");
  389 + ErrorCode WM_RETURN_ISSUE_DETAIL_QUANTITY_MISMATCH = new ErrorCode(1_040_710_007, "退料单行数量与明细数量不一致");
  390 + ErrorCode WM_RETURN_ISSUE_CANCEL_NOT_ALLOWED = new ErrorCode(1_040_710_008, "生产退料单已完成或已取消,无法取消");
387 ErrorCode WM_RETURN_ISSUE_LINE_NOT_EXISTS = new ErrorCode(1_040_710_100, "生产退料单行不存在"); 391 ErrorCode WM_RETURN_ISSUE_LINE_NOT_EXISTS = new ErrorCode(1_040_710_100, "生产退料单行不存在");
388 ErrorCode WM_RETURN_ISSUE_DETAIL_NOT_EXISTS = new ErrorCode(1_040_710_200, "生产退料单明细不存在"); 392 ErrorCode WM_RETURN_ISSUE_DETAIL_NOT_EXISTS = new ErrorCode(1_040_710_200, "生产退料单明细不存在");
389 ErrorCode WM_RETURN_ISSUE_DETAIL_QUANTITY_INVALID = new ErrorCode(1_040_710_201, "退料明细数量必须大于0"); 393 ErrorCode WM_RETURN_ISSUE_DETAIL_QUANTITY_INVALID = new ErrorCode(1_040_710_201, "退料明细数量必须大于0");
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmReturnIssueStatusEnum.java
@@ -27,7 +27,7 @@ public enum MesWmReturnIssueStatusEnum implements ArrayValuable&lt;Integer&gt; { @@ -27,7 +27,7 @@ public enum MesWmReturnIssueStatusEnum implements ArrayValuable&lt;Integer&gt; {
27 /** 27 /**
28 * 待检验(已确认,等待质检) 28 * 待检验(已确认,等待质检)
29 * 29 *
30 - * 对应方法:{@link MesWmReturnIssueService#confirmReturnIssue(Long)} 30 + * 对应方法:{@link MesWmReturnIssueService#submitReturnIssue(Long)}
31 */ 31 */
32 CONFIRMED(MesOrderStatusConstants.CONFIRMED, "待检验"), // "UNCHECK" 32 CONFIRMED(MesOrderStatusConstants.CONFIRMED, "待检验"), // "UNCHECK"
33 /** 33 /**
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueService.java
@@ -58,14 +58,7 @@ public interface MesWmReturnIssueService { @@ -58,14 +58,7 @@ public interface MesWmReturnIssueService {
58 MesWmReturnIssueDO validateReturnIssueExists(Long id); 58 MesWmReturnIssueDO validateReturnIssueExists(Long id);
59 59
60 /** 60 /**
61 - * 确认生产退料单(草稿 → 待检验)  
62 - *  
63 - * @param id 编号  
64 - */  
65 - void confirmReturnIssue(Long id);  
66 -  
67 - /**  
68 - * 提交生产退料单(待检验 → 待上架) 61 + * 提交生产退料单(草稿 → 待检验/待上架)
69 * 62 *
70 * @param id 编号 63 * @param id 编号
71 */ 64 */
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueServiceImpl.java
@@ -8,10 +8,11 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils; @@ -8,10 +8,11 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
8 import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; 8 import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
9 import cn.iocoder.yudao.module.mes.controller.admin.wm.returnissue.vo.MesWmReturnIssuePageReqVO; 9 import cn.iocoder.yudao.module.mes.controller.admin.wm.returnissue.vo.MesWmReturnIssuePageReqVO;
10 import cn.iocoder.yudao.module.mes.controller.admin.wm.returnissue.vo.MesWmReturnIssueSaveReqVO; 10 import cn.iocoder.yudao.module.mes.controller.admin.wm.returnissue.vo.MesWmReturnIssueSaveReqVO;
11 -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnissue.MesWmReturnIssueDetailDO;  
12 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnissue.MesWmReturnIssueDO; 11 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnissue.MesWmReturnIssueDO;
  12 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnissue.MesWmReturnIssueDetailDO;
13 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnissue.MesWmReturnIssueLineDO; 13 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnissue.MesWmReturnIssueLineDO;
14 import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnissue.MesWmReturnIssueMapper; 14 import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnissue.MesWmReturnIssueMapper;
  15 +import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum;
15 import cn.iocoder.yudao.module.mes.enums.wm.MesWmReturnIssueStatusEnum; 16 import cn.iocoder.yudao.module.mes.enums.wm.MesWmReturnIssueStatusEnum;
16 import cn.iocoder.yudao.module.mes.service.md.workstation.MesMdWorkstationService; 17 import cn.iocoder.yudao.module.mes.service.md.workstation.MesMdWorkstationService;
17 import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService; 18 import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService;
@@ -108,7 +109,7 @@ public class MesWmReturnIssueServiceImpl implements MesWmReturnIssueService { @@ -108,7 +109,7 @@ public class MesWmReturnIssueServiceImpl implements MesWmReturnIssueService {
108 109
109 @Override 110 @Override
110 @Transactional(rollbackFor = Exception.class) 111 @Transactional(rollbackFor = Exception.class)
111 - public void confirmReturnIssue(Long id) { 112 + public void submitReturnIssue(Long id) {
112 // 校验存在 + 草稿状态 113 // 校验存在 + 草稿状态
113 validateReturnIssueExistsAndPrepare(id); 114 validateReturnIssueExistsAndPrepare(id);
114 // 校验至少有一条行 115 // 校验至少有一条行
@@ -117,37 +118,25 @@ public class MesWmReturnIssueServiceImpl implements MesWmReturnIssueService { @@ -117,37 +118,25 @@ public class MesWmReturnIssueServiceImpl implements MesWmReturnIssueService {
117 throw exception(WM_RETURN_ISSUE_NO_LINE); 118 throw exception(WM_RETURN_ISSUE_NO_LINE);
118 } 119 }
119 120
120 - // 确认(草稿 → 待检验)  
121 - issueMapper.updateById(new MesWmReturnIssueDO()  
122 - .setId(id).setStatus(MesWmReturnIssueStatusEnum.CONFIRMED.getStatus()));  
123 - } 121 + // 2.1.1 检查是否有待检验的物料
  122 + boolean hasPendingQc = CollUtil.contains(lines,
  123 + line -> MesWmQualityStatusEnum.PENDING.getStatus().equals(line.getQualityStatus()));
  124 + // 2.1.2 确定目标状态:1)有待检验物料 → 待检验状态;2)无待检验物料 → 待上架状态
  125 + // TODO @芋艿:RQC 质量检测的接入
  126 + Integer targetStatus = hasPendingQc ? MesWmReturnIssueStatusEnum.CONFIRMED.getStatus()
  127 + : MesWmReturnIssueStatusEnum.APPROVING.getStatus();
124 128
125 - @Override  
126 - @Transactional(rollbackFor = Exception.class)  
127 - public void submitReturnIssue(Long id) {  
128 - // 校验存在 + 待检验状态  
129 - MesWmReturnIssueDO issue = validateReturnIssueExists(id);  
130 - if (ObjUtil.notEqual(MesWmReturnIssueStatusEnum.CONFIRMED.getStatus(), issue.getStatus())) {  
131 - throw exception(WM_RETURN_ISSUE_STATUS_INVALID);  
132 - }  
133 - // 校验至少有一条行  
134 - List<MesWmReturnIssueLineDO> lines = issueLineService.getReturnIssueLineListByIssueId(id);  
135 - if (CollUtil.isEmpty(lines)) {  
136 - throw exception(WM_RETURN_ISSUE_NO_LINE);  
137 - }  
138 -  
139 - // 提交(待检验 → 待上架)  
140 - issueMapper.updateById(new MesWmReturnIssueDO()  
141 - .setId(id).setStatus(MesWmReturnIssueStatusEnum.APPROVING.getStatus())); 129 + // 2.2 提交(草稿 → 待检验/待上架)
  130 + issueMapper.updateById(new MesWmReturnIssueDO().setId(id).setStatus(targetStatus));
142 } 131 }
143 132
144 @Override 133 @Override
145 @Transactional(rollbackFor = Exception.class) 134 @Transactional(rollbackFor = Exception.class)
146 public void stockReturnIssue(Long id) { 135 public void stockReturnIssue(Long id) {
147 - // 校验存在 136 + // 校验存在 + 待上架状态
148 MesWmReturnIssueDO issue = validateReturnIssueExists(id); 137 MesWmReturnIssueDO issue = validateReturnIssueExists(id);
149 if (ObjUtil.notEqual(MesWmReturnIssueStatusEnum.APPROVING.getStatus(), issue.getStatus())) { 138 if (ObjUtil.notEqual(MesWmReturnIssueStatusEnum.APPROVING.getStatus(), issue.getStatus())) {
150 - throw exception(WM_RETURN_ISSUE_STATUS_INVALID); 139 + throw exception(WM_RETURN_ISSUE_NOT_APPROVING);
151 } 140 }
152 // 入库上架(待上架 → 待执行退料) 141 // 入库上架(待上架 → 待执行退料)
153 issueMapper.updateById(new MesWmReturnIssueDO() 142 issueMapper.updateById(new MesWmReturnIssueDO()
@@ -157,10 +146,10 @@ public class MesWmReturnIssueServiceImpl implements MesWmReturnIssueService { @@ -157,10 +146,10 @@ public class MesWmReturnIssueServiceImpl implements MesWmReturnIssueService {
157 @Override 146 @Override
158 @Transactional(rollbackFor = Exception.class) 147 @Transactional(rollbackFor = Exception.class)
159 public void finishReturnIssue(Long id) { 148 public void finishReturnIssue(Long id) {
160 - // 校验存在 149 + // 校验存在 + 待执行退料状态
161 MesWmReturnIssueDO issue = validateReturnIssueExists(id); 150 MesWmReturnIssueDO issue = validateReturnIssueExists(id);
162 if (ObjUtil.notEqual(MesWmReturnIssueStatusEnum.APPROVED.getStatus(), issue.getStatus())) { 151 if (ObjUtil.notEqual(MesWmReturnIssueStatusEnum.APPROVED.getStatus(), issue.getStatus())) {
163 - throw exception(WM_RETURN_ISSUE_STATUS_INVALID); 152 + throw exception(WM_RETURN_ISSUE_NOT_APPROVED);
164 } 153 }
165 154
166 // 完成退料(待执行退料 → 已完成),更新库存台账 155 // 完成退料(待执行退料 → 已完成),更新库存台账
@@ -224,7 +213,7 @@ public class MesWmReturnIssueServiceImpl implements MesWmReturnIssueService { @@ -224,7 +213,7 @@ public class MesWmReturnIssueServiceImpl implements MesWmReturnIssueService {
224 private MesWmReturnIssueDO validateReturnIssueExistsAndPrepare(Long id) { 213 private MesWmReturnIssueDO validateReturnIssueExistsAndPrepare(Long id) {
225 MesWmReturnIssueDO issue = validateReturnIssueExists(id); 214 MesWmReturnIssueDO issue = validateReturnIssueExists(id);
226 if (ObjUtil.notEqual(MesWmReturnIssueStatusEnum.PREPARE.getStatus(), issue.getStatus())) { 215 if (ObjUtil.notEqual(MesWmReturnIssueStatusEnum.PREPARE.getStatus(), issue.getStatus())) {
227 - throw exception(WM_RETURN_ISSUE_STATUS_INVALID); 216 + throw exception(WM_RETURN_ISSUE_NOT_PREPARE);
228 } 217 }
229 return issue; 218 return issue;
230 } 219 }