Przeglądaj źródła

✨ feat(mes): 新增外协发料单编码和数据校验逻辑

新增外协发料单编码常量,更新相关服务以支持外协发料单的创建和校验逻辑。优化了发料单的创建、更新和取消流程,确保数据的完整性和有效性。
YunaiV 3 miesięcy temu
rodzic
commit
8b94433f63

+ 8 - 2
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<Long, MesMdVendorDO> vendorMap = vendorService.getVendorMap(
                 convertSet(list, MesWmOutsourceIssueDO::getVendorId));
+        Map<Long, MesProWorkOrderDO> 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()));
         });
     }
 

+ 2 - 1
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", "外协发料单编码");
 
     /**
      * 规则代码

+ 18 - 4
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());
+    }
+
 }

+ 19 - 9
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());
+    }
+
 }

+ 30 - 8
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());
+    }
+
     /**
      * 校验编码唯一性
      */