From 2e84a447af471fe5ada907c28849838a6bc3a340 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期一, 13 七月 2026 17:58:41 +0800
Subject: [PATCH] 1.仓储物流-转移产品模块

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourcereceipt/MesWmOutsourceReceiptDetailController.java |   22 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/MesWmPackageLineController.java                    |   22 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java                     |   73 +
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/mdm/MesMdmItemService.java                                              |   60 +
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/materialstock/vo/MesWmMaterialStockAdjustReqVO.java         |   48 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productreceipt/MesWmProductReceiptLineServiceImpl.java               |    6 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnvendor/MesWmReturnVendorLineController.java           |   22 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productreceipt/MesWmProductReceiptController.java           |   22 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/task/MesWmStockTakingTaskLineController.java    |   22 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productsales/MesWmProductSalesDetailController.java         |   22 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/MesWmTransferLineController.java                   |   22 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnvendor/MesWmReturnVendorDetailController.java         |   22 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/packages/MesWmPackageLineServiceImpl.java                            |    6 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeServiceImpl.java                         |  149 ++
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/MesWmReturnSalesDetailController.java           |   22 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueLineServiceImpl.java               |    6 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeLineServiceImpl.java                     |    6 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourceissue/MesWmOutsourceIssueLineController.java       |   22 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/task/MesWmStockTakingTaskResultController.java  |   22 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productsales/MesWmProductSalesLineController.java           |   22 
 docs/SALES_SHIPMENT_OUT_API_SUMMARY.md                                                                                                     |  652 +++++++++++++
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmOutStatusEnum.java                                                |   31 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/MesWmReturnSalesLineController.java             |   22 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/sn/MesWmSnServiceImpl.java                                           |    6 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscissue/MesWmMiscIssueLineServiceImpl.java                         |    6 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesServiceImpl.java                         |    8 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/MesWmItemReceiptDetailController.java           |   22 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/MesWmSalesNoticeRespVO.java                  |    4 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productproduce/MesWmProductProduceLineController.java       |   22 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/MesWmArrivalNoticeLineController.java         |   22 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/MesWmSalesNoticeController.java                 |   12 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/salesnotice/MesWmSalesNoticeDO.java                           |   11 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineServiceImpl.java                     |   10 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnissue/MesWmReturnIssueDetailController.java           |   22 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesDetailServiceImpl.java                 |    6 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/MesWmMiscReceiptLineController.java             |   22 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java                                                   |    1 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/MesWmItemReceiptLineController.java             |   22 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/MesBizTypeConstants.java                                                  |    2 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/MesWmProductIssueLineController.java           |   22 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockService.java                         |    9 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transaction/MesWmTransactionServiceImpl.java                         |   10 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnissue/MesWmReturnIssueLineController.java             |   22 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productreceipt/MesWmProductReceiptDetailController.java     |   22 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/salesnotice/MesWmSalesNoticeLineDO.java                       |    4 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueServiceImpl.java                         |    8 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/mdm/MesMdmItemDO.java                                            |  211 ++++
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java                                                    |    1 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/MesWmSalesNoticePageReqVO.java               |    2 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/line/MesWmSalesNoticeLineRespVO.java         |    3 
 docs/sales_outbound_flow.md                                                                                                                |  293 +++++
 docs/material_stock_adjust.md                                                                                                              |  113 ++
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptLineServiceImpl.java           |    8 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueLineServiceImpl.java                     |    6 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/batch/MesWmBatchController.java                             |   22 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourceissue/MesWmOutsourceIssueDetailController.java     |   22 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesServiceImpl.java                       |   21 
 docs/sales_notice_to_product_sales.md                                                                                                      |  153 +++
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productreceipt/MesWmProductReceiptLineController.java       |   22 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptServiceImpl.java               |    8 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorLineServiceImpl.java                   |    6 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscissue/MesWmMiscIssueLineController.java                 |   22 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesLineServiceImpl.java                   |    6 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorDetailServiceImpl.java                 |    6 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/MesWmTransferDetailController.java                 |   22 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java                     |    4 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/MesWmProductIssueDetailController.java         |   22 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueDetailServiceImpl.java             |    6 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemconsume/MesWmItemConsumeLineController.java             |   22 
 .claude/settings.local.json                                                                                                                |    9 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscreceipt/MesWmMiscReceiptLineServiceImpl.java                     |    6 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/salesnotice/MesWmSalesNoticeMapper.java                            |    2 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchServiceImpl.java                                     |   10 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/MesWmPackageController.java                        |   14 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeService.java                             |   26 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourcereceipt/MesWmOutsourceReceiptLineController.java   |   22 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/mdm/MesMdmItemServiceImpl.java                                          |   60 +
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptDetailServiceImpl.java         |    6 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transfer/MesWmTransferLineServiceImpl.java                           |    6 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/MesWmSalesNoticeLineController.java             |   22 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/sn/MesWmSnController.java                                   |   29 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/mdm/MesMdmItemMapper.java                                             |   24 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeLineServiceImpl.java                 |    6 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/materialstock/MesWmMaterialStockController.java             |   30 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueLineServiceImpl.java                   |    6 
 85 files changed, 2,487 insertions(+), 410 deletions(-)

diff --git a/.claude/settings.local.json b/.claude/settings.local.json
index 085aed9..b89dd57 100644
--- a/.claude/settings.local.json
+++ b/.claude/settings.local.json
@@ -23,7 +23,14 @@
       "Bash(mysql *)",
       "mcp__designcomputer-mysql_mcp_server__execute_sql",
       "mcp__designcomputer-mysql_mcp_server__get_schema_info",
-      "mcp__designcomputer-mysql_mcp_server__get_table_sample"
+      "mcp__designcomputer-mysql_mcp_server__get_table_sample",
+      "Bash(mvn clean *)",
+      "Bash(python3)",
+      "Bash(cat)",
+      "Bash(chmod +x /tmp/fix_controller.sh)",
+      "Bash(/tmp/fix_controller.sh)",
+      "Bash(chmod +x /tmp/fix2.sh)",
+      "Bash(/tmp/fix2.sh)"
     ],
     "deny": [
       "Bash(rm -rf *)",
diff --git a/docs/SALES_SHIPMENT_OUT_API_SUMMARY.md b/docs/SALES_SHIPMENT_OUT_API_SUMMARY.md
new file mode 100644
index 0000000..f6aeb5b
--- /dev/null
+++ b/docs/SALES_SHIPMENT_OUT_API_SUMMARY.md
@@ -0,0 +1,652 @@
+# 閿�鍞彂璐у嚭搴撴祦绋� - API鎺ュ彛涓庡瓧娈垫眹鎬�
+
+## 娴佺▼鍥�
+
+```
+鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�    鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�    鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�    鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹�  閿�鍞鍗�   鈹傗攢鈹�鈹�>鈹� 鍙戣揣閫氱煡鍗�  鈹傗攢鈹�鈹�>鈹� 閿�鍞嚭搴撳崟  鈹傗攢鈹�鈹�>鈹�  鍑哄簱瀹屾垚   鈹�
+鈹� (ERP妯″潡)   鈹�    鈹�  (MES妯″潡)  鈹�    鈹�  (MES妯″潡)  鈹�    鈹�  鐘舵�佸洖鍐�   鈹�
+鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�    鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�    鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�    鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+       鈹�                  鈹�                  鈹�                  鈹�
+       鈻�                  鈻�                  鈻�                  鈻�
+  鍑哄簱鐘舵�佸悓姝�      鍑哄簱鐘舵�佸悓姝�       鎵ц鍑哄簱           鐘舵�佸洖鍐欎笂娓�
+```
+
+---
+
+## 涓�銆侀攢鍞鍗� (ERP妯″潡)
+
+**鏂囦欢璺緞锛�** `src/api/erp/sale/order/index.ts`
+
+### 鏌ヨ鎺ュ彛
+
+| 鏂规硶 | 璺緞 | 璇存槑 |
+|------|------|------|
+| GET | `/erp/sale-order/page` | 鍒嗛〉鏌ヨ |
+| GET | `/erp/sale-order/get?id={id}` | 璇︽儏鏌ヨ |
+| GET | `/erp/sale-order/item/list-by-order-id?orderId={orderId}` | 鏌ヨ璁㈠崟鏄庣粏鍒楄〃 |
+
+### 鎺ュ彛瀹氫箟
+
+```typescript
+export namespace ErpSaleOrderApi {
+  /** 閿�鍞鍗曚俊鎭� */
+  export interface SaleOrder {
+    id?: number;              // 璁㈠崟ID
+    no: string;               // 閿�鍞鍗曞彿
+    customerId: number;       // 瀹㈡埛ID
+    customerName?: string;    // 瀹㈡埛鍚嶇О
+    orderTime: Date;          // 璁㈠崟鏃堕棿
+    totalCount: number;       // 鍚堣鏁伴噺
+    totalPrice: number;       // 鍚堣閲戦
+    status: number;           // 鐘舵�侊細10-鏈鏍�, 20-宸插鏍�, 30-宸蹭綔搴�
+    outStatus?: number;       // 鍑哄簱鐘舵�侊細0-鏈嚭搴�, 1-閮ㄥ垎鍑哄簱, 2-鍏ㄩ儴鍑哄簱
+    outCount: number;         // 閿�鍞嚭搴撴暟閲�
+    inCount?: number;         // 閲囪喘鍏ュ簱鏁伴噺
+    returnCount: number;      // 閿�鍞��璐ф暟閲�
+    items?: SaleOrderItem[];  // 閿�鍞鍗曟槑缁�
+  }
+
+  /** 閿�鍞鍗曟槑缁� */
+  export interface SaleOrderItem {
+    id?: number;              // 鏄庣粏ID
+    seq?: number;             // 搴忓彿
+    orderId?: number;         // 璁㈠崟ID
+    productId?: number;       // 浜у搧ID
+    productName?: string;     // 浜у搧鍚嶇О
+    productBarCode?: string;  // 浜у搧鏉$爜
+    productUnitName?: string; // 鍗曚綅
+    productPrice?: number;    // 鍗曚环
+    count?: number;           // 鏁伴噺
+    outCount?: number;        // 鍑哄簱鏁伴噺
+    taxPercent?: number;      // 绋庣巼
+    taxPrice?: number;        // 绋庨
+    remark?: string;          // 澶囨敞
+  }
+}
+```
+
+### 鐘舵�佹灇涓�
+
+```typescript
+// 閿�鍞鍗曠姸鎬�
+const SaleOrderStatus = {
+  UN_AUDITED: 10,    // 鏈鏍�
+  AUDITED: 20,       // 宸插鏍�
+  CANCELLED: 30,     // 宸蹭綔搴�
+}
+
+// 閿�鍞鍗曞嚭搴撶姸鎬�
+const SaleOrderOutStatus = {
+  NONE: 0,           // 鏈嚭搴�
+  PARTIAL: 1,        // 閮ㄥ垎鍑哄簱
+  ALL: 2,            // 鍏ㄩ儴鍑哄簱
+}
+```
+
+---
+
+## 浜屻�佸彂璐ч�氱煡鍗� (MES妯″潡)
+
+**鏂囦欢璺緞锛�** `src/api/mes/wm/salesnotice/index.ts`
+
+### 鏌ヨ鎺ュ彛
+
+| 鏂规硶 | 璺緞 | 璇存槑 |
+|------|------|------|
+| GET | `/mes/wm/sales-notice/page` | 鍒嗛〉鏌ヨ |
+| GET | `/mes/wm/sales-notice/get?id={id}` | 璇︽儏鏌ヨ |
+| POST | `/mes/wm/sales-notice/create` | 鍒涘缓 |
+| PUT | `/mes/wm/sales-notice/update` | 淇敼 |
+| DELETE | `/mes/wm/sales-notice/delete?id={id}` | 鍒犻櫎 |
+| PUT | `/mes/wm/sales-notice/submit?id={id}` | 鎻愪氦 |
+| POST | `/mes/wm/sales-notice/generate-from-sale-order` | 浠庨攢鍞鍗曠敓鎴� |
+| POST | `/mes/wm/sales-notice/generate-product-sales` | 鐢熸垚閿�鍞嚭搴撳崟 |
+
+### 鎺ュ彛瀹氫箟
+
+```typescript
+export namespace MesWmSalesNoticeApi {
+  /** 鍙戣揣閫氱煡鍗� */
+  export interface SalesNotice {
+    id?: number;                    // 閫氱煡鍗旾D
+    code?: string;                  // 閫氱煡鍗曞彿
+    name?: string;                  // 閫氱煡鍗曞悕绉�
+    saleOrderId?: number;           // 閿�鍞鍗旾D
+    saleOrderCode?: string;         // 閿�鍞鍗曞彿
+    clientId?: number;              // 瀹㈡埛ID
+    clientName?: string;            // 瀹㈡埛鍚嶇О
+    salesDate?: Date;               // 鍙戣揣鏃ユ湡
+    recipientName?: string;         // 鏀惰揣浜�
+    recipientTelephone?: string;    // 鑱旂郴鏂瑰紡
+    recipientAddress?: string;      // 鏀惰揣鍦板潃
+    status?: number;                // 鍗曟嵁鐘舵�侊細0-鑽夌, 20-寰呭嚭搴�, 30-宸插畬鎴�
+    outStatus?: number;             // 鍑哄簱鐘舵�侊細0-鏈嚭搴�, 1-閮ㄥ垎鍑哄簱, 2-鍏ㄩ儴鍑哄簱
+    remark?: string;                // 澶囨敞
+    createTime?: Date;              // 鍒涘缓鏃堕棿
+  }
+
+  /** 鍒涘缓/淇敼璇锋眰 */
+  export interface SalesNoticeSaveReq {
+    id?: number;                    // 閫氱煡鍗旾D锛堜慨鏀规椂蹇呭~锛�
+    code: string;                   // 閫氱煡鍗曞彿
+    name: string;                   // 閫氱煡鍗曞悕绉�
+    clientId: number;               // 瀹㈡埛ID
+    saleOrderId?: number;           // 閿�鍞鍗旾D
+    saleOrderCode?: string;         // 閿�鍞鍗曞彿
+    salesDate: Date;                // 鍙戣揣鏃ユ湡
+    recipientName?: string;         // 鏀惰揣浜�
+    recipientTelephone?: string;    // 鑱旂郴鏂瑰紡
+    recipientAddress?: string;      // 鏀惰揣鍦板潃
+    remark?: string;                // 澶囨敞
+  }
+}
+
+/** 鏌ヨ鍒嗛〉 */
+export function getSalesNoticePage(params: PageParam): Promise<PageResult<SalesNotice>>
+
+/** 鏌ヨ璇︽儏 */
+export function getSalesNotice(id: number): Promise<SalesNotice>
+
+/** 鍒涘缓鍙戣揣閫氱煡鍗� */
+export function createSalesNotice(data: SalesNoticeSaveReq): Promise<number>
+
+/** 淇敼鍙戣揣閫氱煡鍗� */
+export function updateSalesNotice(data: SalesNoticeSaveReq): Promise<boolean>
+
+/** 鍒犻櫎鍙戣揣閫氱煡鍗� */
+export function deleteSalesNotice(id: number): Promise<boolean>
+
+/** 鎻愪氦鍙戣揣閫氱煡鍗� */
+export function submitSalesNotice(id: number): Promise<boolean>
+
+/** 浠庨攢鍞鍗曠敓鎴愬彂璐ч�氱煡鍗� */
+export function generateFromSaleOrder(saleOrderId: number): Promise<number>
+
+/** 浠庡彂璐ч�氱煡鍗曠敓鎴愰攢鍞嚭搴撳崟 */
+export function generateProductSales(id: number): Promise<number>
+```
+
+### 琛岃〃鎺ュ彛
+
+**鏂囦欢璺緞锛�** `src/api/mes/wm/salesnotice/line/index.ts`
+
+| 鏂规硶 | 璺緞 | 璇存槑 |
+|------|------|------|
+| GET | `/mes/wm/sales-notice-line/page` | 鍒嗛〉鏌ヨ |
+| GET | `/mes/wm/sales-notice-line/get?id={id}` | 璇︽儏鏌ヨ |
+| POST | `/mes/wm/sales-notice-line/create` | 鍒涘缓 |
+| PUT | `/mes/wm/sales-notice-line/update` | 淇敼 |
+| DELETE | `/mes/wm/sales-notice-line/delete?id={id}` | 鍒犻櫎 |
+
+```typescript
+export namespace MesWmSalesNoticeLineApi {
+  /** 鍙戣揣閫氱煡鍗曡 */
+  export interface SalesNoticeLine {
+    id?: number;                    // 琛孖D
+    noticeId?: number;              // 閫氱煡鍗旾D
+    saleOrderItemId?: number;       // 閿�鍞鍗曟槑缁咺D
+    itemId?: number;                // 鐗╂枡ID
+    itemCode?: string;              // 鐗╂枡缂栫爜
+    itemName?: string;              // 鐗╂枡鍚嶇О
+    specification?: string;         // 瑙勬牸鍨嬪彿
+    unitMeasureName?: string;       // 鍗曚綅
+    batchId?: number;               // 鎵规ID
+    batchCode?: string;             // 鎵规鍙�
+    quantity?: number;              // 鍙戣揣鏁伴噺
+    outCount?: number;              // 宸插嚭搴撴暟閲�
+    oqcCheckFlag?: boolean;         // 鏄惁妫�楠�
+    remark?: string;                // 澶囨敞
+    createTime?: Date;              // 鍒涘缓鏃堕棿
+  }
+
+  /** 鍒涘缓/淇敼璇锋眰 */
+  export interface SalesNoticeLineSaveReq {
+    id?: number;                    // 琛孖D锛堜慨鏀规椂蹇呭~锛�
+    noticeId: number;               // 閫氱煡鍗旾D
+    saleOrderItemId?: number;       // 閿�鍞鍗曟槑缁咺D
+    itemId: number;                 // 鐗╂枡ID
+    batchId?: number;               // 鎵规ID
+    batchCode?: string;             // 鎵规鍙�
+    quantity: number;               // 鍙戣揣鏁伴噺
+    oqcCheckFlag?: boolean;         // 鏄惁妫�楠�
+    remark?: string;                // 澶囨敞
+  }
+}
+```
+
+### 鐘舵�佹灇涓�
+
+```typescript
+// 鍙戣揣閫氱煡鍗曠姸鎬�
+const MesWmSalesNoticeStatusEnum = {
+  PREPARE: 0,        // 鑽夌
+  APPROVED: 20,      // 寰呭嚭搴擄紙宸插鏍革級
+  FINISHED: 30,      // 宸插畬鎴�
+}
+
+// 鍙戣揣閫氱煡鍗曞嚭搴撶姸鎬�
+const MesWmSalesNoticeOutStatusEnum = {
+  NONE: 0,           // 鏈嚭搴�
+  PARTIAL: 1,        // 閮ㄥ垎鍑哄簱
+  ALL: 2,            // 鍏ㄩ儴鍑哄簱
+}
+```
+
+---
+
+## 涓夈�侀攢鍞嚭搴撳崟 (MES妯″潡)
+
+**鏂囦欢璺緞锛�** `src/api/mes/wm/productsales/index.ts`
+
+### 鏌ヨ鎺ュ彛
+
+| 鏂规硶 | 璺緞 | 璇存槑 |
+|------|------|------|
+| GET | `/mes/wm/product-sales/page` | 鍒嗛〉鏌ヨ |
+| GET | `/mes/wm/product-sales/get?id={id}` | 璇︽儏鏌ヨ |
+| POST | `/mes/wm/product-sales/create` | 鍒涘缓 |
+| PUT | `/mes/wm/product-sales/update` | 淇敼 |
+| DELETE | `/mes/wm/product-sales/delete?id={id}` | 鍒犻櫎 |
+| PUT | `/mes/wm/product-sales/submit?id={id}` | 鎻愪氦 |
+| PUT | `/mes/wm/product-sales/stock?id={id}` | 鎵ц鎷h揣 |
+| PUT | `/mes/wm/product-sales/shipping` | 濉啓杩愬崟 |
+| PUT | `/mes/wm/product-sales/finish?id={id}` | 鎵ц鍑哄簱 |
+| PUT | `/mes/wm/product-sales/cancel?id={id}` | 鍙栨秷 |
+| GET | `/mes/wm/product-sales/check-quantity?id={id}` | 鏍¢獙鏁伴噺 |
+
+### 鎺ュ彛瀹氫箟
+
+```typescript
+export namespace MesWmProductSalesApi {
+  /** 閿�鍞嚭搴撳崟 */
+  export interface ProductSales {
+    id?: number;                    // 鍑哄簱鍗旾D
+    code?: string;                  // 鍑哄簱鍗曞彿
+    name?: string;                  // 鍑哄簱鍗曞悕绉�
+    noticeId?: number;              // 鍙戣揣閫氱煡鍗旾D
+    noticeCode?: string;            // 鍙戣揣閫氱煡鍗曞彿
+    saleOrderId?: number;           // 閿�鍞鍗旾D
+    salesOrderCode?: string;        // 閿�鍞鍗曞彿
+    clientId?: number;              // 瀹㈡埛ID
+    clientName?: string;            // 瀹㈡埛鍚嶇О
+    salesDate?: Date;               // 鍑哄簱鏃ユ湡
+    contactName?: string;           // 鑱旂郴浜�
+    contactTelephone?: string;      // 鑱旂郴鐢佃瘽
+    contactAddress?: string;        // 鏀惰揣鍦板潃
+    carrier?: string;               // 鎵胯繍鍟�
+    shippingNumber?: string;        // 杩愯緭鍗曞彿
+    status?: number;                // 鍗曟嵁鐘舵��
+    remark?: string;                // 澶囨敞
+    createTime?: Date;              // 鍒涘缓鏃堕棿
+  }
+
+  /** 鍒涘缓/淇敼璇锋眰 */
+  export interface ProductSalesSaveReq {
+    id?: number;                    // 鍑哄簱鍗旾D锛堜慨鏀规椂蹇呭~锛�
+    code: string;                   // 鍑哄簱鍗曞彿
+    name: string;                   // 鍑哄簱鍗曞悕绉�
+    clientId: number;               // 瀹㈡埛ID
+    noticeId?: number;              // 鍙戣揣閫氱煡鍗旾D
+    saleOrderId?: number;           // 閿�鍞鍗旾D
+    salesOrderCode?: string;        // 閿�鍞鍗曞彿
+    salesDate?: Date;               // 鍑哄簱鏃ユ湡
+    contactName?: string;           // 鑱旂郴浜�
+    contactTelephone?: string;      // 鑱旂郴鐢佃瘽
+    contactAddress?: string;        // 鏀惰揣鍦板潃
+    remark?: string;                // 澶囨敞
+  }
+
+  /** 濉啓杩愬崟璇锋眰 */
+  export interface ProductSalesShippingReq {
+    id: number;                     // 鍑哄簱鍗旾D
+    carrier: string;                // 鎵胯繍鍟�
+    shippingNumber: string;         // 杩愯緭鍗曞彿
+  }
+}
+
+/** 鏌ヨ鍒嗛〉 */
+export function getProductSalesPage(params: PageParam): Promise<PageResult<ProductSales>>
+
+/** 鏌ヨ璇︽儏 */
+export function getProductSales(id: number): Promise<ProductSales>
+
+/** 鍒涘缓閿�鍞嚭搴撳崟 */
+export function createProductSales(data: ProductSalesSaveReq): Promise<number>
+
+/** 淇敼閿�鍞嚭搴撳崟 */
+export function updateProductSales(data: ProductSalesSaveReq): Promise<boolean>
+
+/** 鍒犻櫎閿�鍞嚭搴撳崟 */
+export function deleteProductSales(id: number): Promise<boolean>
+
+/** 鎻愪氦 */
+export function submitProductSales(id: number): Promise<boolean>
+
+/** 鎵ц鎷h揣 */
+export function stockProductSales(id: number): Promise<boolean>
+
+/** 濉啓杩愬崟 */
+export function shippingProductSales(data: ProductSalesShippingReq): Promise<boolean>
+
+/** 鎵ц鍑哄簱 */
+export function finishProductSales(id: number): Promise<boolean>
+
+/** 鍙栨秷 */
+export function cancelProductSales(id: number): Promise<boolean>
+
+/** 鏍¢獙鏁伴噺 */
+export function checkProductSalesQuantity(id: number): Promise<boolean>
+```
+
+### 琛岃〃鎺ュ彛
+
+**鏂囦欢璺緞锛�** `src/api/mes/wm/productsales/line/index.ts`
+
+| 鏂规硶 | 璺緞 | 璇存槑 |
+|------|------|------|
+| GET | `/mes/wm/product-sales-line/page` | 鍒嗛〉鏌ヨ |
+| GET | `/mes/wm/product-sales-line/get?id={id}` | 璇︽儏鏌ヨ |
+| POST | `/mes/wm/product-sales-line/create` | 鍒涘缓 |
+| PUT | `/mes/wm/product-sales-line/update` | 淇敼 |
+| DELETE | `/mes/wm/product-sales-line/delete?id={id}` | 鍒犻櫎 |
+
+```typescript
+export namespace MesWmProductSalesLineApi {
+  /** 閿�鍞嚭搴撳崟琛� */
+  export interface ProductSalesLine {
+    id?: number;                    // 琛孖D
+    salesId?: number;               // 鍑哄簱鍗旾D
+    noticeLineId?: number;          // 鍙戣揣閫氱煡鍗曡ID
+    saleOrderItemId?: number;       // 閿�鍞鍗曟槑缁咺D
+    itemId?: number;                // 鐗╂枡ID
+    itemCode?: string;              // 鐗╂枡缂栫爜
+    itemName?: string;              // 鐗╂枡鍚嶇О
+    specification?: string;         // 瑙勬牸鍨嬪彿
+    unitMeasureName?: string;       // 鍗曚綅
+    quantity?: number;              // 鍑哄簱鏁伴噺
+    batchId?: number;               // 鎵规ID
+    batchCode?: string;             // 鎵规鍙�
+    oqcCheckFlag?: boolean;         // 鏄惁妫�楠�
+    oqcId?: number;                 // 鍑哄巶妫�楠屽崟ID
+    qualityStatus?: number;         // 璐ㄩ噺鐘舵��
+    remark?: string;                // 澶囨敞
+    createTime?: Date;              // 鍒涘缓鏃堕棿
+  }
+
+  /** 鍒涘缓/淇敼璇锋眰 */
+  export interface ProductSalesLineSaveReq {
+    id?: number;                    // 琛孖D锛堜慨鏀规椂蹇呭~锛�
+    salesId: number;                // 鍑哄簱鍗旾D
+    noticeLineId?: number;          // 鍙戣揣閫氱煡鍗曡ID
+    saleOrderItemId?: number;       // 閿�鍞鍗曟槑缁咺D
+    itemId: number;                 // 鐗╂枡ID
+    quantity: number;               // 鍑哄簱鏁伴噺
+    batchId?: number;               // 鎵规ID
+    batchCode?: string;             // 鎵规鍙�
+    oqcCheckFlag?: boolean;         // 鏄惁妫�楠�
+    remark?: string;                // 澶囨敞
+  }
+}
+```
+
+### 鏄庣粏琛ㄦ帴鍙o紙鎷h揣淇℃伅锛�
+
+**鏂囦欢璺緞锛�** `src/api/mes/wm/productsales/detail/index.ts`
+
+| 鏂规硶 | 璺緞 | 璇存槑 |
+|------|------|------|
+| GET | `/mes/wm/product-sales-detail/page` | 鍒嗛〉鏌ヨ |
+| GET | `/mes/wm/product-sales-detail/get?id={id}` | 璇︽儏鏌ヨ |
+| POST | `/mes/wm/product-sales-detail/create` | 鍒涘缓 |
+| PUT | `/mes/wm/product-sales-detail/update` | 淇敼 |
+| DELETE | `/mes/wm/product-sales-detail/delete?id={id}` | 鍒犻櫎 |
+
+```typescript
+export namespace MesWmProductSalesDetailApi {
+  /** 閿�鍞嚭搴撴槑缁嗭紙鎷h揣淇℃伅锛� */
+  export interface ProductSalesDetail {
+    id?: number;                    // 鏄庣粏ID
+    lineId?: number;                // 鍑哄簱鍗曡ID
+    salesId?: number;               // 鍑哄簱鍗旾D
+    itemId?: number;                // 鐗╂枡ID
+    itemCode?: string;              // 鐗╂枡缂栫爜
+    itemName?: string;              // 鐗╂枡鍚嶇О
+    specification?: string;         // 瑙勬牸鍨嬪彿
+    unitMeasureName?: string;       // 鍗曚綅
+    quantity?: number;              // 鎷h揣鏁伴噺
+    materialStockId?: number;       // 搴撳瓨璁板綍ID
+    batchId?: number;               // 鎵规ID
+    batchCode?: string;             // 鎵规鍙�
+    warehouseId?: number;           // 浠撳簱ID
+    warehouseName?: string;         // 浠撳簱鍚嶇О
+    locationId?: number;            // 搴撳尯ID
+    locationName?: string;          // 搴撳尯鍚嶇О
+    areaId?: number;                // 搴撲綅ID
+    areaName?: string;              // 搴撲綅鍚嶇О
+    remark?: string;                // 澶囨敞
+    createTime?: Date;              // 鍒涘缓鏃堕棿
+  }
+
+  /** 鍒涘缓/淇敼璇锋眰 */
+  export interface ProductSalesDetailSaveReq {
+    id?: number;                    // 鏄庣粏ID锛堜慨鏀规椂蹇呭~锛�
+    lineId: number;                 // 鍑哄簱鍗曡ID
+    salesId: number;                // 鍑哄簱鍗旾D
+    itemId: number;                 // 鐗╂枡ID
+    quantity: number;               // 鎷h揣鏁伴噺
+    materialStockId?: number;       // 搴撳瓨璁板綍ID
+    batchId?: number;               // 鎵规ID
+    batchCode?: string;             // 鎵规鍙�
+    warehouseId: number;            // 浠撳簱ID
+    locationId: number;             // 搴撳尯ID
+    areaId: number;                 // 搴撲綅ID
+    remark?: string;                // 澶囨敞
+  }
+}
+```
+
+### 鐘舵�佹灇涓�
+
+```typescript
+// 閿�鍞嚭搴撳崟鐘舵��
+const MesWmProductSalesStatusEnum = {
+  PREPARE: 0,        // 鑽夌
+  CONFIRMED: 10,     // 寰呮娴�
+  APPROVING: 20,     // 寰呮嫞璐�
+  SHIPPING: 25,      // 寰呭~鍐欒繍鍗�
+  APPROVED: 30,      // 寰呮墽琛屽嚭搴�
+  FINISHED: 40,      // 宸插畬鎴�
+  CANCELLED: 50,     // 宸插彇娑�
+}
+
+// 璐ㄩ噺鐘舵��
+const MesWmQualityStatusEnum = {
+  PENDING: 0,        // 寰呮楠�
+  PASS: 1,           // 鍚堟牸
+  FAIL: 2,           // 涓嶅悎鏍�
+}
+```
+
+---
+
+## 鍥涖�佸瓧娈垫槧灏勫叧绯�
+
+### 4.1 閿�鍞鍗� 鈫� 鍙戣揣閫氱煡鍗�
+
+| 閿�鍞鍗曞瓧娈� | 鍙戣揣閫氱煡鍗曞瓧娈� | 璇存槑 |
+|-------------|---------------|------|
+| `id` | `saleOrderId` | 閿�鍞鍗旾D |
+| `no` | `saleOrderCode` | 閿�鍞鍗曞彿 |
+| `customerId` | `clientId` | 瀹㈡埛ID |
+| `customerName` | `clientName` | 瀹㈡埛鍚嶇О |
+
+### 4.2 鍙戣揣閫氱煡鍗� 鈫� 閿�鍞嚭搴撳崟
+
+| 鍙戣揣閫氱煡鍗曞瓧娈� | 閿�鍞嚭搴撳崟瀛楁 | 璇存槑 |
+|---------------|---------------|------|
+| `id` | `noticeId` | 鍙戣揣閫氱煡鍗旾D |
+| `code` | `noticeCode` | 鍙戣揣閫氱煡鍗曞彿 |
+| `saleOrderId` | `saleOrderId` | 閿�鍞鍗旾D |
+| `saleOrderCode` | `salesOrderCode` | 閿�鍞鍗曞彿 |
+| `clientId` | `clientId` | 瀹㈡埛ID |
+| `clientName` | `clientName` | 瀹㈡埛鍚嶇О |
+| `recipientName` | `contactName` | 鏀惰揣浜衡啋鑱旂郴浜� |
+| `recipientTelephone` | `contactTelephone` | 鑱旂郴鐢佃瘽 |
+| `recipientAddress` | `contactAddress` | 鏀惰揣鍦板潃 |
+| `salesDate` | `salesDate` | 鍑哄簱鏃ユ湡 |
+
+### 4.3 鍙戣揣閫氱煡鍗曡 鈫� 閿�鍞嚭搴撳崟琛�
+
+| 鍙戣揣閫氱煡鍗曡瀛楁 | 閿�鍞嚭搴撳崟琛屽瓧娈� | 璇存槑 |
+|-----------------|-----------------|------|
+| `id` | `noticeLineId` | 鍙戣揣閫氱煡鍗曡ID |
+| `saleOrderItemId` | `saleOrderItemId` | 閿�鍞鍗曟槑缁咺D |
+| `itemId` | `itemId` | 鐗╂枡ID |
+| `quantity` | `quantity` | 鍑哄簱鏁伴噺 |
+| `batchId` | `batchId` | 鎵规ID |
+| `batchCode` | `batchCode` | 鎵规鍙� |
+| `oqcCheckFlag` | `oqcCheckFlag` | 鏄惁妫�楠� |
+
+---
+
+## 浜斻�佺姸鎬佹祦杞�
+
+### 5.1 鍗曟嵁鐘舵�佹祦杞�
+
+```
+閿�鍞鍗曪細鏈鏍� 鈫� 宸插鏍� 鈫� [鍑哄簱鐘舵�佸悓姝
+                鈫�
+鍙戣揣閫氱煡鍗曪細鑽夌 鈫� 寰呭嚭搴� 鈫� [閮ㄥ垎鍑哄簱/鍏ㄩ儴鍑哄簱] 鈫� 宸插畬鎴�
+                              鈫�
+                        閿�鍞嚭搴撳崟锛氳崏绋� 鈫� 鎻愪氦 鈫� 鎷h揣 鈫� 鍙戣揣 鈫� 鎵ц鍑哄簱
+                                                    鈫�
+                                              [鐘舵�佸洖鍐欎笂娓竇
+```
+
+### 5.2 鍑哄簱鐘舵�佹洿鏂版椂鏈�
+
+| 瑙﹀彂鍔ㄤ綔 | 鏇存柊鍗曟嵁 | 鏇存柊鍐呭 |
+|---------|---------|---------|
+| 閿�鍞嚭搴撳崟鎵ц鍑哄簱 | 鍙戣揣閫氱煡鍗曡 | `outCount` 绱姞 |
+| 閿�鍞嚭搴撳崟鎵ц鍑哄簱 | 鍙戣揣閫氱煡鍗� | `outStatus` 鏇存柊 |
+| 閿�鍞嚭搴撳崟鎵ц鍑哄簱 | 閿�鍞鍗曡 | `outCount` 绱姞 |
+| 閿�鍞嚭搴撳崟鎵ц鍑哄簱 | 閿�鍞鍗� | `outStatus` 鏇存柊 |
+
+### 5.3 閿�鍞嚭搴撳崟瀹屾暣鐘舵�佹祦杞�
+
+```
+鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹�                           閿�鍞嚭搴撳崟鐘舵�佹祦杞�                           鈹�
+鈹溾攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹�                                                                     鈹�
+鈹�   鑽夌(PREPARE:0)                                                    鈹�
+鈹�       鈹�                                                             鈹�
+鈹�       鈹� 鎻愪氦                                                         鈹�
+鈹�       鈻�                                                             鈹�
+鈹�   鈹屸攢鈹�鈹�鈹粹攢鈹�鈹�鈹�                                                         鈹�
+鈹�   鈹�       鈹�                                                         鈹�
+鈹�   鈹�       鈹� 鏈塐QC妫�楠岃    鈹�鈹�鈹�鈻�  寰呮娴�(CONFIRMED:10)                鈹�
+鈹�   鈹�       鈹�                       鈹�                                 鈹�
+鈹�   鈹�       鈹�                       鈹� OQC妫�楠屽畬鎴�                      鈹�
+鈹�   鈹�       鈹�                       鈻�                                 鈹�
+鈹�   鈹�       鈹�                     寰呮嫞璐�(APPROVING:20) 鈼勨攢鈹�鈹�            鈹�
+鈹�   鈹�       鈹�                                             鈹�            鈹�
+鈹�   鈹�       鈹� 鏃燨QC妫�楠岃  鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�            鈹�
+鈹�   鈹�       鈹�                                                          鈹�
+鈹�   鈹斺攢鈹�鈹�鈹攢鈹�鈹�鈹�                                                         鈹�
+鈹�       鈹�                                                             鈹�
+鈹�       鈹� 鎵ц鎷h揣                                                     鈹�
+鈹�       鈻�                                                             鈹�
+鈹�   寰呭~鍐欒繍鍗�(SHIPPING:25)                                            鈹�
+鈹�       鈹�                                                             鈹�
+鈹�       鈹� 濉啓杩愬崟                                                     鈹�
+鈹�       鈻�                                                             鈹�
+鈹�   寰呮墽琛屽嚭搴�(APPROVED:30)                                            鈹�
+鈹�       鈹�                                                             鈹�
+鈹�       鈹� 鎵ц鍑哄簱                                                     鈹�
+鈹�       鈻�                                                             鈹�
+鈹�   宸插畬鎴�(FINISHED:40)                                                鈹�
+鈹�                                                                     鈹�
+鈹�   浠绘剰鐘舵�� 鈹�鈹�鍙栨秷鈹�鈹�鈻� 宸插彇娑�(CANCELLED:50)                              鈹�
+鈹�                                                                     鈹�
+鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+```
+
+---
+
+## 鍏�佸墠绔〉闈㈣矾寰�
+
+| 椤甸潰 | 璺緞 | 鏂囦欢 |
+|------|------|------|
+| 閿�鍞鍗曞垪琛� | `/erp/sale/order` | `src/views/erp/sale/order/index.vue` |
+| 鍙戣揣閫氱煡鍗曞垪琛� | `/wls/sales-notice` | `src/views/wls/salesnotice/index.vue` |
+| 閿�鍞嚭搴撳崟鍒楄〃 | `/wls/product-sales` | `src/views/wls/productsales/index.vue` |
+
+---
+
+## 涓冦�佺敓鎴愭帴鍙h皟鐢ㄩ摼
+
+```typescript
+// 1. 閿�鍞鍗曠敓鎴愬彂璐ч�氱煡鍗�
+const noticeId = await generateFromSaleOrder(saleOrderId);
+
+// 2. 鍙戣揣閫氱煡鍗曠敓鎴愰攢鍞嚭搴撳崟
+const productSalesId = await generateProductSales(noticeId);
+
+// 3. 閿�鍞嚭搴撳崟鎻愪氦
+await submitProductSales(productSalesId);
+
+// 4. 鎵ц鎷h揣锛堥渶瑕佸厛娣诲姞鎷h揣鏄庣粏锛�
+await stockProductSales(productSalesId);
+
+// 5. 濉啓杩愬崟
+await shippingProductSales({ id: productSalesId, carrier: '椤轰赴', shippingNumber: 'SF123' });
+
+// 6. 鎵ц鍑哄簱锛堜細鑷姩鍥炲啓鐘舵�佸埌鍙戣揣閫氱煡鍗曞拰閿�鍞鍗曪級
+await finishProductSales(productSalesId);
+```
+
+---
+
+## 鍏�佸叧閿笟鍔¤鍒�
+
+### 8.1 鐢熸垚瑙勫垯
+
+| 鍦烘櫙 | 瑙勫垯 |
+|------|------|
+| 鍙戣揣閫氱煡鍗曠敓鎴愭潯浠� | 閿�鍞鍗曠姸鎬佷负"宸插鏍�" |
+| 閿�鍞嚭搴撳崟鐢熸垚鏉′欢 | 鍙戣揣閫氱煡鍗曠姸鎬佷负"寰呭嚭搴�" |
+| 鐢熸垚鍚庣姸鎬� | 鍧囦负"鑽夌"鐘舵�侊紝闇�瑕佹彁浜ゅ悗鎵嶈兘娴佽浆 |
+
+### 8.2 鍑哄簱瀹屾垚鍚庣殑鐘舵�佸洖鍐�
+
+| 鍥炲啓瀵硅薄 | 鍥炲啓鍐呭 |
+|---------|---------|
+| 鍙戣揣閫氱煡鍗曡 | `outCount += 瀹為檯鍑哄簱鏁伴噺` |
+| 鍙戣揣閫氱煡鍗� | `outStatus = 璁$畻缁撴灉锛�0/1/2锛塦 |
+| 鍙戣揣閫氱煡鍗� | 濡傛灉 `outStatus === 2`锛堝叏閮ㄥ嚭搴擄級锛屽垯 `status = 30`锛堝凡瀹屾垚锛� |
+| ERP閿�鍞鍗曡 | `outCount += 瀹為檯鍑哄簱鏁伴噺` |
+| ERP閿�鍞鍗� | `outStatus = 璁$畻缁撴灉锛�0/1/2锛塦 |
+
+### 8.3 鍑哄簱鏁伴噺璁$畻閫昏緫
+
+```typescript
+// 璁$畻鍑哄簱鐘舵��
+function calculateOutStatus(lines: SalesNoticeLine[]): number {
+  let allOut = true;
+  let anyOut = false;
+
+  for (const line of lines) {
+    const quantity = line.quantity || 0;
+    const outCount = line.outCount || 0;
+
+    if (outCount > 0) anyOut = true;
+    if (outCount < quantity) allOut = false;
+  }
+
+  if (allOut) return 2;  // 鍏ㄩ儴鍑哄簱
+  if (anyOut) return 1;  // 閮ㄥ垎鍑哄簱
+  return 0;              // 鏈嚭搴�
+}
+```
\ No newline at end of file
diff --git a/docs/material_stock_adjust.md b/docs/material_stock_adjust.md
new file mode 100644
index 0000000..38b6d85
--- /dev/null
+++ b/docs/material_stock_adjust.md
@@ -0,0 +1,113 @@
+# 搴撳瓨鐜版湁閲忚嚜瀹氫箟鍑哄叆搴� - 鍓嶇鑱旇皟鏂规
+
+## 娑夊強椤甸潰
+
+- 搴撳瓨鐜版湁閲忓垪琛ㄩ〉
+- 搴撳瓨璋冩暣寮圭獥/瀵硅瘽妗�
+
+## 涓氬姟鍦烘櫙
+
+搴撳瓨鐜版湁閲忔ā鍧楁柊澧炶嚜瀹氫箟鍑哄叆搴撳姛鑳斤紝鐢ㄤ簬锛�
+- 搴撳瓨鐩樼偣璋冩暣
+- 搴撳瓨鎹熻��/鎶ユ孩
+- 鎵嬪姩鍏ュ簱/鍑哄簱
+- 鍏朵粬闈炰笟鍔″崟鎹┍鍔ㄧ殑搴撳瓨鍙樺姩
+
+## 鏂板 API
+
+### 搴撳瓨璋冩暣锛堣嚜瀹氫箟鍑哄叆搴擄級
+
+| 鏂规硶 | 璺緞 | 璇存槑 |
+|------|------|------|
+| POST | /mes/wm/material-stock/adjust | 搴撳瓨璋冩暣锛堟鏁�=鍏ュ簱锛岃礋鏁�=鍑哄簱锛� |
+
+**璇锋眰鍙傛暟锛�**
+
+| 鍙傛暟 | 绫诲瀷 | 蹇呭~ | 璇存槑 |
+|------|------|------|------|
+| itemId | Long | 鏄� | 鐗╂枡ID |
+| warehouseId | Long | 鏄� | 浠撳簱ID |
+| locationId | Long | 鏄� | 搴撳尯ID |
+| areaId | Long | 鏄� | 搴撲綅ID |
+| batchId | Long | 鍚� | 鎵规ID |
+| batchCode | String | 鍚� | 鎵规鍙� |
+| vendorId | Long | 鍚� | 渚涘簲鍟咺D |
+| quantity | BigDecimal | 鏄� | 璋冩暣鏁伴噺锛堟鏁�=鍏ュ簱锛岃礋鏁�=鍑哄簱锛� |
+| reason | String | 鍚� | 璋冩暣鍘熷洜 |
+
+**鍝嶅簲锛�**
+
+```json
+{
+  "code": 0,
+  "data": 123,  // 搴撳瓨璁板綍ID
+  "msg": "鎿嶄綔鎴愬姛"
+}
+```
+
+## 鍓嶇淇敼鐐�
+
+### 1. 搴撳瓨鐜版湁閲忓垪琛ㄩ〉
+
+鍦ㄥ垪琛ㄩ〉宸ュ叿鏍忔坊鍔�"搴撳瓨璋冩暣"鎸夐挳锛�
+
+**鎸夐挳閫昏緫锛�**
+1. 鐐瑰嚮鎵撳紑搴撳瓨璋冩暣寮圭獥
+2. 寮圭獥鍐呭~鍐欒皟鏁翠俊鎭�
+
+### 2. 搴撳瓨璋冩暣寮圭獥
+
+**琛ㄥ崟瀛楁锛�**
+
+| 瀛楁 | 绫诲瀷 | 蹇呭~ | 璇存槑 |
+|------|------|------|------|
+| 鐗╂枡 | 閫夋嫨鍣� | 鏄� | 寮瑰嚭鐗╂枡閫夋嫨瀵硅瘽妗� |
+| 浠撳簱 | 閫夋嫨鍣� | 鏄� | 涓嬫媺閫夋嫨浠撳簱 |
+| 搴撳尯 | 閫夋嫨鍣� | 鏄� | 鏍规嵁浠撳簱鑱斿姩鍔犺浇搴撳尯 |
+| 搴撲綅 | 閫夋嫨鍣� | 鏄� | 鏍规嵁搴撳尯鑱斿姩鍔犺浇搴撲綅 |
+| 鎵规 | 閫夋嫨鍣� | 鍚� | 寮瑰嚭鎵规閫夋嫨瀵硅瘽妗嗭紙濡傛灉鐗╂枡鍚敤鎵规绠$悊锛� |
+| 渚涘簲鍟� | 閫夋嫨鍣� | 鍚� | 涓嬫媺閫夋嫨渚涘簲鍟� |
+| 璋冩暣鏁伴噺 | 鏁板瓧杈撳叆 | 鏄� | 姝f暟=鍏ュ簱锛岃礋鏁�=鍑哄簱 |
+| 璋冩暣鍘熷洜 | 鏂囨湰杈撳叆 | 鍚� | 濉啓璋冩暣鍘熷洜 |
+
+**鑱斿姩閫昏緫锛�**
+
+1. 閫夋嫨浠撳簱鍚庯紝鍔犺浇璇ヤ粨搴撲笅鐨勫簱鍖哄垪琛�
+2. 閫夋嫨搴撳尯鍚庯紝鍔犺浇璇ュ簱鍖轰笅鐨勫簱浣嶅垪琛�
+3. 閫夋嫨鐗╂枡鍚庯細
+   - 濡傛灉鐗╂枡鍚敤鎵规绠$悊锛坆atchCode=true锛夛紝鎵规瀛楁鏄剧ず骞跺繀濉�
+   - 濡傛灉鐗╂枡鏈惎鐢ㄦ壒娆$鐞嗭紝鎵规瀛楁闅愯棌
+
+**鎻愪氦閫昏緫锛�**
+
+1. 鏍¢獙蹇呭~瀛楁
+2. 璋冪敤 API `/mes/wm/material-stock/adjust`
+3. 鎴愬姛鍚庢彁绀�"璋冩暣鎴愬姛"锛屽埛鏂板垪琛ㄩ〉
+4. 澶辫触鏃舵樉绀洪敊璇俊鎭�
+
+## 涓氬姟瑙勫垯璇存槑
+
+| 鍦烘櫙 | 瑙勫垯 |
+|------|------|
+| 鍏ュ簱锛坬uantity > 0锛� | 鑷姩鍒涘缓搴撳瓨璁板綍锛堝鏋滀笉瀛樺湪锛夛紝澧炲姞搴撳瓨鏁伴噺 |
+| 鍑哄簱锛坬uantity < 0锛� | 鏍¢獙搴撳瓨璁板綍瀛樺湪涓旀暟閲忓厖瓒筹紝鎵e噺搴撳瓨鏁伴噺 |
+| 鎵规绠$悊 | 鐗╂枡鍚敤鎵规绠$悊鏃讹紝蹇呴』閫夋嫨鎵规 |
+| 搴撲綅娣锋斁 | 鏍规嵁搴撲綅閰嶇疆鐨勬贩鏀捐鍒欐牎楠� |
+
+## 搴撳瓨浜嬪姟娴佹按
+
+璋冩暣鎿嶄綔浼氳嚜鍔ㄧ敓鎴愬簱瀛樹簨鍔℃祦姘达細
+
+| 瀛楁 | 鍏ュ簱 | 鍑哄簱 |
+|------|------|------|
+| type | IN (鍏ュ簱) | OUT (鍑哄簱) |
+| bizType | WM_STOCK_ADJUST_IN (126) | WM_STOCK_ADJUST_OUT (127) |
+| bizId | 搴撳瓨璁板綍ID | 搴撳瓨璁板綍ID |
+| bizCode | STOCK_ADJUST_{搴撳瓨ID} | STOCK_ADJUST_{搴撳瓨ID} |
+
+## 娉ㄦ剰浜嬮」
+
+- 璋冩暣鏁伴噺涓嶈兘涓�0
+- 鍑哄簱鏃跺繀椤讳繚璇佸簱瀛樺厖瓒�
+- 璋冩暣鎿嶄綔浼氳褰曞簱瀛樹簨鍔℃祦姘达紝渚夸簬杩芥函
+- 寤鸿鍦ㄨ皟鏁村師鍥犱腑濉啓璇︾粏鐨勮皟鏁村師鍥狅紝渚夸簬鍚庣画鏌ヨ鍜屽璁�
\ No newline at end of file
diff --git a/docs/sales_notice_to_product_sales.md b/docs/sales_notice_to_product_sales.md
new file mode 100644
index 0000000..ff668cf
--- /dev/null
+++ b/docs/sales_notice_to_product_sales.md
@@ -0,0 +1,153 @@
+# 鍙戣揣閫氱煡鍗曠敓鎴愰攢鍞嚭搴撳崟 - 鍓嶇鑱旇皟鏂规
+
+## 娑夊強椤甸潰
+
+- 鍙戣揣閫氱煡鍗曞垪琛ㄩ〉
+- 鍙戣揣閫氱煡鍗曡鎯呴〉
+- 閿�鍞嚭搴撳崟鍒楄〃椤�
+- 閿�鍞嚭搴撳崟璇︽儏椤�
+
+## 涓氬姟娴佺▼
+
+```
+閿�鍞鍗� 鈫� 鍙戣揣閫氱煡鍗� 鈫� 閿�鍞嚭搴撳崟 鈫� 鍑哄簱瀹屾垚
+   鈫�            鈫�             鈫�            鈫�
+鍑哄簱鐘舵�佸悓姝�  鍑哄簱鐘舵�佸悓姝�   鎵ц鍑哄簱    鐘舵�佸洖鍐欎笂娓�
+```
+
+**鐘舵�佸悓姝ヨ鍒欙細**
+
+| 瑙﹀彂鍔ㄤ綔 | 涓婃父鍗曟嵁 | 鏇存柊鍐呭 |
+|----------|----------|----------|
+| 閿�鍞嚭搴撳崟鎵ц鍑哄簱 | 鍙戣揣閫氱煡鍗曡 | 绱姞 outCount锛堝凡鍑哄簱鏁伴噺锛� |
+| 閿�鍞嚭搴撳崟鎵ц鍑哄簱 | 鍙戣揣閫氱煡鍗� | 鏇存柊 outStatus锛堝嚭搴撶姸鎬侊級锛屽叏閮ㄥ嚭搴撴椂 status 鍙樹负"宸插畬鎴�" |
+| 閿�鍞嚭搴撳崟鎵ц鍑哄簱 | ERP閿�鍞鍗曡 | 绱姞 outCount锛堝嚭搴撴暟閲忥級 |
+| 閿�鍞嚭搴撳崟鎵ц鍑哄簱 | ERP閿�鍞鍗� | 鏇存柊 outStatus锛堝嚭搴撶姸鎬侊級 |
+
+**鏁版嵁甯﹀叆瑙勫垯锛�**
+
+| 婧愬崟鎹� | 鐩爣鍗曟嵁 | 甯﹀叆瀛楁 |
+|--------|----------|----------|
+| 鍙戣揣閫氱煡鍗� | 閿�鍞嚭搴撳崟 | 瀹㈡埛銆侀攢鍞鍗曞彿銆佹敹璐т汉銆佽仈绯荤數璇濄�佹敹璐у湴鍧� |
+| 鍙戣揣閫氱煡鍗曡 | 閿�鍞嚭搴撳崟琛� | 鐗╂枡銆佹暟閲忋�佹壒娆°�佹槸鍚︽楠� |
+
+## 鏂板 API
+
+### 浠庡彂璐ч�氱煡鍗曠敓鎴愰攢鍞嚭搴撳崟
+
+| 鏂规硶 | 璺緞 | 璇存槑 |
+|------|------|------|
+| POST | /mes/wm/sales-notice/generate-product-sales | 浠庡彂璐ч�氱煡鍗曠敓鎴愰攢鍞嚭搴撳崟 |
+
+**璇锋眰鍙傛暟锛�**
+
+| 鍙傛暟 | 绫诲瀷 | 蹇呭~ | 璇存槑 |
+|------|------|------|------|
+| id | Long | 鏄� | 鍙戣揣閫氱煡鍗旾D锛圦uery鍙傛暟锛� |
+
+**鍝嶅簲锛�**
+
+```json
+{
+  "code": 0,
+  "data": 123,  // 鏂扮敓鎴愮殑閿�鍞嚭搴撳崟ID
+  "msg": "鎿嶄綔鎴愬姛"
+}
+```
+
+## 鏂板瀛楁
+
+### 鍙戣揣閫氱煡鍗曚富琛ㄦ柊澧炲瓧娈�
+
+| 瀛楁 | 绫诲瀷 | 璇存槑 |
+|------|------|------|
+| outStatus | Integer | 鍑哄簱鐘舵�侊細0-鏈嚭搴擄紝1-閮ㄥ垎鍑哄簱锛�2-鍏ㄩ儴鍑哄簱 |
+
+### 鍙戣揣閫氱煡鍗曡鏂板瀛楁
+
+| 瀛楁 | 绫诲瀷 | 璇存槑 |
+|------|------|------|
+| outCount | Decimal | 宸插嚭搴撴暟閲� |
+
+## 鍓嶇淇敼鐐�
+
+### 1. 鍙戣揣閫氱煡鍗曞垪琛ㄩ〉/璇︽儏椤�
+
+鍦�"寰呭嚭搴�"鐘舵�佺殑鍙戣揣閫氱煡鍗曚笂娣诲姞"鐢熸垚鍑哄簱鍗�"鎸夐挳锛�
+
+**鎸夐挳鏄剧ず鏉′欢锛�**
+- 鍗曟嵁鐘舵�� = 寰呭嚭搴擄紙status = 20锛�
+
+**鎸夐挳鐐瑰嚮閫昏緫锛�**
+1. 璋冪敤 API `/mes/wm/sales-notice/generate-product-sales?id={noticeId}`
+2. 鎴愬姛鍚庢彁绀�"鐢熸垚鎴愬姛"锛岃烦杞埌閿�鍞嚭搴撳崟璇︽儏椤�
+3. 澶辫触鏃舵樉绀洪敊璇俊鎭�
+
+**鍒楄〃鏄剧ず鏂板锛�**
+- 鍑哄簱鐘舵�佸垪锛氭樉绀�"鏈嚭搴�"/"閮ㄥ垎鍑哄簱"/"鍏ㄩ儴鍑哄簱"
+
+### 2. 鍙戣揣閫氱煡鍗曡鍒楄〃
+
+**鏄剧ず鏂板锛�**
+- 宸插嚭搴撴暟閲忓垪锛氭樉绀烘瘡琛岀殑宸插嚭搴撴暟閲�
+- 鍑哄簱杩涘害鍒楋細鏄剧ず 宸插嚭搴撴暟閲�/鎬绘暟閲� 鐨勮繘搴︽潯鎴栨枃瀛�
+
+### 3. 閿�鍞嚭搴撳崟璇︽儏椤�
+
+浠庡彂璐ч�氱煡鍗曠敓鎴愮殑閿�鍞嚭搴撳崟锛屼互涓嬪瓧娈靛凡鑷姩濉厖锛�
+- 鍩烘湰淇℃伅锛氬嚭搴撳崟鍙枫�佸鎴枫�侀攢鍞鍗曞彿銆佸嚭搴撴棩鏈�
+- 鏀惰揣淇℃伅锛氳仈绯讳汉銆佽仈绯荤數璇濄�佹敹璐у湴鍧�
+- 琛屼俊鎭細鐗╂枡銆佹暟閲忋�佹壒娆°�佹槸鍚︽楠�
+
+**娉ㄦ剰锛�** 鎷h揣鏄庣粏闇�瑕佹墜鍔ㄦ坊鍔�
+
+## 瀛楁鏄犲皠琛�
+
+### 涓昏〃瀛楁鏄犲皠
+
+| 鍙戣揣閫氱煡鍗曞瓧娈� | 閿�鍞嚭搴撳崟瀛楁 | 璇存槑 |
+|----------------|----------------|------|
+| clientId | clientId | 瀹㈡埛ID |
+| saleOrderId | saleOrderId | 閿�鍞鍗旾D |
+| saleOrderCode | salesOrderCode | 閿�鍞鍗曞彿 |
+| salesDate | salesDate | 鍑哄簱鏃ユ湡 |
+| recipientName | contactName | 鏀惰揣浜� 鈫� 鑱旂郴浜� |
+| recipientTelephone | contactTelephone | 鑱旂郴鐢佃瘽 |
+| recipientAddress | contactAddress | 鏀惰揣鍦板潃 |
+
+### 琛岃〃瀛楁鏄犲皠
+
+| 鍙戣揣閫氱煡鍗曡瀛楁 | 閿�鍞嚭搴撳崟琛屽瓧娈� | 璇存槑 |
+|------------------|------------------|------|
+| saleOrderItemId | saleOrderItemId | 閿�鍞鍗曟槑缁咺D |
+| itemId | itemId | 鐗╂枡ID |
+| quantity | quantity | 鍑哄簱鏁伴噺 |
+| batchId | batchId | 鎵规ID |
+| batchCode | batchCode | 鎵规鍙� |
+| oqcCheckFlag | oqcCheckFlag | 鏄惁妫�楠� |
+
+## 涓氬姟瑙勫垯璇存槑
+
+| 鍦烘櫙 | 瑙勫垯 |
+|------|------|
+| 鐢熸垚鏉′欢 | 鍙戣揣閫氱煡鍗曠姸鎬佸繀椤讳负"寰呭嚭搴�" |
+| 鐢熸垚鍚庣姸鎬� | 閿�鍞嚭搴撳崟鐘舵�佷负"鑽夌" |
+| 鍏宠仈鍏崇郴 | 閿�鍞嚭搴撳崟鐨� noticeId 鍏宠仈鍙戣揣閫氱煡鍗曠殑 id |
+| 鍑哄簱瀹屾垚 | 绱姞鍙戣揣閫氱煡鍗曡鐨� outCount锛岃绠椾富鍗� outStatus |
+| 鍏ㄩ儴鍑哄簱 | 鍙戣揣閫氱煡鍗� outStatus=2 鏃讹紝status 鑷姩鍙樹负"宸插畬鎴�" |
+
+## 鍑哄簱鐘舵�佹灇涓�
+
+| 鍊� | 鍚嶇О | 璇存槑 |
+|----|------|------|
+| 0 | 鏈嚭搴� | 鎵�鏈夎鐨� outCount = 0 |
+| 1 | 閮ㄥ垎鍑哄簱 | 閮ㄥ垎琛屽凡鍑哄簱锛屾垨閮ㄥ垎鏁伴噺宸插嚭搴� |
+| 2 | 鍏ㄩ儴鍑哄簱 | 鎵�鏈夎鐨� outCount >= quantity |
+
+## 娉ㄦ剰浜嬮」
+
+- 涓�涓彂璐ч�氱煡鍗曞彲浠ョ敓鎴愬涓攢鍞嚭搴撳崟锛堥儴鍒嗗嚭搴撳満鏅級
+- 鐢熸垚鐨勯攢鍞嚭搴撳崟涓鸿崏绋跨姸鎬侊紝闇�瑕佹彁浜ゅ悗鎵嶈兘鎵ц鎷h揣銆佸嚭搴撴搷浣�
+- 鎷h揣鏄庣粏闇�瑕佹墜鍔ㄦ坊鍔狅紝鎸囧畾浠庡摢涓粨搴撱�佸簱鍖恒�佸簱浣嶆嫞璐�
+- 濡傛灉鍙戣揣閫氱煡鍗曡鏈�"鏄惁妫�楠�"鏍囪瘑锛岄攢鍞嚭搴撳崟鎻愪氦鍚庝細杩涘叆"寰呮娴�"鐘舵��
+- 鍑哄簱瀹屾垚鍚庝細鑷姩鍚屾鐘舵�佸埌鍙戣揣閫氱煡鍗曞拰 ERP 閿�鍞鍗�
diff --git a/docs/sales_outbound_flow.md b/docs/sales_outbound_flow.md
new file mode 100644
index 0000000..1a57982
--- /dev/null
+++ b/docs/sales_outbound_flow.md
@@ -0,0 +1,293 @@
+# 閿�鍞嚭搴撴祦绋嬫暟鎹甫鍏ヤ笌鏌ヨ鏂规
+
+## 涓�銆佹暣浣撴祦绋�
+
+```
+鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�    鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�    鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�    鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹�  閿�鍞鍗�   鈹傗攢鈹�鈹�>鈹� 鍙戣揣閫氱煡鍗�  鈹傗攢鈹�鈹�>鈹� 閿�鍞嚭搴撳崟  鈹傗攢鈹�鈹�>鈹�  鍑哄簱瀹屾垚   鈹�
+鈹� (ERP妯″潡)   鈹�    鈹�  (MES妯″潡)  鈹�    鈹�  (MES妯″潡)  鈹�    鈹�  鐘舵�佸洖鍐�   鈹�
+鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�    鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�    鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�    鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+       鈹�                  鈹�                  鈹�                  鈹�
+       鈻�                  鈻�                  鈻�                  鈻�
+  鍑哄簱鐘舵�佸悓姝�      鍑哄簱鐘舵�佸悓姝�       鎵ц鍑哄簱           鐘舵�佸洖鍐欎笂娓�
+```
+
+## 浜屻�佸崟鎹眰绾х粨鏋�
+
+### 1. 鍙戣揣閫氱煡鍗曪紙mes_wm_sales_notice锛�
+
+| 灞傜骇 | 琛ㄥ悕 | 璇存槑 |
+|------|------|------|
+| 涓昏〃 | mes_wm_sales_notice | 鍙戣揣閫氱煡鍗曞熀鏈俊鎭� |
+| 琛岃〃 | mes_wm_sales_notice_line | 鎸夌墿鏂欑淮搴︾殑鍙戣揣鏄庣粏 |
+
+### 2. 閿�鍞嚭搴撳崟锛坢es_wm_product_sales锛�
+
+| 灞傜骇 | 琛ㄥ悕 | 璇存槑 |
+|------|------|------|
+| 涓昏〃 | mes_wm_product_sales | 鍑哄簱鍗曞熀鏈俊鎭� |
+| 琛岃〃 | mes_wm_product_sales_line | 鎸夌墿鏂�/鎵规缁村害鐨勫嚭搴撹 |
+| 鏄庣粏琛� | mes_wm_product_sales_detail | 鎷h揣鏄庣粏锛屽叿浣撲粨搴�/搴撳尯/搴撲綅 |
+
+## 涓夈�佷笂涓嬫父鏁版嵁甯﹀叆瑙勫垯
+
+### 1. 閿�鍞鍗� 鈫� 鍙戣揣閫氱煡鍗�
+
+**涓昏〃甯﹀叆锛�**
+
+| 閿�鍞鍗曞瓧娈� | 鍙戣揣閫氱煡鍗曞瓧娈� | 璇存槑 |
+|-------------|---------------|------|
+| id | saleOrderId | 閿�鍞鍗旾D |
+| no | saleOrderCode | 閿�鍞鍗曞彿 |
+| customerId | clientId | 瀹㈡埛ID |
+
+**琛岃〃甯﹀叆锛�**
+
+| 閿�鍞鍗曟槑缁嗗瓧娈� | 鍙戣揣閫氱煡鍗曡瀛楁 | 璇存槑 |
+|-----------------|-----------------|------|
+| id | saleOrderItemId | 閿�鍞鍗曟槑缁咺D |
+| productId | itemId | 鐗╂枡ID |
+| count | quantity | 鍙戣揣鏁伴噺 |
+
+**API 璋冪敤锛�**
+- `ErpSaleOrderApi.getSaleOrder(saleOrderId)` - 鑾峰彇閿�鍞鍗曚俊鎭�
+- `ErpSaleOrderApi.getSaleOrderItemList(saleOrderId)` - 鑾峰彇閿�鍞鍗曟槑缁嗗垪琛�
+
+### 2. 鍙戣揣閫氱煡鍗� 鈫� 閿�鍞嚭搴撳崟
+
+**涓昏〃甯﹀叆锛�**
+
+| 鍙戣揣閫氱煡鍗曞瓧娈� | 閿�鍞嚭搴撳崟瀛楁 | 璇存槑 |
+|---------------|---------------|------|
+| id | noticeId | 鍙戣揣閫氱煡鍗旾D |
+| clientId | clientId | 瀹㈡埛ID |
+| saleOrderId | saleOrderId | 閿�鍞鍗旾D |
+| saleOrderCode | salesOrderCode | 閿�鍞鍗曞彿 |
+| salesDate | salesDate | 鍑哄簱鏃ユ湡 |
+| recipientName | contactName | 鏀惰揣浜� 鈫� 鑱旂郴浜� |
+| recipientTelephone | contactTelephone | 鑱旂郴鐢佃瘽 |
+| recipientAddress | contactAddress | 鏀惰揣鍦板潃 |
+
+**琛岃〃甯﹀叆锛�**
+
+| 鍙戣揣閫氱煡鍗曡瀛楁 | 閿�鍞嚭搴撳崟琛屽瓧娈� | 璇存槑 |
+|-----------------|-----------------|------|
+| id | noticeLineId | 鍙戣揣閫氱煡鍗曡ID |
+| saleOrderItemId | saleOrderItemId | 閿�鍞鍗曟槑缁咺D |
+| itemId | itemId | 鐗╂枡ID |
+| quantity | quantity | 鍑哄簱鏁伴噺 |
+| batchId | batchId | 鎵规ID |
+| batchCode | batchCode | 鎵规鍙� |
+| oqcCheckFlag | oqcCheckFlag | 鏄惁妫�楠� |
+
+**娉ㄦ剰锛�**
+- 閿�鍞嚭搴撳崟鏄庣粏琛紙鎷h揣淇℃伅锛夐渶瑕佹墜鍔ㄦ坊鍔�
+- 涓�涓彂璐ч�氱煡鍗曞彲浠ョ敓鎴愬涓攢鍞嚭搴撳崟锛堥儴鍒嗗嚭搴撳満鏅級
+
+## 鍥涖�佺姸鎬佸悓姝ユ満鍒�
+
+### 1. 鍑哄簱瀹屾垚鏃剁殑鐘舵�佸洖鍐�
+
+**瑙﹀彂鏃舵満锛�** 閿�鍞嚭搴撳崟鎵ц鍑哄簱锛坒inishProductSales锛�
+
+**鍥炲啓娴佺▼锛�**
+
+```
+閿�鍞嚭搴撳崟琛�.noticeLineId 鈫� 鍙戣揣閫氱煡鍗曡.outCount锛堢疮鍔狅級
+                                鈫�
+                        璁$畻鍙戣揣閫氱煡鍗�.outStatus
+                                鈫�
+                    鍏ㄩ儴鍑哄簱鏃� 鈫� 鍙戣揣閫氱煡鍗�.status = 宸插畬鎴�
+                                鈫�
+閿�鍞嚭搴撳崟琛�.saleOrderItemId 鈫� ERP閿�鍞鍗曟槑缁�.outCount锛堢疮鍔狅級
+                                鈫�
+                        璁$畻ERP閿�鍞鍗�.outStatus
+```
+
+### 2. 鍑哄簱鐘舵�佹灇涓�
+
+| 鍊� | 鍚嶇О | 璇存槑 |
+|----|------|------|
+| 0 | 鏈嚭搴� | 鎵�鏈夎鐨� outCount = 0 |
+| 1 | 閮ㄥ垎鍑哄簱 | 閮ㄥ垎琛屽凡鍑哄簱锛屾垨閮ㄥ垎鏁伴噺宸插嚭搴� |
+| 2 | 鍏ㄩ儴鍑哄簱 | 鎵�鏈夎鐨� outCount >= quantity |
+
+## 浜斻�佸叧鑱斾俊鎭煡璇�
+
+### 1. 鍙戣揣閫氱煡鍗曟煡璇㈡椂
+
+**闇�瑕佹煡璇㈢殑鍏宠仈鏁版嵁锛�**
+
+| 鍏宠仈瀵硅薄 | API/鏂规硶 | 鐢ㄩ�� |
+|---------|---------|------|
+| 瀹㈡埛淇℃伅 | CrmCustomerApi.getCustomerMap(clientIds) | 鏄剧ず瀹㈡埛鍚嶇О |
+| 閿�鍞鍗� | ErpSaleOrderApi.getSaleOrder(saleOrderId) | 鏄剧ず璁㈠崟淇℃伅 |
+
+### 2. 閿�鍞嚭搴撳崟鏌ヨ鏃�
+
+**闇�瑕佹煡璇㈢殑鍏宠仈鏁版嵁锛�**
+
+| 鍏宠仈瀵硅薄 | API/鏂规硶 | 鐢ㄩ�� |
+|---------|---------|------|
+| 瀹㈡埛淇℃伅 | CrmCustomerApi.getCustomerMap(clientIds) | 鏄剧ず瀹㈡埛鍚嶇О |
+| 鍙戣揣閫氱煡鍗� | SalesNoticeService.getSalesNoticeMap(noticeIds) | 鏄剧ず閫氱煡鍗曠紪鐮� |
+| 鐗╂枡淇℃伅 | MesMdItemService.getItemMap(itemIds) | 鏄剧ず鐗╂枡缂栫爜銆佸悕绉般�佽鏍煎瀷鍙� |
+| 鎵规淇℃伅 | MesWmBatchService.getBatchMap(batchIds) | 鏄剧ず鎵规鍙枫�佺敓浜ф棩鏈� |
+| 浠撳簱淇℃伅 | MesWmWarehouseService.getWarehouseMap(warehouseIds) | 鏄剧ず浠撳簱鍚嶇О |
+| 搴撳尯淇℃伅 | MesWmWarehouseLocationService.getLocationMap(locationIds) | 鏄剧ず搴撳尯鍚嶇О |
+| 搴撲綅淇℃伅 | MesWmWarehouseAreaService.getAreaMap(areaIds) | 鏄剧ず搴撲綅鍚嶇О |
+
+### 3. 鐗╂枡淇℃伅鏌ヨ API
+
+```java
+// 鑾峰彇鐗╂枡鍩烘湰淇℃伅
+MesMdItemDO item = itemService.getItem(itemId);
+
+// 鎵归噺鑾峰彇鐗╂枡淇℃伅
+Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(itemIds);
+
+// 鏍¢獙鐗╂枡瀛樺湪涓斿惎鐢�
+itemService.validateItemExistsAndEnable(itemId);
+```
+
+**鐗╂枡鍏抽敭淇℃伅锛�**
+
+| 瀛楁 | 璇存槑 |
+|------|------|
+| id | 鐗╂枡ID |
+| code | 鐗╂枡缂栫爜 |
+| name | 鐗╂枡鍚嶇О |
+| spec | 瑙勬牸鍨嬪彿 |
+| unitId | 涓诲崟浣岻D |
+| unitCode | 涓诲崟浣嶇紪鐮� |
+| batchCode | 鏄惁鎵规绠$悊 |
+| qualityFlag | 鏄惁璐ㄦ |
+
+## 鍏�丄PI 鎺ュ彛娓呭崟
+
+### 1. 鍙戣揣閫氱煡鍗� API
+
+| 鏂规硶 | 璺緞 | 璇存槑 |
+|------|------|------|
+| POST | /mes/wm/sales-notice/create | 鍒涘缓鍙戣揣閫氱煡鍗� |
+| PUT | /mes/wm/sales-notice/update | 淇敼鍙戣揣閫氱煡鍗� |
+| DELETE | /mes/wm/sales-notice/delete | 鍒犻櫎鍙戣揣閫氱煡鍗� |
+| GET | /mes/wm/sales-notice/get | 鑾峰彇鍙戣揣閫氱煡鍗曡鎯� |
+| GET | /mes/wm/sales-notice/page | 鍒嗛〉鏌ヨ鍙戣揣閫氱煡鍗� |
+| PUT | /mes/wm/sales-notice/submit | 鎻愪氦鍙戣揣閫氱煡鍗� |
+| POST | /mes/wm/sales-notice/generate-from-sale-order | 浠庨攢鍞鍗曠敓鎴� |
+| POST | /mes/wm/sales-notice/generate-product-sales | 鐢熸垚閿�鍞嚭搴撳崟 |
+
+### 2. 閿�鍞嚭搴撳崟 API
+
+| 鏂规硶 | 璺緞 | 璇存槑 |
+|------|------|------|
+| POST | /mes/wm/product-sales/create | 鍒涘缓閿�鍞嚭搴撳崟 |
+| PUT | /mes/wm/product-sales/update | 淇敼閿�鍞嚭搴撳崟 |
+| DELETE | /mes/wm/product-sales/delete | 鍒犻櫎閿�鍞嚭搴撳崟 |
+| GET | /mes/wm/product-sales/get | 鑾峰彇閿�鍞嚭搴撳崟璇︽儏 |
+| GET | /mes/wm/product-sales/page | 鍒嗛〉鏌ヨ閿�鍞嚭搴撳崟 |
+| PUT | /mes/wm/product-sales/submit | 鎻愪氦閿�鍞嚭搴撳崟 |
+| PUT | /mes/wm/product-sales/stock | 鎵ц鎷h揣 |
+| PUT | /mes/wm/product-sales/shipping | 濉啓杩愬崟 |
+| PUT | /mes/wm/product-sales/finish | 鎵ц鍑哄簱 |
+| PUT | /mes/wm/product-sales/cancel | 鍙栨秷閿�鍞嚭搴撳崟 |
+
+## 涓冦�佸墠绔睍绀哄瓧娈�
+
+### 1. 鍙戣揣閫氱煡鍗曞垪琛�
+
+| 瀛楁 | 鏉ユ簮 | 璇存槑 |
+|------|------|------|
+| code | mes_wm_sales_notice | 閫氱煡鍗曠紪鐮� |
+| name | mes_wm_sales_notice | 閫氱煡鍗曞悕绉� |
+| clientName | crm_customer | 瀹㈡埛鍚嶇О锛堝叧鑱旀煡璇級 |
+| saleOrderCode | mes_wm_sales_notice | 閿�鍞鍗曞彿 |
+| salesDate | mes_wm_sales_notice | 鍙戣揣鏃ユ湡 |
+| status | mes_wm_sales_notice | 鍗曟嵁鐘舵�� |
+| outStatus | mes_wm_sales_notice | 鍑哄簱鐘舵�� |
+
+### 2. 鍙戣揣閫氱煡鍗曡鍒楄〃
+
+| 瀛楁 | 鏉ユ簮 | 璇存槑 |
+|------|------|------|
+| itemCode | mes_md_item | 鐗╂枡缂栫爜锛堝叧鑱旀煡璇級 |
+| itemName | mes_md_item | 鐗╂枡鍚嶇О锛堝叧鑱旀煡璇級 |
+| itemSpec | mes_md_item | 瑙勬牸鍨嬪彿锛堝叧鑱旀煡璇級 |
+| batchCode | mes_wm_sales_notice_line | 鎵规鍙� |
+| quantity | mes_wm_sales_notice_line | 鍙戣揣鏁伴噺 |
+| outCount | mes_wm_sales_notice_line | 宸插嚭搴撴暟閲� |
+| outProgress | 璁$畻 | 鍑哄簱杩涘害 = outCount / quantity |
+| oqcCheckFlag | mes_wm_sales_notice_line | 鏄惁妫�楠� |
+
+### 3. 閿�鍞嚭搴撳崟鍒楄〃
+
+| 瀛楁 | 鏉ユ簮 | 璇存槑 |
+|------|------|------|
+| code | mes_wm_product_sales | 鍑哄簱鍗曠紪鐮� |
+| name | mes_wm_product_sales | 鍑哄簱鍗曞悕绉� |
+| clientName | crm_customer | 瀹㈡埛鍚嶇О锛堝叧鑱旀煡璇級 |
+| noticeCode | mes_wm_sales_notice | 閫氱煡鍗曠紪鐮侊紙鍏宠仈鏌ヨ锛� |
+| salesOrderCode | mes_wm_product_sales | 閿�鍞鍗曞彿 |
+| salesDate | mes_wm_product_sales | 鍑哄簱鏃ユ湡 |
+| contactName | mes_wm_product_sales | 鑱旂郴浜� |
+| contactTelephone | mes_wm_product_sales | 鑱旂郴鐢佃瘽 |
+| status | mes_wm_product_sales | 鍗曟嵁鐘舵�� |
+
+### 4. 閿�鍞嚭搴撳崟琛屽垪琛�
+
+| 瀛楁 | 鏉ユ簮 | 璇存槑 |
+|------|------|------|
+| itemCode | mes_md_item | 鐗╂枡缂栫爜锛堝叧鑱旀煡璇級 |
+| itemName | mes_md_item | 鐗╂枡鍚嶇О锛堝叧鑱旀煡璇級 |
+| batchCode | mes_wm_product_sales_line | 鎵规鍙� |
+| quantity | mes_wm_product_sales_line | 鍑哄簱鏁伴噺 |
+| oqcCheckFlag | mes_wm_product_sales_line | 鏄惁妫�楠� |
+| qualityStatus | mes_wm_product_sales_line | 璐ㄩ噺鐘舵�� |
+
+### 5. 閿�鍞嚭搴撴槑缁嗗垪琛紙鎷h揣淇℃伅锛�
+
+| 瀛楁 | 鏉ユ簮 | 璇存槑 |
+|------|------|------|
+| itemCode | mes_md_item | 鐗╂枡缂栫爜锛堝叧鑱旀煡璇級 |
+| batchCode | mes_wm_product_sales_detail | 鎵规鍙� |
+| quantity | mes_wm_product_sales_detail | 鎷h揣鏁伴噺 |
+| warehouseName | mes_wm_warehouse | 浠撳簱鍚嶇О锛堝叧鑱旀煡璇級 |
+| locationName | mes_wm_warehouse_location | 搴撳尯鍚嶇О锛堝叧鑱旀煡璇級 |
+| areaName | mes_wm_warehouse_area | 搴撲綅鍚嶇О锛堝叧鑱旀煡璇級 |
+
+## 鍏�佷笟鍔¤鍒�
+
+### 1. 鐢熸垚瑙勫垯
+
+| 鍦烘櫙 | 瑙勫垯 |
+|------|------|
+| 鍙戣揣閫氱煡鍗曠敓鎴愭潯浠� | 閿�鍞鍗曠姸鎬佷负"宸插鏍�" |
+| 閿�鍞嚭搴撳崟鐢熸垚鏉′欢 | 鍙戣揣閫氱煡鍗曠姸鎬佷负"寰呭嚭搴�" |
+| 鐢熸垚鍚庣姸鎬� | 鍧囦负"鑽夌"鐘舵�侊紝闇�瑕佹彁浜ゅ悗鎵嶈兘娴佽浆 |
+
+### 2. 鎻愪氦鏍¢獙
+
+| 鍗曟嵁 | 鏍¢獙瑙勫垯 |
+|------|---------|
+| 鍙戣揣閫氱煡鍗� | 鑷冲皯鏈変竴鏉¤璁板綍 |
+| 閿�鍞嚭搴撳崟 | 鑷冲皯鏈変竴鏉¤璁板綍锛屾瘡琛屽嚭搴撴暟閲� > 0 |
+
+### 3. 鍑哄簱娴佺▼
+
+```
+鑽夌 鈫� 鎻愪氦 鈫� 寰呮嫞璐� 鈫� 鎷h揣 鈫� 寰呭~鍐欒繍鍗� 鈫� 濉啓杩愬崟 鈫� 寰呭嚭搴� 鈫� 鎵ц鍑哄簱 鈫� 宸插畬鎴�
+              鈫�                                                    鈫�
+              鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹� 濡傛灉闇�瑕丱QC妫�楠� 鈫愨攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+                               鑽夌 鈫� 鎻愪氦 鈫� 寰呮娴� 鈫� OQC妫�楠屽畬鎴� 鈫� 寰呮嫞璐�
+```
+
+### 4. 鐘舵�佸洖鍐欒鍒�
+
+| 瑙﹀彂鍔ㄤ綔 | 鍥炲啓瀵硅薄 | 鍥炲啓鍐呭 |
+|---------|---------|---------|
+| 鎵ц鍑哄簱 | 鍙戣揣閫氱煡鍗曡 | outCount += 瀹為檯鍑哄簱鏁伴噺 |
+| 鎵ц鍑哄簱 | 鍙戣揣閫氱煡鍗� | outStatus = 璁$畻缁撴灉 |
+| 鎵ц鍑哄簱 | 鍙戣揣閫氱煡鍗� | 濡傛灉 outStatus=鍏ㄩ儴鍑哄簱锛屽垯 status=宸插畬鎴� |
+| 鎵ц鍑哄簱 | ERP閿�鍞鍗曟槑缁� | outCount += 瀹為檯鍑哄簱鏁伴噺 |
+| 鎵ц鍑哄簱 | ERP閿�鍞鍗� | outStatus = 璁$畻缁撴灉 |
\ No newline at end of file
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/MesWmArrivalNoticeLineController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/MesWmArrivalNoticeLineController.java
index 10a853a..a5342fc 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/MesWmArrivalNoticeLineController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/MesWmArrivalNoticeLineController.java
@@ -8,12 +8,14 @@
 import cn.iocoder.yudao.module.mes.controller.admin.wm.arrivalnotice.vo.line.MesWmArrivalNoticeLinePageReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.arrivalnotice.vo.line.MesWmArrivalNoticeLineRespVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.arrivalnotice.vo.line.MesWmArrivalNoticeLineSaveReqVO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
+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.dal.dataobject.qc.iqc.MesQcIqcDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice.MesWmArrivalNoticeLineDO;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
-import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
+import cn.iocoder.yudao.module.mdm.api.unit.MdmUnitMeasureApi;
+import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO;
+
 import cn.iocoder.yudao.module.mes.service.qc.iqc.MesQcIqcService;
 import cn.iocoder.yudao.module.mes.service.wm.arrivalnotice.MesWmArrivalNoticeLineService;
 import io.swagger.v3.oas.annotations.Operation;
@@ -28,6 +30,7 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
@@ -41,9 +44,9 @@
     @Resource
     private MesWmArrivalNoticeLineService arrivalNoticeLineService;
     @Resource
-    private MesMdItemService itemService;
+    private MdmItemApi mdmItemApi;
     @Resource
-    private MesMdUnitMeasureService unitMeasureService;
+    private MdmUnitMeasureApi mdmUnitMeasureApi;
     @Resource
     private MesQcIqcService iqcService;
 
@@ -99,10 +102,11 @@
             return Collections.emptyList();
         }
         // 1. 鑾峰緱鍏宠仈鏁版嵁
-        Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(
+        Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(
                 convertSet(list, MesWmArrivalNoticeLineDO::getItemId));
-        Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
-                convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
+        Map<Long, MdmUnitMeasureRespDTO> unitMeasureMap = mdmUnitMeasureApi.getUnitMeasureList(
+                        convertSet(itemMap.values(), MdmItemRespDTO::getUnitMeasureId)).getCheckedData()
+                .stream().collect(Collectors.toMap(MdmUnitMeasureRespDTO::getId, e -> e));
         Map<Long, MesQcIqcDO> iqcMap = iqcService.getIqcMap(
                 convertSet(list, MesWmArrivalNoticeLineDO::getIqcId));
         // 2. 鏋勫缓缁撴灉
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/batch/MesWmBatchController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/batch/MesWmBatchController.java
index 3e01347..415c15d 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/batch/MesWmBatchController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/batch/MesWmBatchController.java
@@ -8,8 +8,9 @@
 import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchPageReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchRespVO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.md.client.MesMdClientDO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
+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.dal.dataobject.md.vendor.MesMdVendorDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.md.workstation.MesMdWorkstationDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.pro.task.MesProTaskDO;
@@ -17,8 +18,9 @@
 import cn.iocoder.yudao.module.mes.dal.dataobject.tm.tool.MesTmToolDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO;
 import cn.iocoder.yudao.module.mes.service.md.client.MesMdClientService;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
-import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
+import cn.iocoder.yudao.module.mdm.api.unit.MdmUnitMeasureApi;
+import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO;
+
 import cn.iocoder.yudao.module.mes.service.md.vendor.MesMdVendorService;
 import cn.iocoder.yudao.module.mes.service.md.workstation.MesMdWorkstationService;
 import cn.iocoder.yudao.module.mes.service.pro.task.MesProTaskService;
@@ -40,6 +42,7 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
@@ -53,9 +56,9 @@
     @Resource
     private MesWmBatchService batchService;
     @Resource
-    private MesMdItemService itemService;
+    private MdmItemApi mdmItemApi;
     @Resource
-    private MesMdUnitMeasureService unitMeasureService;
+    private MdmUnitMeasureApi mdmUnitMeasureApi;
     @Resource
     private MesMdVendorService vendorService;
     @Resource
@@ -111,7 +114,7 @@
             return Collections.emptyList();
         }
         // 1. 鑾峰緱鍏宠仈鏁版嵁
-        Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(
+        Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(
                 convertSet(list, MesWmBatchDO::getItemId));
         Map<Long, MesMdVendorDO> vendorMap = vendorService.getVendorMap(
                 convertSet(list, MesWmBatchDO::getVendorId));
@@ -125,8 +128,9 @@
                 convertSet(list, MesWmBatchDO::getWorkstationId));
         Map<Long, MesTmToolDO> toolMap = toolService.getToolMap(
                 convertSet(list, MesWmBatchDO::getToolId));
-        Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
-                convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
+        Map<Long, MdmUnitMeasureRespDTO> unitMeasureMap = mdmUnitMeasureApi.getUnitMeasureList(
+                convertSet(itemMap.values(), MdmItemRespDTO::getUnitMeasureId)).getCheckedData()
+                .stream().collect(Collectors.toMap(MdmUnitMeasureRespDTO::getId, e -> e));
         // 2. 鏋勫缓缁撴灉
         return BeanUtils.toBean(list, MesWmBatchRespVO.class, vo -> {
             MapUtils.findAndThen(itemMap, vo.getItemId(), item -> {
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemconsume/MesWmItemConsumeLineController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemconsume/MesWmItemConsumeLineController.java
index edeb614..a7c559b 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemconsume/MesWmItemConsumeLineController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemconsume/MesWmItemConsumeLineController.java
@@ -5,11 +5,13 @@
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.itemconsume.vo.MesWmItemConsumeLinePageReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.itemconsume.vo.MesWmItemConsumeLineRespVO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
+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.dal.dataobject.wm.itemconsume.MesWmItemConsumeLineDO;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
-import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
+import cn.iocoder.yudao.module.mdm.api.unit.MdmUnitMeasureApi;
+import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO;
+
 import cn.iocoder.yudao.module.mes.service.wm.itemconsume.MesWmItemConsumeLineService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -22,6 +24,7 @@
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
@@ -36,9 +39,9 @@
     @Resource
     private MesWmItemConsumeLineService itemConsumeLineService;
     @Resource
-    private MesMdItemService itemService;
+    private MdmItemApi mdmItemApi;
     @Resource
-    private MesMdUnitMeasureService unitMeasureService;
+    private MdmUnitMeasureApi mdmUnitMeasureApi;
 
     @GetMapping("/page")
     @Operation(summary = "鏍规嵁鎶ュ伐缂栧彿鍒嗛〉鑾峰彇娑堣�楄鍒楄〃")
@@ -50,10 +53,11 @@
                 itemConsumeLineService.getItemConsumeLinePage(pageReqVO);
         PageResult<MesWmItemConsumeLineRespVO> voPage = BeanUtils.toBean(pageResult, MesWmItemConsumeLineRespVO.class);
         // 2. 鎷兼帴鐗╂枡淇℃伅
-        Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(
+        Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(
                 convertSet(pageResult.getList(), MesWmItemConsumeLineDO::getItemId));
-        Map<Long, MesMdUnitMeasureDO> unitMap = unitMeasureService.getUnitMeasureMap(
-                convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
+        Map<Long, MdmUnitMeasureRespDTO> unitMap = mdmUnitMeasureApi.getUnitMeasureList(
+                convertSet(itemMap.values(), MdmItemRespDTO::getUnitMeasureId)).getCheckedData()
+                .stream().collect(Collectors.toMap(MdmUnitMeasureRespDTO::getId, e -> e));
         for (MesWmItemConsumeLineRespVO vo : voPage.getList()) {
             findAndThen(itemMap, vo.getItemId(), item -> {
                 vo.setItemCode(item.getCode()).setItemName(item.getName()).setSpecification(item.getSpecification());
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/MesWmItemReceiptDetailController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/MesWmItemReceiptDetailController.java
index 4628348..33a5d69 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/MesWmItemReceiptDetailController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/MesWmItemReceiptDetailController.java
@@ -6,14 +6,16 @@
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.detail.MesWmItemReceiptDetailRespVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.detail.MesWmItemReceiptDetailSaveReqVO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
+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.dal.dataobject.wm.itemreceipt.MesWmItemReceiptDetailDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
-import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
+import cn.iocoder.yudao.module.mdm.api.unit.MdmUnitMeasureApi;
+import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO;
+
 import cn.iocoder.yudao.module.mes.service.wm.itemreceipt.MesWmItemReceiptDetailService;
 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService;
 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService;
@@ -30,6 +32,7 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
@@ -43,9 +46,9 @@
     @Resource
     private MesWmItemReceiptDetailService itemReceiptDetailService;
     @Resource
-    private MesMdItemService itemService;
+    private MdmItemApi mdmItemApi;
     @Resource
-    private MesMdUnitMeasureService unitMeasureService;
+    private MdmUnitMeasureApi mdmUnitMeasureApi;
     @Resource
     private MesWmWarehouseService warehouseService;
     @Resource
@@ -106,10 +109,11 @@
             return Collections.emptyList();
         }
         // 1. 鑾峰緱鍏宠仈鏁版嵁
-        Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(
+        Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(
                 convertSet(list, MesWmItemReceiptDetailDO::getItemId));
-        Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
-                convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
+        Map<Long, MdmUnitMeasureRespDTO> unitMeasureMap = mdmUnitMeasureApi.getUnitMeasureList(
+                convertSet(itemMap.values(), MdmItemRespDTO::getUnitMeasureId)).getCheckedData()
+                .stream().collect(Collectors.toMap(MdmUnitMeasureRespDTO::getId, e -> e));
         Map<Long, MesWmWarehouseDO> warehouseMap = warehouseService.getWarehouseMap(
                 convertSet(list, MesWmItemReceiptDetailDO::getWarehouseId));
         Map<Long, MesWmWarehouseLocationDO> locationMap = locationService.getWarehouseLocationMap(
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/MesWmItemReceiptLineController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/MesWmItemReceiptLineController.java
index 0d4438f..2c056ba 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/MesWmItemReceiptLineController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/MesWmItemReceiptLineController.java
@@ -8,12 +8,14 @@
 import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.line.MesWmItemReceiptLinePageReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.line.MesWmItemReceiptLineRespVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.line.MesWmItemReceiptLineSaveReqVO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
+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.dal.dataobject.wm.itemreceipt.MesWmItemReceiptDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptLineDO;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
-import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
+import cn.iocoder.yudao.module.mdm.api.unit.MdmUnitMeasureApi;
+import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO;
+
 import cn.iocoder.yudao.module.mes.service.wm.itemreceipt.MesWmItemReceiptLineService;
 import cn.iocoder.yudao.module.mes.service.wm.itemreceipt.MesWmItemReceiptService;
 import io.swagger.v3.oas.annotations.Operation;
@@ -28,6 +30,7 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
@@ -41,9 +44,9 @@
     @Resource
     private MesWmItemReceiptLineService itemReceiptLineService;
     @Resource
-    private MesMdItemService itemService;
+    private MdmItemApi mdmItemApi;
     @Resource
-    private MesMdUnitMeasureService unitMeasureService;
+    private MdmUnitMeasureApi mdmUnitMeasureApi;
     @Resource
     private MesWmItemReceiptService itemReceiptService;
 
@@ -99,10 +102,11 @@
             return Collections.emptyList();
         }
         // 1. 鑾峰緱鍏宠仈鏁版嵁
-        Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(
+        Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(
                 convertSet(list, MesWmItemReceiptLineDO::getItemId));
-        Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
-                convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
+        Map<Long, MdmUnitMeasureRespDTO> unitMeasureMap = mdmUnitMeasureApi.getUnitMeasureList(
+                convertSet(itemMap.values(), MdmItemRespDTO::getUnitMeasureId)).getCheckedData()
+                .stream().collect(Collectors.toMap(MdmUnitMeasureRespDTO::getId, e -> e));
         Map<Long, MesWmItemReceiptDO> receiptMap = itemReceiptService.getItemReceiptMap(
                 convertSet(list, MesWmItemReceiptLineDO::getReceiptId));
         // 2. 鏋勫缓缁撴灉
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/materialstock/MesWmMaterialStockController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/materialstock/MesWmMaterialStockController.java
index a665b66..51d117b 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/materialstock/MesWmMaterialStockController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/materialstock/MesWmMaterialStockController.java
@@ -8,18 +8,21 @@
 import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockAdjustReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockPageReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockRespVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockFreezeReqVO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
+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.dal.dataobject.md.vendor.MesMdVendorDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstock.MesWmMaterialStockDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
-import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
+import cn.iocoder.yudao.module.mdm.api.unit.MdmUnitMeasureApi;
+import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO;
+
 import cn.iocoder.yudao.module.mes.service.md.vendor.MesMdVendorService;
 import cn.iocoder.yudao.module.mes.service.wm.materialstock.MesWmMaterialStockService;
 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService;
@@ -40,6 +43,7 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@@ -54,9 +58,9 @@
     @Resource
     private MesWmMaterialStockService materialStockService;
     @Resource
-    private MesMdItemService itemService;
+    private MdmItemApi mdmItemApi;
     @Resource
-    private MesMdUnitMeasureService unitMeasureService;
+    private MdmUnitMeasureApi mdmUnitMeasureApi;
     @Resource
     private MesWmWarehouseService warehouseService;
     @Resource
@@ -96,6 +100,13 @@
         return success(true);
     }
 
+    @PostMapping("/adjust")
+    @Operation(summary = "搴撳瓨璋冩暣锛堣嚜瀹氫箟鍑哄叆搴擄級")
+    @PreAuthorize("@ss.hasPermission('mes:wm-material-stock:adjust')")
+    public CommonResult<Long> adjustMaterialStock(@Valid @RequestBody MesWmMaterialStockAdjustReqVO reqVO) {
+        return success(materialStockService.adjustMaterialStock(reqVO));
+    }
+
     @GetMapping("/export-excel")
     @Operation(summary = "瀵煎嚭搴撳瓨鍙拌处 Excel")
     @PreAuthorize("@ss.hasPermission('mes:wm-material-stock:export')")
@@ -115,10 +126,11 @@
             return Collections.emptyList();
         }
         // 1. 鑾峰緱鍏宠仈鏁版嵁
-        Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(
+        Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(
                 convertSet(list, MesWmMaterialStockDO::getItemId));
-        Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
-                convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
+        Map<Long, MdmUnitMeasureRespDTO> unitMeasureMap = mdmUnitMeasureApi.getUnitMeasureList(
+                convertSet(itemMap.values(), MdmItemRespDTO::getUnitMeasureId)).getCheckedData()
+                .stream().collect(Collectors.toMap(MdmUnitMeasureRespDTO::getId, e -> e));
         Map<Long, MesWmWarehouseDO> warehouseMap = warehouseService.getWarehouseMap(
                 convertSet(list, MesWmMaterialStockDO::getWarehouseId));
         Map<Long, MesWmWarehouseLocationDO> locationMap = locationService.getWarehouseLocationMap(
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/materialstock/vo/MesWmMaterialStockAdjustReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/materialstock/vo/MesWmMaterialStockAdjustReqVO.java
new file mode 100644
index 0000000..b9e3a62
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/materialstock/vo/MesWmMaterialStockAdjustReqVO.java
@@ -0,0 +1,48 @@
+package cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 搴撳瓨璋冩暣锛堣嚜瀹氫箟鍑哄叆搴擄級Request VO
+ */
+@Schema(description = "绠$悊鍚庡彴 - 搴撳瓨璋冩暣 Request VO")
+@Data
+public class MesWmMaterialStockAdjustReqVO {
+
+    @Schema(description = "鐗╂枡ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @NotNull(message = "鐗╂枡ID涓嶈兘涓虹┖")
+    private Long itemId;
+
+    @Schema(description = "浠撳簱ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @NotNull(message = "浠撳簱ID涓嶈兘涓虹┖")
+    private Long warehouseId;
+
+    @Schema(description = "搴撳尯ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @NotNull(message = "搴撳尯ID涓嶈兘涓虹┖")
+    private Long locationId;
+
+    @Schema(description = "搴撲綅ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @NotNull(message = "搴撲綅ID涓嶈兘涓虹┖")
+    private Long areaId;
+
+    @Schema(description = "鎵规ID", example = "1")
+    private Long batchId;
+
+    @Schema(description = "鎵规鍙�", example = "BATCH001")
+    private String batchCode;
+
+    @Schema(description = "渚涘簲鍟咺D", example = "1")
+    private Long vendorId;
+
+    @Schema(description = "璋冩暣鏁伴噺锛堟鏁�=鍏ュ簱锛岃礋鏁�=鍑哄簱锛�", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
+    @NotNull(message = "璋冩暣鏁伴噺涓嶈兘涓虹┖")
+    private BigDecimal quantity;
+
+    @Schema(description = "璋冩暣鍘熷洜", example = "鐩樼偣璋冩暣")
+    private String reason;
+
+}
\ No newline at end of file
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscissue/MesWmMiscIssueLineController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscissue/MesWmMiscIssueLineController.java
index 2ca2d0a..654daa3 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscissue/MesWmMiscIssueLineController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscissue/MesWmMiscIssueLineController.java
@@ -8,14 +8,16 @@
 import cn.iocoder.yudao.module.mes.controller.admin.wm.miscissue.vo.line.MesWmMiscIssueLinePageReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.miscissue.vo.line.MesWmMiscIssueLineRespVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.miscissue.vo.line.MesWmMiscIssueLineSaveReqVO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
+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.dal.dataobject.wm.miscissue.MesWmMiscIssueLineDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
-import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
+import cn.iocoder.yudao.module.mdm.api.unit.MdmUnitMeasureApi;
+import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO;
+
 import cn.iocoder.yudao.module.mes.service.wm.miscissue.MesWmMiscIssueLineService;
 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService;
 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService;
@@ -32,6 +34,7 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
@@ -45,9 +48,9 @@
     @Resource
     private MesWmMiscIssueLineService miscIssueLineService;
     @Resource
-    private MesMdItemService itemService;
+    private MdmItemApi mdmItemApi;
     @Resource
-    private MesMdUnitMeasureService unitMeasureService;
+    private MdmUnitMeasureApi mdmUnitMeasureApi;
     @Resource
     private MesWmWarehouseService warehouseService;
     @Resource
@@ -107,10 +110,11 @@
             return Collections.emptyList();
         }
         // 1. 鑾峰緱鍏宠仈鏁版嵁
-        Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(
+        Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(
                 convertSet(list, MesWmMiscIssueLineDO::getItemId));
-        Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
-                convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
+        Map<Long, MdmUnitMeasureRespDTO> unitMeasureMap = mdmUnitMeasureApi.getUnitMeasureList(
+                convertSet(itemMap.values(), MdmItemRespDTO::getUnitMeasureId)).getCheckedData()
+                .stream().collect(Collectors.toMap(MdmUnitMeasureRespDTO::getId, e -> e));
         Map<Long, MesWmWarehouseDO> warehouseMap = warehouseService.getWarehouseMap(
                 convertSet(list, MesWmMiscIssueLineDO::getWarehouseId));
         Map<Long, MesWmWarehouseLocationDO> locationMap = warehouseLocationService.getWarehouseLocationMap(
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/MesWmMiscReceiptLineController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/MesWmMiscReceiptLineController.java
index 8abd396..ff4153c 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/MesWmMiscReceiptLineController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/MesWmMiscReceiptLineController.java
@@ -20,18 +20,21 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
 import cn.hutool.core.collection.CollUtil;
 import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
+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.dal.dataobject.wm.warehouse.MesWmWarehouseDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
-import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
+import cn.iocoder.yudao.module.mdm.api.unit.MdmUnitMeasureApi;
+import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO;
+
 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService;
 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService;
 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService;
@@ -45,9 +48,9 @@
     @Resource
     private MesWmMiscReceiptLineService miscReceiptLineService;
     @Resource
-    private MesMdItemService itemService;
+    private MdmItemApi mdmItemApi;
     @Resource
-    private MesMdUnitMeasureService unitMeasureService;
+    private MdmUnitMeasureApi mdmUnitMeasureApi;
     @Resource
     private MesWmWarehouseService warehouseService;
     @Resource
@@ -115,10 +118,11 @@
             return Collections.emptyList();
         }
         // 1. 鑾峰緱鍏宠仈鏁版嵁
-        Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(
+        Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(
                 convertSet(list, MesWmMiscReceiptLineDO::getItemId));
-        Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
-                convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
+        Map<Long, MdmUnitMeasureRespDTO> unitMeasureMap = mdmUnitMeasureApi.getUnitMeasureList(
+                convertSet(itemMap.values(), MdmItemRespDTO::getUnitMeasureId)).getCheckedData()
+                .stream().collect(Collectors.toMap(MdmUnitMeasureRespDTO::getId, e -> e));
         Map<Long, MesWmWarehouseDO> warehouseMap = warehouseService.getWarehouseMap(
                 convertSet(list, MesWmMiscReceiptLineDO::getWarehouseId));
         Map<Long, MesWmWarehouseLocationDO> locationMap = warehouseLocationService.getWarehouseLocationMap(
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourceissue/MesWmOutsourceIssueDetailController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourceissue/MesWmOutsourceIssueDetailController.java
index e92fca2..a18634e 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourceissue/MesWmOutsourceIssueDetailController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourceissue/MesWmOutsourceIssueDetailController.java
@@ -6,14 +6,16 @@
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourceissue.vo.detail.MesWmOutsourceIssueDetailRespVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourceissue.vo.detail.MesWmOutsourceIssueDetailSaveReqVO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
+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.dal.dataobject.wm.outsourceissue.MesWmOutsourceIssueDetailDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
-import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
+import cn.iocoder.yudao.module.mdm.api.unit.MdmUnitMeasureApi;
+import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO;
+
 import cn.iocoder.yudao.module.mes.service.wm.outsourceissue.MesWmOutsourceIssueDetailService;
 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService;
 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService;
@@ -30,6 +32,7 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
@@ -43,9 +46,9 @@
     @Resource
     private MesWmOutsourceIssueDetailService outsourceIssueDetailService;
     @Resource
-    private MesMdItemService itemService;
+    private MdmItemApi mdmItemApi;
     @Resource
-    private MesMdUnitMeasureService unitMeasureService;
+    private MdmUnitMeasureApi mdmUnitMeasureApi;
     @Resource
     private MesWmWarehouseService warehouseService;
     @Resource
@@ -106,10 +109,11 @@
             return Collections.emptyList();
         }
         // 1. 鑾峰緱鍏宠仈鏁版嵁
-        Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(
+        Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(
                 convertSet(list, MesWmOutsourceIssueDetailDO::getItemId));
-        Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
-                convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
+        Map<Long, MdmUnitMeasureRespDTO> unitMeasureMap = mdmUnitMeasureApi.getUnitMeasureList(
+                convertSet(itemMap.values(), MdmItemRespDTO::getUnitMeasureId)).getCheckedData()
+                .stream().collect(Collectors.toMap(MdmUnitMeasureRespDTO::getId, e -> e));
         Map<Long, MesWmWarehouseDO> warehouseMap = warehouseService.getWarehouseMap(
                 convertSet(list, MesWmOutsourceIssueDetailDO::getWarehouseId));
         Map<Long, MesWmWarehouseLocationDO> locationMap = locationService.getWarehouseLocationMap(
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourceissue/MesWmOutsourceIssueLineController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourceissue/MesWmOutsourceIssueLineController.java
index f629379..20230d5 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourceissue/MesWmOutsourceIssueLineController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourceissue/MesWmOutsourceIssueLineController.java
@@ -8,12 +8,14 @@
 import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourceissue.vo.line.MesWmOutsourceIssueLinePageReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourceissue.vo.line.MesWmOutsourceIssueLineRespVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourceissue.vo.line.MesWmOutsourceIssueLineSaveReqVO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
+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.dal.dataobject.wm.batch.MesWmBatchDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourceissue.MesWmOutsourceIssueLineDO;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
-import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
+import cn.iocoder.yudao.module.mdm.api.unit.MdmUnitMeasureApi;
+import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO;
+
 import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService;
 import cn.iocoder.yudao.module.mes.service.wm.outsourceissue.MesWmOutsourceIssueLineService;
 import io.swagger.v3.oas.annotations.Operation;
@@ -28,6 +30,7 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 import java.util.Set;
 
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@@ -43,9 +46,9 @@
     @Resource
     private MesWmOutsourceIssueLineService outsourceIssueLineService;
     @Resource
-    private MesMdItemService itemService;
+    private MdmItemApi mdmItemApi;
     @Resource
-    private MesMdUnitMeasureService unitMeasureService;
+    private MdmUnitMeasureApi mdmUnitMeasureApi;
     @Resource
     private MesWmBatchService batchService;
 
@@ -111,10 +114,11 @@
             return Collections.emptyList();
         }
         // 1. 鑾峰緱鍏宠仈鏁版嵁
-        Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(
+        Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(
                 convertSet(list, MesWmOutsourceIssueLineDO::getItemId));
-        Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
-                convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
+        Map<Long, MdmUnitMeasureRespDTO> unitMeasureMap = mdmUnitMeasureApi.getUnitMeasureList(
+                convertSet(itemMap.values(), MdmItemRespDTO::getUnitMeasureId)).getCheckedData()
+                .stream().collect(Collectors.toMap(MdmUnitMeasureRespDTO::getId, e -> e));
         // 1.2 鑾峰緱鎵规鏁版嵁
         Set<Long> batchIds = convertSet(list, MesWmOutsourceIssueLineDO::getBatchId);
         batchIds.remove(null);
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourcereceipt/MesWmOutsourceReceiptDetailController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourcereceipt/MesWmOutsourceReceiptDetailController.java
index 9f26cad..7ab32a0 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourcereceipt/MesWmOutsourceReceiptDetailController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourcereceipt/MesWmOutsourceReceiptDetailController.java
@@ -6,14 +6,16 @@
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourcereceipt.vo.detail.MesWmOutsourceReceiptDetailRespVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourcereceipt.vo.detail.MesWmOutsourceReceiptDetailSaveReqVO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
+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.dal.dataobject.wm.outsourcereceipt.MesWmOutsourceReceiptDetailDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
-import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
+import cn.iocoder.yudao.module.mdm.api.unit.MdmUnitMeasureApi;
+import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO;
+
 import cn.iocoder.yudao.module.mes.service.wm.outsourcereceipt.MesWmOutsourceReceiptDetailService;
 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService;
 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService;
@@ -30,6 +32,7 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
@@ -43,9 +46,9 @@
     @Resource
     private MesWmOutsourceReceiptDetailService detailService;
     @Resource
-    private MesMdItemService itemService;
+    private MdmItemApi mdmItemApi;
     @Resource
-    private MesMdUnitMeasureService unitMeasureService;
+    private MdmUnitMeasureApi mdmUnitMeasureApi;
     @Resource
     private MesWmWarehouseService warehouseService;
     @Resource
@@ -106,10 +109,11 @@
             return Collections.emptyList();
         }
         // 1. 鑾峰緱鍏宠仈鏁版嵁
-        Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(
+        Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(
                 convertSet(list, MesWmOutsourceReceiptDetailDO::getItemId));
-        Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
-                convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
+        Map<Long, MdmUnitMeasureRespDTO> unitMeasureMap = mdmUnitMeasureApi.getUnitMeasureList(
+                convertSet(itemMap.values(), MdmItemRespDTO::getUnitMeasureId)).getCheckedData()
+                .stream().collect(Collectors.toMap(MdmUnitMeasureRespDTO::getId, e -> e));
         Map<Long, MesWmWarehouseDO> warehouseMap = warehouseService.getWarehouseMap(
                 convertSet(list, MesWmOutsourceReceiptDetailDO::getWarehouseId));
         Map<Long, MesWmWarehouseLocationDO> locationMap = locationService.getWarehouseLocationMap(
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourcereceipt/MesWmOutsourceReceiptLineController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourcereceipt/MesWmOutsourceReceiptLineController.java
index 771b426..5ce8c74 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourcereceipt/MesWmOutsourceReceiptLineController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourcereceipt/MesWmOutsourceReceiptLineController.java
@@ -8,11 +8,13 @@
 import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourcereceipt.vo.line.MesWmOutsourceReceiptLinePageReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourcereceipt.vo.line.MesWmOutsourceReceiptLineRespVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourcereceipt.vo.line.MesWmOutsourceReceiptLineSaveReqVO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
+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.dal.dataobject.wm.outsourcereceipt.MesWmOutsourceReceiptLineDO;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
-import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
+import cn.iocoder.yudao.module.mdm.api.unit.MdmUnitMeasureApi;
+import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO;
+
 import cn.iocoder.yudao.module.mes.service.wm.outsourcereceipt.MesWmOutsourceReceiptLineService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
@@ -26,6 +28,7 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
@@ -39,9 +42,9 @@
     @Resource
     private MesWmOutsourceReceiptLineService receiptLineService;
     @Resource
-    private MesMdItemService itemService;
+    private MdmItemApi mdmItemApi;
     @Resource
-    private MesMdUnitMeasureService unitMeasureService;
+    private MdmUnitMeasureApi mdmUnitMeasureApi;
 
     @PostMapping("/create")
     @Operation(summary = "鍒涘缓澶栧崗鍏ュ簱鍗曡")
@@ -95,10 +98,11 @@
             return Collections.emptyList();
         }
         // 1. 鑾峰緱鍏宠仈鏁版嵁
-        Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(
+        Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(
                 convertSet(list, MesWmOutsourceReceiptLineDO::getItemId));
-        Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
-                convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
+        Map<Long, MdmUnitMeasureRespDTO> unitMeasureMap = mdmUnitMeasureApi.getUnitMeasureList(
+                convertSet(itemMap.values(), MdmItemRespDTO::getUnitMeasureId)).getCheckedData()
+                .stream().collect(Collectors.toMap(MdmUnitMeasureRespDTO::getId, e -> e));
         // 2. 鏋勫缓缁撴灉
         return BeanUtils.toBean(list, MesWmOutsourceReceiptLineRespVO.class, vo -> {
             MapUtils.findAndThen(itemMap, vo.getItemId(), item -> {
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/MesWmPackageController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/MesWmPackageController.java
index 5c52e6f..70d546b 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/MesWmPackageController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/MesWmPackageController.java
@@ -9,11 +9,13 @@
 import cn.iocoder.yudao.module.mes.controller.admin.wm.packages.vo.MesWmPackageRespVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.packages.vo.MesWmPackageSaveReqVO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.md.client.MesMdClientDO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
+
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.packages.MesWmPackageDO;
 import cn.iocoder.yudao.module.mes.service.md.client.MesMdClientService;
-import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
+
 import cn.iocoder.yudao.module.mes.service.wm.packages.MesWmPackageService;
+import cn.iocoder.yudao.module.mdm.api.unit.MdmUnitMeasureApi;
+import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO;
 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;
@@ -26,6 +28,7 @@
 import org.springframework.web.bind.annotation.*;
 
 import java.util.*;
+import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@@ -43,7 +46,7 @@
     @Resource
     private MesMdClientService clientService;
     @Resource
-    private MesMdUnitMeasureService unitMeasureService;
+    private MdmUnitMeasureApi mdmUnitMeasureApi;
 
     @Resource
     private AdminUserApi adminUserApi;
@@ -131,8 +134,9 @@
         Map<Long, MesMdClientDO> clientMap = clientService.getClientMap(
                 convertSet(list, MesWmPackageDO::getClientId));
         // 鎵归噺鏌ヨ璁¢噺鍗曚綅锛堝昂瀵� + 閲嶉噺锛�
-        Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
-                convertSetByFlatMap(list, p -> Stream.of(p.getSizeUnitId(), p.getWeightUnitId())));
+        Map<Long, MdmUnitMeasureRespDTO> unitMeasureMap = mdmUnitMeasureApi.getUnitMeasureList(
+                convertSetByFlatMap(list, p -> Stream.of(p.getSizeUnitId(), p.getWeightUnitId()))).getCheckedData()
+                .stream().collect(Collectors.toMap(MdmUnitMeasureRespDTO::getId, e -> e));
         // 鎵归噺鏌ヨ妫�鏌ュ憳
         Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
                 convertSet(list, MesWmPackageDO::getInspectorUserId));
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/MesWmPackageLineController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/MesWmPackageLineController.java
index 2b8724a..1f6e878 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/MesWmPackageLineController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/MesWmPackageLineController.java
@@ -8,12 +8,14 @@
 import cn.iocoder.yudao.module.mes.controller.admin.wm.packages.vo.line.MesWmPackageLinePageReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.packages.vo.line.MesWmPackageLineRespVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.packages.vo.line.MesWmPackageLineSaveReqVO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
+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.dal.dataobject.pro.workorder.MesProWorkOrderDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.packages.MesWmPackageLineDO;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
-import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
+import cn.iocoder.yudao.module.mdm.api.unit.MdmUnitMeasureApi;
+import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO;
+
 import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService;
 import cn.iocoder.yudao.module.mes.service.wm.packages.MesWmPackageLineService;
 import io.swagger.v3.oas.annotations.Operation;
@@ -28,6 +30,7 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
@@ -41,9 +44,9 @@
         @Resource
         private MesWmPackageLineService packageLineService;
         @Resource
-        private MesMdItemService itemService;
+        private MdmItemApi mdmItemApi;
         @Resource
-        private MesMdUnitMeasureService unitMeasureService;
+        private MdmUnitMeasureApi mdmUnitMeasureApi;
         @Resource
         private MesProWorkOrderService workOrderService;
 
@@ -99,11 +102,12 @@
                         return Collections.emptyList();
                 }
                 // 鎵归噺鏌ヨ鐗╂枡
-                Map<Long, MesMdItemDO> itemMap = itemService
+                Map<Long, MdmItemRespDTO> itemMap = mdmItemApi
                                 .getItemMap(convertSet(list, MesWmPackageLineDO::getItemId));
                 // 鎵归噺鏌ヨ璁¢噺鍗曚綅
-                Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
-                                convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
+                Map<Long, MdmUnitMeasureRespDTO> unitMeasureMap = mdmUnitMeasureApi.getUnitMeasureList(
+                                convertSet(itemMap.values(), MdmItemRespDTO::getUnitMeasureId)).getCheckedData()
+                                .stream().collect(Collectors.toMap(MdmUnitMeasureRespDTO::getId, e -> e));
                 // 鎵归噺鏌ヨ宸ュ崟
                 Map<Long, MesProWorkOrderDO> workOrderMap = workOrderService.getWorkOrderMap(
                                 convertSet(list, MesWmPackageLineDO::getWorkOrderId));
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/MesWmProductIssueDetailController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/MesWmProductIssueDetailController.java
index c7049a2..69306e0 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/MesWmProductIssueDetailController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/MesWmProductIssueDetailController.java
@@ -6,14 +6,16 @@
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.productissue.vo.detail.MesWmProductIssueDetailRespVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.productissue.vo.detail.MesWmProductIssueDetailSaveReqVO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
+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.dal.dataobject.wm.productissue.MesWmProductIssueDetailDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
-import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
+import cn.iocoder.yudao.module.mdm.api.unit.MdmUnitMeasureApi;
+import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO;
+
 import cn.iocoder.yudao.module.mes.service.wm.productissue.MesWmProductIssueDetailService;
 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService;
 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService;
@@ -30,6 +32,7 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
@@ -43,9 +46,9 @@
     @Resource
     private MesWmProductIssueDetailService issueDetailService;
     @Resource
-    private MesMdItemService itemService;
+    private MdmItemApi mdmItemApi;
     @Resource
-    private MesMdUnitMeasureService unitMeasureService;
+    private MdmUnitMeasureApi mdmUnitMeasureApi;
     @Resource
     private MesWmWarehouseService warehouseService;
     @Resource
@@ -106,10 +109,11 @@
             return Collections.emptyList();
         }
         // 1. 鑾峰緱鍏宠仈鏁版嵁
-        Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(
+        Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(
                 convertSet(list, MesWmProductIssueDetailDO::getItemId));
-        Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
-                convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
+        Map<Long, MdmUnitMeasureRespDTO> unitMeasureMap = mdmUnitMeasureApi.getUnitMeasureList(
+                convertSet(itemMap.values(), MdmItemRespDTO::getUnitMeasureId)).getCheckedData()
+                .stream().collect(Collectors.toMap(MdmUnitMeasureRespDTO::getId, e -> e));
         Map<Long, MesWmWarehouseDO> warehouseMap = warehouseService.getWarehouseMap(
                 convertSet(list, MesWmProductIssueDetailDO::getWarehouseId));
         Map<Long, MesWmWarehouseLocationDO> locationMap = locationService.getWarehouseLocationMap(
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/MesWmProductIssueLineController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/MesWmProductIssueLineController.java
index 67d1b5a..29093f9 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/MesWmProductIssueLineController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/MesWmProductIssueLineController.java
@@ -8,11 +8,13 @@
 import cn.iocoder.yudao.module.mes.controller.admin.wm.productissue.vo.line.MesWmProductIssueLinePageReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.productissue.vo.line.MesWmProductIssueLineRespVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.productissue.vo.line.MesWmProductIssueLineSaveReqVO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
+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.dal.dataobject.wm.productissue.MesWmProductIssueLineDO;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
-import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
+import cn.iocoder.yudao.module.mdm.api.unit.MdmUnitMeasureApi;
+import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO;
+
 import cn.iocoder.yudao.module.mes.service.wm.productissue.MesWmProductIssueLineService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
@@ -26,6 +28,7 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
@@ -39,9 +42,9 @@
     @Resource
     private MesWmProductIssueLineService issueLineService;
     @Resource
-    private MesMdItemService itemService;
+    private MdmItemApi mdmItemApi;
     @Resource
-    private MesMdUnitMeasureService unitMeasureService;
+    private MdmUnitMeasureApi mdmUnitMeasureApi;
 
     @PostMapping("/create")
     @Operation(summary = "鍒涘缓棰嗘枡鍑哄簱鍗曡")
@@ -105,10 +108,11 @@
             return Collections.emptyList();
         }
         // 1. 鑾峰緱鍏宠仈鏁版嵁
-        Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(
+        Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(
                 convertSet(list, MesWmProductIssueLineDO::getItemId));
-        Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
-                convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
+        Map<Long, MdmUnitMeasureRespDTO> unitMeasureMap = mdmUnitMeasureApi.getUnitMeasureList(
+                convertSet(itemMap.values(), MdmItemRespDTO::getUnitMeasureId)).getCheckedData()
+                .stream().collect(Collectors.toMap(MdmUnitMeasureRespDTO::getId, e -> e));
         // 2. 鏋勫缓缁撴灉
         return BeanUtils.toBean(list, MesWmProductIssueLineRespVO.class, vo -> {
             MapUtils.findAndThen(itemMap, vo.getItemId(), item -> {
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productproduce/MesWmProductProduceLineController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productproduce/MesWmProductProduceLineController.java
index 9d663b5..d6d7379 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productproduce/MesWmProductProduceLineController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productproduce/MesWmProductProduceLineController.java
@@ -7,11 +7,13 @@
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.productproduce.vo.MesWmProductProduceLinePageReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.productproduce.vo.MesWmProductProduceLineRespVO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
+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.dal.dataobject.wm.productproduce.MesWmProductProduceLineDO;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
-import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
+import cn.iocoder.yudao.module.mdm.api.unit.MdmUnitMeasureApi;
+import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO;
+
 import cn.iocoder.yudao.module.mes.service.wm.productproduce.MesWmProductProduceLineService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -26,6 +28,7 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
@@ -39,9 +42,9 @@
     @Resource
     private MesWmProductProduceLineService productProduceLineService;
     @Resource
-    private MesMdItemService itemService;
+    private MdmItemApi mdmItemApi;
     @Resource
-    private MesMdUnitMeasureService unitMeasureService;
+    private MdmUnitMeasureApi mdmUnitMeasureApi;
 
     @GetMapping("/page")
     @Operation(summary = "鑾峰緱鐢熶骇鍏ュ簱鍗曡鍒嗛〉")
@@ -60,10 +63,11 @@
             return Collections.emptyList();
         }
         // 1. 鑾峰緱鍏宠仈鏁版嵁
-        Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(
+        Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(
                 convertSet(list, MesWmProductProduceLineDO::getItemId));
-        Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
-                convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
+        Map<Long, MdmUnitMeasureRespDTO> unitMeasureMap = mdmUnitMeasureApi.getUnitMeasureList(
+                convertSet(itemMap.values(), MdmItemRespDTO::getUnitMeasureId)).getCheckedData()
+                .stream().collect(Collectors.toMap(MdmUnitMeasureRespDTO::getId, e -> e));
         // 2. 鏋勫缓缁撴灉
         return BeanUtils.toBean(list, MesWmProductProduceLineRespVO.class, vo -> {
             MapUtils.findAndThen(itemMap, vo.getItemId(), item -> {
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productreceipt/MesWmProductReceiptController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productreceipt/MesWmProductReceiptController.java
index 74bcb3a..d8e5af5 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productreceipt/MesWmProductReceiptController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productreceipt/MesWmProductReceiptController.java
@@ -11,12 +11,14 @@
 import cn.iocoder.yudao.module.mes.controller.admin.wm.productreceipt.vo.MesWmProductReceiptPageReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.productreceipt.vo.MesWmProductReceiptRespVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.productreceipt.vo.MesWmProductReceiptSaveReqVO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
+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.dal.dataobject.pro.workorder.MesProWorkOrderDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productreceipt.MesWmProductReceiptDO;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
-import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
+import cn.iocoder.yudao.module.mdm.api.unit.MdmUnitMeasureApi;
+import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO;
+
 import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService;
 import cn.iocoder.yudao.module.mes.service.wm.productreceipt.MesWmProductReceiptService;
 import io.swagger.v3.oas.annotations.Operation;
@@ -33,6 +35,7 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@@ -49,9 +52,9 @@
     @Resource
     private MesProWorkOrderService workOrderService;
     @Resource
-    private MesMdItemService itemService;
+    private MdmItemApi mdmItemApi;
     @Resource
-    private MesMdUnitMeasureService unitMeasureService;
+    private MdmUnitMeasureApi mdmUnitMeasureApi;
 
     @PostMapping("/create")
     @Operation(summary = "鍒涘缓浜у搧鏀惰揣鍗�")
@@ -163,10 +166,11 @@
         // 1. 鑾峰緱鍏宠仈鏁版嵁
         Map<Long, MesProWorkOrderDO> workOrderMap = workOrderService.getWorkOrderMap(
                 convertSet(list, MesWmProductReceiptDO::getWorkOrderId));
-        Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(
+        Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(
                 convertSet(list, MesWmProductReceiptDO::getItemId));
-        Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
-                convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
+        Map<Long, MdmUnitMeasureRespDTO> unitMeasureMap = mdmUnitMeasureApi.getUnitMeasureList(
+                convertSet(itemMap.values(), MdmItemRespDTO::getUnitMeasureId)).getCheckedData()
+                .stream().collect(Collectors.toMap(MdmUnitMeasureRespDTO::getId, e -> e));
         // 2. 鏋勫缓缁撴灉
         return BeanUtils.toBean(list, MesWmProductReceiptRespVO.class, vo -> {
             MapUtils.findAndThen(workOrderMap, vo.getWorkOrderId(),
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productreceipt/MesWmProductReceiptDetailController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productreceipt/MesWmProductReceiptDetailController.java
index 3382087..c234fa5 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productreceipt/MesWmProductReceiptDetailController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productreceipt/MesWmProductReceiptDetailController.java
@@ -6,14 +6,16 @@
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.productreceipt.vo.detail.MesWmProductReceiptDetailRespVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.productreceipt.vo.detail.MesWmProductReceiptDetailSaveReqVO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
+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.dal.dataobject.wm.productreceipt.MesWmProductReceiptDetailDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
-import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
+import cn.iocoder.yudao.module.mdm.api.unit.MdmUnitMeasureApi;
+import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO;
+
 import cn.iocoder.yudao.module.mes.service.wm.productreceipt.MesWmProductReceiptDetailService;
 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService;
 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService;
@@ -30,6 +32,7 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
@@ -43,9 +46,9 @@
     @Resource
     private MesWmProductReceiptDetailService productReceiptDetailService;
     @Resource
-    private MesMdItemService itemService;
+    private MdmItemApi mdmItemApi;
     @Resource
-    private MesMdUnitMeasureService unitMeasureService;
+    private MdmUnitMeasureApi mdmUnitMeasureApi;
     @Resource
     private MesWmWarehouseService warehouseService;
     @Resource
@@ -106,10 +109,11 @@
             return Collections.emptyList();
         }
         // 1. 鑾峰緱鍏宠仈鏁版嵁
-        Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(
+        Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(
                 convertSet(list, MesWmProductReceiptDetailDO::getItemId));
-        Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
-                convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
+        Map<Long, MdmUnitMeasureRespDTO> unitMeasureMap = mdmUnitMeasureApi.getUnitMeasureList(
+                convertSet(itemMap.values(), MdmItemRespDTO::getUnitMeasureId)).getCheckedData()
+                .stream().collect(Collectors.toMap(MdmUnitMeasureRespDTO::getId, e -> e));
         Map<Long, MesWmWarehouseDO> warehouseMap = warehouseService.getWarehouseMap(
                 convertSet(list, MesWmProductReceiptDetailDO::getWarehouseId));
         Map<Long, MesWmWarehouseLocationDO> locationMap = locationService.getWarehouseLocationMap(
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productreceipt/MesWmProductReceiptLineController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productreceipt/MesWmProductReceiptLineController.java
index a96260f..1aef3bc 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productreceipt/MesWmProductReceiptLineController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productreceipt/MesWmProductReceiptLineController.java
@@ -8,11 +8,13 @@
 import cn.iocoder.yudao.module.mes.controller.admin.wm.productreceipt.vo.line.MesWmProductReceiptLinePageReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.productreceipt.vo.line.MesWmProductReceiptLineRespVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.productreceipt.vo.line.MesWmProductReceiptLineSaveReqVO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
+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.dal.dataobject.wm.productreceipt.MesWmProductReceiptLineDO;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
-import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
+import cn.iocoder.yudao.module.mdm.api.unit.MdmUnitMeasureApi;
+import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO;
+
 import cn.iocoder.yudao.module.mes.service.wm.productreceipt.MesWmProductReceiptLineService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
@@ -26,6 +28,7 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
@@ -39,9 +42,9 @@
     @Resource
     private MesWmProductReceiptLineService productReceiptLineService;
     @Resource
-    private MesMdItemService itemService;
+    private MdmItemApi mdmItemApi;
     @Resource
-    private MesMdUnitMeasureService unitMeasureService;
+    private MdmUnitMeasureApi mdmUnitMeasureApi;
 
     @PostMapping("/create")
     @Operation(summary = "鍒涘缓浜у搧鏀惰揣鍗曡")
@@ -95,10 +98,11 @@
             return Collections.emptyList();
         }
         // 1. 鑾峰緱鍏宠仈鏁版嵁
-        Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(
+        Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(
                 convertSet(list, MesWmProductReceiptLineDO::getItemId));
-        Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
-                convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
+        Map<Long, MdmUnitMeasureRespDTO> unitMeasureMap = mdmUnitMeasureApi.getUnitMeasureList(
+                convertSet(itemMap.values(), MdmItemRespDTO::getUnitMeasureId)).getCheckedData()
+                .stream().collect(Collectors.toMap(MdmUnitMeasureRespDTO::getId, e -> e));
         // 2. 鏋勫缓缁撴灉
         return BeanUtils.toBean(list, MesWmProductReceiptLineRespVO.class, vo -> {
             MapUtils.findAndThen(itemMap, vo.getItemId(), item -> {
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productsales/MesWmProductSalesDetailController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productsales/MesWmProductSalesDetailController.java
index 2038e4c..6e79bf3 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productsales/MesWmProductSalesDetailController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productsales/MesWmProductSalesDetailController.java
@@ -6,14 +6,16 @@
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.productsales.vo.detail.MesWmProductSalesDetailRespVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.productsales.vo.detail.MesWmProductSalesDetailSaveReqVO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
+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.dal.dataobject.wm.productsales.MesWmProductSalesDetailDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
-import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
+import cn.iocoder.yudao.module.mdm.api.unit.MdmUnitMeasureApi;
+import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO;
+
 import cn.iocoder.yudao.module.mes.service.wm.productsales.MesWmProductSalesDetailService;
 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService;
 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService;
@@ -30,6 +32,7 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
@@ -43,9 +46,9 @@
     @Resource
     private MesWmProductSalesDetailService productSalesDetailService;
     @Resource
-    private MesMdItemService itemService;
+    private MdmItemApi mdmItemApi;
     @Resource
-    private MesMdUnitMeasureService unitMeasureService;
+    private MdmUnitMeasureApi mdmUnitMeasureApi;
     @Resource
     private MesWmWarehouseService warehouseService;
     @Resource
@@ -106,10 +109,11 @@
             return Collections.emptyList();
         }
         // 1. 鑾峰緱鍏宠仈鏁版嵁
-        Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(
+        Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(
                 convertSet(list, MesWmProductSalesDetailDO::getItemId));
-        Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
-                convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
+        Map<Long, MdmUnitMeasureRespDTO> unitMeasureMap = mdmUnitMeasureApi.getUnitMeasureList(
+                convertSet(itemMap.values(), MdmItemRespDTO::getUnitMeasureId)).getCheckedData()
+                .stream().collect(Collectors.toMap(MdmUnitMeasureRespDTO::getId, e -> e));
         Map<Long, MesWmWarehouseDO> warehouseMap = warehouseService.getWarehouseMap(
                 convertSet(list, MesWmProductSalesDetailDO::getWarehouseId));
         Map<Long, MesWmWarehouseLocationDO> locationMap = locationService.getWarehouseLocationMap(
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productsales/MesWmProductSalesLineController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productsales/MesWmProductSalesLineController.java
index 6b3ccbf..336da58 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productsales/MesWmProductSalesLineController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productsales/MesWmProductSalesLineController.java
@@ -8,12 +8,14 @@
 import cn.iocoder.yudao.module.mes.controller.admin.wm.productsales.vo.line.MesWmProductSalesLinePageReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.productsales.vo.line.MesWmProductSalesLineRespVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.productsales.vo.line.MesWmProductSalesLineSaveReqVO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
+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.dal.dataobject.wm.productsales.MesWmProductSalesLineDO;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
-import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
+import cn.iocoder.yudao.module.mdm.api.unit.MdmUnitMeasureApi;
+import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO;
+
 
 import cn.iocoder.yudao.module.mes.service.wm.productsales.MesWmProductSalesLineService;
 import io.swagger.v3.oas.annotations.Operation;
@@ -28,6 +30,7 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
@@ -41,9 +44,9 @@
     @Resource
     private MesWmProductSalesLineService productSalesLineService;
     @Resource
-    private MesMdItemService itemService;
+    private MdmItemApi mdmItemApi;
     @Resource
-    private MesMdUnitMeasureService unitMeasureService;
+    private MdmUnitMeasureApi mdmUnitMeasureApi;
 
 
     @PostMapping("/create")
@@ -98,10 +101,11 @@
             return Collections.emptyList();
         }
         // 1. 鑾峰緱鍏宠仈鏁版嵁
-        Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(
+        Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(
                 convertSet(list, MesWmProductSalesLineDO::getItemId));
-        Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
-                convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
+        Map<Long, MdmUnitMeasureRespDTO> unitMeasureMap = mdmUnitMeasureApi.getUnitMeasureList(
+                        convertSet(itemMap.values(), MdmItemRespDTO::getUnitMeasureId)).getCheckedData()
+                .stream().collect(Collectors.toMap(MdmUnitMeasureRespDTO::getId, e -> e));
         // 2. 鏋勫缓缁撴灉
         return BeanUtils.toBean(list, MesWmProductSalesLineRespVO.class, vo -> {
             MapUtils.findAndThen(itemMap, vo.getItemId(), item -> {
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnissue/MesWmReturnIssueDetailController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnissue/MesWmReturnIssueDetailController.java
index 602c244..913b9b8 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnissue/MesWmReturnIssueDetailController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnissue/MesWmReturnIssueDetailController.java
@@ -6,14 +6,16 @@
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.returnissue.vo.detail.MesWmReturnIssueDetailRespVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.returnissue.vo.detail.MesWmReturnIssueDetailSaveReqVO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
+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.dal.dataobject.wm.returnissue.MesWmReturnIssueDetailDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
-import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
+import cn.iocoder.yudao.module.mdm.api.unit.MdmUnitMeasureApi;
+import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO;
+
 import cn.iocoder.yudao.module.mes.service.wm.returnissue.MesWmReturnIssueDetailService;
 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService;
 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService;
@@ -30,6 +32,7 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
@@ -43,9 +46,9 @@
     @Resource
     private MesWmReturnIssueDetailService issueDetailService;
     @Resource
-    private MesMdItemService itemService;
+    private MdmItemApi mdmItemApi;
     @Resource
-    private MesMdUnitMeasureService unitMeasureService;
+    private MdmUnitMeasureApi mdmUnitMeasureApi;
     @Resource
     private MesWmWarehouseService warehouseService;
     @Resource
@@ -106,10 +109,11 @@
             return Collections.emptyList();
         }
         // 1. 鑾峰緱鍏宠仈鏁版嵁
-        Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(
+        Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(
                 convertSet(list, MesWmReturnIssueDetailDO::getItemId));
-        Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
-                convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
+        Map<Long, MdmUnitMeasureRespDTO> unitMeasureMap = mdmUnitMeasureApi.getUnitMeasureList(
+                convertSet(itemMap.values(), MdmItemRespDTO::getUnitMeasureId)).getCheckedData()
+                .stream().collect(Collectors.toMap(MdmUnitMeasureRespDTO::getId, e -> e));
         Map<Long, MesWmWarehouseDO> warehouseMap = warehouseService.getWarehouseMap(
                 convertSet(list, MesWmReturnIssueDetailDO::getWarehouseId));
         Map<Long, MesWmWarehouseLocationDO> locationMap = locationService.getWarehouseLocationMap(
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnissue/MesWmReturnIssueLineController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnissue/MesWmReturnIssueLineController.java
index e8b3360..58423bc 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnissue/MesWmReturnIssueLineController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnissue/MesWmReturnIssueLineController.java
@@ -8,11 +8,13 @@
 import cn.iocoder.yudao.module.mes.controller.admin.wm.returnissue.vo.line.MesWmReturnIssueLinePageReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.returnissue.vo.line.MesWmReturnIssueLineRespVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.returnissue.vo.line.MesWmReturnIssueLineSaveReqVO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
+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.dal.dataobject.wm.returnissue.MesWmReturnIssueLineDO;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
-import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
+import cn.iocoder.yudao.module.mdm.api.unit.MdmUnitMeasureApi;
+import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO;
+
 import cn.iocoder.yudao.module.mes.service.wm.returnissue.MesWmReturnIssueLineService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
@@ -26,6 +28,7 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
@@ -39,9 +42,9 @@
     @Resource
     private MesWmReturnIssueLineService issueLineService;
     @Resource
-    private MesMdItemService itemService;
+    private MdmItemApi mdmItemApi;
     @Resource
-    private MesMdUnitMeasureService unitMeasureService;
+    private MdmUnitMeasureApi mdmUnitMeasureApi;
 
     @PostMapping("/create")
     @Operation(summary = "鍒涘缓鐢熶骇閫�鏂欏崟琛�")
@@ -105,10 +108,11 @@
             return Collections.emptyList();
         }
         // 1. 鑾峰緱鍏宠仈鏁版嵁
-        Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(
+        Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(
                 convertSet(list, MesWmReturnIssueLineDO::getItemId));
-        Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
-                convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
+        Map<Long, MdmUnitMeasureRespDTO> unitMeasureMap = mdmUnitMeasureApi.getUnitMeasureList(
+                convertSet(itemMap.values(), MdmItemRespDTO::getUnitMeasureId)).getCheckedData()
+                .stream().collect(Collectors.toMap(MdmUnitMeasureRespDTO::getId, e -> e));
         // 2. 鏋勫缓缁撴灉
         return BeanUtils.toBean(list, MesWmReturnIssueLineRespVO.class, vo -> {
             MapUtils.findAndThen(itemMap, vo.getItemId(), item -> {
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/MesWmReturnSalesDetailController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/MesWmReturnSalesDetailController.java
index d9d291f..bafc3b3 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/MesWmReturnSalesDetailController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/MesWmReturnSalesDetailController.java
@@ -6,14 +6,16 @@
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.detail.MesWmReturnSalesDetailRespVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.detail.MesWmReturnSalesDetailSaveReqVO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
+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.dal.dataobject.wm.returnsales.MesWmReturnSalesDetailDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
-import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
+import cn.iocoder.yudao.module.mdm.api.unit.MdmUnitMeasureApi;
+import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO;
+
 import cn.iocoder.yudao.module.mes.service.wm.returnsales.MesWmReturnSalesDetailService;
 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService;
 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService;
@@ -30,6 +32,7 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
@@ -43,9 +46,9 @@
     @Resource
     private MesWmReturnSalesDetailService returnSalesDetailService;
     @Resource
-    private MesMdItemService itemService;
+    private MdmItemApi mdmItemApi;
     @Resource
-    private MesMdUnitMeasureService unitMeasureService;
+    private MdmUnitMeasureApi mdmUnitMeasureApi;
     @Resource
     private MesWmWarehouseService warehouseService;
     @Resource
@@ -106,10 +109,11 @@
             return Collections.emptyList();
         }
         // 1. 鑾峰緱鍏宠仈鏁版嵁
-        Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(
+        Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(
                 convertSet(list, MesWmReturnSalesDetailDO::getItemId));
-        Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
-                convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
+        Map<Long, MdmUnitMeasureRespDTO> unitMeasureMap = mdmUnitMeasureApi.getUnitMeasureList(
+                convertSet(itemMap.values(), MdmItemRespDTO::getUnitMeasureId)).getCheckedData()
+                .stream().collect(Collectors.toMap(MdmUnitMeasureRespDTO::getId, e -> e));
         Map<Long, MesWmWarehouseDO> warehouseMap = warehouseService.getWarehouseMap(
                 convertSet(list, MesWmReturnSalesDetailDO::getWarehouseId));
         Map<Long, MesWmWarehouseLocationDO> locationMap = locationService.getWarehouseLocationMap(
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/MesWmReturnSalesLineController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/MesWmReturnSalesLineController.java
index e32fff1..66fbe50 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/MesWmReturnSalesLineController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnsales/MesWmReturnSalesLineController.java
@@ -8,11 +8,13 @@
 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.MesWmReturnSalesLineRespVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.line.MesWmReturnSalesLineSaveReqVO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
+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.dal.dataobject.wm.returnsales.MesWmReturnSalesLineDO;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
-import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
+import cn.iocoder.yudao.module.mdm.api.unit.MdmUnitMeasureApi;
+import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO;
+
 import cn.iocoder.yudao.module.mes.service.wm.returnsales.MesWmReturnSalesLineService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
@@ -26,6 +28,7 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
@@ -39,9 +42,9 @@
     @Resource
     private MesWmReturnSalesLineService returnSalesLineService;
     @Resource
-    private MesMdItemService itemService;
+    private MdmItemApi mdmItemApi;
     @Resource
-    private MesMdUnitMeasureService unitMeasureService;
+    private MdmUnitMeasureApi mdmUnitMeasureApi;
 
     @PostMapping("/create")
     @Operation(summary = "鍒涘缓閿�鍞��璐у崟琛�")
@@ -105,10 +108,11 @@
             return Collections.emptyList();
         }
         // 1. 鑾峰緱鍏宠仈鏁版嵁
-        Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(
+        Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(
                 convertSet(list, MesWmReturnSalesLineDO::getItemId));
-        Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
-                convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
+        Map<Long, MdmUnitMeasureRespDTO> unitMeasureMap = mdmUnitMeasureApi.getUnitMeasureList(
+                convertSet(itemMap.values(), MdmItemRespDTO::getUnitMeasureId)).getCheckedData()
+                .stream().collect(Collectors.toMap(MdmUnitMeasureRespDTO::getId, e -> e));
         // 2. 鏋勫缓缁撴灉
         return BeanUtils.toBean(list, MesWmReturnSalesLineRespVO.class, vo ->
                 MapUtils.findAndThen(itemMap, vo.getItemId(), item -> {
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnvendor/MesWmReturnVendorDetailController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnvendor/MesWmReturnVendorDetailController.java
index ceabec9..4c6cd81 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnvendor/MesWmReturnVendorDetailController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnvendor/MesWmReturnVendorDetailController.java
@@ -6,14 +6,16 @@
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.detail.MesWmReturnVendorDetailRespVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.detail.MesWmReturnVendorDetailSaveReqVO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
+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.dal.dataobject.wm.returnvendor.MesWmReturnVendorDetailDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
-import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
+import cn.iocoder.yudao.module.mdm.api.unit.MdmUnitMeasureApi;
+import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO;
+
 import cn.iocoder.yudao.module.mes.service.wm.returnvendor.MesWmReturnVendorDetailService;
 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService;
 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService;
@@ -30,6 +32,7 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
@@ -43,9 +46,9 @@
     @Resource
     private MesWmReturnVendorDetailService returnVendorDetailService;
     @Resource
-    private MesMdItemService itemService;
+    private MdmItemApi mdmItemApi;
     @Resource
-    private MesMdUnitMeasureService unitMeasureService;
+    private MdmUnitMeasureApi mdmUnitMeasureApi;
     @Resource
     private MesWmWarehouseService warehouseService;
     @Resource
@@ -106,10 +109,11 @@
             return Collections.emptyList();
         }
         // 1. 鑾峰緱鍏宠仈鏁版嵁
-        Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(
+        Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(
                 convertSet(list, MesWmReturnVendorDetailDO::getItemId));
-        Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
-                convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
+        Map<Long, MdmUnitMeasureRespDTO> unitMeasureMap = mdmUnitMeasureApi.getUnitMeasureList(
+                convertSet(itemMap.values(), MdmItemRespDTO::getUnitMeasureId)).getCheckedData()
+                .stream().collect(Collectors.toMap(MdmUnitMeasureRespDTO::getId, e -> e));
         Map<Long, MesWmWarehouseDO> warehouseMap = warehouseService.getWarehouseMap(
                 convertSet(list, MesWmReturnVendorDetailDO::getWarehouseId));
         Map<Long, MesWmWarehouseLocationDO> locationMap = locationService.getWarehouseLocationMap(
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnvendor/MesWmReturnVendorLineController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnvendor/MesWmReturnVendorLineController.java
index f7a7a1d..a03aaf6 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnvendor/MesWmReturnVendorLineController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/returnvendor/MesWmReturnVendorLineController.java
@@ -8,11 +8,13 @@
 import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.line.MesWmReturnVendorLinePageReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.line.MesWmReturnVendorLineRespVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.line.MesWmReturnVendorLineSaveReqVO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
+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.dal.dataobject.wm.returnvendor.MesWmReturnVendorLineDO;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
-import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
+import cn.iocoder.yudao.module.mdm.api.unit.MdmUnitMeasureApi;
+import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO;
+
 import cn.iocoder.yudao.module.mes.service.wm.returnvendor.MesWmReturnVendorLineService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
@@ -26,6 +28,7 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
@@ -39,9 +42,9 @@
     @Resource
     private MesWmReturnVendorLineService returnVendorLineService;
     @Resource
-    private MesMdItemService itemService;
+    private MdmItemApi mdmItemApi;
     @Resource
-    private MesMdUnitMeasureService unitMeasureService;
+    private MdmUnitMeasureApi mdmUnitMeasureApi;
 
     @PostMapping("/create")
     @Operation(summary = "鍒涘缓渚涘簲鍟嗛��璐у崟琛�")
@@ -105,10 +108,11 @@
             return Collections.emptyList();
         }
         // 1. 鑾峰緱鍏宠仈鏁版嵁
-        Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(
+        Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(
                 convertSet(list, MesWmReturnVendorLineDO::getItemId));
-        Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
-                convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
+        Map<Long, MdmUnitMeasureRespDTO> unitMeasureMap = mdmUnitMeasureApi.getUnitMeasureList(
+                convertSet(itemMap.values(), MdmItemRespDTO::getUnitMeasureId)).getCheckedData()
+                .stream().collect(Collectors.toMap(MdmUnitMeasureRespDTO::getId, e -> e));
         // 2. 鏋勫缓缁撴灉
         return BeanUtils.toBean(list, MesWmReturnVendorLineRespVO.class, vo -> {
             MapUtils.findAndThen(itemMap, vo.getItemId(), item -> {
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/MesWmSalesNoticeController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/MesWmSalesNoticeController.java
index 53d0b5a..2bf826e 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/MesWmSalesNoticeController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/MesWmSalesNoticeController.java
@@ -113,12 +113,20 @@
 
     @PostMapping("/generate-from-sale-order")
     @Operation(summary = "浠庨攢鍞鍗曠敓鎴愬彂璐ч�氱煡鍗�")
-    @Parameter(name = "saleOrderId", description = "閿�鍞鍗旾D", required = true)
     @PreAuthorize("@ss.hasPermission('mes:wm-sales-notice:create')")
-    public CommonResult<Long> generateFromSaleOrder(@RequestParam("saleOrderId") Long saleOrderId) {
+    public CommonResult<Long> generateFromSaleOrder(@RequestBody Map<String, Long> params) {
+        Long saleOrderId = params.get("saleOrderId");
         return success(salesNoticeService.generateSalesNoticeFromSaleOrder(saleOrderId));
     }
 
+    @PostMapping("/generate-product-sales")
+    @Operation(summary = "浠庡彂璐ч�氱煡鍗曠敓鎴愰攢鍞嚭搴撳崟")
+    @Parameter(name = "id", description = "鍙戣揣閫氱煡鍗曠紪鍙�", required = true)
+    @PreAuthorize("@ss.hasPermission('mes:wm-product-sales:create')")
+    public CommonResult<Long> generateProductSales(@RequestParam("id") Long id) {
+        return success(salesNoticeService.generateProductSalesFromNotice(id));
+    }
+
     // ==================== 鎷兼帴 VO ====================
 
     private List<MesWmSalesNoticeRespVO> buildRespVOList(List<MesWmSalesNoticeDO> list) {
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/MesWmSalesNoticeLineController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/MesWmSalesNoticeLineController.java
index d3eaa0e..53b1afa 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/MesWmSalesNoticeLineController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/MesWmSalesNoticeLineController.java
@@ -5,14 +5,14 @@
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi;
+import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO;
+import cn.iocoder.yudao.module.mdm.api.unit.MdmUnitMeasureApi;
+import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.salesnotice.vo.line.MesWmSalesNoticeLinePageReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.salesnotice.vo.line.MesWmSalesNoticeLineRespVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.salesnotice.vo.line.MesWmSalesNoticeLineSaveReqVO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.salesnotice.MesWmSalesNoticeLineDO;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
-import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
 import cn.iocoder.yudao.module.mes.service.wm.salesnotice.MesWmSalesNoticeLineService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
@@ -26,6 +26,7 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
@@ -39,9 +40,9 @@
     @Resource
     private MesWmSalesNoticeLineService salesNoticeLineService;
     @Resource
-    private MesMdItemService itemService;
+    private MdmItemApi mdmItemApi;
     @Resource
-    private MesMdUnitMeasureService unitMeasureService;
+    private MdmUnitMeasureApi mdmUnitMeasureApi;
 
     @PostMapping("/create")
     @Operation(summary = "鍒涘缓鍙戣揣閫氱煡鍗曡")
@@ -94,11 +95,12 @@
         if (CollUtil.isEmpty(list)) {
             return Collections.emptyList();
         }
-        // 1. 鑾峰緱鍏宠仈鏁版嵁
-        Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(
+        // 1. 鑾峰緱鍏宠仈鏁版嵁 - 浣跨敤 MDM API 鑾峰彇鐗╂枡淇℃伅
+        Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(
                 convertSet(list, MesWmSalesNoticeLineDO::getItemId));
-        Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
-                convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
+        Map<Long, MdmUnitMeasureRespDTO> unitMeasureMap = mdmUnitMeasureApi.getUnitMeasureList(
+                        convertSet(itemMap.values(), MdmItemRespDTO::getUnitMeasureId)).getCheckedData()
+                .stream().collect(java.util.stream.Collectors.toMap(MdmUnitMeasureRespDTO::getId, e -> e));
         // 2. 鏋勫缓缁撴灉
         return BeanUtils.toBean(list, MesWmSalesNoticeLineRespVO.class, vo -> {
             MapUtils.findAndThen(itemMap, vo.getItemId(), item -> {
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/MesWmSalesNoticePageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/MesWmSalesNoticePageReqVO.java
index 3dee41c..f3ce710 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/MesWmSalesNoticePageReqVO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/MesWmSalesNoticePageReqVO.java
@@ -19,7 +19,7 @@
     private String name;
 
     @Schema(description = "閿�鍞鍗曠紪鍙�", example = "SO202603010001")
-    private String salesOrderCode;
+    private String saleOrderCode;
 
     @Schema(description = "瀹㈡埛缂栧彿", example = "1")
     private Long clientId;
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/MesWmSalesNoticeRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/MesWmSalesNoticeRespVO.java
index 05dda66..ad39bbd 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/MesWmSalesNoticeRespVO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/MesWmSalesNoticeRespVO.java
@@ -58,6 +58,10 @@
     @ExcelProperty("鐘舵��")
     private Integer status;
 
+    @Schema(description = "鍑哄簱鐘舵��", example = "0")
+    @ExcelProperty("鍑哄簱鐘舵��")
+    private Integer outStatus;
+
     @Schema(description = "澶囨敞", example = "澶囨敞")
     @ExcelProperty("澶囨敞")
     private String remark;
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/line/MesWmSalesNoticeLineRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/line/MesWmSalesNoticeLineRespVO.java
index 81e8091..93201b1 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/line/MesWmSalesNoticeLineRespVO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/line/MesWmSalesNoticeLineRespVO.java
@@ -43,6 +43,9 @@
     @Schema(description = "鍙戣揣鏁伴噺", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00")
     private BigDecimal quantity;
 
+    @Schema(description = "宸插嚭搴撴暟閲�", example = "50.00")
+    private BigDecimal outCount;
+
     @Schema(description = "鏄惁妫�楠�", requiredMode = Schema.RequiredMode.REQUIRED, example = "true")
     private Boolean oqcCheckFlag;
 
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/sn/MesWmSnController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/sn/MesWmSnController.java
index 7b14295..3b49cc7 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/sn/MesWmSnController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/sn/MesWmSnController.java
@@ -12,10 +12,12 @@
 import cn.iocoder.yudao.module.mes.controller.admin.wm.sn.vo.MesWmSnGroupRespVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.sn.vo.MesWmSnPageReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.sn.vo.MesWmSnRespVO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
-import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
+import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi;
+import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO;
+
+import cn.iocoder.yudao.module.mdm.api.unit.MdmUnitMeasureApi;
+import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO;
+
 import cn.iocoder.yudao.module.mes.service.wm.sn.MesWmSnService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
@@ -31,6 +33,7 @@
 import java.io.IOException;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@@ -45,9 +48,9 @@
     @Resource
     private MesWmSnService snService;
     @Resource
-    private MesMdItemService itemService;
+    private MdmItemApi mdmItemApi;
     @Resource
-    private MesMdUnitMeasureService unitMeasureService;
+    private MdmUnitMeasureApi mdmUnitMeasureApi;
 
     @PostMapping("/generate")
     @Operation(summary = "鐢熸垚 SN 鐮�")
@@ -117,9 +120,10 @@
         if (CollUtil.isEmpty(list)) {
             return;
         }
-        Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(convertSet(list, MesWmSnGroupRespVO::getItemId));
-        Map<Long, MesMdUnitMeasureDO> unitMap = unitMeasureService.getUnitMeasureMap(
-                convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
+        Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(convertSet(list, MesWmSnGroupRespVO::getItemId));
+        Map<Long, MdmUnitMeasureRespDTO> unitMap = mdmUnitMeasureApi.getUnitMeasureList(
+                convertSet(itemMap.values(), MdmItemRespDTO::getUnitMeasureId)).getCheckedData()
+                .stream().collect(Collectors.toMap(MdmUnitMeasureRespDTO::getId, e -> e));
         list.forEach(vo -> MapUtils.findAndThen(itemMap, vo.getItemId(), item -> {
             vo.setItemCode(item.getCode()).setItemName(item.getName()).setSpecification(item.getSpecification());
             MapUtils.findAndThen(unitMap, item.getUnitMeasureId(), unit -> vo.setUnitName(unit.getName()));
@@ -130,9 +134,10 @@
         if (CollUtil.isEmpty(list)) {
             return;
         }
-        Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(convertSet(list, MesWmSnRespVO::getItemId));
-        Map<Long, MesMdUnitMeasureDO> unitMap = unitMeasureService.getUnitMeasureMap(
-                convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
+        Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(convertSet(list, MesWmSnRespVO::getItemId));
+        Map<Long, MdmUnitMeasureRespDTO> unitMap = mdmUnitMeasureApi.getUnitMeasureList(
+                convertSet(itemMap.values(), MdmItemRespDTO::getUnitMeasureId)).getCheckedData()
+                .stream().collect(Collectors.toMap(MdmUnitMeasureRespDTO::getId, e -> e));
         list.forEach(vo -> MapUtils.findAndThen(itemMap, vo.getItemId(), item -> {
             vo.setItemCode(item.getCode()).setItemName(item.getName()).setSpecification(item.getSpecification());
             MapUtils.findAndThen(unitMap, item.getUnitMeasureId(), unit -> vo.setUnitName(unit.getName()));
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/task/MesWmStockTakingTaskLineController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/task/MesWmStockTakingTaskLineController.java
index 39c8b4b..88c2270 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/task/MesWmStockTakingTaskLineController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/task/MesWmStockTakingTaskLineController.java
@@ -7,14 +7,16 @@
 import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.line.MesWmStockTakingTaskLinePageReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.line.MesWmStockTakingTaskLineRespVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.line.MesWmStockTakingTaskLineSaveReqVO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
+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.dal.dataobject.wm.stocktaking.task.MesWmStockTakingTaskLineDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
-import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
+import cn.iocoder.yudao.module.mdm.api.unit.MdmUnitMeasureApi;
+import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO;
+
 import cn.iocoder.yudao.module.mes.service.wm.stocktaking.task.MesWmStockTakingTaskLineService;
 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService;
 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService;
@@ -31,6 +33,7 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
@@ -45,9 +48,9 @@
     @Resource
     private MesWmStockTakingTaskLineService stockTakingTaskLineService;
     @Resource
-    private MesMdItemService itemService;
+    private MdmItemApi mdmItemApi;
     @Resource
-    private MesMdUnitMeasureService unitMeasureService;
+    private MdmUnitMeasureApi mdmUnitMeasureApi;
     @Resource
     private MesWmWarehouseService warehouseService;
     @Resource
@@ -116,9 +119,10 @@
             return Collections.emptyList();
         }
         // 鏌ヨ鍏宠仈鏁版嵁
-        Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(convertSet(list, MesWmStockTakingTaskLineDO::getItemId));
-        Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
-                convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
+        Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(convertSet(list, MesWmStockTakingTaskLineDO::getItemId));
+        Map<Long, MdmUnitMeasureRespDTO> unitMeasureMap = mdmUnitMeasureApi.getUnitMeasureList(
+                convertSet(itemMap.values(), MdmItemRespDTO::getUnitMeasureId)).getCheckedData()
+                .stream().collect(Collectors.toMap(MdmUnitMeasureRespDTO::getId, e -> e));
         Map<Long, MesWmWarehouseDO> warehouseMap = warehouseService.getWarehouseMap(
                 convertSet(list, MesWmStockTakingTaskLineDO::getWarehouseId));
         Map<Long, MesWmWarehouseLocationDO> locationMap = locationService.getWarehouseLocationMap(
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/task/MesWmStockTakingTaskResultController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/task/MesWmStockTakingTaskResultController.java
index 8ff23ae..2139457 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/task/MesWmStockTakingTaskResultController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/task/MesWmStockTakingTaskResultController.java
@@ -8,14 +8,16 @@
 import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.result.MesWmStockTakingTaskResultPageReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.result.MesWmStockTakingTaskResultRespVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.result.MesWmStockTakingTaskResultSaveReqVO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
+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.dal.dataobject.wm.stocktaking.task.MesWmStockTakingTaskResultDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
-import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
+import cn.iocoder.yudao.module.mdm.api.unit.MdmUnitMeasureApi;
+import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO;
+
 import cn.iocoder.yudao.module.mes.service.wm.stocktaking.task.MesWmStockTakingTaskResultService;
 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService;
 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService;
@@ -33,6 +35,7 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
@@ -46,9 +49,9 @@
     @Resource
     private MesWmStockTakingTaskResultService stockTakingTaskResultService;
     @Resource
-    private MesMdItemService itemService;
+    private MdmItemApi mdmItemApi;
     @Resource
-    private MesMdUnitMeasureService unitMeasureService;
+    private MdmUnitMeasureApi mdmUnitMeasureApi;
     @Resource
     private MesWmWarehouseService warehouseService;
     @Resource
@@ -112,10 +115,11 @@
             return Collections.emptyList();
         }
         // 鏌ヨ鍏宠仈鏁版嵁
-        Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(
+        Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(
                 convertSet(list, MesWmStockTakingTaskResultDO::getItemId));
-        Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
-                convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
+        Map<Long, MdmUnitMeasureRespDTO> unitMeasureMap = mdmUnitMeasureApi.getUnitMeasureList(
+                convertSet(itemMap.values(), MdmItemRespDTO::getUnitMeasureId)).getCheckedData()
+                .stream().collect(Collectors.toMap(MdmUnitMeasureRespDTO::getId, e -> e));
         Map<Long, MesWmWarehouseDO> warehouseMap = warehouseService.getWarehouseMap(
                 convertSet(list, MesWmStockTakingTaskResultDO::getWarehouseId));
         Map<Long, MesWmWarehouseLocationDO> locationMap = locationService.getWarehouseLocationMap(
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/MesWmTransferDetailController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/MesWmTransferDetailController.java
index 31343ec..47d19fc 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/MesWmTransferDetailController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/MesWmTransferDetailController.java
@@ -6,14 +6,16 @@
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.transfer.vo.detail.MesWmTransferDetailRespVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.transfer.vo.detail.MesWmTransferDetailSaveReqVO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
+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.dal.dataobject.wm.transfer.MesWmTransferDetailDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
-import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
+import cn.iocoder.yudao.module.mdm.api.unit.MdmUnitMeasureApi;
+import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO;
+
 import cn.iocoder.yudao.module.mes.service.wm.transfer.MesWmTransferDetailService;
 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService;
 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService;
@@ -30,6 +32,7 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
@@ -43,9 +46,9 @@
     @Resource
     private MesWmTransferDetailService transferDetailService;
     @Resource
-    private MesMdItemService itemService;
+    private MdmItemApi mdmItemApi;
     @Resource
-    private MesMdUnitMeasureService unitMeasureService;
+    private MdmUnitMeasureApi mdmUnitMeasureApi;
     @Resource
     private MesWmWarehouseService warehouseService;
     @Resource
@@ -106,9 +109,10 @@
             return Collections.emptyList();
         }
         // 鏌ヨ鐩稿叧鏁版嵁
-        Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(convertSet(list, MesWmTransferDetailDO::getItemId));
-        Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
-                convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
+        Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(convertSet(list, MesWmTransferDetailDO::getItemId));
+        Map<Long, MdmUnitMeasureRespDTO> unitMeasureMap = mdmUnitMeasureApi.getUnitMeasureList(
+                convertSet(itemMap.values(), MdmItemRespDTO::getUnitMeasureId)).getCheckedData()
+                .stream().collect(Collectors.toMap(MdmUnitMeasureRespDTO::getId, e -> e));
         Map<Long, MesWmWarehouseDO> warehouseMap = warehouseService.getWarehouseMap(
                 convertSet(list, MesWmTransferDetailDO::getToWarehouseId));
         Map<Long, MesWmWarehouseLocationDO> locationMap = locationService.getWarehouseLocationMap(
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/MesWmTransferLineController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/MesWmTransferLineController.java
index 7945dc9..c7db87f 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/MesWmTransferLineController.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/MesWmTransferLineController.java
@@ -6,14 +6,16 @@
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.transfer.vo.line.MesWmTransferLineRespVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.transfer.vo.line.MesWmTransferLineSaveReqVO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
+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.dal.dataobject.wm.transfer.MesWmTransferLineDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
-import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
+import cn.iocoder.yudao.module.mdm.api.unit.MdmUnitMeasureApi;
+import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO;
+
 import cn.iocoder.yudao.module.mes.service.wm.transfer.MesWmTransferLineService;
 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService;
 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService;
@@ -30,6 +32,7 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
@@ -43,9 +46,9 @@
     @Resource
     private MesWmTransferLineService transferLineService;
     @Resource
-    private MesMdItemService itemService;
+    private MdmItemApi mdmItemApi;
     @Resource
-    private MesMdUnitMeasureService unitMeasureService;
+    private MdmUnitMeasureApi mdmUnitMeasureApi;
     @Resource
     private MesWmWarehouseService warehouseService;
     @Resource
@@ -105,9 +108,10 @@
             return Collections.emptyList();
         }
         // 鏌ヨ鐩稿叧鏁版嵁
-        Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(convertSet(list, MesWmTransferLineDO::getItemId));
-        Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
-                convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
+        Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(convertSet(list, MesWmTransferLineDO::getItemId));
+        Map<Long, MdmUnitMeasureRespDTO> unitMeasureMap = mdmUnitMeasureApi.getUnitMeasureList(
+                convertSet(itemMap.values(), MdmItemRespDTO::getUnitMeasureId)).getCheckedData()
+                .stream().collect(Collectors.toMap(MdmUnitMeasureRespDTO::getId, e -> e));
         Map<Long, MesWmWarehouseDO> warehouseMap = warehouseService.getWarehouseMap(
                 convertSet(list, MesWmTransferLineDO::getFromWarehouseId));
         Map<Long, MesWmWarehouseLocationDO> locationMap = locationService.getWarehouseLocationMap(
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/mdm/MesMdmItemDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/mdm/MesMdmItemDO.java
new file mode 100644
index 0000000..e0f5a04
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/mdm/MesMdmItemDO.java
@@ -0,0 +1,211 @@
+package cn.iocoder.yudao.module.mes.dal.dataobject.mdm;
+
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * MDM 鐗╂枡 DO
+ *
+ * 鏄犲皠 mdm_item 琛�
+ */
+@TableName("mdm_item")
+@KeySequence("mdm_item_seq")
+@Data
+@EqualsAndHashCode
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class MesMdmItemDO {
+
+    /**
+     * 鐗╂枡缂栧彿
+     */
+    @TableId
+    private Long id;
+
+    /**
+     * 鐗╂枡缂栫爜
+     */
+    private String code;
+
+    /**
+     * 鐗╂枡鍚嶇О
+     */
+    private String name;
+
+    /**
+     * 鐗╂枡鏉$爜
+     */
+    private String barCode;
+
+    /**
+     * 瑙勬牸鍨嬪彿
+     */
+    private String specification;
+
+    /**
+     * 鐗╂枡鍒嗙被缂栧彿
+     */
+    private Long categoryId;
+
+    /**
+     * 璁¢噺鍗曚綅缂栧彿
+     */
+    private Long unitMeasureId;
+
+    /**
+     * 杈呭崟浣�1缂栧彿
+     */
+    private Long unitMeasureId2;
+
+    /**
+     * 杈呭崟浣�1鎹㈢畻姣旂巼
+     */
+    private BigDecimal unitMeasureRate1;
+
+    /**
+     * 杈呭崟浣�2缂栧彿
+     */
+    private Long unitMeasureId3;
+
+    /**
+     * 杈呭崟浣�2鎹㈢畻姣旂巼
+     */
+    private BigDecimal unitMeasureRate2;
+
+    /**
+     * 榛樿浠撳簱缂栧彿
+     */
+    private Long warehouseId;
+
+    /**
+     * 榛樿浠撳簱缂栫爜
+     */
+    private String warehouseCode;
+
+    /**
+     * 鍝佺墝缂栧彿
+     */
+    private Long brandId;
+
+    /**
+     * 鐗╂枡绫诲瀷锛�1:鐗╂枡 2:浜у搧 3:鍗婃垚鍝侊級
+     */
+    private Integer itemType;
+
+    /**
+     * 鐘舵�侊紙0姝e父 1鍋滅敤锛�
+     */
+    private Integer status;
+
+    /**
+     * 閲囪喘浠�
+     */
+    private BigDecimal purchasePrice;
+
+    /**
+     * 閿�鍞环
+     */
+    private BigDecimal salesPrice;
+
+    /**
+     * 鎴愭湰浠�
+     */
+    private BigDecimal costPrice;
+
+    /**
+     * 鏈�浣庝环
+     */
+    private BigDecimal minPrice;
+
+    /**
+     * 瀹夊叏搴撳瓨
+     */
+    private BigDecimal safetyStock;
+
+    /**
+     * 鏈�浣庡簱瀛橀噺
+     */
+    private BigDecimal minStock;
+
+    /**
+     * 鏈�楂樺簱瀛橀噺
+     */
+    private BigDecimal maxStock;
+
+    /**
+     * 鏈�灏忚璐ч噺
+     */
+    private BigDecimal minOrderQty;
+
+    /**
+     * 閲囪喘鎻愬墠鏈燂紙澶╋級
+     */
+    private Integer leadTime;
+
+    /**
+     * 鏄惁鎵规绠$悊
+     */
+    private Boolean isBatchManaged;
+
+    /**
+     * 鏄惁搴忓垪鍙风鐞�
+     */
+    private Boolean isSerialManaged;
+
+    /**
+     * 鏉$爜瑙勫垯ID
+     */
+    private Long barcodeRuleId;
+
+    /**
+     * 淇濊川鏈熷ぉ鏁�
+     */
+    private Integer expiryDay;
+
+    /**
+     * 鏄惁楂樺�肩墿鏂�
+     */
+    private Boolean highValue;
+
+    /**
+     * 閲嶉噺(kg)
+     */
+    private BigDecimal weight;
+
+    /**
+     * 澶囨敞
+     */
+    private String remark;
+
+    /**
+     * 鍒涘缓鑰�
+     */
+    private String creator;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 鏇存柊鑰�
+     */
+    private String updater;
+
+    /**
+     * 鏇存柊鏃堕棿
+     */
+    private LocalDateTime updateTime;
+
+    /**
+     * 鏄惁鍒犻櫎
+     */
+    private Boolean deleted;
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/salesnotice/MesWmSalesNoticeDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/salesnotice/MesWmSalesNoticeDO.java
index 665d5b2..66f1dea 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/salesnotice/MesWmSalesNoticeDO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/salesnotice/MesWmSalesNoticeDO.java
@@ -37,10 +37,6 @@
      */
     private String name;
     /**
-     * 閿�鍞鍗曠紪鍙�
-     */
-    private String salesOrderCode;
-    /**
      * 瀹㈡埛缂栧彿
      *
      * 鍏宠仈 CRM 瀹㈡埛 {@link cn.iocoder.yudao.module.crm.api.customer.dto.CrmCustomerRespDTO#getId()}
@@ -78,6 +74,13 @@
      */
     private Integer status;
     /**
+     * 鍑哄簱鐘舵��
+     *
+     * 瀛楀吀 {@link DictTypeConstants#MES_WM_OUT_STATUS}
+     * 鏋氫妇 {@link cn.iocoder.yudao.module.mes.enums.wm.MesWmOutStatusEnum}
+     */
+    private Integer outStatus;
+    /**
      * 澶囨敞
      */
     private String remark;
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/salesnotice/MesWmSalesNoticeLineDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/salesnotice/MesWmSalesNoticeLineDO.java
index 651d238..1219bf6 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/salesnotice/MesWmSalesNoticeLineDO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/salesnotice/MesWmSalesNoticeLineDO.java
@@ -61,6 +61,10 @@
      */
     private BigDecimal quantity;
     /**
+     * 宸插嚭搴撴暟閲�
+     */
+    private BigDecimal outCount;
+    /**
      * 鏄惁妫�楠�
      */
     private Boolean oqcCheckFlag;
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/mdm/MesMdmItemMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/mdm/MesMdmItemMapper.java
new file mode 100644
index 0000000..ca09636
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/mdm/MesMdmItemMapper.java
@@ -0,0 +1,24 @@
+package cn.iocoder.yudao.module.mes.dal.mysql.mdm;
+
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.module.mes.dal.dataobject.mdm.MesMdmItemDO;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * MDM 鐗╂枡 Mapper
+ */
+@Mapper
+public interface MesMdmItemMapper extends BaseMapperX<MesMdmItemDO> {
+
+    default MesMdmItemDO selectByCode(String code) {
+        return selectOne(MesMdmItemDO::getCode, code);
+    }
+
+    default List<MesMdmItemDO> selectListByIds(Collection<Long> ids) {
+        return selectList(MesMdmItemDO::getId, ids);
+    }
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/salesnotice/MesWmSalesNoticeMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/salesnotice/MesWmSalesNoticeMapper.java
index a4256f0..71c4714 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/salesnotice/MesWmSalesNoticeMapper.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/salesnotice/MesWmSalesNoticeMapper.java
@@ -17,7 +17,7 @@
         return selectPage(reqVO, new LambdaQueryWrapperX<MesWmSalesNoticeDO>()
                 .likeIfPresent(MesWmSalesNoticeDO::getCode, reqVO.getCode())
                 .likeIfPresent(MesWmSalesNoticeDO::getName, reqVO.getName())
-                .likeIfPresent(MesWmSalesNoticeDO::getSalesOrderCode, reqVO.getSalesOrderCode())
+                .likeIfPresent(MesWmSalesNoticeDO::getSaleOrderCode, reqVO.getSaleOrderCode())
                 .eqIfPresent(MesWmSalesNoticeDO::getClientId, reqVO.getClientId())
                 .eqIfPresent(MesWmSalesNoticeDO::getStatus, reqVO.getStatus())
                 .orderByDesc(MesWmSalesNoticeDO::getId));
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java
index d505ca0..5a32a63 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java
@@ -51,6 +51,7 @@
     String MES_WM_MISC_ISSUE_TYPE = "mes_wm_misc_issue_type"; // MES 鏉傞」鍑哄簱绫诲瀷
     String MES_WM_MISC_ISSUE_STATUS = "mes_wm_misc_issue_status"; // MES 鏉傞」鍑哄簱鍗曠姸鎬�
     String MES_WM_SALES_NOTICE_STATUS = "mes_wm_sales_notice_status"; // MES 鍙戣揣閫氱煡鍗曠姸鎬�
+    String MES_WM_OUT_STATUS = "mes_wm_out_status"; // MES 鍑哄簱鐘舵��
     String MES_WM_PRODUCT_SALES_STATUS = "mes_wm_product_sales_status"; // MES 閿�鍞嚭搴撳崟鐘舵��
     String MES_WM_OUTSOURCE_ISSUE_STATUS = "mes_wm_outsource_issue_status"; // MES 濮斿鍑哄簱鐘舵��
     String MES_WM_PRODUCT_ISSUE_STATUS = "mes_wm_product_issue_status"; // MES 鐢熶骇棰嗘枡鐘舵��
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java
index c64ae2a..b5f3ad9 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java
@@ -438,6 +438,7 @@
     ErrorCode WM_TRANSACTION_BATCH_NOT_EXISTS = new ErrorCode(1_040_703_012, "鎵规璁板綍涓嶅瓨鍦�");
     ErrorCode WM_MATERIAL_STOCK_REQUIRED = new ErrorCode(1_040_703_013, "搴撳瓨璁板綍涓嶈兘涓虹┖");
     ErrorCode WM_MATERIAL_STOCK_SELECTION_MISMATCH = new ErrorCode(1_040_703_014, "搴撳瓨璁板綍涓庢彁浜ょ殑鐗╂枡銆佹壒娆℃垨搴撲綅淇℃伅涓嶄竴鑷�");
+    ErrorCode WM_MATERIAL_STOCK_QUANTITY_INVALID = new ErrorCode(1_040_703_015, "璋冩暣鏁伴噺涓嶈兘涓虹┖鎴栭浂");
 
     // ========== MES 浠撳簱绠$悊-鍒拌揣閫氱煡鍗曪紙1-040-704-000锛� ==========
     ErrorCode WM_ARRIVAL_NOTICE_NOT_EXISTS = new ErrorCode(1_040_704_000, "鍒拌揣閫氱煡鍗曚笉瀛樺湪");
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/MesBizTypeConstants.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/MesBizTypeConstants.java
index b09a030..b4a0579 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/MesBizTypeConstants.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/MesBizTypeConstants.java
@@ -47,6 +47,8 @@
     public static final int WM_ITEM_CONSUME = 123; // 鐢熶骇娑堣�楋細MesWmItemConsumeDO
     public static final int WM_PRODUCT_PRODUCE = 124; // 浜у搧浜у嚭锛歁esWmProductProduceDO
     public static final int WM_RETURN_VENDOR = 125; // 渚涘簲鍟嗛��璐у嚭搴擄細MesWmReturnVendorDO
+    public static final int WM_STOCK_ADJUST_IN = 126; // 搴撳瓨璋冩暣鍏ュ簱锛堣嚜瀹氫箟鍏ュ簱锛�
+    public static final int WM_STOCK_ADJUST_OUT = 127; // 搴撳瓨璋冩暣鍑哄簱锛堣嚜瀹氫箟鍑哄簱锛�
 
     // ========== CAL 鎺掔彮妯″潡 [200, 300) ==========
 
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmOutStatusEnum.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmOutStatusEnum.java
new file mode 100644
index 0000000..f4515dd
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmOutStatusEnum.java
@@ -0,0 +1,31 @@
+package cn.iocoder.yudao.module.mes.enums.wm;
+
+import cn.iocoder.yudao.framework.common.core.ArrayValuable;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.Arrays;
+
+/**
+ * MES 鍑哄簱鐘舵�佹灇涓�
+ */
+@Getter
+@AllArgsConstructor
+public enum MesWmOutStatusEnum implements ArrayValuable<Integer> {
+
+    NOT_OUT(0, "鏈嚭搴�"),
+    PART_OUT(1, "閮ㄥ垎鍑哄簱"),
+    ALL_OUT(2, "鍏ㄩ儴鍑哄簱");
+
+    public static final Integer[] ARRAYS = Arrays.stream(values())
+            .map(MesWmOutStatusEnum::getStatus).toArray(Integer[]::new);
+
+    private final Integer status;
+    private final String name;
+
+    @Override
+    public Integer[] array() {
+        return ARRAYS;
+    }
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/mdm/MesMdmItemService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/mdm/MesMdmItemService.java
new file mode 100644
index 0000000..0a58be5
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/mdm/MesMdmItemService.java
@@ -0,0 +1,60 @@
+package cn.iocoder.yudao.module.mes.service.mdm;
+
+import cn.iocoder.yudao.module.mes.dal.dataobject.mdm.MesMdmItemDO;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
+
+/**
+ * MDM 鐗╂枡 Service 鎺ュ彛
+ *
+ * 涓撻棬鐢ㄤ簬鏌ヨ mdm_item 琛�
+ */
+public interface MesMdmItemService {
+
+    /**
+     * 鑾峰緱鐗╂枡
+     *
+     * @param id 缂栧彿
+     * @return 鐗╂枡
+     */
+    MesMdmItemDO getItem(Long id);
+
+    /**
+     * 鏍¢獙鐗╂枡瀛樺湪
+     *
+     * @param id 缂栧彿
+     * @return 鐗╂枡
+     */
+    MesMdmItemDO validateItemExists(Long id);
+
+    /**
+     * 鏍¢獙鐗╂枡瀛樺湪涓斿惎鐢�
+     *
+     * @param id 缂栧彿
+     * @return 鐗╂枡
+     */
+    MesMdmItemDO validateItemExistsAndEnable(Long id);
+
+    /**
+     * 鑾峰緱鐗╂枡鍒楄〃
+     *
+     * @param ids 缂栧彿鏁扮粍
+     * @return 鐗╂枡鍒楄〃
+     */
+    List<MesMdmItemDO> getItemList(Collection<Long> ids);
+
+    /**
+     * 鑾峰緱鐗╂枡 Map
+     *
+     * @param ids 缂栧彿鏁扮粍
+     * @return 鐗╂枡 Map
+     */
+    default Map<Long, MesMdmItemDO> getItemMap(Collection<Long> ids) {
+        return convertMap(getItemList(ids), MesMdmItemDO::getId);
+    }
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/mdm/MesMdmItemServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/mdm/MesMdmItemServiceImpl.java
new file mode 100644
index 0000000..913af25
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/mdm/MesMdmItemServiceImpl.java
@@ -0,0 +1,60 @@
+package cn.iocoder.yudao.module.mes.service.mdm;
+
+import cn.iocoder.yudao.module.mes.dal.dataobject.mdm.MesMdmItemDO;
+import cn.iocoder.yudao.module.mes.dal.mysql.mdm.MesMdmItemMapper;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.MD_ITEM_NOT_EXISTS;
+import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.MD_ITEM_IS_DISABLE;
+
+/**
+ * MDM 鐗╂枡 Service 瀹炵幇绫�
+ *
+ * 涓撻棬鐢ㄤ簬鏌ヨ mdm_item 琛�
+ */
+@Service
+@Validated
+public class MesMdmItemServiceImpl implements MesMdmItemService {
+
+    @Resource
+    private MesMdmItemMapper mesMdmItemMapper;
+
+    @Override
+    public MesMdmItemDO getItem(Long id) {
+        return mesMdmItemMapper.selectById(id);
+    }
+
+    @Override
+    public MesMdmItemDO validateItemExists(Long id) {
+        MesMdmItemDO item = mesMdmItemMapper.selectById(id);
+        if (item == null) {
+            throw exception(MD_ITEM_NOT_EXISTS);
+        }
+        return item;
+    }
+
+    @Override
+    public MesMdmItemDO validateItemExistsAndEnable(Long id) {
+        MesMdmItemDO item = validateItemExists(id);
+        if (item.getStatus() != null && item.getStatus() == 1) {
+            throw exception(MD_ITEM_IS_DISABLE);
+        }
+        return item;
+    }
+
+    @Override
+    public List<MesMdmItemDO> getItemList(Collection<Long> ids) {
+        if (ids == null || ids.isEmpty()) {
+            return Collections.emptyList();
+        }
+        return mesMdmItemMapper.selectListByIds(ids);
+    }
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeLineServiceImpl.java
index 3f1ae8b..c71717e 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeLineServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeLineServiceImpl.java
@@ -8,7 +8,7 @@
 import cn.iocoder.yudao.module.mes.controller.admin.wm.arrivalnotice.vo.line.MesWmArrivalNoticeLineSaveReqVO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice.MesWmArrivalNoticeLineDO;
 import cn.iocoder.yudao.module.mes.dal.mysql.wm.arrivalnotice.MesWmArrivalNoticeLineMapper;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
+import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
 import jakarta.annotation.Resource;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
@@ -34,7 +34,7 @@
     @Lazy
     private MesWmArrivalNoticeService arrivalNoticeService;
     @Resource
-    private MesMdItemService itemService;
+    private MesMdmItemService mdmItemService;
 
     @Override
     public Long createArrivalNoticeLine(MesWmArrivalNoticeLineSaveReqVO createReqVO) {
@@ -66,7 +66,7 @@
         // 鏍¢獙鐖跺崟鎹瓨鍦ㄤ笖涓鸿崏绋跨姸鎬�
         arrivalNoticeService.validateArrivalNoticeExistsAndDraft(reqVO.getNoticeId());
         // 鏍¢獙鐗╂枡瀛樺湪
-        itemService.validateItemExistsAndEnable(reqVO.getItemId());
+        mdmItemService.validateItemExistsAndEnable(reqVO.getItemId());
     }
 
     /**
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java
index aac37da..29db064 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java
@@ -14,7 +14,7 @@
 import cn.iocoder.yudao.module.erp.api.purchase.ErpPurchaseOrderApi;
 import cn.iocoder.yudao.module.erp.api.purchase.dto.ErpPurchaseOrderRespDTO;
 import cn.iocoder.yudao.module.erp.api.purchase.dto.ErpPurchaseOrderItemRespDTO;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
+import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
 import jakarta.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -49,7 +49,7 @@
     private ErpPurchaseOrderApi purchaseOrderApi;
 
     @Resource
-    private MesMdItemService mdItemService;
+    private MesMdmItemService mdmItemService;
 
     @Override
     public Long createArrivalNotice(MesWmArrivalNoticeSaveReqVO createReqVO) {
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchServiceImpl.java
index 35d0a18..211281f 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchServiceImpl.java
@@ -6,14 +6,14 @@
 import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchGenerateReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchPageReqVO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemBatchConfigDO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
+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.mysql.wm.batch.MesWmBatchMapper;
 import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants;
 import cn.iocoder.yudao.module.mes.enums.md.autocode.MesMdAutoCodeRuleCodeEnum;
 import cn.iocoder.yudao.module.mes.service.md.autocode.MesMdAutoCodeRecordService;
 import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemBatchConfigService;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
+import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
 import cn.iocoder.yudao.module.mes.service.wm.barcode.MesWmBarcodeService;
 import jakarta.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
@@ -48,7 +48,7 @@
     private MesWmBatchMapper batchMapper;
 
     @Resource
-    private MesMdItemService itemService;
+    private MesMdmItemService mdmItemService;
     @Resource
     private MesMdItemBatchConfigService itemBatchConfigService;
     @Resource
@@ -75,8 +75,8 @@
     @Transactional(rollbackFor = Exception.class)
     public MesWmBatchDO getOrGenerateBatchCode(MesWmBatchGenerateReqVO reqVO) {
         // 1.1 鏌ヨ鐗╂枡淇℃伅锛屾鏌ユ槸鍚﹀惎鐢ㄦ壒娆$鐞�
-        MesMdItemDO item = itemService.validateItemExists(reqVO.getItemId());
-        if (Boolean.FALSE.equals(item.getBatchFlag())) {
+        MesMdmItemDO item = mdmItemService.validateItemExists(reqVO.getItemId());
+        if (Boolean.FALSE.equals(item.getIsBatchManaged())) {
             // 鏈惎鐢ㄦ壒娆$鐞嗭紝杩斿洖 null
             return null;
         }
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockService.java
index a6e667c..cc8b761 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockService.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockService.java
@@ -1,6 +1,7 @@
 package cn.iocoder.yudao.module.mes.service.wm.materialstock;
 
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockAdjustReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockFreezeReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockListReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockPageReqVO;
@@ -148,4 +149,12 @@
     MesWmMaterialStockDO validateSelectedStock(Long materialStockId, Long itemId, Long batchId, String batchCode,
                                                Long warehouseId, Long locationId, Long areaId, BigDecimal quantity);
 
+    /**
+     * 搴撳瓨璋冩暣锛堣嚜瀹氫箟鍑哄叆搴擄級
+     *
+     * @param reqVO 璋冩暣璇锋眰
+     * @return 搴撳瓨浜嬪姟娴佹按ID
+     */
+    Long adjustMaterialStock(@Valid MesWmMaterialStockAdjustReqVO reqVO);
+
 }
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java
index 638bae4..5c9f684 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java
@@ -5,22 +5,28 @@
 import cn.hutool.core.util.ObjUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.collection.SetUtils;
+import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockAdjustReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockFreezeReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockListReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockPageReqVO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.mdm.MesMdmItemDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemTypeDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstock.MesWmMaterialStockDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO;
 import cn.iocoder.yudao.module.mes.dal.mysql.wm.materialstock.MesWmMaterialStockMapper;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
+import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants;
+import cn.iocoder.yudao.module.mes.enums.wm.MesWmTransactionTypeEnum;
+import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
 import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemTypeService;
+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.mes.service.wm.warehouse.MesWmWarehouseAreaService;
 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService;
 import jakarta.annotation.Resource;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
 
 import java.math.BigDecimal;
@@ -42,7 +48,7 @@
     private MesWmMaterialStockMapper materialStockMapper;
 
     @Resource
-    private MesMdItemService itemService;
+    private MesMdmItemService mdmItemService;
     @Resource
     private MesMdItemTypeService itemTypeService;
     @Resource
@@ -50,6 +56,9 @@
     @Resource
     @Lazy
     private MesWmWarehouseService warehouseService;
+    @Resource
+    @Lazy
+    private MesWmTransactionService wmTransactionService;
 
     @Override
     public MesWmMaterialStockDO getMaterialStock(Long id) {
@@ -156,9 +165,9 @@
         }
 
         // 2. 涓嶅瓨鍦ㄥ垯鏂板缓
-        MesMdItemDO item = itemService.validateItemExists(itemId);
+        MesMdmItemDO item = mdmItemService.validateItemExists(itemId);
         MesWmMaterialStockDO newStock = MesWmMaterialStockDO.builder()
-                .itemId(itemId).itemTypeId(item.getItemTypeId())
+                .itemId(itemId).itemTypeId(item.getCategoryId())
                 .warehouseId(warehouseId).locationId(locationId).areaId(areaId)
                 .batchId(batchId).batchCode(batchCode).vendorId(vendorId)
                 .quantity(BigDecimal.ZERO) // 鍒濆鏁伴噺涓� 0锛岀敱 updateMaterialStockQuantity 鏇存柊
@@ -232,4 +241,58 @@
         return stock;
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Long adjustMaterialStock(MesWmMaterialStockAdjustReqVO reqVO) {
+        // 1. 鏍¢獙鐗╂枡瀛樺湪涓斿惎鐢�
+        MesMdmItemDO item = mdmItemService.validateItemExistsAndEnable(reqVO.getItemId());
+
+        // 2. 鍒ゆ柇鏄叆搴撹繕鏄嚭搴�
+        BigDecimal quantity = reqVO.getQuantity();
+        if (quantity == null || quantity.compareTo(BigDecimal.ZERO) == 0) {
+            throw exception(WM_MATERIAL_STOCK_QUANTITY_INVALID);
+        }
+        boolean isInbound = quantity.compareTo(BigDecimal.ZERO) > 0;
+        int bizType = isInbound ? MesBizTypeConstants.WM_STOCK_ADJUST_IN : MesBizTypeConstants.WM_STOCK_ADJUST_OUT;
+
+        // 3. 鏍¢獙搴撲綅娣锋斁瑙勫垯
+        checkAreaMixingRule(reqVO.getAreaId(), reqVO.getItemId(), reqVO.getBatchId());
+
+        // 4. 鑾峰彇鎴栧垱寤哄簱瀛樿褰�
+        MesWmMaterialStockDO stock = getOrCreateMaterialStock(
+                reqVO.getItemId(),
+                reqVO.getWarehouseId(),
+                reqVO.getLocationId(),
+                reqVO.getAreaId(),
+                reqVO.getBatchId(),
+                reqVO.getBatchCode(),
+                reqVO.getVendorId(),
+                LocalDateTime.now()
+        );
+
+        // 5. 鏇存柊搴撳瓨鏁伴噺锛堝嚭搴撴椂鏍¢獙搴撳瓨鍏呰冻锛�
+        updateMaterialStockQuantity(stock.getId(), quantity, !isInbound);
+
+        // 6. 鍒涘缓搴撳瓨浜嬪姟娴佹按
+        MesWmTransactionSaveReqDTO transaction = new MesWmTransactionSaveReqDTO()
+                .setType(isInbound ? MesWmTransactionTypeEnum.IN.getType() : MesWmTransactionTypeEnum.OUT.getType())
+                .setBizType(bizType)
+                .setBizId(stock.getId())
+                .setBizCode("STOCK_ADJUST_" + stock.getId())
+                .setBizLineId(stock.getId())
+                .setItemId(reqVO.getItemId())
+                .setQuantity(quantity)
+                .setBatchId(reqVO.getBatchId())
+                .setBatchCode(reqVO.getBatchCode())
+                .setWarehouseId(reqVO.getWarehouseId())
+                .setLocationId(reqVO.getLocationId())
+                .setAreaId(reqVO.getAreaId())
+                .setVendorId(reqVO.getVendorId())
+                .setReceiptTime(LocalDateTime.now())
+                .setCheckFlag(!isInbound);
+        wmTransactionService.createTransaction(transaction);
+
+        return stock.getId();
+    }
+
 }
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscissue/MesWmMiscIssueLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscissue/MesWmMiscIssueLineServiceImpl.java
index ddf7ba4..22b985d 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscissue/MesWmMiscIssueLineServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscissue/MesWmMiscIssueLineServiceImpl.java
@@ -6,7 +6,7 @@
 import cn.iocoder.yudao.module.mes.controller.admin.wm.miscissue.vo.line.MesWmMiscIssueLineSaveReqVO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.miscissue.MesWmMiscIssueLineDO;
 import cn.iocoder.yudao.module.mes.dal.mysql.wm.miscissue.MesWmMiscIssueLineMapper;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
+import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService;
 import jakarta.annotation.Resource;
 import org.springframework.context.annotation.Lazy;
@@ -36,7 +36,7 @@
     @Lazy
     private MesWmMiscIssueDetailService miscIssueDetailService;
     @Resource
-    private MesMdItemService itemService;
+    private MesMdmItemService mdmItemService;
     @Resource
     private MesWmWarehouseAreaService warehouseAreaService;
 
@@ -129,7 +129,7 @@
         // 鏍¢獙鐖跺崟鎹瓨鍦ㄤ笖涓哄彲缂栬緫鐘舵��
         miscIssueService.validateMiscIssueEditable(issueId);
         // 鏍¢獙鐗╂枡瀛樺湪
-        itemService.validateItemExistsAndEnable(reqVO.getItemId());
+        mdmItemService.validateItemExistsAndEnable(reqVO.getItemId());
         // 鏍¢獙浠撳簱銆佸簱鍖恒�佸簱浣嶇殑鐖跺瓙鍏崇郴
         warehouseAreaService.validateWarehouseAreaExists(reqVO.getWarehouseId(),
                 reqVO.getLocationId(), reqVO.getAreaId());
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscreceipt/MesWmMiscReceiptLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscreceipt/MesWmMiscReceiptLineServiceImpl.java
index ed156b3..dee628f 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscreceipt/MesWmMiscReceiptLineServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscreceipt/MesWmMiscReceiptLineServiceImpl.java
@@ -6,7 +6,7 @@
 import cn.iocoder.yudao.module.mes.controller.admin.wm.miscreceipt.vo.line.MesWmMiscReceiptLineSaveReqVO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.miscreceipt.MesWmMiscReceiptLineDO;
 import cn.iocoder.yudao.module.mes.dal.mysql.wm.miscreceipt.MesWmMiscReceiptLineMapper;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
+import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService;
 import jakarta.annotation.Resource;
 import org.springframework.context.annotation.Lazy;
@@ -36,7 +36,7 @@
     @Lazy
     private MesWmMiscReceiptDetailService miscReceiptDetailService;
     @Resource
-    private MesMdItemService itemService;
+    private MesMdmItemService mdmItemService;
     @Resource
     private MesWmWarehouseAreaService warehouseAreaService;
 
@@ -125,7 +125,7 @@
         // 鏍¢獙鐖跺崟鎹瓨鍦ㄤ笖涓哄彲缂栬緫鐘舵��
         miscReceiptService.validateMiscReceiptEditable(reqVO.getReceiptId());
         // 鏍¢獙鐗╂枡瀛樺湪
-        itemService.validateItemExistsAndEnable(reqVO.getItemId());
+        mdmItemService.validateItemExistsAndEnable(reqVO.getItemId());
         // 鏍¢獙浠撳簱灞傜骇鍏崇郴锛堜粨搴� - 搴撲綅 - 搴撳尯锛�
         warehouseAreaService.validateWarehouseAreaExists(reqVO.getWarehouseId(),
                 reqVO.getLocationId(), reqVO.getAreaId());
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueDetailServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueDetailServiceImpl.java
index 9a14936..da3ff2e 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueDetailServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueDetailServiceImpl.java
@@ -6,7 +6,7 @@
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourceissue.MesWmOutsourceIssueDetailDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourceissue.MesWmOutsourceIssueLineDO;
 import cn.iocoder.yudao.module.mes.dal.mysql.wm.outsourceissue.MesWmOutsourceIssueDetailMapper;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
+import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
 import cn.iocoder.yudao.module.mes.service.wm.materialstock.MesWmMaterialStockService;
 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService;
 import jakarta.annotation.Resource;
@@ -35,7 +35,7 @@
     @Lazy
     private MesWmOutsourceIssueLineService outsourceIssueLineService;
     @Resource
-    private MesMdItemService itemService;
+    private MesMdmItemService mdmItemService;
     @Resource
     private MesWmWarehouseAreaService warehouseAreaService;
     @Resource
@@ -113,7 +113,7 @@
             throw exception(WM_OUTSOURCE_ISSUE_DETAIL_LINE_NOT_MATCH);
         }
         // 鏍¢獙鐗╂枡瀛樺湪
-        itemService.validateItemExistsAndEnable(saveReqVO.getItemId());
+        mdmItemService.validateItemExistsAndEnable(saveReqVO.getItemId());
         if (ObjUtil.notEqual(line.getItemId(), saveReqVO.getItemId())) {
             throw exception(WM_OUTSOURCE_ISSUE_DETAIL_ITEM_MISMATCH);
         }
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueLineServiceImpl.java
index 236ee94..3399e0d 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueLineServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueLineServiceImpl.java
@@ -11,7 +11,7 @@
 import cn.iocoder.yudao.module.mes.dal.mysql.wm.outsourceissue.MesWmOutsourceIssueLineMapper;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderBomDO;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
+import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
 import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderBomService;
 import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService;
 import jakarta.annotation.Resource;
@@ -44,7 +44,7 @@
     @Lazy
     private MesWmOutsourceIssueService outsourceIssueService;
     @Resource
-    private MesMdItemService itemService;
+    private MesMdmItemService mdmItemService;
     @Resource
     private MesWmBatchService batchService;
     @Resource
@@ -121,7 +121,7 @@
             throw exception(WM_OUTSOURCE_ISSUE_NOT_EXISTS);
         }
         // 鏍¢獙鍏宠仈鐨勭墿鏂欏瓨鍦�
-        itemService.validateItemExistsAndEnable(saveReqVO.getItemId());
+        mdmItemService.validateItemExistsAndEnable(saveReqVO.getItemId());
         // 鏍¢獙鐗╂枡鏄惁鍦ㄥ伐鍗� BOM 涓�
         validateItemInWorkOrderBom(issue.getWorkOrderId(), saveReqVO.getItemId());
     }
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptDetailServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptDetailServiceImpl.java
index e59639b..22538b3 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptDetailServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptDetailServiceImpl.java
@@ -4,7 +4,7 @@
 import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourcereceipt.vo.detail.MesWmOutsourceReceiptDetailSaveReqVO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourcereceipt.MesWmOutsourceReceiptDetailDO;
 import cn.iocoder.yudao.module.mes.dal.mysql.wm.outsourcereceipt.MesWmOutsourceReceiptDetailMapper;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
+import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService;
 import jakarta.annotation.Resource;
 import org.springframework.stereotype.Service;
@@ -26,7 +26,7 @@
     private MesWmOutsourceReceiptDetailMapper detailMapper;
 
     @Resource
-    private MesMdItemService itemService;
+    private MesMdmItemService mdmItemService;
     @Resource
     private MesWmWarehouseAreaService areaService;
 
@@ -91,7 +91,7 @@
      */
     private void validateDetailSaveData(MesWmOutsourceReceiptDetailSaveReqVO reqVO) {
         // 鏍¢獙鐗╂枡瀛樺湪
-        itemService.validateItemExistsAndEnable(reqVO.getItemId());
+        mdmItemService.validateItemExistsAndEnable(reqVO.getItemId());
         // 鏍¢獙浠撳簱銆佸簱鍖恒�佸簱浣嶇殑灞傜骇鍏崇郴
         areaService.validateWarehouseAreaExists(reqVO.getWarehouseId(), reqVO.getLocationId(), reqVO.getAreaId());
     }
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptLineServiceImpl.java
index 5559ce9..b0337fe 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptLineServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptLineServiceImpl.java
@@ -11,7 +11,7 @@
 import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO;
 import cn.iocoder.yudao.module.mes.dal.mysql.wm.outsourcereceipt.MesWmOutsourceReceiptLineMapper;
 import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
+import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
 import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService;
 import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService;
 import jakarta.annotation.Resource;
@@ -36,7 +36,7 @@
     private MesWmOutsourceReceiptLineMapper lineMapper;
 
     @Resource
-    private MesMdItemService itemService;
+    private MesMdmItemService mdmItemService;
     @Resource
     @Lazy
     private MesWmOutsourceReceiptDetailService outsourceReceiptDetailService;
@@ -52,7 +52,7 @@
     @Override
     public Long createOutsourceReceiptLine(MesWmOutsourceReceiptLineSaveReqVO createReqVO) {
         // 鏍¢獙鐗╂枡瀛樺湪
-        itemService.validateItemExistsAndEnable(createReqVO.getItemId());
+        mdmItemService.validateItemExistsAndEnable(createReqVO.getItemId());
 
         // 鎻掑叆
         MesWmOutsourceReceiptLineDO line = BeanUtils.toBean(createReqVO, MesWmOutsourceReceiptLineDO.class);
@@ -72,7 +72,7 @@
         // 鏍¢獙瀛樺湪
         validateOutsourceReceiptLineExists(updateReqVO.getId());
         // 鏍¢獙鐗╂枡瀛樺湪
-        itemService.validateItemExistsAndEnable(updateReqVO.getItemId());
+        mdmItemService.validateItemExistsAndEnable(updateReqVO.getItemId());
 
         // 鏇存柊
         MesWmOutsourceReceiptLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmOutsourceReceiptLineDO.class);
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptServiceImpl.java
index 67cb907..4ab00b6 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptServiceImpl.java
@@ -10,7 +10,7 @@
 import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourcereceipt.vo.MesWmOutsourceReceiptPageReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourcereceipt.vo.MesWmOutsourceReceiptSaveReqVO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.mdm.MesMdmItemDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourcereceipt.MesWmOutsourceReceiptDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourcereceipt.MesWmOutsourceReceiptDetailDO;
@@ -20,7 +20,7 @@
 import cn.iocoder.yudao.module.mes.enums.wm.MesWmOutsourceReceiptStatusEnum;
 import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum;
 import cn.iocoder.yudao.module.mes.enums.wm.MesWmTransactionTypeEnum;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
+import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
 import cn.iocoder.yudao.module.mes.service.md.vendor.MesMdVendorService;
 import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService;
 import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService;
@@ -58,7 +58,7 @@
     @Resource
     private MesMdVendorService vendorService;
     @Resource
-    private MesMdItemService itemService;
+    private MesMdmItemService mdmItemService;
     @Resource
     private MesProWorkOrderService workOrderService;
 
@@ -160,7 +160,7 @@
                         MesWmOutsourceReceiptDetailDO::getQuantity, BigDecimal::add, BigDecimal.ZERO);
                 // 瀵规瘮琛屾暟閲忎笌鏄庣粏鎬绘暟閲忥紝涓嶆弧瓒崇洿鎺ユ姏鍑�
                 if (line.getQuantity().compareTo(totalDetailQuantity) > 0) {
-                    MesMdItemDO item = itemService.validateItemExistsAndEnable(line.getItemId());
+                    MesMdmItemDO item = mdmItemService.validateItemExistsAndEnable(line.getItemId());
                     throw exception(WM_OUTSOURCE_RECEIPT_DETAIL_QUANTITY_MISMATCH,
                             item.getCode() + " " + item.getName() + " 鏈畬鎴愪笂鏋�");
                 }
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/packages/MesWmPackageLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/packages/MesWmPackageLineServiceImpl.java
index a04cd6b..57e2238 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/packages/MesWmPackageLineServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/packages/MesWmPackageLineServiceImpl.java
@@ -6,7 +6,7 @@
 import cn.iocoder.yudao.module.mes.controller.admin.wm.packages.vo.line.MesWmPackageLineSaveReqVO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.packages.MesWmPackageLineDO;
 import cn.iocoder.yudao.module.mes.dal.mysql.wm.packages.MesWmPackageLineMapper;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
+import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
 import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService;
 import jakarta.annotation.Resource;
 import org.springframework.context.annotation.Lazy;
@@ -34,7 +34,7 @@
     @Lazy
     private MesWmPackageService packageService;
     @Resource
-    private MesMdItemService itemService;
+    private MesMdmItemService mdmItemService;
     @Resource
     private MesProWorkOrderService workOrderService;
 
@@ -101,7 +101,7 @@
         // 鏍¢獙瑁呯鍗曠姸鎬佷负鑽夌
         packageService.validatePackageStatusDraft(reqVO.getPackageId());
         // 鏍¢獙浜у搧鐗╂枡瀛樺湪
-        itemService.validateItemExistsAndEnable(reqVO.getItemId());
+        mdmItemService.validateItemExistsAndEnable(reqVO.getItemId());
         // 鏍¢獙宸ュ崟宸茬‘璁�
         workOrderService.validateWorkOrderConfirmed(reqVO.getWorkOrderId());
     }
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueLineServiceImpl.java
index 374a2ce..b264b98 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueLineServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueLineServiceImpl.java
@@ -9,7 +9,7 @@
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productissue.MesWmProductIssueDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productissue.MesWmProductIssueLineDO;
 import cn.iocoder.yudao.module.mes.dal.mysql.wm.productissue.MesWmProductIssueLineMapper;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
+import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
 import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderBomService;
 import jakarta.annotation.Resource;
 import org.springframework.context.annotation.Lazy;
@@ -36,7 +36,7 @@
     @Lazy
     private MesWmProductIssueService issueService;
     @Resource
-    private MesMdItemService itemService;
+    private MesMdmItemService mdmItemService;
     @Resource
     private MesProWorkOrderBomService workOrderBomService;
     @Resource
@@ -114,7 +114,7 @@
         // 鏍¢獙鐗╂枡鍦ㄥ伐鍗� BOM 涓�
         validateItemInWorkOrderBom(reqVO.getIssueId(), reqVO.getItemId());
         // 鏍¢獙鐗╂枡瀛樺湪
-        itemService.validateItemExistsAndEnable(reqVO.getItemId());
+        mdmItemService.validateItemExistsAndEnable(reqVO.getItemId());
     }
 
     private void validateItemInWorkOrderBom(Long issueId, Long itemId) {
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productreceipt/MesWmProductReceiptLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productreceipt/MesWmProductReceiptLineServiceImpl.java
index b22b8fc..e40fb5f 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productreceipt/MesWmProductReceiptLineServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productreceipt/MesWmProductReceiptLineServiceImpl.java
@@ -6,7 +6,7 @@
 import cn.iocoder.yudao.module.mes.controller.admin.wm.productreceipt.vo.line.MesWmProductReceiptLineSaveReqVO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productreceipt.MesWmProductReceiptLineDO;
 import cn.iocoder.yudao.module.mes.dal.mysql.wm.productreceipt.MesWmProductReceiptLineMapper;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
+import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
 import jakarta.annotation.Resource;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
@@ -34,7 +34,7 @@
     @Resource
     private MesWmProductReceiptDetailService productReceiptDetailService;
     @Resource
-    private MesMdItemService itemService;
+    private MesMdmItemService mdmItemService;
 
     @Override
     public Long createProductReceiptLine(MesWmProductReceiptLineSaveReqVO createReqVO) {
@@ -109,7 +109,7 @@
         // 鏍¢獙鐖跺崟鎹瓨鍦ㄤ笖涓哄彲缂栬緫鐘舵��
         productReceiptService.validateProductReceiptEditable(reqVO.getReceiptId());
         // 鏍¢獙鐗╂枡瀛樺湪
-        itemService.validateItemExistsAndEnable(reqVO.getItemId());
+        mdmItemService.validateItemExistsAndEnable(reqVO.getItemId());
     }
 
 }
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesDetailServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesDetailServiceImpl.java
index 8cb2e81..a1d20b0 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesDetailServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesDetailServiceImpl.java
@@ -6,7 +6,7 @@
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productsales.MesWmProductSalesDetailDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productsales.MesWmProductSalesLineDO;
 import cn.iocoder.yudao.module.mes.dal.mysql.wm.productsales.MesWmProductSalesDetailMapper;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
+import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
 import cn.iocoder.yudao.module.mes.service.wm.materialstock.MesWmMaterialStockService;
 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService;
 import jakarta.annotation.Resource;
@@ -32,7 +32,7 @@
     private MesWmProductSalesDetailMapper productSalesDetailMapper;
 
     @Resource
-    private MesMdItemService itemService;
+    private MesMdmItemService mdmItemService;
     @Resource
     @Lazy
     private MesWmProductSalesLineService productSalesLineService;
@@ -115,7 +115,7 @@
             throw exception(WM_PRODUCT_SALES_DETAIL_LINE_NOT_MATCH);
         }
         // 鏍¢獙鐗╂枡瀛樺湪
-        itemService.validateItemExistsAndEnable(reqVO.getItemId());
+        mdmItemService.validateItemExistsAndEnable(reqVO.getItemId());
         if (ObjUtil.notEqual(line.getItemId(), reqVO.getItemId())) {
             throw exception(WM_PRODUCT_SALES_DETAIL_ITEM_MISMATCH);
         }
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesLineServiceImpl.java
index 5d112b8..a1ec2f7 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesLineServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesLineServiceImpl.java
@@ -12,7 +12,7 @@
 import cn.iocoder.yudao.module.mes.dal.mysql.wm.productsales.MesWmProductSalesLineMapper;
 import cn.iocoder.yudao.module.mes.enums.qc.MesQcCheckResultEnum;
 import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
+import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
 import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.salesnotice.MesWmSalesNoticeLineDO;
@@ -47,7 +47,7 @@
     @Resource
     private MesWmProductSalesDetailService productSalesDetailService;
     @Resource
-    private MesMdItemService itemService;
+    private MesMdmItemService mdmItemService;
     @Resource
     private MesWmBatchService batchService;
     @Resource
@@ -153,7 +153,7 @@
         // 鏍¢獙涓诲崟瀛樺湪涓斾负鑽夌鐘舵��
         MesWmProductSalesDO sales = productSalesService.validateProductSalesExistsAndDraft(reqVO.getSalesId());
         // 鏍¢獙鐗╂枡瀛樺湪
-        itemService.validateItemExistsAndEnable(reqVO.getItemId());
+        mdmItemService.validateItemExistsAndEnable(reqVO.getItemId());
         // 鏍¢獙鍏宠仈鍙戣揣閫氱煡鍗曡锛堝瓨鍦ㄦ�� + 褰掑睘 + 瀛楁涓�鑷存�э級
         validateSalesNoticeLine(sales, reqVO);
         // 鏍规嵁 batchCode 瑙f瀽 batchId
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 baec481..7309606 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
@@ -251,9 +251,9 @@
         productSalesMapper.updateById(new MesWmProductSalesDO()
                 .setId(id).setStatus(MesWmProductSalesStatusEnum.FINISHED.getStatus()));
 
-        // 5. 鏇存柊鍏宠仈鐨勫彂璐ч�氱煡鍗曠姸鎬�
+        // 5. 鏇存柊鍏宠仈鐨勫彂璐ч�氱煡鍗曞嚭搴撴暟閲忓拰鐘舵��
         if (sales.getNoticeId() != null) {
-            salesNoticeService.finishSalesNotice(sales.getNoticeId());
+            updateSalesNoticeOutCount(sales);
         }
 
         // 6. 鍥炲啓 ERP 閿�鍞鍗曠殑鍑哄簱鏁伴噺鍜岀姸鎬�
@@ -261,6 +261,23 @@
     }
 
     /**
+     * 鏇存柊鍙戣揣閫氱煡鍗曠殑鍑哄簱鏁伴噺鍜岀姸鎬�
+     */
+    private void updateSalesNoticeOutCount(MesWmProductSalesDO sales) {
+        // 鑾峰彇鍑哄簱鍗曡
+        List<MesWmProductSalesLineDO> lines = productSalesLineService.getProductSalesLineListBySalesId(sales.getId());
+        if (CollUtil.isEmpty(lines)) {
+            return;
+        }
+        // 閬嶅巻琛岋紝鎸� noticeLineId 鏇存柊鍑哄簱鏁伴噺
+        for (MesWmProductSalesLineDO line : lines) {
+            if (line.getNoticeLineId() != null && line.getQuantity() != null) {
+                salesNoticeService.updateSalesNoticeLineOutCount(line.getNoticeLineId(), line.getQuantity());
+            }
+        }
+    }
+
+    /**
      * 鍥炲啓 ERP 閿�鍞鍗曠殑鍑哄簱鏁伴噺鍜岀姸鎬�
      */
     private void updateErpSaleOrderOutCount(MesWmProductSalesDO sales) {
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueLineServiceImpl.java
index 60ef865..f966893 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueLineServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueLineServiceImpl.java
@@ -12,7 +12,7 @@
 import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum;
 import cn.iocoder.yudao.module.mes.enums.wm.MesWmReturnIssueStatusEnum;
 import cn.iocoder.yudao.module.mes.enums.wm.MesWmReturnIssueTypeEnum;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
+import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
 import jakarta.annotation.Resource;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
@@ -39,7 +39,7 @@
     @Lazy
     private MesWmReturnIssueService issueService;
     @Resource
-    private MesMdItemService itemService;
+    private MesMdmItemService mdmItemService;
     @Resource
     @Lazy
     private MesWmReturnIssueDetailService issueDetailService;
@@ -117,7 +117,7 @@
         // 鏍¢獙鐖舵暟鎹瓨鍦� + 鑽夌鐘舵��
         MesWmReturnIssueDO issue = issueService.validateReturnIssueExistsAndPrepare(reqVO.getIssueId());
         // 鏍¢獙鐗╂枡瀛樺湪
-        itemService.validateItemExistsAndEnable(reqVO.getItemId());
+        mdmItemService.validateItemExistsAndEnable(reqVO.getItemId());
         return issue;
     }
 
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueServiceImpl.java
index 3269ae7..41d05d5 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnissue/MesWmReturnIssueServiceImpl.java
@@ -9,7 +9,7 @@
 import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.returnissue.vo.MesWmReturnIssuePageReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.returnissue.vo.MesWmReturnIssueSaveReqVO;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.mdm.MesMdmItemDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnissue.MesWmReturnIssueDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnissue.MesWmReturnIssueDetailDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnissue.MesWmReturnIssueLineDO;
@@ -18,7 +18,7 @@
 import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum;
 import cn.iocoder.yudao.module.mes.enums.wm.MesWmReturnIssueStatusEnum;
 import cn.iocoder.yudao.module.mes.enums.wm.MesWmTransactionTypeEnum;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
+import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
 import cn.iocoder.yudao.module.mes.service.md.workstation.MesMdWorkstationService;
 import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService;
 import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService;
@@ -61,7 +61,7 @@
     @Resource
     private MesProWorkOrderService workOrderService;
     @Resource
-    private MesMdItemService itemService;
+    private MesMdmItemService mdmItemService;
     @Resource
     private MesWmTransactionService wmTransactionService;
     @Resource
@@ -168,7 +168,7 @@
                         MesWmReturnIssueDetailDO::getQuantity, BigDecimal::add, BigDecimal.ZERO);
                 // 瀵规瘮琛屾暟閲忎笌鏄庣粏鎬绘暟閲忥紝涓嶆弧瓒崇洿鎺ユ姏鍑�
                 if (line.getQuantity().compareTo(totalDetailQuantity) > 0) {
-                    MesMdItemDO item = itemService.validateItemExistsAndEnable(line.getItemId());
+                    MesMdmItemDO item = mdmItemService.validateItemExistsAndEnable(line.getItemId());
                     throw exception(WM_RETURN_ISSUE_DETAIL_QUANTITY_MISMATCH,
                             item.getCode() + " " + item.getName() + " 鏈畬鎴愪笂鏋�");
                 }
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 0aa1fd8..ed787a3 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
@@ -6,13 +6,13 @@
 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.md.item.MesMdItemDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.mdm.MesMdmItemDO;
 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.enums.wm.MesWmQualityStatusEnum;
 import cn.iocoder.yudao.module.mes.enums.wm.MesWmReturnSalesStatusEnum;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
+import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
 import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService;
 import jakarta.annotation.Resource;
 import org.springframework.context.annotation.Lazy;
@@ -43,7 +43,7 @@
     @Lazy
     private MesWmReturnSalesService returnSalesService;
     @Resource
-    private MesMdItemService itemService;
+    private MesMdmItemService mdmItemService;
     @Resource
     private MesWmBatchService batchService;
     @Resource
@@ -155,9 +155,9 @@
      * @param batchId  鎵规ID
      */
     private void validateItemBatchManagement(Long returnId, Long itemId, Long batchId) {
-        MesMdItemDO item = itemService.validateItemExistsAndEnable(itemId);
+        MesMdmItemDO item = mdmItemService.validateItemExistsAndEnable(itemId);
         // 濡傛灉鐗╂枡鍚敤浜嗘壒娆$鐞嗭紝鍒欏繀椤婚�夋嫨鎵规
-        if (Boolean.TRUE.equals(item.getBatchFlag()) && batchId == null) {
+        if (Boolean.TRUE.equals(item.getIsBatchManaged()) && batchId == null) {
             throw exception(MD_ITEM_BATCH_REQUIRED);
         }
         // 鏍¢獙鎵规瀛樺湪涓斿睘浜庡綋鍓嶇墿鏂欏拰瀹㈡埛
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 a110f3e..82abbb2 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
@@ -9,7 +9,7 @@
 import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
 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.md.item.MesMdItemDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.mdm.MesMdmItemDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesDetailDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesLineDO;
@@ -19,7 +19,7 @@
 import cn.iocoder.yudao.module.mes.enums.wm.MesWmReturnSalesStatusEnum;
 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.md.item.MesMdItemService;
+import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
 import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService;
 import cn.iocoder.yudao.module.mes.service.wm.transaction.dto.MesWmTransactionSaveReqDTO;
 import jakarta.annotation.Resource;
@@ -55,7 +55,7 @@
     @Resource
     private MesMdClientService clientService;
     @Resource
-    private MesMdItemService itemService;
+    private MesMdmItemService mdmItemService;
     @Resource
     private MesWmTransactionService wmTransactionService;
 
@@ -170,7 +170,7 @@
                         MesWmReturnSalesDetailDO::getQuantity, BigDecimal::add, BigDecimal.ZERO);
                 // 瀵规瘮琛屾暟閲忎笌鏄庣粏鎬绘暟閲忥紝涓嶆弧瓒崇洿鎺ユ姏鍑�
                 if (line.getQuantity().compareTo(totalDetailQuantity) > 0) {
-                    MesMdItemDO item = itemService.validateItemExistsAndEnable(line.getItemId());
+                    MesMdmItemDO item = mdmItemService.validateItemExistsAndEnable(line.getItemId());
                     throw exception(WM_RETURN_SALES_DETAIL_QUANTITY_MISMATCH,
                             item.getCode() + " " + item.getName() + " 鏈畬鎴愪笂鏋�");
                 }
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorDetailServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorDetailServiceImpl.java
index 985e80f..efc903c 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorDetailServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorDetailServiceImpl.java
@@ -6,7 +6,7 @@
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorDetailDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorLineDO;
 import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnvendor.MesWmReturnVendorDetailMapper;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
+import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
 import cn.iocoder.yudao.module.mes.service.wm.materialstock.MesWmMaterialStockService;
 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService;
 import jakarta.annotation.Resource;
@@ -33,7 +33,7 @@
     @Lazy
     private MesWmReturnVendorLineService returnVendorLineService;
     @Resource
-    private MesMdItemService itemService;
+    private MesMdmItemService mdmItemService;
     @Resource
     private MesWmMaterialStockService materialStockService;
     @Resource
@@ -72,7 +72,7 @@
             throw exception(WM_RETURN_VENDOR_DETAIL_LINE_NOT_MATCH);
         }
         // 鏍¢獙鐗╂枡瀛樺湪
-        itemService.validateItemExistsAndEnable(reqVO.getItemId());
+        mdmItemService.validateItemExistsAndEnable(reqVO.getItemId());
         // 鏍¢獙鐗╂枡涓庤鐗╂枡涓�鑷�
         validateItemConsistency(reqVO.getItemId(), line);
         // 鏍¢獙搴撲綅瀛樺湪
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorLineServiceImpl.java
index 6b70f92..7a9ee75 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorLineServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorLineServiceImpl.java
@@ -7,7 +7,7 @@
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorLineDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorDO;
 import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnvendor.MesWmReturnVendorLineMapper;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
+import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
 import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService;
 import jakarta.annotation.Resource;
 import org.springframework.context.annotation.Lazy;
@@ -37,7 +37,7 @@
     @Lazy
     private MesWmReturnVendorDetailService returnVendorDetailService;
     @Resource
-    private MesMdItemService itemService;
+    private MesMdmItemService mdmItemService;
     @Resource
     private MesWmBatchService batchService;
 
@@ -113,7 +113,7 @@
         // 鏍¢獙鐖舵暟鎹瓨鍦ㄤ笖涓鸿崏绋跨姸鎬�
         MesWmReturnVendorDO returnVendor = returnVendorService.validateReturnVendorExistsAndPrepare(reqVO.getReturnId());
         // 鏍¢獙鐗╂枡瀛樺湪
-        itemService.validateItemExistsAndEnable(reqVO.getItemId());
+        mdmItemService.validateItemExistsAndEnable(reqVO.getItemId());
         // 鏍¢獙鎵规瀛樺湪涓斿睘浜庡綋鍓嶇墿鏂欏拰渚涘簲鍟�
         if (reqVO.getBatchId() != null) {
             batchService.validateBatchExists(reqVO.getBatchId(), reqVO.getItemId(), null, returnVendor.getVendorId());
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeLineServiceImpl.java
index a5f08ff..7f40f15 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeLineServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeLineServiceImpl.java
@@ -10,7 +10,7 @@
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.salesnotice.MesWmSalesNoticeDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.salesnotice.MesWmSalesNoticeLineDO;
 import cn.iocoder.yudao.module.mes.dal.mysql.wm.salesnotice.MesWmSalesNoticeLineMapper;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
+import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
 import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService;
 import jakarta.annotation.Resource;
 import org.springframework.context.annotation.Lazy;
@@ -39,7 +39,7 @@
     @Resource
     private MesWmBatchService batchService;
     @Resource
-    private MesMdItemService itemService;
+    private MesMdmItemService mdmItemService;
 
     @Override
     public Long createSalesNoticeLine(MesWmSalesNoticeLineSaveReqVO createReqVO) {
@@ -122,7 +122,7 @@
         validateNoticeStatusDraft(reqVO.getNoticeId());
         // 鏍¢獙鐗╂枡瀛樺湪
         if (reqVO.getItemId() != null) {
-            itemService.validateItemExistsAndEnable(reqVO.getItemId());
+            mdmItemService.validateItemExistsAndEnable(reqVO.getItemId());
         }
     }
 
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeService.java
index d952c79..be5338c 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeService.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeService.java
@@ -98,9 +98,35 @@
 
     /**
      * 瀹屾垚鍙戣揣閫氱煡鍗曪紙鍑哄簱瀹屾垚鍚庤皟鐢級
+     * 绱姞鍑哄簱鏁伴噺骞惰绠楀嚭搴撶姸鎬�
      *
      * @param id 缂栧彿
+     * @deprecated 璇蜂娇鐢� {@link #updateSalesNoticeOutCount(Long, java.math.BigDecimal)}
      */
+    @Deprecated
     void finishSalesNotice(Long id);
 
+    /**
+     * 鏇存柊鍙戣揣閫氱煡鍗曡鐨勫嚭搴撴暟閲�
+     *
+     * @param noticeLineId 鍙戣揣閫氱煡鍗曡ID
+     * @param outCount     鍑哄簱鏁伴噺
+     */
+    void updateSalesNoticeLineOutCount(Long noticeLineId, java.math.BigDecimal outCount);
+
+    /**
+     * 鏇存柊鍙戣揣閫氱煡鍗曠殑鍑哄簱鐘舵��
+     *
+     * @param noticeId 鍙戣揣閫氱煡鍗旾D
+     */
+    void updateSalesNoticeOutStatus(Long noticeId);
+
+    /**
+     * 浠庡彂璐ч�氱煡鍗曠敓鎴愰攢鍞嚭搴撳崟
+     *
+     * @param noticeId 鍙戣揣閫氱煡鍗旾D
+     * @return 閿�鍞嚭搴撳崟ID
+     */
+    Long generateProductSalesFromNotice(Long noticeId);
+
 }
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeServiceImpl.java
index 9301bb6..c2b964c 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeServiceImpl.java
@@ -6,9 +6,16 @@
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.salesnotice.vo.MesWmSalesNoticePageReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.salesnotice.vo.MesWmSalesNoticeSaveReqVO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productsales.MesWmProductSalesDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productsales.MesWmProductSalesLineDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.salesnotice.MesWmSalesNoticeDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.salesnotice.MesWmSalesNoticeLineDO;
+import cn.iocoder.yudao.module.mes.dal.mysql.wm.productsales.MesWmProductSalesMapper;
+import cn.iocoder.yudao.module.mes.dal.mysql.wm.productsales.MesWmProductSalesLineMapper;
 import cn.iocoder.yudao.module.mes.dal.mysql.wm.salesnotice.MesWmSalesNoticeMapper;
+import cn.iocoder.yudao.module.mes.dal.mysql.wm.salesnotice.MesWmSalesNoticeLineMapper;
+import cn.iocoder.yudao.module.mes.enums.wm.MesWmOutStatusEnum;
+import cn.iocoder.yudao.module.mes.enums.wm.MesWmProductSalesStatusEnum;
 import cn.iocoder.yudao.module.mes.service.md.autocode.MesMdAutoCodeRecordService;
 import cn.iocoder.yudao.module.mes.service.md.client.MesMdClientService;
 import cn.iocoder.yudao.module.erp.api.sale.ErpSaleOrderApi;
@@ -20,6 +27,7 @@
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
 
+import java.math.BigDecimal;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
@@ -48,6 +56,13 @@
     private ErpSaleOrderApi saleOrderApi;
     @Resource
     private MesMdAutoCodeRecordService autoCodeRecordService;
+
+    @Resource
+    private MesWmProductSalesMapper productSalesMapper;
+    @Resource
+    private MesWmProductSalesLineMapper productSalesLineMapper;
+    @Resource
+    private MesWmSalesNoticeLineMapper salesNoticeLineMapper;
 
     @Override
     public Long createSalesNotice(MesWmSalesNoticeSaveReqVO createReqVO) {
@@ -202,11 +217,137 @@
 
     @Override
     public void finishSalesNotice(Long id) {
-        // 鏍¢獙瀛樺湪
-        MesWmSalesNoticeDO notice = validateSalesNoticeExists(id);
-        // 鏇存柊鐘舵�佷负宸插畬鎴�
+        // 宸插簾寮冿紝淇濈暀鍏煎鎬�
+        updateSalesNoticeOutStatus(id);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updateSalesNoticeLineOutCount(Long noticeLineId, BigDecimal outCount) {
+        if (noticeLineId == null || outCount == null) {
+            return;
+        }
+        // 1. 鑾峰彇鍙戣揣閫氱煡鍗曡
+        MesWmSalesNoticeLineDO line = salesNoticeLineMapper.selectById(noticeLineId);
+        if (line == null) {
+            return;
+        }
+        // 2. 绱姞鍑哄簱鏁伴噺
+        BigDecimal newOutCount = (line.getOutCount() != null ? line.getOutCount() : BigDecimal.ZERO).add(outCount);
+        // 3. 鏇存柊琛�
+        salesNoticeLineMapper.updateById(new MesWmSalesNoticeLineDO()
+                .setId(noticeLineId)
+                .setOutCount(newOutCount));
+        // 4. 鏇存柊涓诲崟鍑哄簱鐘舵��
+        updateSalesNoticeOutStatus(line.getNoticeId());
+    }
+
+    @Override
+    public void updateSalesNoticeOutStatus(Long noticeId) {
+        if (noticeId == null) {
+            return;
+        }
+        // 1. 鑾峰彇鍙戣揣閫氱煡鍗�
+        MesWmSalesNoticeDO notice = salesNoticeMapper.selectById(noticeId);
+        if (notice == null) {
+            return;
+        }
+        // 2. 鑾峰彇鍙戣揣閫氱煡鍗曡
+        List<MesWmSalesNoticeLineDO> lines = salesNoticeLineMapper.selectListByNoticeId(noticeId);
+        if (CollUtil.isEmpty(lines)) {
+            return;
+        }
+        // 3. 璁$畻鍑哄簱鐘舵��
+        int outStatus = calculateOutStatus(lines);
+        // 4. 鏇存柊鍑哄簱鐘舵��
         salesNoticeMapper.updateById(new MesWmSalesNoticeDO()
-                .setId(id).setStatus(FINISHED.getStatus()));
+                .setId(noticeId)
+                .setOutStatus(outStatus));
+        // 5. 濡傛灉鍏ㄩ儴鍑哄簱锛屾洿鏂板崟鎹姸鎬佷负宸插畬鎴�
+        if (outStatus == MesWmOutStatusEnum.ALL_OUT.getStatus()) {
+            salesNoticeMapper.updateById(new MesWmSalesNoticeDO()
+                    .setId(noticeId)
+                    .setStatus(FINISHED.getStatus()));
+        }
+    }
+
+    /**
+     * 璁$畻鍑哄簱鐘舵��
+     */
+    private int calculateOutStatus(List<MesWmSalesNoticeLineDO> lines) {
+        boolean allOut = true;
+        boolean anyOut = false;
+
+        for (MesWmSalesNoticeLineDO line : lines) {
+            BigDecimal quantity = line.getQuantity() != null ? line.getQuantity() : BigDecimal.ZERO;
+            BigDecimal outCount = line.getOutCount() != null ? line.getOutCount() : BigDecimal.ZERO;
+
+            if (outCount.compareTo(BigDecimal.ZERO) > 0) {
+                anyOut = true;
+            }
+            if (outCount.compareTo(quantity) < 0) {
+                allOut = false;
+            }
+        }
+
+        if (allOut) {
+            return MesWmOutStatusEnum.ALL_OUT.getStatus();
+        } else if (anyOut) {
+            return MesWmOutStatusEnum.PART_OUT.getStatus();
+        } else {
+            return MesWmOutStatusEnum.NOT_OUT.getStatus();
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Long generateProductSalesFromNotice(Long noticeId) {
+        // 1. 鏍¢獙鍙戣揣閫氱煡鍗曞瓨鍦ㄤ笖涓哄緟鍑哄簱鐘舵��
+        MesWmSalesNoticeDO notice = validateSalesNoticeExists(noticeId);
+        if (ObjUtil.notEqual(APPROVED.getStatus(), notice.getStatus())) {
+            throw exception(WM_SALES_NOTICE_STATUS_NOT_APPROVED);
+        }
+
+        // 2. 鑾峰彇鍙戣揣閫氱煡鍗曡
+        List<MesWmSalesNoticeLineDO> noticeLines = salesNoticeLineService.getSalesNoticeLineListByNoticeId(noticeId);
+        if (CollUtil.isEmpty(noticeLines)) {
+            throw exception(WM_SALES_NOTICE_LINE_EMPTY);
+        }
+
+        // 3. 鐢熸垚閿�鍞嚭搴撳崟缂栫爜
+        String code = autoCodeRecordService.generateAutoCode("WM_PRODUCT_SALES_CODE", null);
+
+        // 4. 鍒涘缓閿�鍞嚭搴撳崟涓昏〃
+        MesWmProductSalesDO productSales = new MesWmProductSalesDO();
+        productSales.setCode(code);
+        productSales.setName("鍙戣揣閫氱煡鍗昜" + notice.getCode() + "]鍑哄簱");
+        productSales.setClientId(notice.getClientId());
+        productSales.setSaleOrderId(notice.getSaleOrderId());
+        productSales.setSalesOrderCode(notice.getSaleOrderCode());
+        productSales.setNoticeId(noticeId);
+        productSales.setSalesDate(notice.getSalesDate());
+        // 鏀惰揣淇℃伅浠庡彂璐ч�氱煡鍗曞甫鍏�
+        productSales.setContactName(notice.getRecipientName());
+        productSales.setContactTelephone(notice.getRecipientTelephone());
+        productSales.setContactAddress(notice.getRecipientAddress());
+        productSales.setStatus(MesWmProductSalesStatusEnum.PREPARE.getStatus());
+        productSalesMapper.insert(productSales);
+
+        // 5. 閬嶅巻鍙戣揣閫氱煡鍗曡鍒涘缓閿�鍞嚭搴撳崟琛�
+        for (MesWmSalesNoticeLineDO noticeLine : noticeLines) {
+            MesWmProductSalesLineDO salesLine = new MesWmProductSalesLineDO();
+            salesLine.setSalesId(productSales.getId());
+            salesLine.setSaleOrderItemId(noticeLine.getSaleOrderItemId());
+            salesLine.setNoticeLineId(noticeLine.getId());
+            salesLine.setItemId(noticeLine.getItemId());
+            salesLine.setQuantity(noticeLine.getQuantity());
+            salesLine.setBatchId(noticeLine.getBatchId());
+            salesLine.setBatchCode(noticeLine.getBatchCode());
+            salesLine.setOqcCheckFlag(noticeLine.getOqcCheckFlag());
+            productSalesLineMapper.insert(salesLine);
+        }
+
+        return productSales.getId();
     }
 
 }
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/sn/MesWmSnServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/sn/MesWmSnServiceImpl.java
index e07b1c4..2cf874d 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/sn/MesWmSnServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/sn/MesWmSnServiceImpl.java
@@ -11,7 +11,7 @@
 import cn.iocoder.yudao.module.mes.enums.md.autocode.MesMdAutoCodeRuleCodeEnum;
 import cn.iocoder.yudao.module.mes.enums.wm.BarcodeBizTypeEnum;
 import cn.iocoder.yudao.module.mes.service.md.autocode.MesMdAutoCodeRecordService;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
+import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
 import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService;
 import cn.iocoder.yudao.module.mes.service.wm.barcode.MesWmBarcodeService;
 import jakarta.annotation.Resource;
@@ -41,7 +41,7 @@
     @Resource
     private MesMdAutoCodeRecordService autoCodeRecordService;
     @Resource
-    private MesMdItemService itemService;
+    private MesMdmItemService mdmItemService;
     @Resource
     private MesProWorkOrderService workOrderService;
     @Resource
@@ -51,7 +51,7 @@
     @Transactional(rollbackFor = Exception.class)
     public void generateSnCodes(MesWmSnGenerateReqVO reqVO) {
         // 鏍¢獙鐗╂枡鏄惁瀛樺湪
-        itemService.validateItemExists(reqVO.getItemId());
+        mdmItemService.validateItemExists(reqVO.getItemId());
         // 鏍¢獙宸ュ崟鏄惁瀛樺湪
         if (reqVO.getWorkOrderId() != null) {
             workOrderService.validateWorkOrderExists(reqVO.getWorkOrderId());
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transaction/MesWmTransactionServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transaction/MesWmTransactionServiceImpl.java
index 83f1115..dd61bb8 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transaction/MesWmTransactionServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transaction/MesWmTransactionServiceImpl.java
@@ -4,7 +4,7 @@
 import cn.hutool.core.lang.Assert;
 import cn.hutool.core.util.ObjUtil;
 import cn.hutool.core.util.StrUtil;
-import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
+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.materialstock.MesWmMaterialStockDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.transaction.MesWmTransactionDO;
@@ -13,7 +13,7 @@
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO;
 import cn.iocoder.yudao.module.mes.dal.mysql.wm.transaction.MesWmTransactionMapper;
 import cn.iocoder.yudao.module.mes.enums.wm.MesWmTransactionTypeEnum;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
+import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
 import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService;
 import cn.iocoder.yudao.module.mes.service.wm.materialstock.MesWmMaterialStockService;
 import cn.iocoder.yudao.module.mes.service.wm.transaction.dto.MesWmTransactionSaveReqDTO;
@@ -47,7 +47,7 @@
     @Resource
     private MesWmBatchService batchService;
     @Resource
-    private MesMdItemService itemService;
+    private MesMdmItemService mdmItemService;
     @Resource
     private MesWmWarehouseService warehouseService;
     @Resource
@@ -144,8 +144,8 @@
         }
         // 2. 鍏ュ簱鏃讹細鍚敤鎵规绠$悊鐨勭墿鏂欙紝蹇呴』浼犻�掓壒娆″彿
         if (inbound) {
-            MesMdItemDO item = itemService.validateItemExists(reqDTO.getItemId());
-            if (Boolean.TRUE.equals(item.getBatchFlag())) {
+            MesMdmItemDO item = mdmItemService.validateItemExists(reqDTO.getItemId());
+            if (Boolean.TRUE.equals(item.getIsBatchManaged())) {
                 if (StrUtil.isEmpty(reqDTO.getBatchCode()) && reqDTO.getBatchId() == null) {
                     throw exception(WM_TRANSACTION_BATCH_REQUIRED);
                 }
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transfer/MesWmTransferLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transfer/MesWmTransferLineServiceImpl.java
index 7bc662a..be322c6 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transfer/MesWmTransferLineServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transfer/MesWmTransferLineServiceImpl.java
@@ -5,7 +5,7 @@
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.transfer.MesWmTransferLineDO;
 import cn.iocoder.yudao.module.mes.dal.mysql.wm.transfer.MesWmTransferLineMapper;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstock.MesWmMaterialStockDO;
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
+import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
 import cn.iocoder.yudao.module.mes.service.wm.materialstock.MesWmMaterialStockService;
 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService;
 import jakarta.annotation.Resource;
@@ -38,7 +38,7 @@
     @Lazy
     private MesWmTransferDetailService transferDetailService;
     @Resource
-    private MesMdItemService itemService;
+    private MesMdmItemService mdmItemService;
     @Resource
     private MesWmWarehouseAreaService warehouseAreaService;
     @Resource
@@ -109,7 +109,7 @@
         // 鏍¢獙鐖舵暟鎹彲缂栬緫
         transferService.validateTransferEditable(reqVO.getTransferId());
         // 鏍¢獙浜у搧瀛樺湪
-        itemService.validateItemExistsAndEnable(reqVO.getItemId());
+        mdmItemService.validateItemExistsAndEnable(reqVO.getItemId());
         // 鏍¢獙鏉ユ簮浠撳簱銆佸簱鍖恒�佸簱浣嶇殑鍏宠仈鍏崇郴
         warehouseAreaService.validateWarehouseAreaExists(reqVO.getFromWarehouseId(),
                 reqVO.getFromLocationId(), reqVO.getFromAreaId());

--
Gitblit v1.9.3