From 38915e96f93a056ff521e56fcbcf5078e4deff7d Mon Sep 17 00:00:00 2001 From: YunaiV Date: Tue, 31 Mar 2026 23:22:23 +0800 Subject: [PATCH] ✨ feat(mes): 新增工单类型过滤和批次编码处理逻辑 --- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/MesProWorkorderController.java | 7 +++++-- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourceissue/MesWmOutsourceIssueLineController.java | 13 +++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourceissue/vo/line/MesWmOutsourceIssueLineSaveReqVO.java | 3 +++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java | 1 + yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueLineServiceImpl.java | 21 +++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueServiceImpl.java | 9 +++++++-- 6 files changed, 50 insertions(+), 4 deletions(-) diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/MesProWorkorderController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/MesProWorkorderController.java index 826660a..ea1afa8 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/MesProWorkorderController.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/MesProWorkorderController.java @@ -106,10 +106,13 @@ public class MesProWorkOrderController { @GetMapping("/simple-list") @Operation(summary = "获得生产工单精简列表", description = "主要用于前端的下拉选项") - public CommonResult> getWorkOrderSimpleList() { - List list = workOrderService.getWorkOrderList(); + @Parameter(name = "type", description = "工单类型", example = "2") + public CommonResult> getWorkOrderSimpleList( + @RequestParam(value = "type", required = false) Integer type) { + List list = workOrderService.getWorkOrderList(type); return success(convertList(list, wo -> new MesProWorkOrderRespVO() .setId(wo.getId()).setCode(wo.getCode()).setName(wo.getName()) + .setType(wo.getType()).setVendorId(wo.getVendorId()) .setStatus(wo.getStatus()))); } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourceissue/MesWmOutsourceIssueLineController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourceissue/MesWmOutsourceIssueLineController.java index 4e7b3ed..11ac9d5 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourceissue/MesWmOutsourceIssueLineController.java +++ b/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 import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourceissue.vo.line.MesWmOutsourceIssueLineSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourceissue.MesWmOutsourceIssueLineDO; import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService; +import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService; import cn.iocoder.yudao.module.mes.service.wm.outsourceissue.MesWmOutsourceIssueLineService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -26,8 +28,10 @@ import org.springframework.web.bind.annotation.*; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Set; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; /** @@ -50,6 +54,9 @@ public class MesWmOutsourceIssueLineController { @Resource private MesMdUnitMeasureService unitMeasureService; + @Resource + private MesWmBatchService batchService; + @PostMapping("/create") @Operation(summary = "创建外协发料单行") @PreAuthorize("@ss.hasPermission('mes:wm-outsource-issue:create')") @@ -116,6 +123,11 @@ public class MesWmOutsourceIssueLineController { convertSet(list, MesWmOutsourceIssueLineDO::getItemId)); Map unitMeasureMap = unitMeasureService.getUnitMeasureMap( convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId)); + // 1.2 获得批次数据 + Set batchIds = convertSet(list, MesWmOutsourceIssueLineDO::getBatchId); + batchIds.remove(null); + Map batchMap = CollUtil.isEmpty(batchIds) ? Collections.emptyMap() + : convertMap(batchIds, id -> id, id -> batchService.getBatch(id)); // 2. 构建结果 return BeanUtils.toBean(list, MesWmOutsourceIssueLineRespVO.class, vo -> { MapUtils.findAndThen(itemMap, vo.getItemId(), item -> { @@ -123,6 +135,7 @@ public class MesWmOutsourceIssueLineController { MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(), unitMeasure -> vo.setUnitMeasureName(unitMeasure.getName())); }); + MapUtils.findAndThen(batchMap, vo.getBatchId(), batch -> vo.setBatchCode(batch.getCode())); }); } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourceissue/vo/line/MesWmOutsourceIssueLineSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourceissue/vo/line/MesWmOutsourceIssueLineSaveReqVO.java index b0765fd..7bfabd0 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourceissue/vo/line/MesWmOutsourceIssueLineSaveReqVO.java +++ b/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 { @Schema(description = "备注", example = "备注") private String remark; + @Schema(description = "批次编码", example = "BATCH001") + private String batchCode; + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java index 532d407..340d24f 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java @@ -415,6 +415,7 @@ public interface ErrorCodeConstants { ErrorCode WM_OUTSOURCE_ISSUE_CANCEL_NOT_ALLOWED = new ErrorCode(1_040_707_007, "已完成或已取消的发料单不允许取消"); ErrorCode WM_OUTSOURCE_ISSUE_LINE_NOT_EXISTS = new ErrorCode(1_040_707_100, "外协发料单行不存在"); ErrorCode WM_OUTSOURCE_ISSUE_DETAIL_NOT_EXISTS = new ErrorCode(1_040_707_200, "外协发料单明细不存在"); + ErrorCode WM_OUTSOURCE_ISSUE_WORK_ORDER_TYPE_INVALID = new ErrorCode(1_040_707_008, "工单类型不是外协(代工)类型"); // ========== MES 仓库管理-生产领料出库单(1-040-708-000) ========== ErrorCode WM_PRODUCT_ISSUE_NOT_EXISTS = new ErrorCode(1_040_708_000, "生产领料出库单不存在"); 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 5d30844..8838cef 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 @@ -1,12 +1,15 @@ package cn.iocoder.yudao.module.mes.service.wm.outsourceissue; +import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourceissue.vo.line.MesWmOutsourceIssueLinePageReqVO; 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.dal.dataobject.wm.batch.MesWmBatchDO; import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; +import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService; import jakarta.annotation.Resource; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -36,11 +39,15 @@ public class MesWmOutsourceIssueLineServiceImpl implements MesWmOutsourceIssueLi private MesWmOutsourceIssueService outsourceIssueService; @Resource private MesMdItemService itemService; + @Resource + private MesWmBatchService batchService; @Override public Long createOutsourceIssueLine(MesWmOutsourceIssueLineSaveReqVO createReqVO) { // 校验数据 validateOutsourceIssueLineSaveData(createReqVO); + // 根据 batchCode 解析 batchId + fillBatchId(createReqVO); // 插入 MesWmOutsourceIssueLineDO line = BeanUtils.toBean(createReqVO, MesWmOutsourceIssueLineDO.class); @@ -54,6 +61,8 @@ public class MesWmOutsourceIssueLineServiceImpl implements MesWmOutsourceIssueLi validateOutsourceIssueLineExists(updateReqVO.getId()); // 校验数据 validateOutsourceIssueLineSaveData(updateReqVO); + // 根据 batchCode 解析 batchId + fillBatchId(updateReqVO); // 更新 MesWmOutsourceIssueLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmOutsourceIssueLineDO.class); @@ -104,4 +113,16 @@ public class MesWmOutsourceIssueLineServiceImpl implements MesWmOutsourceIssueLi itemService.validateItemExists(saveReqVO.getItemId()); } + /** + * 根据 batchCode 解析 batchId + */ + private void fillBatchId(MesWmOutsourceIssueLineSaveReqVO reqVO) { + if (StrUtil.isBlank(reqVO.getBatchCode())) { + reqVO.setBatchId(null); + return; + } + MesWmBatchDO batch = batchService.getBatchByCode(reqVO.getBatchCode()); + reqVO.setBatchId(batch != null ? batch.getId() : null); + } + } 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 7269790..3193f3c 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 @@ -13,8 +13,10 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourceissue.MesWmOutsour import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourceissue.MesWmOutsourceIssueDO; 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.dal.dataobject.pro.workorder.MesProWorkOrderDO; 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.pro.MesProWorkOrderTypeEnum; 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; @@ -257,8 +259,11 @@ public class MesWmOutsourceIssueServiceImpl implements MesWmOutsourceIssueServic if (saveReqVO.getVendorId() != null) { vendorService.validateVendorExists(saveReqVO.getVendorId()); } - // 校验工单存在 - workOrderService.validateWorkOrderExists(saveReqVO.getWorkOrderId()); + // 校验工单存在且类型为外协(代工) + MesProWorkOrderDO workOrder = workOrderService.validateWorkOrderExists(saveReqVO.getWorkOrderId()); + if (ObjUtil.notEqual(workOrder.getType(), MesProWorkOrderTypeEnum.OUTSOURCE.getType())) { + throw exception(WM_OUTSOURCE_ISSUE_WORK_ORDER_TYPE_INVALID); + } } /** -- libgit2 0.21.4