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,10 +106,13 @@ public class MesProWorkOrderController {
106 106
107 @GetMapping("/simple-list") 107 @GetMapping("/simple-list")
108 @Operation(summary = "获得生产工单精简列表", description = "主要用于前端的下拉选项") 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 return success(convertList(list, wo -> new MesProWorkOrderRespVO() 113 return success(convertList(list, wo -> new MesProWorkOrderRespVO()
112 .setId(wo.getId()).setCode(wo.getCode()).setName(wo.getName()) 114 .setId(wo.getId()).setCode(wo.getCode()).setName(wo.getName())
  115 + .setType(wo.getType()).setVendorId(wo.getVendorId())
113 .setStatus(wo.getStatus()))); 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,9 +10,11 @@ import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourceissue.vo.line.Me
10 import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourceissue.vo.line.MesWmOutsourceIssueLineSaveReqVO; 10 import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourceissue.vo.line.MesWmOutsourceIssueLineSaveReqVO;
11 import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; 11 import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
12 import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; 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 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourceissue.MesWmOutsourceIssueLineDO; 14 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourceissue.MesWmOutsourceIssueLineDO;
14 import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; 15 import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
15 import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService; 16 import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
  17 +import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService;
16 import cn.iocoder.yudao.module.mes.service.wm.outsourceissue.MesWmOutsourceIssueLineService; 18 import cn.iocoder.yudao.module.mes.service.wm.outsourceissue.MesWmOutsourceIssueLineService;
17 import io.swagger.v3.oas.annotations.Operation; 19 import io.swagger.v3.oas.annotations.Operation;
18 import io.swagger.v3.oas.annotations.Parameter; 20 import io.swagger.v3.oas.annotations.Parameter;
@@ -26,8 +28,10 @@ import org.springframework.web.bind.annotation.*; @@ -26,8 +28,10 @@ import org.springframework.web.bind.annotation.*;
26 import java.util.Collections; 28 import java.util.Collections;
27 import java.util.List; 29 import java.util.List;
28 import java.util.Map; 30 import java.util.Map;
  31 +import java.util.Set;
29 32
30 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 33 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  34 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
31 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; 35 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
32 36
33 /** 37 /**
@@ -50,6 +54,9 @@ public class MesWmOutsourceIssueLineController { @@ -50,6 +54,9 @@ public class MesWmOutsourceIssueLineController {
50 @Resource 54 @Resource
51 private MesMdUnitMeasureService unitMeasureService; 55 private MesMdUnitMeasureService unitMeasureService;
52 56
  57 + @Resource
  58 + private MesWmBatchService batchService;
  59 +
53 @PostMapping("/create") 60 @PostMapping("/create")
54 @Operation(summary = "创建外协发料单行") 61 @Operation(summary = "创建外协发料单行")
55 @PreAuthorize("@ss.hasPermission('mes:wm-outsource-issue:create')") 62 @PreAuthorize("@ss.hasPermission('mes:wm-outsource-issue:create')")
@@ -116,6 +123,11 @@ public class MesWmOutsourceIssueLineController { @@ -116,6 +123,11 @@ public class MesWmOutsourceIssueLineController {
116 convertSet(list, MesWmOutsourceIssueLineDO::getItemId)); 123 convertSet(list, MesWmOutsourceIssueLineDO::getItemId));
117 Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap( 124 Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
118 convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId)); 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 // 2. 构建结果 131 // 2. 构建结果
120 return BeanUtils.toBean(list, MesWmOutsourceIssueLineRespVO.class, vo -> { 132 return BeanUtils.toBean(list, MesWmOutsourceIssueLineRespVO.class, vo -> {
121 MapUtils.findAndThen(itemMap, vo.getItemId(), item -> { 133 MapUtils.findAndThen(itemMap, vo.getItemId(), item -> {
@@ -123,6 +135,7 @@ public class MesWmOutsourceIssueLineController { @@ -123,6 +135,7 @@ public class MesWmOutsourceIssueLineController {
123 MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(), 135 MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(),
124 unitMeasure -> vo.setUnitMeasureName(unitMeasure.getName())); 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,4 +36,7 @@ public class MesWmOutsourceIssueLineSaveReqVO {
36 @Schema(description = "备注", example = "备注") 36 @Schema(description = "备注", example = "备注")
37 private String remark; 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,6 +415,7 @@ public interface ErrorCodeConstants {
415 ErrorCode WM_OUTSOURCE_ISSUE_CANCEL_NOT_ALLOWED = new ErrorCode(1_040_707_007, "已完成或已取消的发料单不允许取消"); 415 ErrorCode WM_OUTSOURCE_ISSUE_CANCEL_NOT_ALLOWED = new ErrorCode(1_040_707_007, "已完成或已取消的发料单不允许取消");
416 ErrorCode WM_OUTSOURCE_ISSUE_LINE_NOT_EXISTS = new ErrorCode(1_040_707_100, "外协发料单行不存在"); 416 ErrorCode WM_OUTSOURCE_ISSUE_LINE_NOT_EXISTS = new ErrorCode(1_040_707_100, "外协发料单行不存在");
417 ErrorCode WM_OUTSOURCE_ISSUE_DETAIL_NOT_EXISTS = new ErrorCode(1_040_707_200, "外协发料单明细不存在"); 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 // ========== MES 仓库管理-生产领料出库单(1-040-708-000) ========== 420 // ========== MES 仓库管理-生产领料出库单(1-040-708-000) ==========
420 ErrorCode WM_PRODUCT_ISSUE_NOT_EXISTS = new ErrorCode(1_040_708_000, "生产领料出库单不存在"); 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 package cn.iocoder.yudao.module.mes.service.wm.outsourceissue; 1 package cn.iocoder.yudao.module.mes.service.wm.outsourceissue;
2 2
  3 +import cn.hutool.core.util.StrUtil;
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 5 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
5 import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourceissue.vo.line.MesWmOutsourceIssueLinePageReqVO; 6 import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourceissue.vo.line.MesWmOutsourceIssueLinePageReqVO;
6 import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourceissue.vo.line.MesWmOutsourceIssueLineSaveReqVO; 7 import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourceissue.vo.line.MesWmOutsourceIssueLineSaveReqVO;
7 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourceissue.MesWmOutsourceIssueLineDO; 8 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourceissue.MesWmOutsourceIssueLineDO;
8 import cn.iocoder.yudao.module.mes.dal.mysql.wm.outsourceissue.MesWmOutsourceIssueLineMapper; 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 import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; 11 import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
  12 +import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService;
10 import jakarta.annotation.Resource; 13 import jakarta.annotation.Resource;
11 import org.springframework.context.annotation.Lazy; 14 import org.springframework.context.annotation.Lazy;
12 import org.springframework.stereotype.Service; 15 import org.springframework.stereotype.Service;
@@ -36,11 +39,15 @@ public class MesWmOutsourceIssueLineServiceImpl implements MesWmOutsourceIssueLi @@ -36,11 +39,15 @@ public class MesWmOutsourceIssueLineServiceImpl implements MesWmOutsourceIssueLi
36 private MesWmOutsourceIssueService outsourceIssueService; 39 private MesWmOutsourceIssueService outsourceIssueService;
37 @Resource 40 @Resource
38 private MesMdItemService itemService; 41 private MesMdItemService itemService;
  42 + @Resource
  43 + private MesWmBatchService batchService;
39 44
40 @Override 45 @Override
41 public Long createOutsourceIssueLine(MesWmOutsourceIssueLineSaveReqVO createReqVO) { 46 public Long createOutsourceIssueLine(MesWmOutsourceIssueLineSaveReqVO createReqVO) {
42 // 校验数据 47 // 校验数据
43 validateOutsourceIssueLineSaveData(createReqVO); 48 validateOutsourceIssueLineSaveData(createReqVO);
  49 + // 根据 batchCode 解析 batchId
  50 + fillBatchId(createReqVO);
44 51
45 // 插入 52 // 插入
46 MesWmOutsourceIssueLineDO line = BeanUtils.toBean(createReqVO, MesWmOutsourceIssueLineDO.class); 53 MesWmOutsourceIssueLineDO line = BeanUtils.toBean(createReqVO, MesWmOutsourceIssueLineDO.class);
@@ -54,6 +61,8 @@ public class MesWmOutsourceIssueLineServiceImpl implements MesWmOutsourceIssueLi @@ -54,6 +61,8 @@ public class MesWmOutsourceIssueLineServiceImpl implements MesWmOutsourceIssueLi
54 validateOutsourceIssueLineExists(updateReqVO.getId()); 61 validateOutsourceIssueLineExists(updateReqVO.getId());
55 // 校验数据 62 // 校验数据
56 validateOutsourceIssueLineSaveData(updateReqVO); 63 validateOutsourceIssueLineSaveData(updateReqVO);
  64 + // 根据 batchCode 解析 batchId
  65 + fillBatchId(updateReqVO);
57 66
58 // 更新 67 // 更新
59 MesWmOutsourceIssueLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmOutsourceIssueLineDO.class); 68 MesWmOutsourceIssueLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmOutsourceIssueLineDO.class);
@@ -104,4 +113,16 @@ public class MesWmOutsourceIssueLineServiceImpl implements MesWmOutsourceIssueLi @@ -104,4 +113,16 @@ public class MesWmOutsourceIssueLineServiceImpl implements MesWmOutsourceIssueLi
104 itemService.validateItemExists(saveReqVO.getItemId()); 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,8 +13,10 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourceissue.MesWmOutsour
13 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourceissue.MesWmOutsourceIssueDO; 13 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourceissue.MesWmOutsourceIssueDO;
14 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourceissue.MesWmOutsourceIssueLineDO; 14 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourceissue.MesWmOutsourceIssueLineDO;
15 import cn.iocoder.yudao.module.mes.dal.mysql.wm.outsourceissue.MesWmOutsourceIssueMapper; 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 import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants; 17 import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants;
17 import cn.iocoder.yudao.module.mes.enums.md.autocode.MesMdAutoCodeRuleCodeEnum; 18 import cn.iocoder.yudao.module.mes.enums.md.autocode.MesMdAutoCodeRuleCodeEnum;
  19 +import cn.iocoder.yudao.module.mes.enums.pro.MesProWorkOrderTypeEnum;
18 import cn.iocoder.yudao.module.mes.enums.wm.MesWmOutsourceIssueStatusEnum; 20 import cn.iocoder.yudao.module.mes.enums.wm.MesWmOutsourceIssueStatusEnum;
19 import cn.iocoder.yudao.module.mes.enums.wm.MesWmTransactionTypeEnum; 21 import cn.iocoder.yudao.module.mes.enums.wm.MesWmTransactionTypeEnum;
20 import cn.iocoder.yudao.module.mes.service.md.autocode.MesMdAutoCodeRecordService; 22 import cn.iocoder.yudao.module.mes.service.md.autocode.MesMdAutoCodeRecordService;
@@ -257,8 +259,11 @@ public class MesWmOutsourceIssueServiceImpl implements MesWmOutsourceIssueServic @@ -257,8 +259,11 @@ public class MesWmOutsourceIssueServiceImpl implements MesWmOutsourceIssueServic
257 if (saveReqVO.getVendorId() != null) { 259 if (saveReqVO.getVendorId() != null) {
258 vendorService.validateVendorExists(saveReqVO.getVendorId()); 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 /**