From d39e4f7d839167c16425086dfa2f8747bccfdff9 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期四, 05 十一月 2026 17:39:01 +0800
Subject: [PATCH] feat: 打通销售采购财务闭环并完成累计业务优化
---
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineServiceImpl.java | 49 ++++++++++++++++++++++++++++++++++++++++++-------
1 files changed, 42 insertions(+), 7 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..35288c5 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,33 @@
*/
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);
+ }
+ // 鎵嬪伐鍏ュ簱鎵规鍙兘娌℃湁瀹㈡埛锛涗粎鍦ㄨ鍗曠洏鍙峰強宸插畬鎴愬嚭搴撻兘宸查獙璇佸悗鍏佽閫�璐с��
+ if (batch != null && (batch.getClientId() != null || reelNumbers.isEmpty())) {
+ batchService.validateBatchExists(batch.getId(), reqVO.getItemId(), returnSales.getClientId(), null);
+ }
+ } else if (batch != null) {
+ batchService.validateBatchExists(batch.getId(), reqVO.getItemId(), returnSales.getClientId(), null);
+ }
}
@Override
@@ -150,11 +185,11 @@
/**
* 鏍¢獙鐗╂枡鎵规绠$悊
*
- * @param returnId 閫�璐у崟ID
+ * @param returnSales 閫�璐у崟
* @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) {
@@ -162,10 +197,9 @@
}
// 鏍¢獙鎵规瀛樺湪涓斿睘浜庡綋鍓嶇墿鏂欏拰瀹㈡埛
if (batchId != null) {
- // 浠庣埗鍗曡幏鍙栧鎴稩D锛屾牎楠屾壒娆″綊灞�
- MesWmReturnSalesDO returnSales = returnSalesService.validateReturnSalesExistsAndPrepare(returnId);
- batchService.validateBatchExists(batchId, itemId, returnSales.getClientId(), null);
+ return batchService.validateBatchExists(batchId, itemId);
}
+ return null;
}
@Override
@@ -192,6 +226,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