From a57dceb3e6bc02e28a86f4de66f593706452c2b4 Mon Sep 17 00:00:00 2001
From: xiaoyi <908147524@qq.com>
Date: 星期六, 07 十一月 2026 14:53:09 +0800
Subject: [PATCH] refactor: 需求10/23 改为基于 ERP 实现,修正此前 ERP 可用性误判

---
 yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/service/cancellation/AfterSaleCancellationService.java |   70 ++++++++++++++++++++++++++---------
 1 files changed, 52 insertions(+), 18 deletions(-)

diff --git a/yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/service/cancellation/AfterSaleCancellationService.java b/yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/service/cancellation/AfterSaleCancellationService.java
index f7ea701..582bc7c 100644
--- a/yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/service/cancellation/AfterSaleCancellationService.java
+++ b/yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/service/cancellation/AfterSaleCancellationService.java
@@ -12,6 +12,7 @@
 import cn.iocoder.yudao.module.aftersales.dal.redis.no.AfterSaleNoRedisDAO;
 import cn.iocoder.yudao.module.aftersales.service.returnobj.AfterSaleReturnService;
 import cn.iocoder.yudao.module.crm.api.contract.CrmContractApi;
+import cn.iocoder.yudao.module.erp.api.sale.ErpSaleOrderApi;
 import jakarta.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.dao.DuplicateKeyException;
@@ -22,6 +23,7 @@
 import java.util.Objects;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.invalidParamException;
 import static cn.iocoder.yudao.module.aftersales.enums.ErrorCodeConstants.*;
 
 /**
@@ -53,6 +55,7 @@
     @Resource private AfterSaleNoRedisDAO noRedisDAO;
     @Resource private AfterSaleReturnService returnService;
     @Resource private CrmContractApi crmContractApi;
+    @Resource private ErpSaleOrderApi erpSaleOrderApi;
 
     public PageResult<AfterSaleCancellationDO> page(PageParam page, String code, String type,
                                                     Integer status, Long customerId) {
@@ -133,7 +136,10 @@
     }
 
     /**
-     * 瀹℃壒锛氶�氳繃鍚庢墽琛屼笅娓稿姩浣滐紱椹冲洖蹇呴』濉剰瑙併��
+     * 瀹℃壒锛氶┏鍥炲繀椤诲~鎰忚锛涢�氳繃鏃跺厛鎵ц涓嬫父鍔ㄤ綔锛屽叏閮ㄦ垚鍔熸墠钀藉鎵圭粨璁恒��
+     *
+     * <p>涓嬫父澶辫触锛堝閿�鍞鍗曚粛鏈夊叧鑱旂敓浜ц鍒掞級浼氭暣浣撳洖婊氾紝鍙楃悊鍗曚繚鎸併�屽緟瀹℃壒銆嶏紝
+     * 鐢辫皟鐢ㄦ柟鐪嬪埌鍏蜂綋鍘熷洜锛岄伩鍏嶅嚭鐜般�屽鎵归�氳繃浜嗕絾涓氬姟娌℃墽琛屻�嶇殑涓嶄竴鑷寸姸鎬併��
      *
      * @return 閫氳繃鏃剁敓鎴愮殑閫�璐у崟缂栧彿锛堥潪閫�璐х被鍨嬩负 null锛�
      */
@@ -146,27 +152,47 @@
         AfterSaleCancellationDO task = get(req.getId());
         if (!Objects.equals(task.getStatus(), ST_PENDING)) throw exception(CANCELLATION_APPROVE_FAIL_STATUS);
 
-        int target = Boolean.TRUE.equals(req.getApproved()) ? ST_APPROVED : ST_REJECTED;
+        // 椹冲洖锛氬彧鏀圭姸鎬侊紝涓嶆墽琛屼笅娓�
+        if (!Boolean.TRUE.equals(req.getApproved())) {
+            if (mapper.update(null, new LambdaUpdateWrapper<AfterSaleCancellationDO>()
+                    .eq(AfterSaleCancellationDO::getId, task.getId())
+                    .eq(AfterSaleCancellationDO::getStatus, ST_PENDING)
+                    .set(AfterSaleCancellationDO::getStatus, ST_REJECTED)
+                    .set(AfterSaleCancellationDO::getApproverId, userId)
+                    .set(AfterSaleCancellationDO::getApprovalTime, LocalDateTime.now())
+                    .set(AfterSaleCancellationDO::getApprovalRemark, req.getRemark())) != 1) {
+                throw exception(CANCELLATION_APPROVE_FAIL_STATUS);
+            }
+            return null;
+        }
+
+        // 閫氳繃锛氬厛鎵ц涓嬫父鍔ㄤ綔锛堝紓甯哥洿鎺ユ姏鍑猴紝浜嬪姟鍥炴粴锛屽崟鎹粛涓哄緟瀹℃壒锛�
+        Long returnId = executeDownstream(task, userId);
+
+        // 涓嬫父鎴愬姛鍚庡啀钀藉鎵圭粨璁�
         if (mapper.update(null, new LambdaUpdateWrapper<AfterSaleCancellationDO>()
                 .eq(AfterSaleCancellationDO::getId, task.getId())
                 .eq(AfterSaleCancellationDO::getStatus, ST_PENDING)
-                .set(AfterSaleCancellationDO::getStatus, target)
+                .set(AfterSaleCancellationDO::getStatus, ST_APPROVED)
                 .set(AfterSaleCancellationDO::getApproverId, userId)
                 .set(AfterSaleCancellationDO::getApprovalTime, LocalDateTime.now())
-                .set(AfterSaleCancellationDO::getApprovalRemark, req.getRemark())) != 1) {
+                .set(AfterSaleCancellationDO::getApprovalRemark, req.getRemark())
+                .set(AfterSaleCancellationDO::getExecuted, 1)) != 1) {
             throw exception(CANCELLATION_APPROVE_FAIL_STATUS);
         }
-
-        if (!Boolean.TRUE.equals(req.getApproved())) return null;
-        return executeDownstream(task, userId);
+        return returnId;
     }
 
-    /** 瀹℃壒閫氳繃鍚庣殑涓嬫父鍔ㄤ綔锛涘け璐ユ椂璁板綍鍘熷洜浣嗕笉鍥炴粴瀹℃壒缁撹锛屼究浜庝汉宸ヨˉ鍋氥�� */
+    /**
+     * 瀹℃壒閫氳繃鍚庣殑涓嬫父鍔ㄤ綔銆�
+     *
+     * <p>涓嶅悶寮傚父锛氫换涓�姝ュけ璐ョ洿鎺ユ姏鍑猴紝鐢� {@link #approve} 鐨勪簨鍔℃暣浣撳洖婊氾紝
+     * 淇濊瘉銆屽鎵归�氳繃銆嶄笌銆屼笅娓稿凡鎵ц銆嶆案杩滀竴鑷淬��
+     */
     private Long executeDownstream(AfterSaleCancellationDO task, Long userId) {
         Long returnId = null;
         String remark;
-        boolean ok = true;
-        try {
+        {
             switch (task.getType()) {
                 case "RETURN" -> {
                     var vo = new AfterSaleReturnSaveReqVO();
@@ -175,23 +201,31 @@
                     vo.setReturnType(task.getReturnType() == null ? 1 : task.getReturnType());
                     vo.setReturnReason(task.getReason());
                     returnId = returnService.createReturn(vo, userId);
-                    remark = "宸茬敓鎴愰��璐у崟 " + returnId;
+                    if (task.getSaleOrderId() != null) {
+                        erpSaleOrderApi.cancelSaleOrder(task.getSaleOrderId()).getCheckedData();
+                        remark = "宸茬敓鎴愰��璐у崟 " + returnId
+                                + "锛屽苟浣滃簾閿�鍞鍗� " + task.getSaleOrderId();
+                    } else {
+                        remark = "宸茬敓鎴愰��璐у崟 " + returnId;
+                    }
                 }
                 case "CONTRACT_TERMINATE" -> {
                     crmContractApi.updateContractStatus(task.getContractId(), CRM_CONTRACT_INVALID).getCheckedData();
-                    remark = "宸蹭綔搴� CRM 鍚堝悓 " + task.getContractId();
+                    // 鑻ュ叧鑱� ERP 閿�鍞鍗曪紝涓�骞朵綔搴燂紙浼氳鏈彇娑堢殑 MPS 璁″垝鎷︽埅锛�
+                    if (task.getSaleOrderId() != null) {
+                        erpSaleOrderApi.cancelSaleOrder(task.getSaleOrderId()).getCheckedData();
+                        remark = "宸蹭綔搴� CRM 鍚堝悓 " + task.getContractId()
+                                + "锛屽苟浣滃簾閿�鍞鍗� " + task.getSaleOrderId();
+                    } else {
+                        remark = "宸蹭綔搴� CRM 鍚堝悓 " + task.getContractId();
+                    }
                 }
                 case "CONTRACT_CHANGE" -> remark = "鍙樻洿鍙楃悊宸查�氳繃锛汣RM 鍚堝悓鍐呭璇锋寜闄勪欢鍚屾缁存姢";
-                default -> { ok = false; remark = "鏈煡鍙楃悊绫诲瀷锛�" + task.getType(); }
+                default -> throw invalidParamException("鏈煡鍙楃悊绫诲瀷锛�" + task.getType());
             }
-        } catch (Exception e) {
-            ok = false;
-            remark = "涓嬫父鎵ц澶辫触锛�" + e.getMessage();
-            log.warn("閫�鍗曞彈鐞哰{}]涓嬫父鍔ㄤ綔澶辫触锛歿}", task.getCode(), e.getMessage());
         }
         var update = new AfterSaleCancellationDO();
         update.setId(task.getId());
-        update.setExecuted(ok ? 1 : 0);
         update.setExecuteRemark(remark);
         if (returnId != null) update.setReturnId(returnId);
         mapper.updateById(update);

--
Gitblit v1.9.3