Commit 62699136d2af4d9d57b85c7150d0a140d779797f
1 parent
049a0f1b
✨ feat(mes): 更新生产退料单提交逻辑及状态校验
重构生产退料单的提交功能,合并确认与提交操作,简化状态流转逻辑。新增状态校验,确保只有草稿状态的退料单可提交,并根据物料质检状态自动决定目标状态(待检验或待上架)。
Showing
5 changed files
with
27 additions
and
50 deletions
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<Integer> { | @@ -27,7 +27,7 @@ public enum MesWmReturnIssueStatusEnum implements ArrayValuable<Integer> { | ||
| 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 | } |