From d54fbc9d4f8981fa0f7f613b33a28a8cd4f764ea Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期日, 25 十月 2026 16:29:53 +0800
Subject: [PATCH] feat(system): 优化用户搜索功能并完善ERP和MES模块验证逻辑

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesServiceImpl.java |  121 +++++++++++++++++++++++++++++++++++-----
 1 files changed, 105 insertions(+), 16 deletions(-)

diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesServiceImpl.java
index 3435611..edc9074 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesServiceImpl.java
@@ -1,12 +1,17 @@
 package cn.iocoder.yudao.module.mes.service.wm.returnsales;
 
 import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 
 import cn.hutool.core.util.ObjUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
+import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.MesWmReturnSalesImportExcelVO;
+import cn.iocoder.yudao.module.mes.api.event.MesReturnSalesProgressEvent;
+import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.MesWmReturnSalesImportRespVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.MesWmReturnSalesPageReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.MesWmReturnSalesSaveReqVO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.mdm.MesMdmItemDO;
@@ -24,13 +29,17 @@
 import cn.iocoder.yudao.module.mes.service.wm.transaction.dto.MesWmTransactionSaveReqDTO;
 import jakarta.annotation.Resource;
 import org.springframework.stereotype.Service;
+import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
 
 import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.Collections;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.atomic.AtomicInteger;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
@@ -39,7 +48,7 @@
 /**
  * MES 閿�鍞��璐у崟 Service 瀹炵幇绫�
  *
- * @author 鑺嬮亾婧愮爜
+ * @author 瓒呯骇绠$悊鍛�
  */
 @Service
 @Validated
@@ -58,6 +67,8 @@
     private MesMdmItemService mdmItemService;
     @Resource
     private MesWmTransactionService wmTransactionService;
+    @Resource
+    private ApplicationEventPublisher eventPublisher;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -67,6 +78,7 @@
 
         // 2. 鎻掑叆涓昏〃
         MesWmReturnSalesDO returnSales = BeanUtils.toBean(createReqVO, MesWmReturnSalesDO.class);
+        returnSales.setAfterSaleReturnId(createReqVO.getAfterSaleReturnId());
         returnSales.setStatus(MesWmReturnSalesStatusEnum.PREPARE.getStatus());
         returnSalesMapper.insert(returnSales);
         return returnSales.getId();
@@ -76,12 +88,16 @@
     @Transactional(rollbackFor = Exception.class)
     public void updateReturnSales(MesWmReturnSalesSaveReqVO updateReqVO) {
         // 1.1 鏍¢獙瀛樺湪 + 鍑嗗涓姸鎬�
-        validateReturnSalesExistsAndPrepare(updateReqVO.getId());
+        MesWmReturnSalesDO existing = validateReturnSalesExistsAndPrepare(updateReqVO.getId());
+        if (existing.getAfterSaleReturnId() != null) {
+            throw exception(WM_RETURN_SALES_AFTERSALE_LINKED);
+        }
         // 1.2 鏍¢獙鍏宠仈鏁版嵁
         validateSaveData(updateReqVO);
 
         // 2. 鏇存柊涓昏〃
         MesWmReturnSalesDO updateObj = BeanUtils.toBean(updateReqVO, MesWmReturnSalesDO.class);
+        updateObj.setAfterSaleReturnId(null); // 鏉ユ簮鐢宠涓嶅彲閫氳繃缂栬緫鎺ュ彛鏀圭粦
         returnSalesMapper.updateById(updateObj);
     }
 
@@ -89,7 +105,10 @@
     @Transactional(rollbackFor = Exception.class)
     public void deleteReturnSales(Long id) {
         // 1. 鏍¢獙瀛樺湪 + 鍑嗗涓姸鎬�
-        validateReturnSalesExistsAndPrepare(id);
+        MesWmReturnSalesDO returnSales = validateReturnSalesExistsAndPrepare(id);
+        if (returnSales.getAfterSaleReturnId() != null) {
+            throw exception(WM_RETURN_SALES_AFTERSALE_LINKED);
+        }
 
         // 2.1 绾ц仈鍒犻櫎鏄庣粏
         returnSalesDetailService.deleteReturnSalesDetailByReturnId(id);
@@ -127,8 +146,13 @@
         Integer targetStatus = hasPendingQc ? MesWmReturnSalesStatusEnum.CONFIRMED.getStatus()
                 : MesWmReturnSalesStatusEnum.APPROVING.getStatus();
         // 2.2 鎻愪氦锛堣崏绋� -> 寰呮楠�/寰呮墽琛岋級
-        returnSalesMapper.updateById(new MesWmReturnSalesDO()
-                .setId(id).setStatus(targetStatus));
+        if (updateStatusIfCurrent(id, MesWmReturnSalesStatusEnum.PREPARE.getStatus(), targetStatus) != 1) {
+            throw exception(WM_RETURN_SALES_STATUS_NOT_PREPARE);
+        }
+        if (!hasPendingQc && validateReturnSalesExists(id).getAfterSaleReturnId() != null) {
+            eventPublisher.publishEvent(new MesReturnSalesProgressEvent(id,
+                    MesReturnSalesProgressEvent.Stage.QUALITY_FINISHED, "鍏嶆"));
+        }
     }
 
     @Override
@@ -145,8 +169,10 @@
             throw exception(WM_RETURN_SALES_NO_LINE);
         }
         // 2. 鎵ц閫�璐э紙寰呮墽琛� -> 寰呬笂鏋讹級
-        returnSalesMapper.updateById(new MesWmReturnSalesDO()
-                .setId(id).setStatus(MesWmReturnSalesStatusEnum.APPROVED.getStatus()));
+        if (updateStatusIfCurrent(id, MesWmReturnSalesStatusEnum.APPROVING.getStatus(),
+                MesWmReturnSalesStatusEnum.APPROVED.getStatus()) != 1) {
+            throw exception(WM_RETURN_SALES_STATUS_NOT_APPROVING);
+        }
     }
 
     @Override
@@ -178,12 +204,16 @@
             }
         }
 
-        // 2. 閬嶅巻鎵�鏈夋槑缁嗭紝鍒涘缓搴撳瓨浜嬪姟锛堝鍔犲簱瀛� + 璁板綍娴佹按锛�
+        // 鎶㈠崰鐘舵�佸悗鍐嶈搴撳瓨娴佹按锛岄伩鍏嶄袱涓苟鍙戜笂鏋惰姹傞噸澶嶅叆搴擄紱浜嬪姟澶辫触浼氬洖婊氱姸鎬併��
+        if (updateStatusIfCurrent(id, MesWmReturnSalesStatusEnum.APPROVED.getStatus(),
+                MesWmReturnSalesStatusEnum.FINISHED.getStatus()) != 1) {
+            throw exception(WM_RETURN_SALES_STATUS_NOT_APPROVED);
+        }
         createTransactionList(returnSales);
-
-        // 3. 鏇存柊閫�璐у崟鐘舵��
-        returnSalesMapper.updateById(new MesWmReturnSalesDO()
-                .setId(id).setStatus(MesWmReturnSalesStatusEnum.FINISHED.getStatus()));
+        if (returnSales.getAfterSaleReturnId() != null) {
+            eventPublisher.publishEvent(new MesReturnSalesProgressEvent(id,
+                    MesReturnSalesProgressEvent.Stage.INBOUND_FINISHED, null));
+        }
     }
 
     private void createTransactionList(MesWmReturnSalesDO returnSales) {
@@ -210,8 +240,13 @@
         }
 
         // 鍙栨秷
-        returnSalesMapper.updateById(new MesWmReturnSalesDO()
-                .setId(id).setStatus(MesWmReturnSalesStatusEnum.CANCELED.getStatus()));
+        if (updateStatusIfCurrent(id, returnSales.getStatus(), MesWmReturnSalesStatusEnum.CANCELED.getStatus()) != 1) {
+            throw exception(WM_RETURN_SALES_CANCEL_NOT_ALLOWED);
+        }
+        if (returnSales.getAfterSaleReturnId() != null) {
+            eventPublisher.publishEvent(new MesReturnSalesProgressEvent(id,
+                    MesReturnSalesProgressEvent.Stage.CANCELED, null));
+        }
     }
 
     @Override
@@ -251,8 +286,16 @@
 
     @Override
     public void updateReturnSalesStatus(Long id, Integer status) {
-        validateReturnSalesExists(id);
-        returnSalesMapper.updateById(new MesWmReturnSalesDO().setId(id).setStatus(status));
+        if (updateStatusIfCurrent(id, MesWmReturnSalesStatusEnum.CONFIRMED.getStatus(), status) != 1) {
+            throw exception(WM_RETURN_SALES_RQC_SOURCE_INVALID);
+        }
+    }
+
+    private int updateStatusIfCurrent(Long id, Integer currentStatus, Integer targetStatus) {
+        return returnSalesMapper.update(null, new LambdaUpdateWrapper<MesWmReturnSalesDO>()
+                .eq(MesWmReturnSalesDO::getId, id)
+                .eq(MesWmReturnSalesDO::getStatus, currentStatus)
+                .set(MesWmReturnSalesDO::getStatus, targetStatus));
     }
 
     /**
@@ -276,4 +319,50 @@
         customerApi.validateCustomer(reqVO.getClientId());
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public MesWmReturnSalesImportRespVO importReturnSalesList(List<MesWmReturnSalesImportExcelVO> importList, boolean updateSupport) {
+        if (CollUtil.isEmpty(importList)) {
+            throw exception(WM_RETURN_SALES_IMPORT_LIST_IS_EMPTY);
+        }
+        MesWmReturnSalesImportRespVO respVO = MesWmReturnSalesImportRespVO.builder()
+                .createCodes(new ArrayList<>()).updateCodes(new ArrayList<>())
+                .failureCodes(new LinkedHashMap<>()).build();
+        AtomicInteger index = new AtomicInteger(1);
+        importList.forEach(importItem -> {
+            int currentIndex = index.getAndIncrement();
+            String code = importItem.getCode();
+            String key = StrUtil.blankToDefault(code, "绗� " + currentIndex + " 琛�");
+            if (StrUtil.isBlank(code)) {
+                respVO.getFailureCodes().put(key, "鍗曞彿涓嶈兘涓虹┖");
+                return;
+            }
+            if (StrUtil.isBlank(importItem.getName())) {
+                respVO.getFailureCodes().put(key, "鍚嶇О涓嶈兘涓虹┖");
+                return;
+            }
+            MesWmReturnSalesDO existing = returnSalesMapper.selectByCode(code);
+            if (existing != null && updateSupport) {
+                if (!MesWmReturnSalesStatusEnum.PREPARE.getStatus().equals(existing.getStatus())) {
+                    respVO.getFailureCodes().put(key, "鍗曟嵁闈炶崏绋跨姸鎬侊紝涓嶅厑璁歌鐩栨洿鏂�");
+                    return;
+                }
+                MesWmReturnSalesDO updateObj = BeanUtils.toBean(importItem, MesWmReturnSalesDO.class);
+                updateObj.setId(existing.getId());
+                updateObj.setStatus(existing.getStatus());
+                returnSalesMapper.updateById(updateObj);
+                respVO.getUpdateCodes().add(code);
+            } else if (existing != null) {
+                respVO.getFailureCodes().put(key, "鍗曞彿宸插瓨鍦細" + code);
+            } else {
+                MesWmReturnSalesDO createObj = BeanUtils.toBean(importItem, MesWmReturnSalesDO.class);
+                createObj.setId(null);
+                createObj.setStatus(MesWmReturnSalesStatusEnum.PREPARE.getStatus());
+                returnSalesMapper.insert(createObj);
+                respVO.getCreateCodes().add(code);
+            }
+        });
+        return respVO;
+    }
+
 }

--
Gitblit v1.9.3