From 14c80fbd16a51a355138345ecf69df9ca37746bf Mon Sep 17 00:00:00 2001
From: xiaoyi <908147524@qq.com>
Date: 星期五, 06 十一月 2026 09:18:32 +0800
Subject: [PATCH] 完善售后退货联动和订单作废保护

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeServiceImpl.java |   30 +++++++++++++++++++++++-------
 1 files changed, 23 insertions(+), 7 deletions(-)

diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeServiceImpl.java
index 0c03975..1314265 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeServiceImpl.java
@@ -66,7 +66,9 @@
     private MesWmSalesNoticeLineMapper salesNoticeLineMapper;
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public Long createSalesNotice(MesWmSalesNoticeSaveReqVO createReqVO) {
+        lockReferencedSaleOrder(createReqVO, null);
         // 鏍¢獙鏁版嵁
         validateSalesNoticeSave(createReqVO);
 
@@ -78,9 +80,11 @@
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public void updateSalesNotice(MesWmSalesNoticeSaveReqVO updateReqVO) {
         // 鏍¢獙瀛樺湪 + 鑽夌鐘舵��
-        validateSalesNoticeExistsAndDraft(updateReqVO.getId());
+        MesWmSalesNoticeDO existing = validateSalesNoticeExistsAndDraft(updateReqVO.getId());
+        lockReferencedSaleOrder(updateReqVO, existing);
         // 鏍¢獙鏁版嵁
         validateSalesNoticeSave(updateReqVO);
 
@@ -170,6 +174,21 @@
         }
     }
 
+    /** 涓庤鍗曚綔搴熶娇鐢ㄥ悓涓�璁㈠崟琛岄攣锛涙敮鎸佸巻鍙茶姹備粎浼犺鍗曞彿銆� */
+    private void lockReferencedSaleOrder(MesWmSalesNoticeSaveReqVO request, MesWmSalesNoticeDO existing) {
+        Long orderId = request.getSaleOrderId();
+        String orderNo = request.getSaleOrderCode();
+        if (orderId == null && (orderNo == null || orderNo.isBlank()) && existing != null) {
+            orderId = existing.getSaleOrderId();
+            orderNo = existing.getSaleOrderCode();
+        }
+        if (orderId == null && (orderNo == null || orderNo.isBlank())) return;
+        ErpSaleOrderRespDTO order = saleOrderApi.lockSaleOrderForNotice(orderId, orderNo).getCheckedData();
+        if (order == null) throw exception(WM_SALES_NOTICE_SALE_ORDER_NOT_EXISTS);
+        request.setSaleOrderId(order.getId());
+        request.setSaleOrderCode(order.getNo());
+    }
+
     private void validateNoticeCodeUnique(Long id, String code) {
         MesWmSalesNoticeDO notice = salesNoticeMapper.selectByCode(code);
         if (notice == null) {
@@ -183,16 +202,13 @@
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Long generateSalesNoticeFromSaleOrder(Long saleOrderId) {
+        // 鍏堥攣瀹氳鍗曪紝鍐嶆鏌ラ�氱煡锛涗笌璁㈠崟浣滃簾涓茶鎵ц銆�
+        ErpSaleOrderRespDTO saleOrder = saleOrderApi.lockSaleOrderForNotice(saleOrderId, null).getCheckedData();
+        if (saleOrder == null) throw exception(WM_SALES_NOTICE_SALE_ORDER_NOT_EXISTS);
         // 1. 鏍¢獙鏄惁宸茬敓鎴愯繃鍙戣揣閫氱煡鍗曪紙闃叉閲嶅鐢熸垚锛�
         MesWmSalesNoticeDO existNotice = salesNoticeMapper.selectBySaleOrderId(saleOrderId);
         if (existNotice != null) {
             throw exception(WM_SALES_NOTICE_ALREADY_EXISTS);
-        }
-
-        // 2. 鑾峰彇閿�鍞鍗曚俊鎭�
-        ErpSaleOrderRespDTO saleOrder = saleOrderApi.getSaleOrder(saleOrderId).getCheckedData();
-        if (saleOrder == null) {
-            throw exception(WM_SALES_NOTICE_SALE_ORDER_NOT_EXISTS);
         }
 
         // 3. 鑾峰彇閿�鍞鍗曟槑缁�

--
Gitblit v1.9.3