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