From eccad5a129106377a275be4f7cdc58e99e9b95d4 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期二, 21 七月 2026 13:45:14 +0800
Subject: [PATCH] feat(mes): 实现库存移库功能

---
 yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/sale/ErpSaleOrderController.java |   51 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 51 insertions(+), 0 deletions(-)

diff --git a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/sale/ErpSaleOrderController.java b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/sale/ErpSaleOrderController.java
index 34a8891..488e818 100644
--- a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/sale/ErpSaleOrderController.java
+++ b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/sale/ErpSaleOrderController.java
@@ -18,6 +18,8 @@
 import cn.iocoder.yudao.module.erp.service.sale.ErpSaleOrderService;
 import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi;
 import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO;
+import cn.iocoder.yudao.module.mes.api.mps.MesProMpsApi;
+import cn.iocoder.yudao.module.mes.api.salesnotice.MesWmSalesNoticeApi;
 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
 import io.swagger.v3.oas.annotations.Operation;
@@ -55,6 +57,10 @@
     private MdmItemApi mdmItemApi;
     @Resource
     private AdminUserApi adminUserApi;
+    @Resource
+    private MesWmSalesNoticeApi salesNoticeApi;
+    @Resource
+    private MesProMpsApi mpsApi;
 
     @PostMapping("/create")
     @Operation(summary = "鍒涘缓閿�鍞鍗�")
@@ -165,6 +171,43 @@
         // 1.4 绠$悊鍛樹俊鎭�
         Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
                 convertSet(pageResult.getList(), saleOrder -> Long.parseLong(saleOrder.getCreator())));
+        // 1.5 鍙戣揣閫氱煡鍗曚俊鎭�
+        Map<Long, Boolean> salesNoticeMap = salesNoticeApi.checkSalesNoticeBySaleOrderIds(
+                convertSet(pageResult.getList(), ErpSaleOrderDO::getId));
+        // 1.6 妫�鏌ユ槸鍚﹀彲浠ョ敓鎴愬彂璐ч�氱煡鍗曪紙闇�瑕佺敓浜х殑鏄庣粏瀵瑰簲鐨� MPS 鏄惁宸插畬鎴愶級
+        // 绛涢�夊嚭闇�瑕佺敓浜х殑鏄庣粏ID
+        List<Long> needProductionItemIds = saleOrderItemList.stream()
+                .filter(item -> item.getNeedProduction() != null && item.getNeedProduction() == 1)
+                .map(ErpSaleOrderItemDO::getId)
+                .toList();
+        Map<Long, Boolean> canCreateSalesNoticeMap = new java.util.HashMap<>();
+        if (!needProductionItemIds.isEmpty()) {
+            // 鎸夎鍗曞垎缁勬槑缁咺D
+            Map<Long, List<Long>> orderItemIdsMap = new java.util.HashMap<>();
+            for (ErpSaleOrderItemDO item : saleOrderItemList) {
+                orderItemIdsMap.computeIfAbsent(item.getOrderId(), k -> new java.util.ArrayList<>())
+                        .add(item.getId());
+            }
+            // 妫�鏌ユ瘡涓鍗�
+            for (Map.Entry<Long, List<Long>> entry : orderItemIdsMap.entrySet()) {
+                List<Long> itemIds = entry.getValue().stream()
+                        .filter(id -> {
+                            ErpSaleOrderItemDO item = saleOrderItemList.stream()
+                                    .filter(i -> i.getId().equals(id))
+                                    .findFirst().orElse(null);
+                            return item != null && item.getNeedProduction() != null && item.getNeedProduction() == 1;
+                        }
+                ).toList();
+                if (itemIds.isEmpty()) {
+                    canCreateSalesNoticeMap.put(entry.getKey(), true);
+                } else {
+                    canCreateSalesNoticeMap.put(entry.getKey(), mpsApi.checkCanCreateSalesNotice(itemIds));
+                }
+            }
+        } else {
+            // 娌℃湁闇�瑕佺敓浜х殑鏄庣粏锛岄兘鍙互鐢熸垚鍙戣揣閫氱煡鍗�
+            pageResult.getList().forEach(order -> canCreateSalesNoticeMap.put(order.getId(), true));
+        }
         // 2. 寮�濮嬫嫾鎺�
         return BeanUtils.toBean(pageResult, ErpSaleOrderRespVO.class, saleOrder -> {
             saleOrder.setItems(BeanUtils.toBean(saleOrderItemMap.get(saleOrder.getId()), ErpSaleOrderRespVO.Item.class,
@@ -173,6 +216,14 @@
             saleOrder.setProductNames(CollUtil.join(saleOrder.getItems(), "锛�", ErpSaleOrderRespVO.Item::getProductName));
             MapUtils.findAndThen(customerMap, saleOrder.getCustomerId(), supplier -> saleOrder.setCustomerName(supplier.getName()));
             MapUtils.findAndThen(userMap, Long.parseLong(saleOrder.getCreator()), user -> saleOrder.setCreatorName(user.getNickname()));
+            // 璁剧疆鏄惁宸茬敓鎴愬彂璐ч�氱煡鍗�
+            saleOrder.setHasSalesNotice(salesNoticeMap.getOrDefault(saleOrder.getId(), false));
+            // 璁剧疆鏄惁鍙互鐢熸垚鍙戣揣閫氱煡鍗曪細宸茬敓鎴愬彂璐ч�氱煡鍗曟椂涓嶆樉绀烘寜閽�
+            saleOrder.setCanCreateSalesNotice(!saleOrder.getHasSalesNotice() && canCreateSalesNoticeMap.getOrDefault(saleOrder.getId(), true));
+            // 璁剧疆鏄惁鏈夐渶瑕佺敓浜х殑鏄庣粏
+            boolean hasNeedProduction = saleOrder.getItems().stream()
+                    .anyMatch(item -> item.getNeedProduction() != null && item.getNeedProduction() == 1);
+            saleOrder.setNeedProduction(hasNeedProduction ? 1 : 0);
         });
     }
 

--
Gitblit v1.9.3