From 67c5d3ea86cfaad45c0150b96949dbcb6729b4d0 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期一, 13 七月 2026 11:58:11 +0800
Subject: [PATCH] 1.仓储物流-库存可用量管理

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesServiceImpl.java |   29 ++++++++++++++++++++++++-----
 1 files changed, 24 insertions(+), 5 deletions(-)

diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesServiceImpl.java
index 1694b78..baec481 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesServiceImpl.java
@@ -18,10 +18,12 @@
 import cn.iocoder.yudao.module.mes.enums.wm.MesWmProductSalesStatusEnum;
 import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum;
 import cn.iocoder.yudao.module.mes.enums.wm.MesWmSalesNoticeStatusEnum;
+import cn.iocoder.yudao.module.mes.enums.wm.MesWmStockReserveBizTypeEnum;
 import cn.iocoder.yudao.module.mes.enums.wm.MesWmTransactionTypeEnum;
 import cn.iocoder.yudao.module.mes.service.md.client.MesMdClientService;
 import cn.iocoder.yudao.module.mes.service.wm.materialstock.MesWmMaterialStockService;
 import cn.iocoder.yudao.module.mes.service.wm.salesnotice.MesWmSalesNoticeService;
+import cn.iocoder.yudao.module.mes.service.wm.stockreserve.MesWmStockReserveService;
 import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService;
 import cn.iocoder.yudao.module.mes.service.wm.transaction.dto.MesWmTransactionSaveReqDTO;
 import cn.iocoder.yudao.module.erp.api.sale.ErpSaleOrderApi;
@@ -61,6 +63,8 @@
     private MesWmTransactionService wmTransactionService;
     @Resource
     private MesWmMaterialStockService materialStockService;
+    @Resource
+    private MesWmStockReserveService stockReserveService;
 
     @Resource
     private ErpSaleOrderApi saleOrderApi;
@@ -181,7 +185,7 @@
             if (CollUtil.isEmpty(details)) {
                 throw exception(WM_PRODUCT_SALES_DETAILS_EMPTY);
             }
-            // 鏍¢獙搴撳瓨鍏呰冻
+            // 鏍¢獙搴撳瓨鍏呰冻骞跺垱寤哄崰鐢�
             for (MesWmProductSalesDetailDO detail : details) {
                 materialStockService.validateSelectedStock(
                         detail.getMaterialStockId(),
@@ -191,6 +195,16 @@
                         detail.getWarehouseId(),
                         detail.getLocationId(),
                         detail.getAreaId(),
+                        detail.getQuantity()
+                );
+                // 鍒涘缓搴撳瓨鍗犵敤
+                stockReserveService.createReserve(
+                        detail.getMaterialStockId(),
+                        MesWmStockReserveBizTypeEnum.PRODUCT_SALES.getType(),
+                        id,
+                        sales.getCode(),
+                        detail.getId(),
+                        detail.getItemId(),
                         detail.getQuantity()
                 );
             }
@@ -227,19 +241,22 @@
             throw exception(WM_PRODUCT_SALES_CANNOT_FINISH);
         }
 
-        // 2. 閬嶅巻鎵�鏈夋槑缁嗭紝鍒涘缓搴撳瓨浜嬪姟锛堟墸鍑忓簱瀛� + 璁板綍娴佹按锛�
+        // 2. 纭鍗犵敤杞嚭搴擄紙閲婃斁鍗犵敤閲忥級
+        stockReserveService.confirmReserveToOutbound(MesWmStockReserveBizTypeEnum.PRODUCT_SALES.getType(), id);
+
+        // 3. 閬嶅巻鎵�鏈夋槑缁嗭紝鍒涘缓搴撳瓨浜嬪姟锛堟墸鍑忓簱瀛� + 璁板綍娴佹按锛�
         createTransactionList(sales);
 
-        // 3. 鏇存柊鍑哄簱鍗曠姸鎬�
+        // 4. 鏇存柊鍑哄簱鍗曠姸鎬�
         productSalesMapper.updateById(new MesWmProductSalesDO()
                 .setId(id).setStatus(MesWmProductSalesStatusEnum.FINISHED.getStatus()));
 
-        // 4. 鏇存柊鍏宠仈鐨勫彂璐ч�氱煡鍗曠姸鎬�
+        // 5. 鏇存柊鍏宠仈鐨勫彂璐ч�氱煡鍗曠姸鎬�
         if (sales.getNoticeId() != null) {
             salesNoticeService.finishSalesNotice(sales.getNoticeId());
         }
 
-        // 5. 鍥炲啓 ERP 閿�鍞鍗曠殑鍑哄簱鏁伴噺鍜岀姸鎬�
+        // 6. 鍥炲啓 ERP 閿�鍞鍗曠殑鍑哄簱鏁伴噺鍜岀姸鎬�
         updateErpSaleOrderOutCount(sales);
     }
 
@@ -296,6 +313,8 @@
                 MesWmProductSalesStatusEnum.CANCELED.getStatus())) {
             throw exception(WM_PRODUCT_SALES_CANNOT_CANCEL);
         }
+        // 閲婃斁搴撳瓨鍗犵敤
+        stockReserveService.releaseReserve(MesWmStockReserveBizTypeEnum.PRODUCT_SALES.getType(), id);
         // 鍙栨秷
         productSalesMapper.updateById(new MesWmProductSalesDO()
                 .setId(id).setStatus(MesWmProductSalesStatusEnum.CANCELED.getStatus()));

--
Gitblit v1.9.3