From 8e4eee5ad4d74e1a4e6ab4de3a9c28000700dce0 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期二, 03 十一月 2026 13:49:04 +0800
Subject: [PATCH] 修复采购退货页面 ERP 模块已禁用报错

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/mps/MesProMpsServiceImpl.java |  240 ++++++++++++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 208 insertions(+), 32 deletions(-)

diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/mps/MesProMpsServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/mps/MesProMpsServiceImpl.java
index af3ad0d..4584c96 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/mps/MesProMpsServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/mps/MesProMpsServiceImpl.java
@@ -3,18 +3,23 @@
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjUtil;
 import cn.hutool.core.util.StrUtil;
+import cn.iocoder.yudao.framework.common.exception.ServiceException;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
+import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
+import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
+import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceStatusEnum;
 import cn.iocoder.yudao.module.erp.api.purchase.ErpPurchaseOrderApi;
 import cn.iocoder.yudao.module.erp.api.purchase.ErpPurchaseRequestApi;
 import cn.iocoder.yudao.module.erp.api.purchase.dto.ErpPurchaseOrderItemRespDTO;
 import cn.iocoder.yudao.module.erp.api.purchase.dto.ErpPurchaseRequestCreateReqDTO;
-import cn.iocoder.yudao.module.mes.controller.admin.pro.mps.vo.MesProMpsAuditReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.pro.mps.vo.MesProMpsPageReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.pro.mps.vo.MesProMpsPreparationCheckRespVO;
 import cn.iocoder.yudao.module.mes.controller.admin.pro.mps.vo.MesProMpsSaveReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.pro.workorder.vo.MesProWorkOrderItemRespVO;
 import cn.iocoder.yudao.module.mes.controller.admin.pro.workorder.vo.MesProWorkOrderSaveReqVO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.dv.machinery.MesDvMachineryDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.pro.mps.MesProMpsDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.pro.mps.MesProMpsMergeItemDO;
@@ -26,13 +31,18 @@
 import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProductBomDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProductDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProcessDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pro.process.MesProProcessDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO;
+import cn.iocoder.yudao.module.mes.enums.dv.MesDvMachineryStatusEnum;
+import cn.iocoder.yudao.module.mes.enums.md.autocode.MesMdAutoCodeRuleCodeEnum;
 import cn.iocoder.yudao.module.mes.enums.pro.MesProMpsStatusEnum;
 import cn.iocoder.yudao.module.mes.enums.pro.MesProFeedbackStatusEnum;
 import cn.iocoder.yudao.module.mes.enums.pro.MesProWorkOrderSourceTypeEnum;
 import cn.iocoder.yudao.module.mes.enums.pro.MesProWorkOrderStatusEnum;
+import cn.iocoder.yudao.module.mes.service.dv.machinery.MesDvMachineryService;
 import cn.iocoder.yudao.module.mes.service.md.autocode.MesMdAutoCodeRecordService;
 import cn.iocoder.yudao.module.mes.service.pro.material.MesProMaterialRequirementService;
+import cn.iocoder.yudao.module.mes.service.pro.process.MesProProcessService;
 import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
 import cn.iocoder.yudao.module.mes.service.pro.route.MesProRouteProductService;
 import cn.iocoder.yudao.module.mes.service.pro.route.MesProRouteProcessService;
@@ -77,6 +87,11 @@
      */
     private static final String MPS_CODE_RULE = "MPS";
 
+    /**
+     * MPS 瀹℃壒娴佺▼瀹氫箟 Key锛圔PM 娴佺▼妯″瀷涓厤缃級
+     */
+    private static final String MPS_APPROVE_PROCESS_DEFINITION_KEY = "mes-pro-mps-audit";
+
     @Resource
     private MesProMpsMapper mpsMapper;
     @Resource
@@ -102,9 +117,15 @@
     @Resource
     private MesProMaterialRequirementService materialRequirementService;
     @Resource
+    private MesProProcessService processService;
+    @Resource
+    private MesDvMachineryService machineryService;
+    @Resource
     private ErpPurchaseOrderApi purchaseOrderApi;
     @Resource
     private ErpPurchaseRequestApi purchaseRequestApi;
+    @Resource
+    private BpmProcessInstanceApi processInstanceApi;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -194,11 +215,8 @@
         // 鏍¢獙缂栫爜鍞竴
         validateMpsCodeUnique(updateReqVO.getId(), updateReqVO.getCode());
 
-        // 鏇存柊锛涘鏍镐腑鐨勮鍒掕淇敼鍚庨渶瑕侀噸鏂版彁浜ゅ鏍�
+        // 鏇存柊锛堜粎鑽夌鍙紪杈戯級
         MesProMpsDO updateObj = BeanUtils.toBean(updateReqVO, MesProMpsDO.class);
-        if (MesProMpsStatusEnum.AUDITING.getStatus().equals(mps.getStatus())) {
-            updateObj.setStatus(MesProMpsStatusEnum.DRAFT.getStatus());
-        }
         mpsMapper.updateById(updateObj);
     }
 
@@ -221,35 +239,71 @@
     @Transactional(rollbackFor = Exception.class)
     public void submitMps(Long id) {
         MesProMpsDO mps = validateMpsExists(id);
-        if (!MesProMpsStatusEnum.DRAFT.getStatus().equals(mps.getStatus())
-                && !MesProMpsStatusEnum.AUDITING.getStatus().equals(mps.getStatus())) {
+        // 鍙湁鑽夌鍙互鎻愪氦瀹℃牳锛涘鏍镐腑鐨勮鍒掗渶绛夊緟鍗忓悓鍔炲叕瀹℃壒缁撴灉
+        if (!MesProMpsStatusEnum.DRAFT.getStatus().equals(mps.getStatus())) {
             throw exception(PRO_MPS_NOT_DRAFT);
+        }
+        // 鍏ㄥ眬鍏嶅鎵癸細涓嶅仛 BPM 娴佺▼锛岀洿鎺ユ寜瀹℃壒閫氳繃澶勭悊
+        if (processInstanceApi.isGlobalAutoApprove()) {
+            mpsMapper.updateById(new MesProMpsDO()
+                    .setId(id)
+                    .setStatus(MesProMpsStatusEnum.AUDITING.getStatus())
+                    .setProcessInstanceId(""));
+            handleBpmProcessResult(id, BpmProcessInstanceStatusEnum.APPROVE.getStatus(), "鍏ㄥ眬鍏嶅鎵硅嚜鍔ㄩ�氳繃", null);
+            return;
+        }
+        // 鍚姩 BPM 娴佺▼锛屽鎵瑰湪鍗忓悓鍔炲叕瀹屾垚锛岀粨鏋滅敱鐩戝惉鍣ㄥ洖鍐�
+        String processInstanceId;
+        try {
+            processInstanceId = processInstanceApi.createProcessInstance(SecurityFrameworkUtils.getLoginUserId(),
+                    new BpmProcessInstanceCreateReqDTO()
+                            .setProcessDefinitionKey(MPS_APPROVE_PROCESS_DEFINITION_KEY)
+                            .setBusinessKey(String.valueOf(id)));
+        } catch (ServiceException ex) {
+            // 娴佺▼鏈儴缃叉椂 BPM 鍙姏銆屾祦绋嬪畾涔変笉瀛樺湪銆嶏紝琛ヤ笂鍙墽琛岀殑鎻愮ず
+            if (StrUtil.contains(ex.getMessage(), "娴佺▼瀹氫箟涓嶅瓨鍦�")) {
+                log.warn("[submitMps] 鐢熶骇璁″垝瀹℃壒娴佺▼({}) 鏈儴缃诧紝mpsId={}", MPS_APPROVE_PROCESS_DEFINITION_KEY, id);
+                throw exception(PRO_MPS_PROCESS_NOT_DEPLOYED);
+            }
+            throw ex;
         }
         mpsMapper.updateById(new MesProMpsDO()
                 .setId(id)
-                .setStatus(MesProMpsStatusEnum.AUDITING.getStatus()));
+                .setStatus(MesProMpsStatusEnum.AUDITING.getStatus())
+                .setProcessInstanceId(processInstanceId));
     }
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void auditMps(MesProMpsAuditReqVO reqVO) {
-        MesProMpsDO mps = validateMpsExists(reqVO.getId());
+    public void handleBpmProcessResult(Long id, Integer bpmResult, String reason, Long auditUserId) {
+        // 1. 鏌旀�ф牎楠岋細璁″垝瀛樺湪涓斿浜庡鏍镐腑
+        MesProMpsDO mps = mpsMapper.selectById(id);
+        if (mps == null) {
+            log.warn("[handleBpmProcessResult] 鐢熶骇璁″垝({}) 涓嶅瓨鍦�", id);
+            return;
+        }
         if (!MesProMpsStatusEnum.AUDITING.getStatus().equals(mps.getStatus())) {
-            throw exception(PRO_MPS_NOT_AUDITING);
+            log.warn("[handleBpmProcessResult] 鐢熶骇璁″垝({}) 涓嶅浜庡鏍镐腑鐘舵�侊紝褰撳墠鐘舵�侊細{}", id, mps.getStatus());
+            return;
         }
-        boolean approved = Boolean.TRUE.equals(reqVO.getApproved());
-        if (!approved && StrUtil.isBlank(reqVO.getAuditRemark())) {
-            throw exception(PRO_MPS_AUDIT_REMARK_REQUIRED);
+
+        // 2. 鏍规嵁瀹℃壒缁撴灉鏇存柊鐘舵��
+        if (BpmProcessInstanceStatusEnum.APPROVE.getStatus().equals(bpmResult)) {
+            mpsMapper.updateById(new MesProMpsDO()
+                    .setId(id)
+                    .setStatus(MesProMpsStatusEnum.APPROVED.getStatus())
+                    .setAuditUserId(auditUserId)
+                    .setAuditTime(LocalDateTime.now())
+                    .setAuditRemark(StrUtil.blankToDefault(reason, "瀹℃牳閫氳繃")));
+        } else if (BpmProcessInstanceStatusEnum.REJECT.getStatus().equals(bpmResult)
+                || BpmProcessInstanceStatusEnum.CANCEL.getStatus().equals(bpmResult)) {
+            mpsMapper.updateById(new MesProMpsDO()
+                    .setId(id)
+                    .setStatus(MesProMpsStatusEnum.DRAFT.getStatus())
+                    .setAuditUserId(auditUserId)
+                    .setAuditTime(LocalDateTime.now())
+                    .setAuditRemark(StrUtil.blankToDefault(reason, "瀹℃壒椹冲洖")));
         }
-        mpsMapper.updateById(new MesProMpsDO()
-                .setId(reqVO.getId())
-                .setStatus(approved ? MesProMpsStatusEnum.APPROVED.getStatus()
-                        : MesProMpsStatusEnum.DRAFT.getStatus())
-                .setAuditUserId(SecurityFrameworkUtils.getLoginUserId())
-                .setAuditTime(LocalDateTime.now())
-                .setAuditRemark(approved
-                        ? StrUtil.blankToDefault(reqVO.getAuditRemark(), "瀹℃牳閫氳繃")
-                        : reqVO.getAuditRemark()));
     }
 
     @Override
@@ -261,15 +315,136 @@
     }
 
     @Override
+    public MesProMpsPreparationCheckRespVO getPreparationCheck(Long id) {
+        MesProMpsDO mps = validateMpsExists(id);
+        MesProMpsPreparationCheckRespVO result = new MesProMpsPreparationCheckRespVO();
+        result.setMpsId(mps.getId());
+        result.setMpsCode(mps.getCode());
+        result.setProductId(mps.getProductId());
+        result.setQuantity(mps.getQuantity());
+        MesMdItemDO product = itemService.getItem(mps.getProductId());
+        result.setProductName(product != null ? product.getName() : String.valueOf(mps.getProductId()));
+
+        // 1. 鐗╂枡妫�鏌ワ細闇�姹� - 鍙敤搴撳瓨 - 鍦ㄩ�旈噰璐�
+        List<MesProWorkOrderItemRespVO> materialItems = getMpsItemList(id);
+        int materialShortageCount = 0;
+        for (MesProWorkOrderItemRespVO item : materialItems) {
+            MesProMpsPreparationCheckRespVO.MaterialCheck check = new MesProMpsPreparationCheckRespVO.MaterialCheck();
+            check.setItemId(item.getItemId());
+            check.setItemCode(item.getItemCode());
+            check.setItemName(item.getItemName());
+            check.setSpecification(item.getItemSpecification());
+            check.setUnitMeasureName(item.getUnitMeasureName());
+            check.setRequiredQuantity(nullToZero(item.getQuantity()));
+            check.setStockQuantity(nullToZero(item.getStockQuantity()));
+            check.setPurchaseOrderQuantity(nullToZero(item.getPurchaseOrderQuantity()));
+            BigDecimal supply = nullToZero(item.getStockQuantity()).add(nullToZero(item.getPurchaseOrderQuantity()));
+            BigDecimal shortage = nullToZero(item.getQuantity()).subtract(supply);
+            if (shortage.compareTo(BigDecimal.ZERO) < 0) {
+                shortage = BigDecimal.ZERO;
+            }
+            check.setShortageQuantity(shortage);
+            check.setSufficient(shortage.compareTo(BigDecimal.ZERO) <= 0);
+            if (!Boolean.TRUE.equals(check.getSufficient())) {
+                materialShortageCount++;
+            }
+            result.getMaterials().add(check);
+        }
+        result.setMaterialReady(materialShortageCount == 0);
+
+        // 2. 璁惧妫�鏌ワ細鎸変骇鍝佺殑宸ヨ壓璺嚎閫愬伐搴忔煡鎵剧粦瀹氳澶�
+        List<MesProRouteProcessDO> routeProcesses = routeProcessService.getRouteProcessListByProductId(mps.getProductId());
+        int equipmentUnavailableCount = 0;
+        if (CollUtil.isEmpty(routeProcesses)) {
+            MesProMpsPreparationCheckRespVO.EquipmentCheck check = new MesProMpsPreparationCheckRespVO.EquipmentCheck();
+            check.setProcessName("宸ヨ壓璺嚎");
+            check.setAvailable(false);
+            check.setReason("浜у搧鏈厤缃伐鑹鸿矾绾匡紝鏃犳硶纭畾鎵�闇�璁惧锛涜鍏堝湪銆屽伐鑹鸿矾绾裤�嶄腑缁存姢璇ヤ骇鍝佺殑宸ヨ壓璺嚎鍚庡啀妫�鏌�");
+            result.getEquipments().add(check);
+            equipmentUnavailableCount++;
+        } else {
+            Map<Long, MesProRouteProcessDO> processIdMap = routeProcesses.stream()
+                    .filter(rp -> rp.getProcessId() != null)
+                    .collect(Collectors.toMap(MesProRouteProcessDO::getProcessId, rp -> rp, (a, b) -> a));
+            Map<Long, MesProProcessDO> processMap = processService.getProcessMap(processIdMap.keySet());
+            // 璁惧涓庡伐搴�/宸ヤ綅鐨勭粦瀹氾細浼樺厛鍙栬澶囦笂鐨勫伐搴� ID锛屽叾娆″洖閫�宸ヤ綅 ID锛堝巻鍙叉暟鎹腑涓よ�呬竴鑷达級
+            List<MesDvMachineryDO> machineries = machineryService.getMachineryList();
+            Map<Long, List<MesDvMachineryDO>> machineryMap = machineries.stream()
+                    .filter(m -> m.getProcessId() != null || m.getWorkstationId() != null)
+                    .collect(Collectors.groupingBy(m -> m.getProcessId() != null ? m.getProcessId() : m.getWorkstationId()));
+            for (MesProRouteProcessDO rp : routeProcesses) {
+                MesProProcessDO process = processMap.get(rp.getProcessId());
+                String processName = process != null ? process.getName() : String.valueOf(rp.getProcessId());
+                List<MesDvMachineryDO> boundMachineries = machineryMap.get(rp.getProcessId());
+                if (CollUtil.isEmpty(boundMachineries)) {
+                    MesProMpsPreparationCheckRespVO.EquipmentCheck check = new MesProMpsPreparationCheckRespVO.EquipmentCheck();
+                    check.setProcessId(rp.getProcessId());
+                    check.setProcessName(processName);
+                    check.setAvailable(false);
+                    check.setReason("璇ュ伐搴忔湭缁戝畾璁惧锛岃鍒般�岃澶囧熀纭�淇℃伅绠$悊銆嶄负璇ュ伐搴忕粦瀹氳澶�");
+                    result.getEquipments().add(check);
+                    equipmentUnavailableCount++;
+                    continue;
+                }
+                for (MesDvMachineryDO machinery : boundMachineries) {
+                    MesProMpsPreparationCheckRespVO.EquipmentCheck check = new MesProMpsPreparationCheckRespVO.EquipmentCheck();
+                    check.setProcessId(rp.getProcessId());
+                    check.setProcessName(processName);
+                    check.setMachineryId(machinery.getId());
+                    check.setMachineryCode(machinery.getCode());
+                    check.setMachineryName(machinery.getName());
+                    check.setStatus(machinery.getStatus());
+                    MesDvMachineryStatusEnum statusEnum = MesDvMachineryStatusEnum.valueOfStatus(machinery.getStatus());
+                    check.setStatusName(statusEnum != null ? statusEnum.getName() : "鏈煡");
+                    boolean available = statusEnum != MesDvMachineryStatusEnum.MAINTENANCE;
+                    check.setAvailable(available);
+                    if (available) {
+                        check.setReason(statusEnum == MesDvMachineryStatusEnum.PRODUCING ? "璁惧鍗犵敤涓紝鎺掍骇鏃堕渶纭鍙敤鏃舵" : null);
+                    } else {
+                        check.setReason("璁惧澶勪簬缁存姢涓紝璇风瓑寰呯淮鎶ゅ畬鎴愭垨鏀规淳鍏朵粬璁惧");
+                        equipmentUnavailableCount++;
+                    }
+                    result.getEquipments().add(check);
+                }
+            }
+        }
+        result.setEquipmentReady(equipmentUnavailableCount == 0);
+        boolean ready = Boolean.TRUE.equals(result.getMaterialReady()) && Boolean.TRUE.equals(result.getEquipmentReady());
+        result.setReady(ready);
+        StringBuilder summary = new StringBuilder();
+        if (materialShortageCount > 0) {
+            summary.append(materialShortageCount).append(" 椤圭墿鏂欑煭缂�");
+        }
+        if (equipmentUnavailableCount > 0) {
+            if (summary.length() > 0) {
+                summary.append("锛�");
+            }
+            summary.append(equipmentUnavailableCount).append(" 椤硅澶囦笉鍙敤");
+        }
+        if (summary.length() == 0) {
+            summary.append("鐗╂枡銆佽澶囧潎宸插榻愶紝鍙互瀹夋帓鐢熶骇");
+        }
+        result.setSummary(summary.toString());
+        return result;
+    }
+
+    @Override
     @Transactional(rollbackFor = Exception.class)
     public Long generatePurchaseRequest(Long id) {
         MesProMpsDO mps = validateMpsExists(id);
         if (!MesProMpsStatusEnum.APPROVED.getStatus().equals(mps.getStatus())) {
             throw exception(PRO_MPS_NOT_APPROVED);
         }
-        // 1. 鍙缂哄彛鐗╂枡鐢熸垚閲囪喘鏄庣粏锛氱己鍙� = 闇�姹� - 鍙敤搴撳瓨 - 鍦ㄩ�旈噰璐�
+        // 1. 鐗╂枡闇�姹備负绌鸿鏄庝骇鍝佹湭缁存姢浠讳綍 BOM锛岀洿鎺ユ彁绀猴紝閬垮厤璇姤鈥滃簱瀛樺厖瓒斥��
+        List<MesProWorkOrderItemRespVO> materialItems = getMpsItemList(id);
+        if (CollUtil.isEmpty(materialItems)) {
+            MesMdItemDO product = itemService.getItem(mps.getProductId());
+            throw exception(PRO_MPS_NO_MATERIAL_BOM, mps.getCode(),
+                    product != null ? product.getName() : String.valueOf(mps.getProductId()));
+        }
+        // 2. 鍙缂哄彛鐗╂枡鐢熸垚閲囪喘鏄庣粏锛氱己鍙� = 闇�姹� - 鍙敤搴撳瓨 - 鍦ㄩ�旈噰璐�
         List<ErpPurchaseRequestCreateReqDTO.Item> shortageItems = new ArrayList<>();
-        for (MesProWorkOrderItemRespVO item : getMpsItemList(id)) {
+        for (MesProWorkOrderItemRespVO item : materialItems) {
             if (Boolean.TRUE.equals(item.getStockSufficient())) {
                 continue;
             }
@@ -293,14 +468,14 @@
         if (CollUtil.isEmpty(shortageItems)) {
             throw exception(PRO_MPS_NO_MATERIAL_SHORTAGE);
         }
-        // 2. 鐢熸垚閲囪喘鐢宠鍗曪紙鑽夌锛屾棤渚涘簲鍟嗭紝鍚庣画鐢遍噰璐汉鍛樿ˉ鍏呭苟鎸夋祦绋嬫彁浜わ級
+        // 3. 鐢熸垚閲囪喘鐢宠鍗曪紙鑽夌锛屾棤渚涘簲鍟嗭紝鍚庣画鐢遍噰璐汉鍛樿ˉ鍏呭苟鎸夋祦绋嬫彁浜わ級
         ErpPurchaseRequestCreateReqDTO createReqDTO = new ErpPurchaseRequestCreateReqDTO()
                 .setRequestTime(LocalDateTime.now())
                 .setRequestReason("鐢熶骇璁″垝 " + mps.getCode() + " 杈呮枡閲囪喘")
                 .setRemark("鐢辩敓浜ц鍒掕嚜鍔ㄧ敓鎴愶紝鍏� " + shortageItems.size() + " 椤圭墿鏂欏簱瀛樹笉瓒�")
                 .setItems(shortageItems);
         Long purchaseRequestId = purchaseRequestApi.createPurchaseRequest(createReqDTO).getCheckedData();
-        // 3. 鍥炲啓閲囪喘鐢宠鍗曠紪鍙凤紝渚夸簬浠庤鍒掕拷婧�
+        // 4. 鍥炲啓閲囪喘鐢宠鍗曠紪鍙凤紝渚夸簬浠庤鍒掕拷婧�
         mpsMapper.updateById(new MesProMpsDO().setId(id).setPurchaseRequestId(purchaseRequestId));
         log.info("[generatePurchaseRequest] 璁″垝({}) 鐢熸垚閲囪喘鐢宠鍗�({})锛屾槑缁� {} 椤�", mps.getCode(), purchaseRequestId, shortageItems.size());
         return purchaseRequestId;
@@ -638,12 +813,11 @@
     }
 
     /**
-     * 鏍¢獙 MPS 瀛樺湪 + 鍙紪杈戠姸鎬侊紙鏈紑濮嬨�佸鏍镐腑锛�
+     * 鏍¢獙 MPS 瀛樺湪 + 鍙紪杈戠姸鎬侊紙浠呰崏绋匡紱瀹℃牳涓殑璁″垝闇�绛夊緟鍗忓悓鍔炲叕瀹℃壒锛�
      */
     private MesProMpsDO validateMpsExistsAndEditable(Long id) {
         MesProMpsDO mps = validateMpsExists(id);
-        if (!MesProMpsStatusEnum.DRAFT.getStatus().equals(mps.getStatus())
-                && !MesProMpsStatusEnum.AUDITING.getStatus().equals(mps.getStatus())) {
+        if (!MesProMpsStatusEnum.DRAFT.getStatus().equals(mps.getStatus())) {
             throw exception(PRO_MPS_NOT_DRAFT);
         }
         return mps;
@@ -754,9 +928,11 @@
      */
     private String generateWorkOrderCode() {
         try {
-            return autoCodeRecordService.generateAutoCode("WO");
+            return autoCodeRecordService.generateAutoCode(
+                    MesMdAutoCodeRuleCodeEnum.PRO_WORK_ORDER_CODE.getCode());
         } catch (Exception e) {
-            log.warn("[generateWorkOrderCode] 缂栫爜瑙勫垯 WO 涓嶅瓨鍦紝浣跨敤鏃堕棿鎴崇敓鎴�");
+            log.warn("[generateWorkOrderCode] 缂栫爜瑙勫垯 {} 涓嶅瓨鍦紝浣跨敤鏃堕棿鎴崇敓鎴�",
+                    MesMdAutoCodeRuleCodeEnum.PRO_WORK_ORDER_CODE.getCode());
             return "WO" + System.currentTimeMillis();
         }
     }

--
Gitblit v1.9.3