From fc1288355802c1b8e69fe08f544df675fb807572 Mon Sep 17 00:00:00 2001
From: liu <2021943741@qq.com>
Date: 星期六, 24 十月 2026 20:31:20 +0800
Subject: [PATCH] fix(erp): 修复销售订单审批未生成MPS

---
 yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleOrderServiceImpl.java |   64 +++++++++++++-------------------
 1 files changed, 26 insertions(+), 38 deletions(-)

diff --git a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleOrderServiceImpl.java b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleOrderServiceImpl.java
index 608d16a..a0f4ca6 100644
--- a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleOrderServiceImpl.java
+++ b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleOrderServiceImpl.java
@@ -31,17 +31,14 @@
 import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO;
 import cn.iocoder.yudao.module.mes.api.mps.MesProMpsApi;
 import cn.iocoder.yudao.module.mes.api.mps.dto.MesProMpsCreateReqDTO;
+import cn.iocoder.yudao.module.mes.api.mps.dto.MesProMpsRespDTO;
 import cn.iocoder.yudao.module.system.api.storage.StorageAttachmentApi;
 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
-import jakarta.annotation.PostConstruct;
 import jakarta.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.PlatformTransactionManager;
-import org.springframework.transaction.TransactionDefinition;
 import org.springframework.transaction.annotation.Transactional;
-import org.springframework.transaction.support.TransactionTemplate;
 import org.springframework.validation.annotation.Validated;
 
 import java.math.BigDecimal;
@@ -67,6 +64,8 @@
 @Validated
 @Slf4j
 public class ErpSaleOrderServiceImpl implements ErpSaleOrderService {
+
+    private static final Integer MPS_STATUS_CANCELED = 3;
 
     @Resource
     private ErpSaleOrderMapper saleOrderMapper;
@@ -94,22 +93,6 @@
     private ErpAccountMapper accountMapper;
     @Resource
     private MesProMpsApi mpsApi;
-
-    @Resource
-    private PlatformTransactionManager transactionManager;
-
-    /**
-     * MPS 鍒涘缓浣跨敤鐙珛浜嬪姟锛圧EQUIRES_NEW锛夛細
-     * 瀹℃牳鏃惰嚜鍔ㄥ垱寤� MPS 灞炰簬灏藉姏鑰屼负鐨勮仈鍔紝澶辫触浠呰褰曟棩蹇楀苟鍥炴粴鑷韩锛�
-     * 涓嶈兘姹℃煋閿�鍞鍗曞鏍镐簨鍔★紙鍚﹀垯鍐呭眰寮傚父浼氭妸澶栧眰浜嬪姟鏍囪涓� rollback-only锛屽鑷存暣涓鏍歌鍥炴粴锛�
-     */
-    private TransactionTemplate mpsTransactionTemplate;
-
-    @PostConstruct
-    public void initMpsTransactionTemplate() {
-        mpsTransactionTemplate = new TransactionTemplate(transactionManager);
-        mpsTransactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
-    }
 
     @Resource
     private StorageAttachmentApi storageAttachmentApi;
@@ -237,31 +220,36 @@
             return;
         }
 
-        int mpsCount = 0;
+        int createdCount = 0;
+        int reusedCount = 0;
         for (ErpSaleOrderItemDO item : items) {
             if (item.getNeedProduction() == null || item.getNeedProduction() != 1) {
                 continue;
             }
-            try {
-                // 鐙珛浜嬪姟鍒涘缓 MPS锛氬け璐ュ彧鍥炴粴 MPS 鑷韩锛屼笉褰卞搷瀹℃牳浜嬪姟
-                Long mpsId = mpsTransactionTemplate.execute(txStatus -> {
-                    Long newMpsId = createMpsForSaleOrderItem(saleOrder, item);
-                    if (newMpsId != null) {
-                        // 鏇存柊閿�鍞鍗曟槑缁嗙殑 MPS 鍏宠仈
-                        saleOrderItemMapper.updateById(new ErpSaleOrderItemDO()
-                                .setId(item.getId())
-                                .setMpsId(newMpsId));
-                    }
-                    return newMpsId;
-                });
-                if (mpsId != null) {
-                    mpsCount++;
+
+            // 鍚屼竴閿�鍞槑缁嗗彧淇濈暀涓�鏉℃湁鏁� MPS锛岄伩鍏嶅弽瀹℃牳鍚庡啀娆″鏍镐骇鐢熼噸澶嶈鍒�
+            MesProMpsRespDTO existingMps = mpsApi.getMpsBySaleOrderItemId(item.getId());
+            if (existingMps != null && ObjectUtil.notEqual(existingMps.getStatus(), MPS_STATUS_CANCELED)) {
+                if (ObjectUtil.notEqual(item.getMpsId(), existingMps.getId())) {
+                    saleOrderItemMapper.updateById(new ErpSaleOrderItemDO()
+                            .setId(item.getId())
+                            .setMpsId(existingMps.getId()));
                 }
-            } catch (Exception e) {
-                log.error("[createMpsForSaleOrder] 鍒涘缓 MPS 澶辫触锛宻aleOrderItemId={}", item.getId(), e);
+                reusedCount++;
+                log.info("[createMpsForSaleOrder] 閿�鍞鍗曟槑缁�({}) 宸插瓨鍦ㄦ湁鏁� MPS({})锛岃烦杩囬噸澶嶅垱寤�",
+                        item.getId(), existingMps.getId());
+                continue;
             }
+
+            // 涓庨攢鍞鍗曞鏍稿叡鐢ㄤ簨鍔★紱浠讳竴鏄庣粏鍒涘缓澶辫触閮戒細鍥炴粴瀹℃牳鐘舵�佸拰鏈宸插垱寤虹殑 MPS
+            Long mpsId = createMpsForSaleOrderItem(saleOrder, item);
+            saleOrderItemMapper.updateById(new ErpSaleOrderItemDO()
+                    .setId(item.getId())
+                    .setMpsId(mpsId));
+            createdCount++;
         }
-        log.info("[createMpsForSaleOrder] 閿�鍞鍗�({}) 瀹℃牳瀹屾垚锛屽垱寤� MPS {} 鏉�", orderId, mpsCount);
+        log.info("[createMpsForSaleOrder] 閿�鍞鍗�({}) 瀹℃牳瀹屾垚锛屽垱寤� MPS {} 鏉★紝澶嶇敤 MPS {} 鏉�",
+                orderId, createdCount, reusedCount);
     }
 
     /**

--
Gitblit v1.9.3