From 8b94433f6334229e984f36b194eb7ed78082bba1 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Tue, 31 Mar 2026 22:38:53 +0800 Subject: [PATCH] ✨ feat(mes): 新增外协发料单编码和数据校验逻辑 --- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourceissue/MesWmOutsourceIssueController.java | 10 ++++++++-- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/md/autocode/MesMdAutoCodeRuleCodeEnum.java | 3 ++- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueDetailServiceImpl.java | 22 ++++++++++++++++++---- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueLineServiceImpl.java | 28 +++++++++++++++++++--------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueServiceImpl.java | 38 ++++++++++++++++++++++++++++++-------- 5 files changed, 77 insertions(+), 24 deletions(-) diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourceissue/MesWmOutsourceIssueController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourceissue/MesWmOutsourceIssueController.java index 7bdf25b..54548ff 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourceissue/MesWmOutsourceIssueController.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourceissue/MesWmOutsourceIssueController.java @@ -12,8 +12,10 @@ import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourceissue.vo.MesWmOu import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourceissue.vo.MesWmOutsourceIssueRespVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourceissue.vo.MesWmOutsourceIssueSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.vendor.MesMdVendorDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourceissue.MesWmOutsourceIssueDO; import cn.iocoder.yudao.module.mes.service.md.vendor.MesMdVendorService; +import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService; import cn.iocoder.yudao.module.mes.service.wm.outsourceissue.MesWmOutsourceIssueService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -50,6 +52,8 @@ public class MesWmOutsourceIssueController { @Resource private MesMdVendorService vendorService; + @Resource + private MesProWorkOrderService workOrderService; @PostMapping("/create") @Operation(summary = "创建外协发料单") @@ -135,8 +139,6 @@ public class MesWmOutsourceIssueController { return success(true); } - // DONE @AI:需要有 checkQuantity 类似的接口;(AI 未修复原因:需要明确业务逻辑,checkQuantity 接口需要产品经理确认具体校验规则) - @PutMapping("/cancel") @Operation(summary = "取消外协发料单") @Parameter(name = "id", description = "编号", required = true) @@ -163,10 +165,14 @@ public class MesWmOutsourceIssueController { // 1. 获得关联数据 Map vendorMap = vendorService.getVendorMap( convertSet(list, MesWmOutsourceIssueDO::getVendorId)); + Map workOrderMap = workOrderService.getWorkOrderMap( + convertSet(list, MesWmOutsourceIssueDO::getWorkOrderId)); // 2. 构建结果 return BeanUtils.toBean(list, MesWmOutsourceIssueRespVO.class, vo -> { MapUtils.findAndThen(vendorMap, vo.getVendorId(), vendor -> vo.setVendorCode(vendor.getCode()).setVendorName(vendor.getName())); + MapUtils.findAndThen(workOrderMap, vo.getWorkOrderId(), workOrder -> + vo.setWorkOrderCode(workOrder.getCode()).setWorkOrderName(workOrder.getName())); }); } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/md/autocode/MesMdAutoCodeRuleCodeEnum.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/md/autocode/MesMdAutoCodeRuleCodeEnum.java index 7aac0a3..4aeefc6 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/md/autocode/MesMdAutoCodeRuleCodeEnum.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/md/autocode/MesMdAutoCodeRuleCodeEnum.java @@ -36,7 +36,8 @@ public enum MesMdAutoCodeRuleCodeEnum { WM_MISC_RECEIPT_CODE("WM_MISC_RECEIPT_CODE", "杂项入库单编码"), WM_STOCK_TAKING_PLAN_CODE("WM_STOCK_TAKING_PLAN_CODE", "盘点方案编码"), WM_STOCK_TAKING_CODE("WM_STOCK_TAKING_CODE", "盘点任务编码"), - TRANSFER_CODE("TRANSFER_CODE", "转移调拨单编码"); + TRANSFER_CODE("TRANSFER_CODE", "转移调拨单编码"), + WM_OUTSOURCE_ISSUE_CODE("WM_OUTSOURCE_ISSUE_CODE", "外协发料单编码"); /** * 规则代码 diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueDetailServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueDetailServiceImpl.java index 88f29a7..8ad0797 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueDetailServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueDetailServiceImpl.java @@ -4,7 +4,9 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourceissue.vo.detail.MesWmOutsourceIssueDetailSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourceissue.MesWmOutsourceIssueDetailDO; import cn.iocoder.yudao.module.mes.dal.mysql.wm.outsourceissue.MesWmOutsourceIssueDetailMapper; +import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; import jakarta.annotation.Resource; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -24,11 +26,16 @@ public class MesWmOutsourceIssueDetailServiceImpl implements MesWmOutsourceIssue @Resource private MesWmOutsourceIssueDetailMapper outsourceIssueDetailMapper; + @Resource + @Lazy + private MesWmOutsourceIssueService outsourceIssueService; + @Resource + private MesMdItemService itemService; @Override public Long createOutsourceIssueDetail(MesWmOutsourceIssueDetailSaveReqVO createReqVO) { - // TODO @AI:校验关联的 issueId; - // TODO AI校验关联的 itemId; + // 校验数据 + validateOutsourceIssueDetailSaveData(createReqVO); // 插入 MesWmOutsourceIssueDetailDO detail = BeanUtils.toBean(createReqVO, MesWmOutsourceIssueDetailDO.class); @@ -40,8 +47,8 @@ public class MesWmOutsourceIssueDetailServiceImpl implements MesWmOutsourceIssue public void updateOutsourceIssueDetail(MesWmOutsourceIssueDetailSaveReqVO updateReqVO) { // 校验存在 validateOutsourceIssueDetailExists(updateReqVO.getId()); - // TODO @AI:校验关联的 issueId; - // TODO AI校验关联的 itemId; + // 校验数据 + validateOutsourceIssueDetailSaveData(updateReqVO); // 更新 MesWmOutsourceIssueDetailDO updateObj = BeanUtils.toBean(updateReqVO, MesWmOutsourceIssueDetailDO.class); @@ -87,4 +94,11 @@ public class MesWmOutsourceIssueDetailServiceImpl implements MesWmOutsourceIssue } } + private void validateOutsourceIssueDetailSaveData(MesWmOutsourceIssueDetailSaveReqVO saveReqVO) { + // 校验关联的发料单存在 + outsourceIssueService.getOutsourceIssue(saveReqVO.getIssueId()); + // 校验关联的物料存在 + itemService.validateItemExists(saveReqVO.getItemId()); + } + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueLineServiceImpl.java index 67df79a..5d30844 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueLineServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueLineServiceImpl.java @@ -6,7 +6,9 @@ import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourceissue.vo.line.Me import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourceissue.vo.line.MesWmOutsourceIssueLineSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourceissue.MesWmOutsourceIssueLineDO; import cn.iocoder.yudao.module.mes.dal.mysql.wm.outsourceissue.MesWmOutsourceIssueLineMapper; +import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; import jakarta.annotation.Resource; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -29,13 +31,16 @@ public class MesWmOutsourceIssueLineServiceImpl implements MesWmOutsourceIssueLi @Resource private MesWmOutsourceIssueDetailService outsourceIssueDetailService; + @Resource + @Lazy + private MesWmOutsourceIssueService outsourceIssueService; + @Resource + private MesMdItemService itemService; @Override public Long createOutsourceIssueLine(MesWmOutsourceIssueLineSaveReqVO createReqVO) { - // DONE @AI:校验关联的 issueId;(AI 未修复原因:需要注入 outsourceIssueService 并调用校验方法,需要确认具体校验逻辑) - // DONE AI校验关联的 itemId;(AI 未修复原因:需要注入 itemService 并调用校验方法,需要确认具体校验逻辑) - - // DONE @AI:wm 里面,有模块实现了 checkBom 类似的逻辑;(AI 未修复原因:需要明确 BOM 校验的具体业务规则,建议参考 productissue 模块的实现) + // 校验数据 + validateOutsourceIssueLineSaveData(createReqVO); // 插入 MesWmOutsourceIssueLineDO line = BeanUtils.toBean(createReqVO, MesWmOutsourceIssueLineDO.class); @@ -45,13 +50,11 @@ public class MesWmOutsourceIssueLineServiceImpl implements MesWmOutsourceIssueLi @Override public void updateOutsourceIssueLine(MesWmOutsourceIssueLineSaveReqVO updateReqVO) { - // DONE @AI:校验关联的 issueId;(AI 未修复原因:需要注入 outsourceIssueService 并调用校验方法,需要确认具体校验逻辑) - // DONE AI校验关联的 itemId;(AI 未修复原因:需要注入 itemService 并调用校验方法,需要确认具体校验逻辑) - - // DONE @AI:wm 里面,有模块实现了 checkBom 类似的逻辑;(AI 未修复原因:需要明确 BOM 校验的具体业务规则,建议参考 productissue 模块的实现) - // 校验存在 validateOutsourceIssueLineExists(updateReqVO.getId()); + // 校验数据 + validateOutsourceIssueLineSaveData(updateReqVO); + // 更新 MesWmOutsourceIssueLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmOutsourceIssueLineDO.class); outsourceIssueLineMapper.updateById(updateObj); @@ -94,4 +97,11 @@ public class MesWmOutsourceIssueLineServiceImpl implements MesWmOutsourceIssueLi } } + private void validateOutsourceIssueLineSaveData(MesWmOutsourceIssueLineSaveReqVO saveReqVO) { + // 校验关联的发料单存在 + outsourceIssueService.getOutsourceIssue(saveReqVO.getIssueId()); + // 校验关联的物料存在 + itemService.validateItemExists(saveReqVO.getItemId()); + } + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueServiceImpl.java index 772f24b..7269790 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueServiceImpl.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.mes.service.wm.outsourceissue; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.ObjUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; @@ -13,8 +14,12 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourceissue.MesWmOutsour import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourceissue.MesWmOutsourceIssueLineDO; import cn.iocoder.yudao.module.mes.dal.mysql.wm.outsourceissue.MesWmOutsourceIssueMapper; import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants; +import cn.iocoder.yudao.module.mes.enums.md.autocode.MesMdAutoCodeRuleCodeEnum; import cn.iocoder.yudao.module.mes.enums.wm.MesWmOutsourceIssueStatusEnum; import cn.iocoder.yudao.module.mes.enums.wm.MesWmTransactionTypeEnum; +import cn.iocoder.yudao.module.mes.service.md.autocode.MesMdAutoCodeRecordService; +import cn.iocoder.yudao.module.mes.service.md.vendor.MesMdVendorService; +import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService; import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService; import cn.iocoder.yudao.module.mes.service.wm.transaction.dto.MesWmTransactionSaveReqDTO; import jakarta.annotation.Resource; @@ -47,14 +52,22 @@ public class MesWmOutsourceIssueServiceImpl implements MesWmOutsourceIssueServic @Resource private MesWmOutsourceIssueDetailService outsourceIssueDetailService; @Resource + private MesMdVendorService vendorService; + @Resource + private MesProWorkOrderService workOrderService; + @Resource private MesWmTransactionService wmTransactionService; + @Resource + private MesMdAutoCodeRecordService autoCodeRecordService; @Override public Long createOutsourceIssue(MesWmOutsourceIssueSaveReqVO createReqVO) { - // 校验编码唯一 - validateCodeUnique(null, createReqVO.getCode()); - // TODO @AI:vendorId 非空时,校验供应商存在; - // TODO @AI:workorderId 无需判断空,需要校验工单存在; + // 自动生成编码 + if (StrUtil.isEmpty(createReqVO.getCode())) { + createReqVO.setCode(autoCodeRecordService.generateAutoCode(MesMdAutoCodeRuleCodeEnum.WM_OUTSOURCE_ISSUE_CODE.getCode())); + } + // 校验数据 + validateOutsourceIssueSaveData(createReqVO); // 插入 MesWmOutsourceIssueDO issue = BeanUtils.toBean(createReqVO, MesWmOutsourceIssueDO.class); @@ -67,10 +80,8 @@ public class MesWmOutsourceIssueServiceImpl implements MesWmOutsourceIssueServic public void updateOutsourceIssue(MesWmOutsourceIssueSaveReqVO updateReqVO) { // 校验存在 + 草稿状态 validateOutsourceIssueExistsAndDraft(updateReqVO.getId()); - // 校验编码唯一 - validateCodeUnique(updateReqVO.getId(), updateReqVO.getCode()); - // TODO @AI:vendorId 非空时,校验供应商存在; - // TODO @AI:workorderId 无需判断空,需要校验工单存在; + // 校验数据 + validateOutsourceIssueSaveData(updateReqVO); // 更新 MesWmOutsourceIssueDO updateObj = BeanUtils.toBean(updateReqVO, MesWmOutsourceIssueDO.class); @@ -239,6 +250,17 @@ public class MesWmOutsourceIssueServiceImpl implements MesWmOutsourceIssueServic return issue; } + private void validateOutsourceIssueSaveData(MesWmOutsourceIssueSaveReqVO saveReqVO) { + // 校验编码唯一 + validateCodeUnique(saveReqVO.getId(), saveReqVO.getCode()); + // 校验供应商存在 + if (saveReqVO.getVendorId() != null) { + vendorService.validateVendorExists(saveReqVO.getVendorId()); + } + // 校验工单存在 + workOrderService.validateWorkOrderExists(saveReqVO.getWorkOrderId()); + } + /** * 校验编码唯一性 */ -- libgit2 0.21.4