From 1c1daebcb9f89138a84e9a7643d1909bb1a5a342 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期二, 14 七月 2026 10:27:31 +0800
Subject: [PATCH] 1.仓储物流-自定义出入库分别新增接口

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java             |   35 ++++++++---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/materialstock/vo/MesWmMaterialStockAdjustReqVO.java |    8 +-
 docs/material_stock_adjust.md                                                                                                      |   62 ++++++++++++++++----
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/materialstock/MesWmMaterialStockController.java     |   15 +++-
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockService.java                 |   16 ++++-
 5 files changed, 101 insertions(+), 35 deletions(-)

diff --git a/docs/material_stock_adjust.md b/docs/material_stock_adjust.md
index 38b6d85..ada1faf 100644
--- a/docs/material_stock_adjust.md
+++ b/docs/material_stock_adjust.md
@@ -15,11 +15,11 @@
 
 ## 鏂板 API
 
-### 搴撳瓨璋冩暣锛堣嚜瀹氫箟鍑哄叆搴擄級
+### 鑷畾涔夊叆搴�
 
 | 鏂规硶 | 璺緞 | 璇存槑 |
 |------|------|------|
-| POST | /mes/wm/material-stock/adjust | 搴撳瓨璋冩暣锛堟鏁�=鍏ュ簱锛岃礋鏁�=鍑哄簱锛� |
+| POST | /mes/wm/material-stock/adjust-in | 鑷畾涔夊叆搴� |
 
 **璇锋眰鍙傛暟锛�**
 
@@ -32,8 +32,38 @@
 | batchId | Long | 鍚� | 鎵规ID |
 | batchCode | String | 鍚� | 鎵规鍙� |
 | vendorId | Long | 鍚� | 渚涘簲鍟咺D |
-| quantity | BigDecimal | 鏄� | 璋冩暣鏁伴噺锛堟鏁�=鍏ュ簱锛岃礋鏁�=鍑哄簱锛� |
-| reason | String | 鍚� | 璋冩暣鍘熷洜 |
+| quantity | BigDecimal | 鏄� | 鍏ュ簱鏁伴噺锛堝繀椤诲ぇ浜�0锛� |
+| reason | String | 鍚� | 鍏ュ簱鍘熷洜 |
+
+**鍝嶅簲锛�**
+
+```json
+{
+  "code": 0,
+  "data": 123,  // 搴撳瓨璁板綍ID
+  "msg": "鎿嶄綔鎴愬姛"
+}
+```
+
+### 鑷畾涔夊嚭搴�
+
+| 鏂规硶 | 璺緞 | 璇存槑 |
+|------|------|------|
+| POST | /mes/wm/material-stock/adjust-out | 鑷畾涔夊嚭搴� |
+
+**璇锋眰鍙傛暟锛�**
+
+| 鍙傛暟 | 绫诲瀷 | 蹇呭~ | 璇存槑 |
+|------|------|------|------|
+| itemId | Long | 鏄� | 鐗╂枡ID |
+| warehouseId | Long | 鏄� | 浠撳簱ID |
+| locationId | Long | 鏄� | 搴撳尯ID |
+| areaId | Long | 鏄� | 搴撲綅ID |
+| batchId | Long | 鍚� | 鎵规ID |
+| batchCode | String | 鍚� | 鎵规鍙� |
+| vendorId | Long | 鍚� | 渚涘簲鍟咺D |
+| quantity | BigDecimal | 鏄� | 鍑哄簱鏁伴噺锛堝繀椤诲ぇ浜�0锛� |
+| reason | String | 鍚� | 鍑哄簱鍘熷洜 |
 
 **鍝嶅簲锛�**
 
@@ -57,6 +87,10 @@
 
 ### 2. 搴撳瓨璋冩暣寮圭獥
 
+**鎿嶄綔绫诲瀷閫夋嫨锛�**
+- 鐢ㄦ埛棣栧厛閫夋嫨鎿嶄綔绫诲瀷锛氬叆搴� / 鍑哄簱
+- 鏍规嵁鎿嶄綔绫诲瀷璋冪敤涓嶅悓鐨� API
+
 **琛ㄥ崟瀛楁锛�**
 
 | 瀛楁 | 绫诲瀷 | 蹇呭~ | 璇存槑 |
@@ -67,8 +101,8 @@
 | 搴撲綅 | 閫夋嫨鍣� | 鏄� | 鏍规嵁搴撳尯鑱斿姩鍔犺浇搴撲綅 |
 | 鎵规 | 閫夋嫨鍣� | 鍚� | 寮瑰嚭鎵规閫夋嫨瀵硅瘽妗嗭紙濡傛灉鐗╂枡鍚敤鎵规绠$悊锛� |
 | 渚涘簲鍟� | 閫夋嫨鍣� | 鍚� | 涓嬫媺閫夋嫨渚涘簲鍟� |
-| 璋冩暣鏁伴噺 | 鏁板瓧杈撳叆 | 鏄� | 姝f暟=鍏ュ簱锛岃礋鏁�=鍑哄簱 |
-| 璋冩暣鍘熷洜 | 鏂囨湰杈撳叆 | 鍚� | 濉啓璋冩暣鍘熷洜 |
+| 鍏ュ簱鏁伴噺/鍑哄簱鏁伴噺 | 鏁板瓧杈撳叆 | 鏄� | 蹇呴』澶т簬0 |
+| 鍏ュ簱鍘熷洜/鍑哄簱鍘熷洜 | 鏂囨湰杈撳叆 | 鍚� | 濉啓鍘熷洜 |
 
 **鑱斿姩閫昏緫锛�**
 
@@ -81,16 +115,18 @@
 **鎻愪氦閫昏緫锛�**
 
 1. 鏍¢獙蹇呭~瀛楁
-2. 璋冪敤 API `/mes/wm/material-stock/adjust`
-3. 鎴愬姛鍚庢彁绀�"璋冩暣鎴愬姛"锛屽埛鏂板垪琛ㄩ〉
+2. 鏍规嵁鎿嶄綔绫诲瀷璋冪敤涓嶅悓 API锛�
+   - 鍏ュ簱锛歚/mes/wm/material-stock/adjust-in`
+   - 鍑哄簱锛歚/mes/wm/material-stock/adjust-out`
+3. 鎴愬姛鍚庢彁绀�"鍏ュ簱鎴愬姛"/"鍑哄簱鎴愬姛"锛屽埛鏂板垪琛ㄩ〉
 4. 澶辫触鏃舵樉绀洪敊璇俊鎭�
 
 ## 涓氬姟瑙勫垯璇存槑
 
 | 鍦烘櫙 | 瑙勫垯 |
 |------|------|
-| 鍏ュ簱锛坬uantity > 0锛� | 鑷姩鍒涘缓搴撳瓨璁板綍锛堝鏋滀笉瀛樺湪锛夛紝澧炲姞搴撳瓨鏁伴噺 |
-| 鍑哄簱锛坬uantity < 0锛� | 鏍¢獙搴撳瓨璁板綍瀛樺湪涓旀暟閲忓厖瓒筹紝鎵e噺搴撳瓨鏁伴噺 |
+| 鍏ュ簱 | 鑷姩鍒涘缓搴撳瓨璁板綍锛堝鏋滀笉瀛樺湪锛夛紝澧炲姞搴撳瓨鏁伴噺 |
+| 鍑哄簱 | 鏍¢獙搴撳瓨璁板綍瀛樺湪涓旀暟閲忓厖瓒筹紝鎵e噺搴撳瓨鏁伴噺 |
 | 鎵规绠$悊 | 鐗╂枡鍚敤鎵规绠$悊鏃讹紝蹇呴』閫夋嫨鎵规 |
 | 搴撲綅娣锋斁 | 鏍规嵁搴撲綅閰嶇疆鐨勬贩鏀捐鍒欐牎楠� |
 
@@ -107,7 +143,7 @@
 
 ## 娉ㄦ剰浜嬮」
 
-- 璋冩暣鏁伴噺涓嶈兘涓�0
+- 鍏ュ簱鏁伴噺/鍑哄簱鏁伴噺蹇呴』澶т簬0
 - 鍑哄簱鏃跺繀椤讳繚璇佸簱瀛樺厖瓒�
-- 璋冩暣鎿嶄綔浼氳褰曞簱瀛樹簨鍔℃祦姘达紝渚夸簬杩芥函
-- 寤鸿鍦ㄨ皟鏁村師鍥犱腑濉啓璇︾粏鐨勮皟鏁村師鍥狅紝渚夸簬鍚庣画鏌ヨ鍜屽璁�
\ No newline at end of file
+- 鍏ュ簱鍜屽嚭搴撴搷浣滀細鍒嗗埆璁板綍搴撳瓨浜嬪姟娴佹按锛屼究浜庤拷婧�
+- 寤鸿鍦ㄥ師鍥犱腑濉啓璇︾粏璇存槑锛屼究浜庡悗缁煡璇㈠拰瀹¤
\ No newline at end of file
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 51d117b..5e3c014 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
@@ -100,11 +100,18 @@
         return success(true);
     }
 
-    @PostMapping("/adjust")
-    @Operation(summary = "搴撳瓨璋冩暣锛堣嚜瀹氫箟鍑哄叆搴擄級")
+    @PostMapping("/adjust-in")
+    @Operation(summary = "鑷畾涔夊叆搴�")
     @PreAuthorize("@ss.hasPermission('mes:wm-material-stock:adjust')")
-    public CommonResult<Long> adjustMaterialStock(@Valid @RequestBody MesWmMaterialStockAdjustReqVO reqVO) {
-        return success(materialStockService.adjustMaterialStock(reqVO));
+    public CommonResult<Long> adjustMaterialStockIn(@Valid @RequestBody MesWmMaterialStockAdjustReqVO reqVO) {
+        return success(materialStockService.adjustMaterialStockIn(reqVO));
+    }
+
+    @PostMapping("/adjust-out")
+    @Operation(summary = "鑷畾涔夊嚭搴�")
+    @PreAuthorize("@ss.hasPermission('mes:wm-material-stock:adjust')")
+    public CommonResult<Long> adjustMaterialStockOut(@Valid @RequestBody MesWmMaterialStockAdjustReqVO reqVO) {
+        return success(materialStockService.adjustMaterialStockOut(reqVO));
     }
 
     @GetMapping("/export-excel")
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
index b9e3a62..155d8b7 100644
--- 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
@@ -2,6 +2,7 @@
 
 import io.swagger.v3.oas.annotations.media.Schema;
 import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Positive;
 import lombok.Data;
 
 import java.math.BigDecimal;
@@ -38,11 +39,12 @@
     @Schema(description = "渚涘簲鍟咺D", example = "1")
     private Long vendorId;
 
-    @Schema(description = "璋冩暣鏁伴噺锛堟鏁�=鍏ュ簱锛岃礋鏁�=鍑哄簱锛�", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
-    @NotNull(message = "璋冩暣鏁伴噺涓嶈兘涓虹┖")
+    @Schema(description = "鏁伴噺锛堝繀椤诲ぇ浜�0锛�", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
+    @NotNull(message = "鏁伴噺涓嶈兘涓虹┖")
+    @Positive(message = "鏁伴噺蹇呴』澶т簬0")
     private BigDecimal quantity;
 
-    @Schema(description = "璋冩暣鍘熷洜", example = "鐩樼偣璋冩暣")
+    @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/service/wm/materialstock/MesWmMaterialStockService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockService.java
index cc8b761..fb9cd45 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
@@ -150,11 +150,19 @@
                                                Long warehouseId, Long locationId, Long areaId, BigDecimal quantity);
 
     /**
-     * 搴撳瓨璋冩暣锛堣嚜瀹氫箟鍑哄叆搴擄級
+     * 鑷畾涔夊叆搴�
      *
-     * @param reqVO 璋冩暣璇锋眰
-     * @return 搴撳瓨浜嬪姟娴佹按ID
+     * @param reqVO 鍏ュ簱璇锋眰
+     * @return 搴撳瓨璁板綍ID
      */
-    Long adjustMaterialStock(@Valid MesWmMaterialStockAdjustReqVO reqVO);
+    Long adjustMaterialStockIn(@Valid MesWmMaterialStockAdjustReqVO reqVO);
+
+    /**
+     * 鑷畾涔夊嚭搴�
+     *
+     * @param reqVO 鍑哄簱璇锋眰
+     * @return 搴撳瓨璁板綍ID
+     */
+    Long adjustMaterialStockOut(@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 5c9f684..b167ca2 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
@@ -243,22 +243,31 @@
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public Long adjustMaterialStock(MesWmMaterialStockAdjustReqVO reqVO) {
+    public Long adjustMaterialStockIn(MesWmMaterialStockAdjustReqVO reqVO) {
+        return doAdjustMaterialStock(reqVO, true);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Long adjustMaterialStockOut(MesWmMaterialStockAdjustReqVO reqVO) {
+        return doAdjustMaterialStock(reqVO, false);
+    }
+
+    /**
+     * 鎵ц搴撳瓨璋冩暣
+     *
+     * @param reqVO     璋冩暣璇锋眰
+     * @param isInbound 鏄惁涓哄叆搴擄紙true=鍏ュ簱锛宖alse=鍑哄簱锛�
+     * @return 搴撳瓨璁板綍ID
+     */
+    private Long doAdjustMaterialStock(MesWmMaterialStockAdjustReqVO reqVO, boolean isInbound) {
         // 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. 鏍¢獙搴撲綅娣锋斁瑙勫垯
+        // 2. 鏍¢獙搴撲綅娣锋斁瑙勫垯
         checkAreaMixingRule(reqVO.getAreaId(), reqVO.getItemId(), reqVO.getBatchId());
 
-        // 4. 鑾峰彇鎴栧垱寤哄簱瀛樿褰�
+        // 3. 鑾峰彇鎴栧垱寤哄簱瀛樿褰�
         MesWmMaterialStockDO stock = getOrCreateMaterialStock(
                 reqVO.getItemId(),
                 reqVO.getWarehouseId(),
@@ -270,10 +279,14 @@
                 LocalDateTime.now()
         );
 
+        // 4. 璁$畻鍙樺姩鏁伴噺锛氬叆搴撲负姝o紝鍑哄簱涓鸿礋
+        BigDecimal quantity = isInbound ? reqVO.getQuantity() : reqVO.getQuantity().negate();
+
         // 5. 鏇存柊搴撳瓨鏁伴噺锛堝嚭搴撴椂鏍¢獙搴撳瓨鍏呰冻锛�
         updateMaterialStockQuantity(stock.getId(), quantity, !isInbound);
 
         // 6. 鍒涘缓搴撳瓨浜嬪姟娴佹按
+        int bizType = isInbound ? MesBizTypeConstants.WM_STOCK_ADJUST_IN : MesBizTypeConstants.WM_STOCK_ADJUST_OUT;
         MesWmTransactionSaveReqDTO transaction = new MesWmTransactionSaveReqDTO()
                 .setType(isInbound ? MesWmTransactionTypeEnum.IN.getType() : MesWmTransactionTypeEnum.OUT.getType())
                 .setBizType(bizType)

--
Gitblit v1.9.3