From dd637406e18a7afbf08d323c6ece913fe545b7ad Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期三, 28 十月 2026 18:11:32 +0800
Subject: [PATCH] feat(mes): 增加盘号追溯功能和销售退货单优化
---
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineServiceImpl.java | 40 +++++++++++++++++++++++++++++++++++-----
1 files changed, 35 insertions(+), 5 deletions(-)
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineServiceImpl.java
index d56b908..c80507d 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineServiceImpl.java
@@ -2,16 +2,21 @@
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.iocoder.yudao.module.erp.api.sale.ErpSaleOrderApi;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.line.MesWmReturnSalesLinePageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.line.MesWmReturnSalesLineSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.mdm.MesMdmItemDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesLineDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesDO;
import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnsales.MesWmReturnSalesLineMapper;
+import cn.iocoder.yudao.module.mes.dal.mysql.wm.productsales.MesWmProductSalesDetailMapper;
import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum;
import cn.iocoder.yudao.module.mes.enums.wm.MesWmReturnSalesStatusEnum;
+import cn.iocoder.yudao.module.mes.enums.wm.MesWmProductSalesStatusEnum;
import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService;
import jakarta.annotation.Resource;
@@ -26,6 +31,8 @@
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.MD_ITEM_BATCH_REQUIRED;
import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_RETURN_SALES_LINE_NOT_EXISTS;
+import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_RETURN_SALES_REEL_MISMATCH;
+import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_RETURN_SALES_BATCH_NOT_SHIPPED;
/**
* MES 閿�鍞��璐у崟琛� Service 瀹炵幇绫�
@@ -46,6 +53,10 @@
private MesMdmItemService mdmItemService;
@Resource
private MesWmBatchService batchService;
+ @Resource
+ private ErpSaleOrderApi saleOrderApi;
+ @Resource
+ private MesWmProductSalesDetailMapper productSalesDetailMapper;
@Resource
@Lazy
private MesWmReturnSalesDetailService returnSalesDetailService;
@@ -82,9 +93,27 @@
*/
private void validateLineSaveData(MesWmReturnSalesLineSaveReqVO reqVO) {
// 鏍¢獙閫�璐у崟瀛樺湪 + 鑽夌鐘舵��
- returnSalesService.validateReturnSalesExistsAndPrepare(reqVO.getReturnId());
+ MesWmReturnSalesDO returnSales = returnSalesService.validateReturnSalesExistsAndPrepare(reqVO.getReturnId());
// 鏍¢獙鐗╂枡瀛樺湪 + 鎵规绠$悊
- validateItemBatchManagement(reqVO.getReturnId(), reqVO.getItemId(), reqVO.getBatchId());
+ MesWmBatchDO batch = validateItemBatchManagement(returnSales, reqVO.getItemId(), reqVO.getBatchId());
+ if (batch != null) {
+ reqVO.setBatchCode(batch.getCode());
+ }
+ if (returnSales.getSaleOrderId() != null) {
+ var items = saleOrderApi.getSaleOrderItemList(returnSales.getSaleOrderId()).getCheckedData();
+ var reelNumbers = items.stream().filter(item -> Objects.equals(reqVO.getItemId(), item.getProductId()))
+ .map(item -> item.getReelNo()).filter(StrUtil::isNotBlank).toList();
+ if (!reelNumbers.isEmpty() && (batch == null || !reelNumbers.contains(batch.getReelNo())
+ || (StrUtil.isNotBlank(batch.getSalesOrderCode())
+ && !Objects.equals(returnSales.getSalesOrderCode(), batch.getSalesOrderCode())))) {
+ throw exception(WM_RETURN_SALES_REEL_MISMATCH);
+ }
+ if (!reelNumbers.isEmpty() && productSalesDetailMapper.countFinishedSaleBatch(
+ returnSales.getSaleOrderId(), reqVO.getItemId(), batch.getId(),
+ MesWmProductSalesStatusEnum.FINISHED.getStatus()) == 0) {
+ throw exception(WM_RETURN_SALES_BATCH_NOT_SHIPPED);
+ }
+ }
}
@Override
@@ -154,7 +183,7 @@
* @param itemId 鐗╂枡ID
* @param batchId 鎵规ID
*/
- private void validateItemBatchManagement(Long returnId, Long itemId, Long batchId) {
+ private MesWmBatchDO validateItemBatchManagement(MesWmReturnSalesDO returnSales, Long itemId, Long batchId) {
MesMdmItemDO item = mdmItemService.validateItemExistsAndEnable(itemId);
// 濡傛灉鐗╂枡鍚敤浜嗘壒娆$鐞嗭紝鍒欏繀椤婚�夋嫨鎵规
if (Boolean.TRUE.equals(item.getIsBatchManaged()) && batchId == null) {
@@ -163,9 +192,9 @@
// 鏍¢獙鎵规瀛樺湪涓斿睘浜庡綋鍓嶇墿鏂欏拰瀹㈡埛
if (batchId != null) {
// 浠庣埗鍗曡幏鍙栧鎴稩D锛屾牎楠屾壒娆″綊灞�
- MesWmReturnSalesDO returnSales = returnSalesService.validateReturnSalesExistsAndPrepare(returnId);
- batchService.validateBatchExists(batchId, itemId, returnSales.getClientId(), null);
+ return batchService.validateBatchExists(batchId, itemId, returnSales.getClientId(), null);
}
+ return null;
}
@Override
@@ -192,6 +221,7 @@
.setItemId(sourceLine.getItemId())
.setQuantity(unqualifiedQuantity)
.setBatchId(sourceLine.getBatchId())
+ .setBatchCode(sourceLine.getBatchCode())
.setRqcId(sourceLine.getRqcId())
.setRqcCheckFlag(sourceLine.getRqcCheckFlag())
.setQualityStatus(MesWmQualityStatusEnum.FAIL.getStatus())
--
Gitblit v1.9.3