Commit 38915e96f93a056ff521e56fcbcf5078e4deff7d

Authored by YunaiV
1 parent 98e4f94c

✨ feat(mes): 新增工单类型过滤和批次编码处理逻辑

在生产工单精简列表接口中新增工单类型参数,支持根据工单类型过滤工单列表。同时,在外协发料单行的创建和更新中,新增批次编码字段,并实现根据批次编码自动解析批次 ID 的功能,提升数据处理的灵活性和准确性。
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/MesProWorkorderController.java
... ... @@ -106,10 +106,13 @@ public class MesProWorkOrderController {
106 106  
107 107 @GetMapping("/simple-list")
108 108 @Operation(summary = "获得生产工单精简列表", description = "主要用于前端的下拉选项")
109   - public CommonResult<List<MesProWorkOrderRespVO>> getWorkOrderSimpleList() {
110   - List<MesProWorkOrderDO> list = workOrderService.getWorkOrderList();
  109 + @Parameter(name = "type", description = "工单类型", example = "2")
  110 + public CommonResult<List<MesProWorkOrderRespVO>> getWorkOrderSimpleList(
  111 + @RequestParam(value = "type", required = false) Integer type) {
  112 + List<MesProWorkOrderDO> list = workOrderService.getWorkOrderList(type);
111 113 return success(convertList(list, wo -> new MesProWorkOrderRespVO()
112 114 .setId(wo.getId()).setCode(wo.getCode()).setName(wo.getName())
  115 + .setType(wo.getType()).setVendorId(wo.getVendorId())
113 116 .setStatus(wo.getStatus())));
114 117 }
115 118  
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourceissue/MesWmOutsourceIssueLineController.java
... ... @@ -10,9 +10,11 @@ import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourceissue.vo.line.Me
10 10 import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourceissue.vo.line.MesWmOutsourceIssueLineSaveReqVO;
11 11 import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
12 12 import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
  13 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO;
13 14 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourceissue.MesWmOutsourceIssueLineDO;
14 15 import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
15 16 import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
  17 +import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService;
16 18 import cn.iocoder.yudao.module.mes.service.wm.outsourceissue.MesWmOutsourceIssueLineService;
17 19 import io.swagger.v3.oas.annotations.Operation;
18 20 import io.swagger.v3.oas.annotations.Parameter;
... ... @@ -26,8 +28,10 @@ import org.springframework.web.bind.annotation.*;
26 28 import java.util.Collections;
27 29 import java.util.List;
28 30 import java.util.Map;
  31 +import java.util.Set;
29 32  
30 33 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  34 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
31 35 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
32 36  
33 37 /**
... ... @@ -50,6 +54,9 @@ public class MesWmOutsourceIssueLineController {
50 54 @Resource
51 55 private MesMdUnitMeasureService unitMeasureService;
52 56  
  57 + @Resource
  58 + private MesWmBatchService batchService;
  59 +
53 60 @PostMapping("/create")
54 61 @Operation(summary = "创建外协发料单行")
55 62 @PreAuthorize("@ss.hasPermission('mes:wm-outsource-issue:create')")
... ... @@ -116,6 +123,11 @@ public class MesWmOutsourceIssueLineController {
116 123 convertSet(list, MesWmOutsourceIssueLineDO::getItemId));
117 124 Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
118 125 convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
  126 + // 1.2 获得批次数据
  127 + Set<Long> batchIds = convertSet(list, MesWmOutsourceIssueLineDO::getBatchId);
  128 + batchIds.remove(null);
  129 + Map<Long, MesWmBatchDO> batchMap = CollUtil.isEmpty(batchIds) ? Collections.emptyMap()
  130 + : convertMap(batchIds, id -> id, id -> batchService.getBatch(id));
119 131 // 2. 构建结果
120 132 return BeanUtils.toBean(list, MesWmOutsourceIssueLineRespVO.class, vo -> {
121 133 MapUtils.findAndThen(itemMap, vo.getItemId(), item -> {
... ... @@ -123,6 +135,7 @@ public class MesWmOutsourceIssueLineController {
123 135 MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(),
124 136 unitMeasure -> vo.setUnitMeasureName(unitMeasure.getName()));
125 137 });
  138 + MapUtils.findAndThen(batchMap, vo.getBatchId(), batch -> vo.setBatchCode(batch.getCode()));
126 139 });
127 140 }
128 141  
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourceissue/vo/line/MesWmOutsourceIssueLineSaveReqVO.java
... ... @@ -36,4 +36,7 @@ public class MesWmOutsourceIssueLineSaveReqVO {
36 36 @Schema(description = "备注", example = "备注")
37 37 private String remark;
38 38  
  39 + @Schema(description = "批次编码", example = "BATCH001")
  40 + private String batchCode;
  41 +
39 42 }
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java
... ... @@ -415,6 +415,7 @@ public interface ErrorCodeConstants {
415 415 ErrorCode WM_OUTSOURCE_ISSUE_CANCEL_NOT_ALLOWED = new ErrorCode(1_040_707_007, "已完成或已取消的发料单不允许取消");
416 416 ErrorCode WM_OUTSOURCE_ISSUE_LINE_NOT_EXISTS = new ErrorCode(1_040_707_100, "外协发料单行不存在");
417 417 ErrorCode WM_OUTSOURCE_ISSUE_DETAIL_NOT_EXISTS = new ErrorCode(1_040_707_200, "外协发料单明细不存在");
  418 + ErrorCode WM_OUTSOURCE_ISSUE_WORK_ORDER_TYPE_INVALID = new ErrorCode(1_040_707_008, "工单类型不是外协(代工)类型");
418 419  
419 420 // ========== MES 仓库管理-生产领料出库单(1-040-708-000) ==========
420 421 ErrorCode WM_PRODUCT_ISSUE_NOT_EXISTS = new ErrorCode(1_040_708_000, "生产领料出库单不存在");
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueLineServiceImpl.java
1 1 package cn.iocoder.yudao.module.mes.service.wm.outsourceissue;
2 2  
  3 +import cn.hutool.core.util.StrUtil;
3 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 5 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
5 6 import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourceissue.vo.line.MesWmOutsourceIssueLinePageReqVO;
6 7 import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourceissue.vo.line.MesWmOutsourceIssueLineSaveReqVO;
7 8 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourceissue.MesWmOutsourceIssueLineDO;
8 9 import cn.iocoder.yudao.module.mes.dal.mysql.wm.outsourceissue.MesWmOutsourceIssueLineMapper;
  10 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO;
9 11 import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
  12 +import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService;
10 13 import jakarta.annotation.Resource;
11 14 import org.springframework.context.annotation.Lazy;
12 15 import org.springframework.stereotype.Service;
... ... @@ -36,11 +39,15 @@ public class MesWmOutsourceIssueLineServiceImpl implements MesWmOutsourceIssueLi
36 39 private MesWmOutsourceIssueService outsourceIssueService;
37 40 @Resource
38 41 private MesMdItemService itemService;
  42 + @Resource
  43 + private MesWmBatchService batchService;
39 44  
40 45 @Override
41 46 public Long createOutsourceIssueLine(MesWmOutsourceIssueLineSaveReqVO createReqVO) {
42 47 // 校验数据
43 48 validateOutsourceIssueLineSaveData(createReqVO);
  49 + // 根据 batchCode 解析 batchId
  50 + fillBatchId(createReqVO);
44 51  
45 52 // 插入
46 53 MesWmOutsourceIssueLineDO line = BeanUtils.toBean(createReqVO, MesWmOutsourceIssueLineDO.class);
... ... @@ -54,6 +61,8 @@ public class MesWmOutsourceIssueLineServiceImpl implements MesWmOutsourceIssueLi
54 61 validateOutsourceIssueLineExists(updateReqVO.getId());
55 62 // 校验数据
56 63 validateOutsourceIssueLineSaveData(updateReqVO);
  64 + // 根据 batchCode 解析 batchId
  65 + fillBatchId(updateReqVO);
57 66  
58 67 // 更新
59 68 MesWmOutsourceIssueLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmOutsourceIssueLineDO.class);
... ... @@ -104,4 +113,16 @@ public class MesWmOutsourceIssueLineServiceImpl implements MesWmOutsourceIssueLi
104 113 itemService.validateItemExists(saveReqVO.getItemId());
105 114 }
106 115  
  116 + /**
  117 + * 根据 batchCode 解析 batchId
  118 + */
  119 + private void fillBatchId(MesWmOutsourceIssueLineSaveReqVO reqVO) {
  120 + if (StrUtil.isBlank(reqVO.getBatchCode())) {
  121 + reqVO.setBatchId(null);
  122 + return;
  123 + }
  124 + MesWmBatchDO batch = batchService.getBatchByCode(reqVO.getBatchCode());
  125 + reqVO.setBatchId(batch != null ? batch.getId() : null);
  126 + }
  127 +
107 128 }
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueServiceImpl.java
... ... @@ -13,8 +13,10 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourceissue.MesWmOutsour
13 13 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourceissue.MesWmOutsourceIssueDO;
14 14 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourceissue.MesWmOutsourceIssueLineDO;
15 15 import cn.iocoder.yudao.module.mes.dal.mysql.wm.outsourceissue.MesWmOutsourceIssueMapper;
  16 +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO;
16 17 import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants;
17 18 import cn.iocoder.yudao.module.mes.enums.md.autocode.MesMdAutoCodeRuleCodeEnum;
  19 +import cn.iocoder.yudao.module.mes.enums.pro.MesProWorkOrderTypeEnum;
18 20 import cn.iocoder.yudao.module.mes.enums.wm.MesWmOutsourceIssueStatusEnum;
19 21 import cn.iocoder.yudao.module.mes.enums.wm.MesWmTransactionTypeEnum;
20 22 import cn.iocoder.yudao.module.mes.service.md.autocode.MesMdAutoCodeRecordService;
... ... @@ -257,8 +259,11 @@ public class MesWmOutsourceIssueServiceImpl implements MesWmOutsourceIssueServic
257 259 if (saveReqVO.getVendorId() != null) {
258 260 vendorService.validateVendorExists(saveReqVO.getVendorId());
259 261 }
260   - // 校验工单存在
261   - workOrderService.validateWorkOrderExists(saveReqVO.getWorkOrderId());
  262 + // 校验工单存在且类型为外协(代工)
  263 + MesProWorkOrderDO workOrder = workOrderService.validateWorkOrderExists(saveReqVO.getWorkOrderId());
  264 + if (ObjUtil.notEqual(workOrder.getType(), MesProWorkOrderTypeEnum.OUTSOURCE.getType())) {
  265 + throw exception(WM_OUTSOURCE_ISSUE_WORK_ORDER_TYPE_INVALID);
  266 + }
262 267 }
263 268  
264 269 /**
... ...