Просмотр исходного кода

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

在生产工单精简列表接口中新增工单类型参数,支持根据工单类型过滤工单列表。同时,在外协发料单行的创建和更新中,新增批次编码字段,并实现根据批次编码自动解析批次 ID 的功能,提升数据处理的灵活性和准确性。
YunaiV месяцев назад: 6
Родитель
Сommit
38915e96f9

+ 5 - 2
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<List<MesProWorkOrderRespVO>> getWorkOrderSimpleList() {
-        List<MesProWorkOrderDO> list = workOrderService.getWorkOrderList();
+    @Parameter(name = "type", description = "工单类型", example = "2")
+    public CommonResult<List<MesProWorkOrderRespVO>> getWorkOrderSimpleList(
+            @RequestParam(value = "type", required = false) Integer type) {
+        List<MesProWorkOrderDO> 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())));
     }
 

+ 13 - 0
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<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
                 convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
+        // 1.2 获得批次数据
+        Set<Long> batchIds = convertSet(list, MesWmOutsourceIssueLineDO::getBatchId);
+        batchIds.remove(null);
+        Map<Long, MesWmBatchDO> 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()));
         });
     }
 

+ 3 - 0
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;
+
 }

+ 1 - 0
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, "生产领料出库单不存在");

+ 21 - 0
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);
+    }
+
 }

+ 7 - 2
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);
+        }
     }
 
     /**