Commit 8b94433f6334229e984f36b194eb7ed78082bba1

Authored by YunaiV
1 parent 34f879e0

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

新增外协发料单编码常量,更新相关服务以支持外协发料单的创建和校验逻辑。优化了发料单的创建、更新和取消流程,确保数据的完整性和有效性。
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
12 12 import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourceissue.vo.MesWmOutsourceIssueRespVO;
13 13 import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourceissue.vo.MesWmOutsourceIssueSaveReqVO;
14 14 import cn.iocoder.yudao.module.mes.dal.dataobject.md.vendor.MesMdVendorDO;
  15 +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO;
15 16 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourceissue.MesWmOutsourceIssueDO;
16 17 import cn.iocoder.yudao.module.mes.service.md.vendor.MesMdVendorService;
  18 +import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService;
17 19 import cn.iocoder.yudao.module.mes.service.wm.outsourceissue.MesWmOutsourceIssueService;
18 20 import io.swagger.v3.oas.annotations.Operation;
19 21 import io.swagger.v3.oas.annotations.Parameter;
... ... @@ -50,6 +52,8 @@ public class MesWmOutsourceIssueController {
50 52  
51 53 @Resource
52 54 private MesMdVendorService vendorService;
  55 + @Resource
  56 + private MesProWorkOrderService workOrderService;
53 57  
54 58 @PostMapping("/create")
55 59 @Operation(summary = "创建外协发料单")
... ... @@ -135,8 +139,6 @@ public class MesWmOutsourceIssueController {
135 139 return success(true);
136 140 }
137 141  
138   - // DONE @AI:需要有 checkQuantity 类似的接口;(AI 未修复原因:需要明确业务逻辑,checkQuantity 接口需要产品经理确认具体校验规则)
139   -
140 142 @PutMapping("/cancel")
141 143 @Operation(summary = "取消外协发料单")
142 144 @Parameter(name = "id", description = "编号", required = true)
... ... @@ -163,10 +165,14 @@ public class MesWmOutsourceIssueController {
163 165 // 1. 获得关联数据
164 166 Map<Long, MesMdVendorDO> vendorMap = vendorService.getVendorMap(
165 167 convertSet(list, MesWmOutsourceIssueDO::getVendorId));
  168 + Map<Long, MesProWorkOrderDO> workOrderMap = workOrderService.getWorkOrderMap(
  169 + convertSet(list, MesWmOutsourceIssueDO::getWorkOrderId));
166 170 // 2. 构建结果
167 171 return BeanUtils.toBean(list, MesWmOutsourceIssueRespVO.class, vo -> {
168 172 MapUtils.findAndThen(vendorMap, vo.getVendorId(), vendor ->
169 173 vo.setVendorCode(vendor.getCode()).setVendorName(vendor.getName()));
  174 + MapUtils.findAndThen(workOrderMap, vo.getWorkOrderId(), workOrder ->
  175 + vo.setWorkOrderCode(workOrder.getCode()).setWorkOrderName(workOrder.getName()));
170 176 });
171 177 }
172 178  
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/md/autocode/MesMdAutoCodeRuleCodeEnum.java
... ... @@ -36,7 +36,8 @@ public enum MesMdAutoCodeRuleCodeEnum {
36 36 WM_MISC_RECEIPT_CODE("WM_MISC_RECEIPT_CODE", "杂项入库单编码"),
37 37 WM_STOCK_TAKING_PLAN_CODE("WM_STOCK_TAKING_PLAN_CODE", "盘点方案编码"),
38 38 WM_STOCK_TAKING_CODE("WM_STOCK_TAKING_CODE", "盘点任务编码"),
39   - TRANSFER_CODE("TRANSFER_CODE", "转移调拨单编码");
  39 + TRANSFER_CODE("TRANSFER_CODE", "转移调拨单编码"),
  40 + WM_OUTSOURCE_ISSUE_CODE("WM_OUTSOURCE_ISSUE_CODE", "外协发料单编码");
40 41  
41 42 /**
42 43 * 规则代码
... ...
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;
4 4 import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourceissue.vo.detail.MesWmOutsourceIssueDetailSaveReqVO;
5 5 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourceissue.MesWmOutsourceIssueDetailDO;
6 6 import cn.iocoder.yudao.module.mes.dal.mysql.wm.outsourceissue.MesWmOutsourceIssueDetailMapper;
  7 +import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
7 8 import jakarta.annotation.Resource;
  9 +import org.springframework.context.annotation.Lazy;
8 10 import org.springframework.stereotype.Service;
9 11 import org.springframework.validation.annotation.Validated;
10 12  
... ... @@ -24,11 +26,16 @@ public class MesWmOutsourceIssueDetailServiceImpl implements MesWmOutsourceIssue
24 26  
25 27 @Resource
26 28 private MesWmOutsourceIssueDetailMapper outsourceIssueDetailMapper;
  29 + @Resource
  30 + @Lazy
  31 + private MesWmOutsourceIssueService outsourceIssueService;
  32 + @Resource
  33 + private MesMdItemService itemService;
27 34  
28 35 @Override
29 36 public Long createOutsourceIssueDetail(MesWmOutsourceIssueDetailSaveReqVO createReqVO) {
30   - // TODO @AI:校验关联的 issueId;
31   - // TODO AI校验关联的 itemId;
  37 + // 校验数据
  38 + validateOutsourceIssueDetailSaveData(createReqVO);
32 39  
33 40 // 插入
34 41 MesWmOutsourceIssueDetailDO detail = BeanUtils.toBean(createReqVO, MesWmOutsourceIssueDetailDO.class);
... ... @@ -40,8 +47,8 @@ public class MesWmOutsourceIssueDetailServiceImpl implements MesWmOutsourceIssue
40 47 public void updateOutsourceIssueDetail(MesWmOutsourceIssueDetailSaveReqVO updateReqVO) {
41 48 // 校验存在
42 49 validateOutsourceIssueDetailExists(updateReqVO.getId());
43   - // TODO @AI:校验关联的 issueId;
44   - // TODO AI校验关联的 itemId;
  50 + // 校验数据
  51 + validateOutsourceIssueDetailSaveData(updateReqVO);
45 52  
46 53 // 更新
47 54 MesWmOutsourceIssueDetailDO updateObj = BeanUtils.toBean(updateReqVO, MesWmOutsourceIssueDetailDO.class);
... ... @@ -87,4 +94,11 @@ public class MesWmOutsourceIssueDetailServiceImpl implements MesWmOutsourceIssue
87 94 }
88 95 }
89 96  
  97 + private void validateOutsourceIssueDetailSaveData(MesWmOutsourceIssueDetailSaveReqVO saveReqVO) {
  98 + // 校验关联的发料单存在
  99 + outsourceIssueService.getOutsourceIssue(saveReqVO.getIssueId());
  100 + // 校验关联的物料存在
  101 + itemService.validateItemExists(saveReqVO.getItemId());
  102 + }
  103 +
90 104 }
... ...
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
6 6 import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourceissue.vo.line.MesWmOutsourceIssueLineSaveReqVO;
7 7 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourceissue.MesWmOutsourceIssueLineDO;
8 8 import cn.iocoder.yudao.module.mes.dal.mysql.wm.outsourceissue.MesWmOutsourceIssueLineMapper;
  9 +import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
9 10 import jakarta.annotation.Resource;
  11 +import org.springframework.context.annotation.Lazy;
10 12 import org.springframework.stereotype.Service;
11 13 import org.springframework.validation.annotation.Validated;
12 14  
... ... @@ -29,13 +31,16 @@ public class MesWmOutsourceIssueLineServiceImpl implements MesWmOutsourceIssueLi
29 31  
30 32 @Resource
31 33 private MesWmOutsourceIssueDetailService outsourceIssueDetailService;
  34 + @Resource
  35 + @Lazy
  36 + private MesWmOutsourceIssueService outsourceIssueService;
  37 + @Resource
  38 + private MesMdItemService itemService;
32 39  
33 40 @Override
34 41 public Long createOutsourceIssueLine(MesWmOutsourceIssueLineSaveReqVO createReqVO) {
35   - // DONE @AI:校验关联的 issueId;(AI 未修复原因:需要注入 outsourceIssueService 并调用校验方法,需要确认具体校验逻辑)
36   - // DONE AI校验关联的 itemId;(AI 未修复原因:需要注入 itemService 并调用校验方法,需要确认具体校验逻辑)
37   -
38   - // DONE @AI:wm 里面,有模块实现了 checkBom 类似的逻辑;(AI 未修复原因:需要明确 BOM 校验的具体业务规则,建议参考 productissue 模块的实现)
  42 + // 校验数据
  43 + validateOutsourceIssueLineSaveData(createReqVO);
39 44  
40 45 // 插入
41 46 MesWmOutsourceIssueLineDO line = BeanUtils.toBean(createReqVO, MesWmOutsourceIssueLineDO.class);
... ... @@ -45,13 +50,11 @@ public class MesWmOutsourceIssueLineServiceImpl implements MesWmOutsourceIssueLi
45 50  
46 51 @Override
47 52 public void updateOutsourceIssueLine(MesWmOutsourceIssueLineSaveReqVO updateReqVO) {
48   - // DONE @AI:校验关联的 issueId;(AI 未修复原因:需要注入 outsourceIssueService 并调用校验方法,需要确认具体校验逻辑)
49   - // DONE AI校验关联的 itemId;(AI 未修复原因:需要注入 itemService 并调用校验方法,需要确认具体校验逻辑)
50   -
51   - // DONE @AI:wm 里面,有模块实现了 checkBom 类似的逻辑;(AI 未修复原因:需要明确 BOM 校验的具体业务规则,建议参考 productissue 模块的实现)
52   -
53 53 // 校验存在
54 54 validateOutsourceIssueLineExists(updateReqVO.getId());
  55 + // 校验数据
  56 + validateOutsourceIssueLineSaveData(updateReqVO);
  57 +
55 58 // 更新
56 59 MesWmOutsourceIssueLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmOutsourceIssueLineDO.class);
57 60 outsourceIssueLineMapper.updateById(updateObj);
... ... @@ -94,4 +97,11 @@ public class MesWmOutsourceIssueLineServiceImpl implements MesWmOutsourceIssueLi
94 97 }
95 98 }
96 99  
  100 + private void validateOutsourceIssueLineSaveData(MesWmOutsourceIssueLineSaveReqVO saveReqVO) {
  101 + // 校验关联的发料单存在
  102 + outsourceIssueService.getOutsourceIssue(saveReqVO.getIssueId());
  103 + // 校验关联的物料存在
  104 + itemService.validateItemExists(saveReqVO.getItemId());
  105 + }
  106 +
97 107 }
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueServiceImpl.java
1 1 package cn.iocoder.yudao.module.mes.service.wm.outsourceissue;
2 2  
3 3 import cn.hutool.core.collection.CollUtil;
  4 +import cn.hutool.core.util.StrUtil;
4 5 import cn.hutool.core.util.ObjUtil;
5 6 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 7 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
... ... @@ -13,8 +14,12 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourceissue.MesWmOutsour
13 14 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourceissue.MesWmOutsourceIssueLineDO;
14 15 import cn.iocoder.yudao.module.mes.dal.mysql.wm.outsourceissue.MesWmOutsourceIssueMapper;
15 16 import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants;
  17 +import cn.iocoder.yudao.module.mes.enums.md.autocode.MesMdAutoCodeRuleCodeEnum;
16 18 import cn.iocoder.yudao.module.mes.enums.wm.MesWmOutsourceIssueStatusEnum;
17 19 import cn.iocoder.yudao.module.mes.enums.wm.MesWmTransactionTypeEnum;
  20 +import cn.iocoder.yudao.module.mes.service.md.autocode.MesMdAutoCodeRecordService;
  21 +import cn.iocoder.yudao.module.mes.service.md.vendor.MesMdVendorService;
  22 +import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService;
18 23 import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService;
19 24 import cn.iocoder.yudao.module.mes.service.wm.transaction.dto.MesWmTransactionSaveReqDTO;
20 25 import jakarta.annotation.Resource;
... ... @@ -47,14 +52,22 @@ public class MesWmOutsourceIssueServiceImpl implements MesWmOutsourceIssueServic
47 52 @Resource
48 53 private MesWmOutsourceIssueDetailService outsourceIssueDetailService;
49 54 @Resource
  55 + private MesMdVendorService vendorService;
  56 + @Resource
  57 + private MesProWorkOrderService workOrderService;
  58 + @Resource
50 59 private MesWmTransactionService wmTransactionService;
  60 + @Resource
  61 + private MesMdAutoCodeRecordService autoCodeRecordService;
51 62  
52 63 @Override
53 64 public Long createOutsourceIssue(MesWmOutsourceIssueSaveReqVO createReqVO) {
54   - // 校验编码唯一
55   - validateCodeUnique(null, createReqVO.getCode());
56   - // TODO @AI:vendorId 非空时,校验供应商存在;
57   - // TODO @AI:workorderId 无需判断空,需要校验工单存在;
  65 + // 自动生成编码
  66 + if (StrUtil.isEmpty(createReqVO.getCode())) {
  67 + createReqVO.setCode(autoCodeRecordService.generateAutoCode(MesMdAutoCodeRuleCodeEnum.WM_OUTSOURCE_ISSUE_CODE.getCode()));
  68 + }
  69 + // 校验数据
  70 + validateOutsourceIssueSaveData(createReqVO);
58 71  
59 72 // 插入
60 73 MesWmOutsourceIssueDO issue = BeanUtils.toBean(createReqVO, MesWmOutsourceIssueDO.class);
... ... @@ -67,10 +80,8 @@ public class MesWmOutsourceIssueServiceImpl implements MesWmOutsourceIssueServic
67 80 public void updateOutsourceIssue(MesWmOutsourceIssueSaveReqVO updateReqVO) {
68 81 // 校验存在 + 草稿状态
69 82 validateOutsourceIssueExistsAndDraft(updateReqVO.getId());
70   - // 校验编码唯一
71   - validateCodeUnique(updateReqVO.getId(), updateReqVO.getCode());
72   - // TODO @AI:vendorId 非空时,校验供应商存在;
73   - // TODO @AI:workorderId 无需判断空,需要校验工单存在;
  83 + // 校验数据
  84 + validateOutsourceIssueSaveData(updateReqVO);
74 85  
75 86 // 更新
76 87 MesWmOutsourceIssueDO updateObj = BeanUtils.toBean(updateReqVO, MesWmOutsourceIssueDO.class);
... ... @@ -239,6 +250,17 @@ public class MesWmOutsourceIssueServiceImpl implements MesWmOutsourceIssueServic
239 250 return issue;
240 251 }
241 252  
  253 + private void validateOutsourceIssueSaveData(MesWmOutsourceIssueSaveReqVO saveReqVO) {
  254 + // 校验编码唯一
  255 + validateCodeUnique(saveReqVO.getId(), saveReqVO.getCode());
  256 + // 校验供应商存在
  257 + if (saveReqVO.getVendorId() != null) {
  258 + vendorService.validateVendorExists(saveReqVO.getVendorId());
  259 + }
  260 + // 校验工单存在
  261 + workOrderService.validateWorkOrderExists(saveReqVO.getWorkOrderId());
  262 + }
  263 +
242 264 /**
243 265 * 校验编码唯一性
244 266 */
... ...