From 3bf81c083883d4861d53380423ee8a44c899b5f6 Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期四, 26 三月 2026 18:04:46 +0800
Subject: [PATCH] fix:1.仓储库存单位转换记录和库存关联更新 2.原材料和非原材料的数量区分 3.入库和出库记录删除单位转换库存更新 4.过磅单单位转换更新

---
 src/main/java/com/ruoyi/stock/dto/StockOutRecordDto.java                  |    9 
 src/main/java/com/ruoyi/stock/pojo/StockInRecord.java                     |    3 
 src/main/resources/mapper/stock/StockOutRecordMapper.xml                  |    2 
 src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java |  259 ++++++++++++++++++-
 src/main/java/com/ruoyi/stock/pojo/StockOutRecord.java                    |    5 
 src/main/resources/mapper/stock/StockInRecordMapper.xml                   |    4 
 src/main/java/com/ruoyi/stock/service/StockInRecordService.java           |    2 
 src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java  |  237 ++++++++++++++++-
 src/main/java/com/ruoyi/stock/dto/StockInRecordDto.java                   |   11 
 src/main/java/com/ruoyi/stock/controller/StockInRecordController.java     |   12 
 src/main/java/com/ruoyi/stock/service/StockOutRecordService.java          |    2 
 src/main/java/com/ruoyi/stock/controller/StockOutRecordController.java    |   16 -
 src/main/java/com/ruoyi/stock/word/WeighbridgeDocGenerator.java           |   10 
 src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java |  151 +++++++----
 14 files changed, 591 insertions(+), 132 deletions(-)

diff --git a/src/main/java/com/ruoyi/stock/controller/StockInRecordController.java b/src/main/java/com/ruoyi/stock/controller/StockInRecordController.java
index 98e9e39..c666f54 100644
--- a/src/main/java/com/ruoyi/stock/controller/StockInRecordController.java
+++ b/src/main/java/com/ruoyi/stock/controller/StockInRecordController.java
@@ -7,7 +7,6 @@
 import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.stock.dto.StockInRecordDto;
 import com.ruoyi.stock.service.StockInRecordService;
-import com.ruoyi.stock.word.WeighbridgeDocGenerator;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -24,9 +23,6 @@
 public class StockInRecordController {
     @Autowired
     private StockInRecordService stockInRecordService;
-    @Autowired
-    private WeighbridgeDocGenerator weighbridgeDocGenerator;
-
 
     @GetMapping("/listPage")
     @Log(title = "鐢熶骇鍏ュ簱-鍏ュ簱绠$悊-鍒楄〃", businessType = BusinessType.OTHER)
@@ -40,13 +36,7 @@
     @PreAuthorize("@ss.hasPermi('receipt_edit')")
     @ApiOperation("缂栬緫鍏ュ簱璁板綍")
     public AjaxResult editStockInStock(@RequestBody StockInRecordDto stockInRecordDto) {
-        if (stockInRecordDto.getId() == null) {
-            return AjaxResult.error("鍏ュ簱璁板綍ID涓嶈兘涓虹┖");
-        }
-        stockInRecordDto.setStockInNum(stockInRecordDto.getNetWeight());
-        String absoluteDocPath = weighbridgeDocGenerator.generateWeighbridgeDoc(stockInRecordDto);
-        stockInRecordDto.setWeighbridgeDocPath(absoluteDocPath);
-        return AjaxResult.success(stockInRecordService.updateById(stockInRecordDto));
+       return AjaxResult.success(stockInRecordService.editStockInStock(stockInRecordDto));
     }
 
     @DeleteMapping("")
diff --git a/src/main/java/com/ruoyi/stock/controller/StockOutRecordController.java b/src/main/java/com/ruoyi/stock/controller/StockOutRecordController.java
index c213393..f8ac279 100644
--- a/src/main/java/com/ruoyi/stock/controller/StockOutRecordController.java
+++ b/src/main/java/com/ruoyi/stock/controller/StockOutRecordController.java
@@ -2,11 +2,9 @@
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ruoyi.common.utils.bean.BeanUtils;
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.AjaxResult;
-import com.ruoyi.stock.dto.StockInRecordDto;
 import com.ruoyi.stock.dto.StockOutRecordDto;
 import com.ruoyi.stock.service.StockOutRecordService;
 import com.ruoyi.stock.word.WeighbridgeDocGenerator;
@@ -54,17 +52,9 @@
     @PostMapping("/editStockOut")
     @PreAuthorize("@ss.hasPermi('dispatch_edit')")
     @ApiOperation("缂栬緫鍑哄簱璁板綍")
-    public AjaxResult update(@RequestBody StockOutRecordDto stockOutRecordDto) {
-        if (stockOutRecordDto.getId() == null) {
-            return AjaxResult.error("鍑哄簱璁板綍ID涓嶈兘涓虹┖");
-        }
-        StockInRecordDto stockInRecordDto = new StockInRecordDto();
-        BeanUtils.copyProperties(stockOutRecordDto, stockInRecordDto);
-        stockInRecordDto.setStockInNum(stockOutRecordDto.getStockOutNum());
-        String absoluteDocPath = weighbridgeDocGenerator.generateWeighbridgeDoc(stockInRecordDto);
-        stockOutRecordDto.setWeighbridgeDocPath(absoluteDocPath);
-        stockOutRecordDto.setStockOutNum(stockOutRecordDto.getStockOutNum());
-        return AjaxResult.success(stockOutRecordService.updateById(stockOutRecordDto));
+    public AjaxResult editStockOut(@RequestBody StockOutRecordDto stockOutRecordDto) {
+        return AjaxResult.success(stockOutRecordService.editStockOut(stockOutRecordDto));
+
     }
 
     @DeleteMapping("")
diff --git a/src/main/java/com/ruoyi/stock/dto/StockInRecordDto.java b/src/main/java/com/ruoyi/stock/dto/StockInRecordDto.java
index c60d7f6..a4e073c 100644
--- a/src/main/java/com/ruoyi/stock/dto/StockInRecordDto.java
+++ b/src/main/java/com/ruoyi/stock/dto/StockInRecordDto.java
@@ -16,10 +16,6 @@
      * 浜у搧瑙勬牸
      */
     private String model;
-    /**
-     * 浜у搧鍗曚綅
-     */
-    private String unit;
 
     private String timeStr;
 
@@ -31,6 +27,9 @@
     //鐜板噣閲�
     private BigDecimal currentWeight;
 
-    //浜у搧绫诲瀷
-    private String productType;
+    //浜у搧绫诲瀷(0-鍘熸潗鏂�)
+    private Integer productType;
+
+    //浜у搧澶х被
+    private String parentName;
 }
diff --git a/src/main/java/com/ruoyi/stock/dto/StockOutRecordDto.java b/src/main/java/com/ruoyi/stock/dto/StockOutRecordDto.java
index 3e3abf9..ea85cc2 100644
--- a/src/main/java/com/ruoyi/stock/dto/StockOutRecordDto.java
+++ b/src/main/java/com/ruoyi/stock/dto/StockOutRecordDto.java
@@ -17,12 +17,13 @@
      * 浜у搧瑙勬牸
      */
     private String model;
-    /**
-     * 浜у搧鍗曚綅
-     */
-    private String unit;
 
     private String timeStr;
 
     private String createBy;
+
+    private String parentName;
+
+    //浜у搧绫诲瀷(0-鍘熸潗鏂�)
+    private Integer productType;
 }
diff --git a/src/main/java/com/ruoyi/stock/pojo/StockInRecord.java b/src/main/java/com/ruoyi/stock/pojo/StockInRecord.java
index 2b70d8b..5f4c9f1 100644
--- a/src/main/java/com/ruoyi/stock/pojo/StockInRecord.java
+++ b/src/main/java/com/ruoyi/stock/pojo/StockInRecord.java
@@ -99,4 +99,7 @@
 
     @ApiModelProperty("浜у搧id")
     private Long productId;
+
+    @ApiModelProperty(value = "鍗曚綅")
+    private String unit;
 }
diff --git a/src/main/java/com/ruoyi/stock/pojo/StockOutRecord.java b/src/main/java/com/ruoyi/stock/pojo/StockOutRecord.java
index 5eb0764..427c217 100644
--- a/src/main/java/com/ruoyi/stock/pojo/StockOutRecord.java
+++ b/src/main/java/com/ruoyi/stock/pojo/StockOutRecord.java
@@ -97,4 +97,9 @@
 
     @ApiModelProperty("纾呭崟鏂囦欢璺緞")
     private String weighbridgeDocPath;
+
+    /**
+     * 浜у搧鍗曚綅
+     */
+    private String unit;
 }
diff --git a/src/main/java/com/ruoyi/stock/service/StockInRecordService.java b/src/main/java/com/ruoyi/stock/service/StockInRecordService.java
index 885487a..d6f9f46 100644
--- a/src/main/java/com/ruoyi/stock/service/StockInRecordService.java
+++ b/src/main/java/com/ruoyi/stock/service/StockInRecordService.java
@@ -17,4 +17,6 @@
     int batchDelete(List<Long> ids);
 
     void exportStockInRecord(HttpServletResponse response, StockInRecordDto stockInRecordDto);
+
+    int editStockInStock(StockInRecordDto stockInRecordDto);
 }
diff --git a/src/main/java/com/ruoyi/stock/service/StockOutRecordService.java b/src/main/java/com/ruoyi/stock/service/StockOutRecordService.java
index f18d50c..7d375fa 100644
--- a/src/main/java/com/ruoyi/stock/service/StockOutRecordService.java
+++ b/src/main/java/com/ruoyi/stock/service/StockOutRecordService.java
@@ -27,4 +27,6 @@
     int batchDelete(List<Long> ids);
 
     void exportStockOutRecord(HttpServletResponse response, StockOutRecordDto stockOutRecordDto);
+
+    int editStockOut(StockOutRecordDto stockOutRecordDto);
 }
diff --git a/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java b/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
index a11ba2f..8784706 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
@@ -1,9 +1,12 @@
 package com.ruoyi.stock.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.basic.mapper.ProductModelMapper;
+import com.ruoyi.basic.pojo.ProductModel;
 import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum;
 import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
 import com.ruoyi.common.exception.base.BaseException;
@@ -22,20 +25,29 @@
 import com.ruoyi.stock.pojo.StockInventory;
 import com.ruoyi.stock.pojo.StockUninventory;
 import com.ruoyi.stock.service.StockInRecordService;
-import lombok.AllArgsConstructor;
+import com.ruoyi.stock.word.WeighbridgeDocGenerator;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.servlet.http.HttpServletResponse;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.List;
 
 @Service
-@AllArgsConstructor
 public class StockInRecordServiceImpl extends ServiceImpl<StockInRecordMapper, StockInRecord> implements StockInRecordService {
 
+    @Autowired
     private StockInRecordMapper stockInRecordMapper;
+    @Autowired
     private StockInventoryMapper stockInventoryMapper;
+    @Autowired
     private StockUninventoryMapper stockUninventoryMapper;
+    @Autowired
+    private WeighbridgeDocGenerator weighbridgeDocGenerator;
+    @Autowired
+    private ProductModelMapper productModelMapper;
 
     @Override
     public IPage<StockInRecordDto> listPage(Page page, StockInRecordDto stockInRecordDto) {
@@ -58,28 +70,71 @@
     public int batchDelete(List<Long> ids) {
         for (Long id : ids) {
             StockInRecord stockInRecord = stockInRecordMapper.selectById(id);
-            if (stockInRecord.getType().equals("0")) {
-                StockInventory stockInventory = stockInventoryMapper.selectOne(new LambdaQueryWrapper<StockInventory>().eq(StockInventory::getProductModelId, stockInRecord.getProductModelId()));
+            if (stockInRecord == null) {
+                throw new BaseException("鍏ュ簱璁板綍涓嶅瓨鍦紝ID锛�" + id);
+            }
+
+            // 鏌ヨ浜у搧鍨嬪彿锛堢敤浜庡崟浣嶈浆鎹級
+            ProductModel productModel = productModelMapper.selectById(stockInRecord.getProductModelId());
+            if (productModel == null) {
+                throw new BaseException("浜у搧鍨嬪彿涓嶅瓨鍦紝鏃犳硶鍒犻櫎");
+            }
+
+            // 鑾峰彇鍏ュ簱鏁伴噺鍙婂叾鍗曚綅锛岃浆鎹负搴撳瓨鍗曚綅
+            BigDecimal stockInNum = stockInRecord.getStockInNum();  // 鍏ュ簱璁板綍涓瓨鍌ㄧ殑鏁伴噺
+            String sourceUnit = stockInRecord.getUnit();  // 鍏ュ簱璁板綍鐨勫崟浣�
+            String stockUnit = productModel.getUnit();  // 搴撳瓨鍗曚綅
+
+            // 灏嗗叆搴撴暟閲忚浆鎹负搴撳瓨鍗曚綅
+            BigDecimal convertedQuantity = convertQuantityToStockUnit(stockInNum, sourceUnit, stockUnit);
+
+            // 鏍规嵁鍏ュ簱绫诲瀷澶勭悊涓嶅悓鐨勫簱瀛樿〃
+            if ("0".equals(stockInRecord.getType())) {
+                // 姝e父鍏ュ簱锛屽垹闄ゆ椂鎵e噺搴撳瓨
+                StockInventory stockInventory = stockInventoryMapper.selectOne(
+                        new LambdaQueryWrapper<StockInventory>()
+                                .eq(StockInventory::getProductModelId, stockInRecord.getProductModelId())
+                );
+
                 if (stockInventory == null) {
-                    throw new BaseException("搴撳瓨璁板綍涓病鏈夊搴旂殑浜у搧,鏃犳硶鍒犻櫎!!!");
-                }else {
-                    StockInventoryDto stockInRecordDto = new StockInventoryDto();
-                    stockInRecordDto.setProductModelId(stockInventory.getProductModelId());
-                    stockInRecordDto.setQualitity(stockInRecord.getStockInNum());
-                    stockInventoryMapper.updateSubtractStockInventory(stockInRecordDto);
+                    throw new BaseException("搴撳瓨璁板綍涓病鏈夊搴旂殑浜у搧锛屾棤娉曞垹闄�");
                 }
-            }else if (stockInRecord.getType().equals("1")) {
-                StockUninventory stockUninventory = stockUninventoryMapper.selectOne(new LambdaQueryWrapper<StockUninventory>().eq(StockUninventory::getProductModelId, stockInRecord.getProductModelId()));
+
+                StockInventoryDto inventoryDto = new StockInventoryDto();
+                inventoryDto.setProductModelId(stockInventory.getProductModelId());
+                inventoryDto.setQualitity(convertedQuantity);
+
+                // 鎵e噺搴撳瓨锛堝垹闄ゅ叆搴撹褰曠浉褰撲簬鍑忓皯搴撳瓨锛�
+                int affectedRows = stockInventoryMapper.updateSubtractStockInventory(inventoryDto);
+                if (affectedRows == 0) {
+                    throw new BaseException("鎵e噺搴撳瓨澶辫触锛屽簱瀛樺彲鑳戒笉瓒�");
+                }
+
+            } else if ("1".equals(stockInRecord.getType())) {
+                // 闈炴甯稿叆搴擄紝鍒犻櫎鏃舵墸鍑忛潪姝e父搴撳瓨
+                StockUninventory stockUninventory = stockUninventoryMapper.selectOne(
+                        new LambdaQueryWrapper<StockUninventory>()
+                                .eq(StockUninventory::getProductModelId, stockInRecord.getProductModelId())
+                );
+
                 if (stockUninventory == null) {
-                    throw new BaseException("搴撳瓨璁板綍涓病鏈夊搴旂殑浜у搧,鏃犳硶鍒犻櫎!!!");
-                }else {
-                    StockUninventoryDto stockUninventoryDto = new StockUninventoryDto();
-                    stockUninventoryDto.setProductModelId(stockUninventory.getProductModelId());
-                    stockUninventoryDto.setQualitity(stockInRecord.getStockInNum());
-                    stockUninventoryMapper.updateSubtractStockUnInventory(stockUninventoryDto);
+                    throw new BaseException("闈炴甯稿簱瀛樿褰曚腑娌℃湁瀵瑰簲鐨勪骇鍝侊紝鏃犳硶鍒犻櫎");
+                }
+
+                // 鍒涘缓闈炴甯稿簱瀛樻洿鏂癉TO
+                StockUninventoryDto uninventoryDto = new StockUninventoryDto();
+                uninventoryDto.setProductModelId(stockUninventory.getProductModelId());
+                uninventoryDto.setQualitity(convertedQuantity);
+
+                // 鎵e噺闈炴甯稿簱瀛�
+                int affectedRows = stockUninventoryMapper.updateSubtractStockUnInventory(uninventoryDto);
+                if (affectedRows == 0) {
+                    throw new BaseException("鎵e噺闈炴甯稿簱瀛樺け璐�");
                 }
             }
         }
+
+        // 5. 鎵归噺鍒犻櫎鍏ュ簱璁板綍
         return stockInRecordMapper.deleteBatchIds(ids);
     }
 
@@ -96,4 +151,150 @@
         ExcelUtil<StockInRecordExportData> util = new ExcelUtil<>(StockInRecordExportData.class);
         util.exportExcel(response,list, "鍏ュ簱璁板綍淇℃伅");
     }
+
+    @Override
+    public int editStockInStock(StockInRecordDto stockInRecordDto) {
+        if (stockInRecordDto.getId() == null) {
+            throw new BaseException("鍏ュ簱璁板綍ID涓嶈兘涓虹┖");
+        }
+
+        // 1. 鏌ヨ鍘熷鍏ュ簱璁板綍
+        StockInRecord originalRecord = stockInRecordMapper.selectById(stockInRecordDto.getId());
+        if (originalRecord == null) {
+            throw new BaseException("鍏ュ簱璁板綍涓嶅瓨鍦�");
+        }
+
+        // 2. 鏌ヨ浜у搧鍨嬪彿淇℃伅锛堢敤浜庡崟浣嶈浆鎹級
+        ProductModel productModel = productModelMapper.selectById(originalRecord.getProductModelId());
+        if (productModel == null) {
+            throw new BaseException("浜у搧鍨嬪彿涓嶅瓨鍦�");
+        }
+
+        // 3. 鑾峰彇鍘熷鍏ュ簱鏁伴噺鍙婂叾鍗曚綅
+        BigDecimal originalNetWeight = originalRecord.getStockInNum();  // 鍘熷璁板綍涓瓨鍌ㄧ殑鏁伴噺
+        String originalUnit = originalRecord.getUnit();  // 鍘熷璁板綍鐨勫崟浣�
+        String stockUnit = productModel.getUnit();  // 搴撳瓨鍗曚綅
+
+        // 灏嗗師濮嬪叆搴撴暟閲忚浆鎹负搴撳瓨鍗曚綅
+        BigDecimal originalNetWeightInStockUnit = convertQuantityToStockUnit(originalNetWeight, originalUnit, stockUnit);
+
+        // 4. 鑾峰彇鏂板叆搴撴暟閲忓強鍏跺崟浣�
+        BigDecimal newNetWeight = stockInRecordDto.getNetWeight();  // 鏂拌緭鍏ョ殑鏁伴噺
+        if (newNetWeight == null) {
+            throw new BaseException("鍑�閲嶄笉鑳戒负绌�");
+        }
+        String newUnit = stockInRecordDto.getUnit();  // 鏂拌緭鍏ョ殑鍗曚綅
+
+        // 灏嗘柊鍏ュ簱鏁伴噺杞崲涓哄簱瀛樺崟浣�
+        BigDecimal newNetWeightInStockUnit = convertQuantityToStockUnit(newNetWeight, newUnit, stockUnit);
+
+        // 5. 璁$畻搴撳瓨鍙樺寲閲忥紙浣跨敤缁熶竴杞崲鍚庣殑搴撳瓨鍗曚綅鍊硷級
+        // 鍏ュ簱鏁伴噺鍙樺寲閲忥紙姝f暟琛ㄧず鍏ュ簱鍙樺锛岄渶瑕佸鍔犲簱瀛橈紱璐熸暟琛ㄧず鍏ュ簱鍙樺皯锛岄渶瑕佸噺灏戝簱瀛橈級
+        BigDecimal diffQuantity = newNetWeightInStockUnit.subtract(originalNetWeightInStockUnit);
+
+        // 6. 鏇存柊鍏ュ簱璁板綍锛堜繚瀛樼敤鎴疯緭鍏ョ殑鍘熷鏁板�煎拰鍗曚綅锛�
+        stockInRecordDto.setStockInNum(stockInRecordDto.getNetWeight());
+        stockInRecordDto.setUnit(stockInRecordDto.getUnit());
+
+        // 7. 鐢熸垚纾呭崟
+        String absoluteDocPath = weighbridgeDocGenerator.generateWeighbridgeDoc(stockInRecordDto);
+        stockInRecordDto.setWeighbridgeDocPath(absoluteDocPath);
+        int updateResult = stockInRecordMapper.updateById(stockInRecordDto);
+
+        // 8. 鏇存柊搴撳瓨锛堜粎鍦ㄦ暟閲忓彂鐢熷彉鍖栨椂锛�
+        if (diffQuantity.compareTo(BigDecimal.ZERO) != 0) {
+            updateInventory(stockInRecordDto.getProductId(), diffQuantity);
+        }
+
+        return updateResult;
+    }
+
+    /**
+     * 灏嗘暟閲忚浆鎹负搴撳瓨鍗曚綅
+     * @param quantity 鍘熷鏁伴噺
+     * @param sourceUnit 鍘熷鍗曚綅
+     * @param targetUnit 鐩爣鍗曚綅锛堝簱瀛樺崟浣嶏級
+     * @return 杞崲鍚庣殑鏁伴噺
+     */
+    private BigDecimal convertQuantityToStockUnit(BigDecimal quantity, String sourceUnit, String targetUnit) {
+        if (quantity == null) {
+            throw new BaseException("鏁伴噺涓嶈兘涓虹┖");
+        }
+
+        if (sourceUnit == null || sourceUnit.isEmpty()) {
+            return quantity;
+        }
+
+        if (sourceUnit.equals(targetUnit)) {
+            return quantity;
+        }
+
+        // 鍗曚綅杞崲
+        if ("鍚�".equals(targetUnit)) {
+            // 鐩爣鍗曚綅鏄惃锛岄渶瑕佸皢婧愬崟浣嶈浆鎹负鍚�
+            if ("鍏枻".equals(sourceUnit)) {
+                // 鍏枻杞惃锛氶櫎浠�1000
+                return quantity.divide(BigDecimal.valueOf(1000), 2, RoundingMode.HALF_UP);
+            } else if ("鍏�".equals(sourceUnit)) {
+                // 鍏嬭浆鍚細闄や互1000000
+                return quantity.divide(BigDecimal.valueOf(1000000), 2, RoundingMode.HALF_UP);
+            }
+        } else if ("鍏枻".equals(targetUnit)) {
+            // 鐩爣鍗曚綅鏄叕鏂�
+            if ("鍚�".equals(sourceUnit)) {
+                // 鍚ㄨ浆鍏枻锛氫箻浠�1000
+                return quantity.multiply(BigDecimal.valueOf(1000));
+            } else if ("鍏�".equals(sourceUnit)) {
+                // 鍏嬭浆鍏枻锛氶櫎浠�1000
+                return quantity.divide(BigDecimal.valueOf(1000), 2, RoundingMode.HALF_UP);
+            }
+        } else if ("鍏�".equals(targetUnit)) {
+            // 鐩爣鍗曚綅鏄厠
+            if ("鍚�".equals(sourceUnit)) {
+                // 鍚ㄨ浆鍏嬶細涔樹互1000000
+                return quantity.multiply(BigDecimal.valueOf(1000000));
+            } else if ("鍏枻".equals(sourceUnit)) {
+                // 鍏枻杞厠锛氫箻浠�1000
+                return quantity.multiply(BigDecimal.valueOf(1000));
+            }
+        }
+
+        return quantity;
+    }
+
+    /**
+     * 鏇存柊搴撳瓨
+     * @param productId 浜у搧ID
+     * @param diffQuantity 搴撳瓨鍙樺寲閲忥紙姝f暟涓哄鍔狅紝璐熸暟涓哄噺灏戯級
+     */
+    private void updateInventory(Long productId, BigDecimal diffQuantity) {
+        // 鏌ヨ褰撳墠搴撳瓨
+        StockInventory stockInventory = stockInventoryMapper.selectOne(
+                new QueryWrapper<StockInventory>().lambda()
+                        .eq(StockInventory::getProductId, productId)
+        );
+
+        if (stockInventory == null) {
+            throw new BaseException("搴撳瓨璁板綍涓嶅瓨鍦�");
+        }
+
+        StockInventoryDto inventoryDto = new StockInventoryDto();
+        BeanUtils.copyProperties(stockInventory, inventoryDto);
+        inventoryDto.setQualitity(diffQuantity.abs());
+
+        // 鏍规嵁鍙樺寲閲忔璐熻皟鐢ㄤ笉鍚岀殑鏇存柊鏂规硶
+        if (diffQuantity.compareTo(BigDecimal.ZERO) > 0) {
+            // 澧炲姞搴撳瓨
+            int affectedRows = stockInventoryMapper.updateAddStockInventory(inventoryDto);
+            if (affectedRows == 0) {
+                throw new BaseException("鏇存柊搴撳瓨澶辫触");
+            }
+        } else {
+            // 鍑忓皯搴撳瓨
+            int affectedRows = stockInventoryMapper.updateSubtractStockInventory(inventoryDto);
+            if (affectedRows == 0) {
+                throw new BaseException("搴撳瓨涓嶈冻锛屾棤娉曟墸鍑�");
+            }
+        }
+    }
 }
diff --git a/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java b/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
index ca4e84d..9f7029d 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
@@ -11,6 +11,7 @@
 import com.ruoyi.basic.pojo.Product;
 import com.ruoyi.basic.pojo.ProductModel;
 import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
+import com.ruoyi.common.exception.base.BaseException;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.equipmentenergyconsumption.mapper.ElectricityConsumptionAreaMapper;
 import com.ruoyi.framework.web.domain.R;
@@ -37,6 +38,7 @@
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.List;
+import java.util.Optional;
 
 /**
  * <p>
@@ -73,6 +75,7 @@
         stockInRecordDto.setRecordId(stockInventoryDto.getRecordId());
         stockInRecordDto.setRecordType(stockInventoryDto.getRecordType());
         stockInRecordDto.setWeighingOperator(stockInventoryDto.getWeighingOperator());
+        stockInRecordDto.setUnit(stockInventoryDto.getUnit());
         Long modelId;
         if (stockInventoryDto.getProductId() != null) {
             stockInRecordDto.setProductId(stockInventoryDto.getProductId());
@@ -139,6 +142,7 @@
             stockInRecordDto.setGrossWeight(stockInventoryDto.getGrossWeight());
             stockInRecordDto.setTareWeight(stockInventoryDto.getTareWeight());
             stockInRecordDto.setLicensePlateNo(stockInventoryDto.getLicensePlateNo());
+            stockInRecordDto.setUnit(stockInventoryDto.getUnit());
             // 鐢熸垚纾呭崟
             String absoluteDocPath = weighbridgeDocGenerator.generateWeighbridgeDoc(stockInRecordDto);
             stockInRecordDto.setWeighbridgeDocPath(absoluteDocPath);
@@ -181,68 +185,111 @@
     @Transactional(rollbackFor = Exception.class)
     public Boolean subtractStockInventory(StockInventoryDto stockInventoryDto) {
 
+        // 1. 鏌ヨ浜у搧鍨嬪彿鍜屽簱瀛樹俊鎭�
         ProductModel productModel = productModelMapper.selectById(stockInventoryDto.getProductModelId());
-        BigDecimal weight = compareUnit(stockInventoryDto, productModel);
-        //  鏂板鍑哄簱璁板綍
-        StockOutRecordDto stockOutRecordDto = new StockOutRecordDto();
-        stockOutRecordDto.setRecordId(stockInventoryDto.getRecordId());
-        stockOutRecordDto.setRecordType(stockInventoryDto.getRecordType());
-        stockOutRecordDto.setWeighingDate(stockInventoryDto.getWeighingDate());
-        stockOutRecordDto.setStockOutNum(stockInventoryDto.getNetWeight());
-        stockOutRecordDto.setNetWeight(stockInventoryDto.getNetWeight());
-        stockOutRecordDto.setGrossWeight(stockInventoryDto.getGrossWeight());
-        stockOutRecordDto.setTareWeight(stockInventoryDto.getTareWeight());
-        stockOutRecordDto.setWeighingOperator(stockInventoryDto.getWeighingOperator());
-        stockOutRecordDto.setProductModelId(stockInventoryDto.getProductModelId());
-        stockOutRecordDto.setLicensePlateNo(stockInventoryDto.getLicensePlateNo());
-        stockOutRecordDto.setProductId(stockInventoryDto.getProductId());
-        stockOutRecordDto.setRemark(stockInventoryDto.getRemark());
-        stockOutRecordDto.setType("0");
-        //鐢熸垚纾呭崟
-        StockInRecordDto stockInRecordDto = new StockInRecordDto();
-        BeanUtils.copyProperties(stockOutRecordDto, stockInRecordDto);
-        String absoluteDocPath = weighbridgeDocGenerator.generateWeighbridgeDoc(stockInRecordDto);
-        stockOutRecordDto.setWeighbridgeDocPath(absoluteDocPath);
-        stockOutRecordService.add(stockOutRecordDto);
-        StockInventory oldStockInventory = stockInventoryMapper.selectOne(new QueryWrapper<StockInventory>().lambda().eq(StockInventory::getProductModelId, stockInventoryDto.getProductModelId()));
-        if (ObjectUtils.isEmpty(oldStockInventory)) {
-            throw new RuntimeException("浜у搧搴撳瓨涓嶅瓨鍦�");
-        }
-        BigDecimal lockedQty = oldStockInventory.getLockedQuantity();
-        if (lockedQty == null) {
-            lockedQty = BigDecimal.ZERO;
-        }
-        stockInventoryDto.setQualitity(weight);
-        if (stockInventoryDto.getQualitity().compareTo(oldStockInventory.getQualitity().subtract(lockedQty)) > 0) {
-            throw new RuntimeException("搴撳瓨涓嶈冻鏃犳硶鍑哄簱");
+        if (productModel == null) {
+            throw new BaseException("浜у搧鍨嬪彿涓嶅瓨鍦�");
         }
 
-        stockInventoryMapper.updateSubtractStockInventory(stockInventoryDto);
+        StockInventory oldStockInventory = stockInventoryMapper.selectOne(
+                new QueryWrapper<StockInventory>().lambda()
+                        .eq(StockInventory::getProductModelId, stockInventoryDto.getProductModelId())
+        );
+        if (oldStockInventory == null) {
+            throw new BaseException("浜у搧搴撳瓨涓嶅瓨鍦�");
+        }
+
+        // 2. 璁$畻骞惰浆鎹㈠嚭搴撴暟閲�
+        BigDecimal outQuantity = compareUnit(stockInventoryDto, productModel);
+
+        // 3. 妫�鏌ュ簱瀛樻槸鍚﹀厖瓒筹紙鑰冭檻閿佸畾搴撳瓨锛�
+        BigDecimal availableQuantity = oldStockInventory.getQualitity()
+                .subtract(Optional.ofNullable(oldStockInventory.getLockedQuantity()).orElse(BigDecimal.ZERO));
+        if (outQuantity.compareTo(availableQuantity) > 0) {
+            throw new BaseException("搴撳瓨涓嶈冻锛屽綋鍓嶅彲鐢ㄥ簱瀛橈細" + availableQuantity);
+        }
+
+        // 4. 鎵e噺搴撳瓨
+        stockInventoryDto.setQualitity(outQuantity);
+        int affectedRows = stockInventoryMapper.updateSubtractStockInventory(stockInventoryDto);
+        if (affectedRows == 0) {
+            throw new BaseException("鎵e噺搴撳瓨澶辫触锛屽彲鑳藉簱瀛樹笉瓒虫垨鏁版嵁宸茶淇敼");
+        }
+
+        // 5. 鍒涘缓骞朵繚瀛樺嚭搴撹褰�
+        createAndSaveStockOutRecord(stockInventoryDto, productModel);
+
         return true;
     }
 
+    /**
+     * 璁$畻骞惰浆鎹㈠嚭搴撴暟閲忥紙缁熶竴杞崲涓哄簱瀛樺崟浣嶏級
+     */
     private BigDecimal compareUnit(StockInventoryDto stockInventoryDto, ProductModel productModel) {
-        String unit = "";
-        if (productModel != null) {
-            unit = productModel.getUnit();
+        // 鑾峰彇鍘熷鍑哄簱鏁伴噺锛堟牴鎹骇鍝佺被鍨嬮�夋嫨鍑�閲嶆垨鏁伴噺锛�
+        BigDecimal originalQuantity = (stockInventoryDto.getProductType() != null && stockInventoryDto.getProductType() == 0)
+                ? stockInventoryDto.getNetWeight()
+                : stockInventoryDto.getQualitity();
+
+        String sourceUnit = stockInventoryDto.getUnit();
+        String targetUnit = productModel.getUnit();
+
+        // 鍗曚綅鐩稿悓锛岀洿鎺ヨ繑鍥�
+        if (sourceUnit.equals(targetUnit)) {
+            return originalQuantity;
         }
-        BigDecimal weight;
-        if (stockInventoryDto.getUnit().equals(unit)) {
-            weight = stockInventoryDto.getProductType() != null && stockInventoryDto.getProductType() == 0 ?
-                    stockInventoryDto.getNetWeight() : stockInventoryDto.getQualitity();
+
+        // 鍗曚綅杞崲
+        if ("鍚�".equals(targetUnit)) {
+            // 杞崲涓哄惃
+            return originalQuantity.divide(BigDecimal.valueOf(1000), 2, RoundingMode.HALF_UP);
+        } else if ("鍏枻".equals(targetUnit)) {
+            // 杞崲涓哄叕鏂�
+            return originalQuantity.multiply(BigDecimal.valueOf(1000));
         } else {
-            if ("鍚�".equals(unit)) {
-                weight =stockInventoryDto.getProductType() != null && stockInventoryDto.getProductType() == 0 ?
-                        stockInventoryDto.getNetWeight().divide(BigDecimal.valueOf(1000),2, RoundingMode.HALF_UP) : stockInventoryDto.getQualitity().divide(BigDecimal.valueOf(1000),2,RoundingMode.HALF_UP);
-            } else if ("鍏枻".equals(unit)) {
-                weight = stockInventoryDto.getProductType() != null && stockInventoryDto.getProductType() == 0 ?
-                        stockInventoryDto.getNetWeight().multiply(BigDecimal.valueOf(1000)) : stockInventoryDto.getQualitity().multiply(BigDecimal.valueOf(1000));
-            }else {
-                weight =stockInventoryDto.getProductType() != null && stockInventoryDto.getProductType() == 0 ?
-                        stockInventoryDto.getNetWeight() : stockInventoryDto.getQualitity();
-            }
+            // 鍗曚綅涓嶅尮閰嶆椂锛岃繑鍥炲師鍊�
+            return originalQuantity;
         }
-        return weight;
+    }
+
+    /**
+     * 鍒涘缓骞朵繚瀛樺嚭搴撹褰�
+     */
+    private void createAndSaveStockOutRecord(StockInventoryDto stockInventoryDto, ProductModel productModel) {
+        // 鍒涘缓鍑哄簱璁板綍DTO
+        StockOutRecordDto stockOutRecordDto = new StockOutRecordDto();
+        if (stockInventoryDto.getProductType() != null && stockInventoryDto.getProductType() == 0) {
+            stockOutRecordDto.setRecordId(stockInventoryDto.getRecordId());
+            stockOutRecordDto.setRecordType(stockInventoryDto.getRecordType());
+            stockOutRecordDto.setWeighingDate(stockInventoryDto.getWeighingDate());
+            stockOutRecordDto.setStockOutNum(stockInventoryDto.getNetWeight());
+            stockOutRecordDto.setNetWeight(stockInventoryDto.getNetWeight());
+            stockOutRecordDto.setGrossWeight(stockInventoryDto.getGrossWeight());
+            stockOutRecordDto.setTareWeight(stockInventoryDto.getTareWeight());
+            stockOutRecordDto.setWeighingOperator(stockInventoryDto.getWeighingOperator());
+            stockOutRecordDto.setProductModelId(stockInventoryDto.getProductModelId());
+            stockOutRecordDto.setLicensePlateNo(stockInventoryDto.getLicensePlateNo());
+            stockOutRecordDto.setProductId(stockInventoryDto.getProductId());
+            stockOutRecordDto.setRemark(stockInventoryDto.getRemark());
+            stockOutRecordDto.setUnit(stockInventoryDto.getUnit());
+            stockOutRecordDto.setType("0");
+            // 鐢熸垚纾呭崟
+            StockInRecordDto stockInRecordDto = new StockInRecordDto();
+            BeanUtils.copyProperties(stockOutRecordDto, stockInRecordDto);
+            String absoluteDocPath = weighbridgeDocGenerator.generateWeighbridgeDoc(stockInRecordDto);
+            stockOutRecordDto.setWeighbridgeDocPath(absoluteDocPath);
+        } else {
+            stockOutRecordDto.setRecordId(stockInventoryDto.getRecordId());
+            stockOutRecordDto.setRecordType(stockInventoryDto.getRecordType());
+            stockOutRecordDto.setStockOutNum(stockInventoryDto.getQualitity());
+            stockOutRecordDto.setNetWeight(stockInventoryDto.getQualitity());
+            stockOutRecordDto.setProductModelId(stockInventoryDto.getProductModelId());
+            stockOutRecordDto.setProductId(stockInventoryDto.getProductId());
+            stockOutRecordDto.setRemark(stockInventoryDto.getRemark());
+            stockOutRecordDto.setUnit(stockInventoryDto.getUnit());
+            stockOutRecordDto.setType("0");
+        }
+        stockOutRecordService.add(stockOutRecordDto);
     }
 
     @Override
diff --git a/src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java b/src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java
index cc299f1..6e28436 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java
@@ -1,9 +1,12 @@
 package com.ruoyi.stock.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.basic.mapper.ProductModelMapper;
+import com.ruoyi.basic.pojo.ProductModel;
 import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum;
 import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
 import com.ruoyi.common.exception.base.BaseException;
@@ -11,6 +14,7 @@
 import com.ruoyi.common.utils.OrderUtils;
 import com.ruoyi.common.utils.bean.BeanUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.stock.dto.StockInRecordDto;
 import com.ruoyi.stock.dto.StockInventoryDto;
 import com.ruoyi.stock.dto.StockOutRecordDto;
 import com.ruoyi.stock.dto.StockUninventoryDto;
@@ -22,10 +26,14 @@
 import com.ruoyi.stock.pojo.StockOutRecord;
 import com.ruoyi.stock.pojo.StockUninventory;
 import com.ruoyi.stock.service.StockOutRecordService;
-import lombok.AllArgsConstructor;
+import com.ruoyi.stock.word.WeighbridgeDocGenerator;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import javax.servlet.http.HttpServletResponse;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.List;
 
 /**
@@ -37,11 +45,17 @@
  * @since 2026-01-21 05:27:04
  */
 @Service
-@AllArgsConstructor
 public class StockOutRecordServiceImpl extends ServiceImpl<StockOutRecordMapper, StockOutRecord> implements StockOutRecordService {
+    @Autowired
     private StockOutRecordMapper stockOutRecordMapper;
+    @Autowired
     private StockInventoryMapper stockInventoryMapper;
+    @Autowired
     private StockUninventoryMapper stockUninventoryMapper;
+    @Autowired
+    private WeighbridgeDocGenerator weighbridgeDocGenerator;
+    @Autowired
+    private ProductModelMapper productModelMapper;
 
     @Override
     public IPage<StockOutRecordDto> listPage(Page page, StockOutRecordDto stockOutRecordDto) {
@@ -59,7 +73,7 @@
     public int update(Long id, StockOutRecordDto stockOutRecordDto) {
         // 鍒ゆ柇瀵硅薄鏄惁瀛樺湪
         StockOutRecord stockOutRecord = stockOutRecordMapper.selectById(id);
-        if (stockOutRecord == null){
+        if (stockOutRecord == null) {
             throw new BaseException("璇ュ嚭搴撹褰曚笉瀛樺湪,鏃犳硶鏇存柊!!!");
         }
 
@@ -69,31 +83,77 @@
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public int batchDelete(List<Long> ids) {
         for (Long id : ids) {
+            // 1. 鏌ヨ鍑哄簱璁板綍
             StockOutRecord stockOutRecord = stockOutRecordMapper.selectById(id);
-            if (stockOutRecord.getType().equals("0")) {
-                StockInventory stockInventory = stockInventoryMapper.selectOne(new LambdaQueryWrapper<StockInventory>().eq(StockInventory::getProductModelId, stockOutRecord.getProductModelId()));
+            if (stockOutRecord == null) {
+                throw new BaseException("鍑哄簱璁板綍涓嶅瓨鍦紝ID锛�" + id);
+            }
+
+            // 2. 鏌ヨ浜у搧鍨嬪彿锛堢敤浜庡崟浣嶈浆鎹級
+            ProductModel productModel = productModelMapper.selectById(stockOutRecord.getProductModelId());
+            if (productModel == null) {
+                throw new BaseException("浜у搧鍨嬪彿涓嶅瓨鍦紝鏃犳硶鍒犻櫎");
+            }
+
+            // 3. 鑾峰彇鍑哄簱鏁伴噺骞惰繘琛屽崟浣嶈浆鎹�
+            BigDecimal stockOutNum = stockOutRecord.getStockOutNum();
+            String sourceUnit = stockOutRecord.getUnit(); // 鍑哄簱璁板綍涓繚瀛樼殑鍗曚綅
+            String targetUnit = productModel.getUnit();
+
+            // 杞崲鍑哄簱鏁伴噺涓哄簱瀛樺崟浣嶏紙鍒犻櫎鏃堕渶瑕佸姞鍥炲簱瀛橈紝鎵�浠ラ渶瑕佽浆鎹級
+            BigDecimal convertedQuantity = convertQuantityToStockUnit(stockOutNum, sourceUnit, targetUnit);
+
+            // 4. 鏍规嵁鍑哄簱绫诲瀷澶勭悊涓嶅悓鐨勫簱瀛樿〃
+            if ("0".equals(stockOutRecord.getType())) {
+                // 姝e父鍑哄簱锛屾仮澶嶅簱瀛�
+                StockInventory stockInventory = stockInventoryMapper.selectOne(
+                        new LambdaQueryWrapper<StockInventory>()
+                                .eq(StockInventory::getProductModelId, stockOutRecord.getProductModelId())
+                );
+
                 if (stockInventory == null) {
-                    throw new BaseException("搴撳瓨璁板綍涓病鏈夊搴旂殑浜у搧,鏃犳硶鍒犻櫎!!!");
-                }else {
-                    StockInventoryDto stockInRecordDto = new StockInventoryDto();
-                    stockInRecordDto.setProductModelId(stockInventory.getProductModelId());
-                    stockInRecordDto.setQualitity(stockOutRecord.getStockOutNum());
-                    stockInventoryMapper.updateAddStockInventory(stockInRecordDto);
+                    throw new BaseException("搴撳瓨璁板綍涓病鏈夊搴旂殑浜у搧锛屾棤娉曞垹闄�");
                 }
-            }else if (stockOutRecord.getType().equals("1")) {
-                StockUninventory stockUninventory = stockUninventoryMapper.selectOne(new LambdaQueryWrapper<StockUninventory>().eq(StockUninventory::getProductModelId, stockOutRecord.getProductModelId()));
+
+                // 鍒涘缓搴撳瓨鏇存柊DTO
+                StockInventoryDto inventoryDto = new StockInventoryDto();
+                inventoryDto.setProductModelId(stockInventory.getProductModelId());
+                inventoryDto.setQualitity(convertedQuantity);
+
+                // 鍔犲洖搴撳瓨
+                int affectedRows = stockInventoryMapper.updateAddStockInventory(inventoryDto);
+                if (affectedRows == 0) {
+                    throw new BaseException("鎭㈠搴撳瓨澶辫触");
+                }
+
+            } else if ("1".equals(stockOutRecord.getType())) {
+                // 闈炴甯稿嚭搴擄紝鎭㈠闈炴甯稿簱瀛�
+                StockUninventory stockUninventory = stockUninventoryMapper.selectOne(
+                        new LambdaQueryWrapper<StockUninventory>()
+                                .eq(StockUninventory::getProductModelId, stockOutRecord.getProductModelId())
+                );
+
                 if (stockUninventory == null) {
-                    throw new BaseException("搴撳瓨璁板綍涓病鏈夊搴旂殑浜у搧,鏃犳硶鍒犻櫎!!!");
-                }else {
-                    StockUninventoryDto stockUninventoryDto = new StockUninventoryDto();
-                    stockUninventoryDto.setProductModelId(stockUninventory.getProductModelId());
-                    stockUninventoryDto.setQualitity(stockOutRecord.getStockOutNum());
-                    stockUninventoryMapper.updateAddStockUnInventory(stockUninventoryDto);
+                    throw new BaseException("闈炴甯稿簱瀛樿褰曚腑娌℃湁瀵瑰簲鐨勪骇鍝侊紝鏃犳硶鍒犻櫎");
+                }
+
+                // 鍒涘缓闈炴甯稿簱瀛樻洿鏂癉TO
+                StockUninventoryDto uninventoryDto = new StockUninventoryDto();
+                uninventoryDto.setProductModelId(stockUninventory.getProductModelId());
+                uninventoryDto.setQualitity(convertedQuantity);
+
+                // 鍔犲洖闈炴甯稿簱瀛�
+                int affectedRows = stockUninventoryMapper.updateAddStockUnInventory(uninventoryDto);
+                if (affectedRows == 0) {
+                    throw new BaseException("鎭㈠闈炴甯稿簱瀛樺け璐�");
                 }
             }
         }
+
+        // 5. 鎵归噺鍒犻櫎鍑哄簱璁板綍
         return stockOutRecordMapper.deleteBatchIds(ids);
     }
 
@@ -103,11 +163,168 @@
         for (StockOutRecordExportData stockInRecordExportData : list) {
             if (stockInRecordExportData.getType().equals("0")) {
                 stockInRecordExportData.setRecordType(EnumUtil.fromCode(StockOutQualifiedRecordTypeEnum.class, Integer.parseInt(stockInRecordExportData.getRecordType())).getValue());
-            }else {
+            } else {
                 stockInRecordExportData.setRecordType(EnumUtil.fromCode(StockInUnQualifiedRecordTypeEnum.class, Integer.parseInt(stockInRecordExportData.getRecordType())).getValue());
             }
         }
         ExcelUtil<StockOutRecordExportData> util = new ExcelUtil<>(StockOutRecordExportData.class);
-        util.exportExcel(response,list, "鍑哄簱璁板綍淇℃伅");
+        util.exportExcel(response, list, "鍑哄簱璁板綍淇℃伅");
+    }
+
+    @Override
+    public int editStockOut(StockOutRecordDto stockOutRecordDto) {
+        if (stockOutRecordDto.getId() == null) {
+            throw new BaseException("鍑哄簱璁板綍ID涓嶈兘涓虹┖");
+        }
+
+        // 1. 鏌ヨ鍘熷鍑哄簱璁板綍
+        StockOutRecord originalRecord = stockOutRecordMapper.selectById(stockOutRecordDto.getId());
+        if (originalRecord == null) {
+            throw new BaseException("鍑哄簱璁板綍涓嶅瓨鍦�");
+        }
+
+        // 2. 鏌ヨ浜у搧鍨嬪彿淇℃伅锛堢敤浜庡崟浣嶈浆鎹級
+        ProductModel productModel = productModelMapper.selectById(originalRecord.getProductModelId());
+        if (productModel == null) {
+            throw new BaseException("浜у搧鍨嬪彿涓嶅瓨鍦�");
+        }
+
+        // 3. 鑾峰彇鍘熷鍑哄簱鏁伴噺鍙婂叾鍗曚綅
+        BigDecimal originalOutNum = originalRecord.getStockOutNum();  // 鍘熷璁板綍涓瓨鍌ㄧ殑鏁伴噺锛堝彲鑳芥槸鍚ㄦ垨鍏枻锛�
+        String originalUnit = originalRecord.getUnit();  // 鍘熷璁板綍鐨勫崟浣嶏紙鍚ㄣ�佸叕鏂ょ瓑锛�
+        String stockUnit = productModel.getUnit();  // 搴撳瓨鍗曚綅
+
+        // 灏嗗師濮嬪嚭搴撴暟閲忚浆鎹负搴撳瓨鍗曚綅
+        BigDecimal originalOutNumInStockUnit = convertQuantityToStockUnit(originalOutNum, originalUnit, stockUnit);
+
+        // 4. 鑾峰彇鏂板嚭搴撴暟閲忓強鍏跺崟浣�
+        BigDecimal newOutNum = stockOutRecordDto.getNetWeight();  // 鏂拌緭鍏ョ殑鏁伴噺
+        if (newOutNum == null) {
+            throw new BaseException("鍑哄簱鏁伴噺涓嶈兘涓虹┖");
+        }
+        String newUnit = stockOutRecordDto.getUnit();  // 鏂拌緭鍏ョ殑鍗曚綅
+
+        // 灏嗘柊鍑哄簱鏁伴噺杞崲涓哄簱瀛樺崟浣�
+        BigDecimal newOutNumInStockUnit = convertQuantityToStockUnit(newOutNum, newUnit, stockUnit);
+
+        // 5. 璁$畻搴撳瓨鍙樺寲閲忥紙浣跨敤缁熶竴杞崲鍚庣殑搴撳瓨鍗曚綅鍊硷級
+        // 鍑哄簱鏁伴噺鍙樺寲閲忥紙姝f暟琛ㄧず鍑哄簱鍙樺锛岄渶瑕佸鎵e簱瀛橈紱璐熸暟琛ㄧず鍑哄簱鍙樺皯锛岄渶瑕佸姞鍥炲簱瀛橈級
+        BigDecimal diffQuantity = newOutNumInStockUnit.subtract(originalOutNumInStockUnit);
+        // 杞崲涓哄簱瀛樺彉鍖栭噺锛氬嚭搴撳彉澶氾紙diffQuantity > 0锛夋椂锛屽簱瀛樺噺灏戯紱鍑哄簱鍙樺皯锛坉iffQuantity < 0锛夋椂锛屽簱瀛樺鍔�
+        BigDecimal inventoryChange = diffQuantity.negate();
+
+        // 6. 鏇存柊鍑哄簱璁板綍锛堜繚瀛樼敤鎴疯緭鍏ョ殑鍘熷鏁板�煎拰鍗曚綅锛�
+        stockOutRecordDto.setStockOutNum(stockOutRecordDto.getNetWeight());  // 淇濆瓨鐢ㄦ埛杈撳叆鐨勫��
+        stockOutRecordDto.setUnit(stockOutRecordDto.getUnit());  // 淇濆瓨鐢ㄦ埛杈撳叆鐨勫崟浣�
+
+        // 7. 鐢熸垚纾呭崟
+        StockInRecordDto stockInRecordDto = new StockInRecordDto();
+        BeanUtils.copyProperties(stockOutRecordDto, stockInRecordDto);
+        stockInRecordDto.setStockInNum(stockOutRecordDto.getStockOutNum());
+        String absoluteDocPath = weighbridgeDocGenerator.generateWeighbridgeDoc(stockInRecordDto);
+        stockOutRecordDto.setWeighbridgeDocPath(absoluteDocPath);
+        int updateResult = stockOutRecordMapper.updateById(stockOutRecordDto);
+
+        // 8. 鏇存柊搴撳瓨锛堜粎鍦ㄦ暟閲忓彂鐢熷彉鍖栨椂锛�
+        if (inventoryChange.compareTo(BigDecimal.ZERO) != 0) {
+            updateInventoryForStockOut(stockOutRecordDto.getProductId(), inventoryChange);
+        }
+
+        return updateResult;
+    }
+
+    /**
+     * 灏嗘暟閲忚浆鎹负搴撳瓨鍗曚綅
+     *
+     * @param quantity   鍘熷鏁伴噺
+     * @param sourceUnit 鍘熷鍗曚綅
+     * @param targetUnit 鐩爣鍗曚綅锛堝簱瀛樺崟浣嶏級
+     * @return 杞崲鍚庣殑鏁伴噺
+     */
+    private BigDecimal convertQuantityToStockUnit(BigDecimal quantity, String sourceUnit, String targetUnit) {
+        if (quantity == null) {
+            throw new BaseException("鏁伴噺涓嶈兘涓虹┖");
+        }
+
+        // 濡傛灉婧愬崟浣嶄负绌猴紝鐩存帴杩斿洖鍘熷��
+        if (sourceUnit == null || sourceUnit.isEmpty()) {
+            return quantity;
+        }
+
+        // 濡傛灉婧愬崟浣嶅拰鐩爣鍗曚綅鐩稿悓锛岀洿鎺ヨ繑鍥�
+        if (sourceUnit.equals(targetUnit)) {
+            return quantity;
+        }
+
+        // 鍗曚綅杞崲
+        if ("鍚�".equals(targetUnit)) {
+            // 鐩爣鍗曚綅鏄惃锛岄渶瑕佸皢婧愬崟浣嶈浆鎹负鍚�
+            if ("鍏枻".equals(sourceUnit)) {
+                // 鍏枻杞惃锛氶櫎浠�1000
+                return quantity.divide(BigDecimal.valueOf(1000), 2, RoundingMode.HALF_UP);
+            } else if ("鍏�".equals(sourceUnit)) {
+                // 鍏嬭浆鍚細闄や互1000000
+                return quantity.divide(BigDecimal.valueOf(1000000), 2, RoundingMode.HALF_UP);
+            }
+        } else if ("鍏枻".equals(targetUnit)) {
+            // 鐩爣鍗曚綅鏄叕鏂�
+            if ("鍚�".equals(sourceUnit)) {
+                // 鍚ㄨ浆鍏枻锛氫箻浠�1000
+                return quantity.multiply(BigDecimal.valueOf(1000));
+            } else if ("鍏�".equals(sourceUnit)) {
+                // 鍏嬭浆鍏枻锛氶櫎浠�1000
+                return quantity.divide(BigDecimal.valueOf(1000), 2, RoundingMode.HALF_UP);
+            }
+        } else if ("鍏�".equals(targetUnit)) {
+            // 鐩爣鍗曚綅鏄厠
+            if ("鍚�".equals(sourceUnit)) {
+                // 鍚ㄨ浆鍏嬶細涔樹互1000000
+                return quantity.multiply(BigDecimal.valueOf(1000000));
+            } else if ("鍏枻".equals(sourceUnit)) {
+                // 鍏枻杞厠锛氫箻浠�1000
+                return quantity.multiply(BigDecimal.valueOf(1000));
+            }
+        }
+
+        // 鏃犳硶杞崲鏃惰繑鍥炲師鍊�
+        return quantity;
+    }
+
+    /**
+     * 鏇存柊搴撳瓨锛堝嚭搴撳満鏅級
+     *
+     * @param productId       浜у搧ID
+     * @param inventoryChange 搴撳瓨鍙樺寲閲忥紙姝f暟涓哄鍔犲簱瀛橈紝璐熸暟涓哄噺灏戝簱瀛橈級
+     */
+    private void updateInventoryForStockOut(Long productId, BigDecimal inventoryChange) {
+        // 鏌ヨ褰撳墠搴撳瓨
+        StockInventory stockInventory = stockInventoryMapper.selectOne(
+                new QueryWrapper<StockInventory>().lambda()
+                        .eq(StockInventory::getProductId, productId)
+        );
+
+        if (stockInventory == null) {
+            throw new BaseException("搴撳瓨璁板綍涓嶅瓨鍦�");
+        }
+
+        // 鍒涘缓搴撳瓨鏇存柊DTO
+        StockInventoryDto inventoryDto = new StockInventoryDto();
+        BeanUtils.copyProperties(stockInventory, inventoryDto);
+        inventoryDto.setQualitity(inventoryChange.abs());
+
+        // 鏍规嵁搴撳瓨鍙樺寲閲忚皟鐢ㄤ笉鍚岀殑鏇存柊鏂规硶
+        if (inventoryChange.compareTo(BigDecimal.ZERO) > 0) {
+            // 搴撳瓨澧炲姞锛堝嚭搴撴暟閲忓彉灏戯紝闇�瑕佸姞鍥炲簱瀛橈級
+            int affectedRows = stockInventoryMapper.updateAddStockInventory(inventoryDto);
+            if (affectedRows == 0) {
+                throw new BaseException("鏇存柊搴撳瓨澶辫触");
+            }
+        } else {
+            // 搴撳瓨鍑忓皯锛堝嚭搴撴暟閲忓彉澶氾紝闇�瑕佸鎵e簱瀛橈級
+            int affectedRows = stockInventoryMapper.updateSubtractStockInventory(inventoryDto);
+            if (affectedRows == 0) {
+                throw new BaseException("搴撳瓨涓嶈冻锛屾棤娉曟墸鍑�");
+            }
+        }
     }
 }
diff --git a/src/main/java/com/ruoyi/stock/word/WeighbridgeDocGenerator.java b/src/main/java/com/ruoyi/stock/word/WeighbridgeDocGenerator.java
index f13a3d5..dacc203 100644
--- a/src/main/java/com/ruoyi/stock/word/WeighbridgeDocGenerator.java
+++ b/src/main/java/com/ruoyi/stock/word/WeighbridgeDocGenerator.java
@@ -204,7 +204,7 @@
         }
 
         XWPFRun unitRun = unitPara.createRun();
-        unitRun.setText("璁¢噺鍗曚綅锛氾紙鍚級");
+        unitRun.setText("璁¢噺鍗曚綅锛�" + dto.getUnit());
         unitRun.setFontSize(12);
         unitRun.setFontFamily("瀹嬩綋");
 
@@ -303,9 +303,9 @@
         String[] data = {
                 dto.getLicensePlateNo() != null ? dto.getLicensePlateNo() : "",
                 getProductModelName(dto.getProductId()),
-                grossWeight + "t",
-                tareWeight + "t",
-                netWeight + "t",
+                grossWeight + dto.getUnit(),
+                tareWeight + dto.getUnit(),
+                netWeight + dto.getUnit(),
                 dto.getRemark() != null ? dto.getRemark() : ""
         };
 
@@ -362,7 +362,7 @@
         );
 
         XWPFTableCell startCell = totalRow.getCell(1);
-        startCell.setText(netWeightChinese + "鍚�");
+        startCell.setText(netWeightChinese + dto.getUnit());
         startCell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);
 
         while (startCell.getParagraphs().size() > 1) {
diff --git a/src/main/resources/mapper/stock/StockInRecordMapper.xml b/src/main/resources/mapper/stock/StockInRecordMapper.xml
index 67ce061..aeada86 100644
--- a/src/main/resources/mapper/stock/StockInRecordMapper.xml
+++ b/src/main/resources/mapper/stock/StockInRecordMapper.xml
@@ -4,9 +4,9 @@
 
     <select id="listPage" resultType="com.ruoyi.stock.dto.StockInRecordDto">
         SELECT
-        p1.product_name AS product_type,
+        p1.product_name AS parentName,
         sir.*,
-        p.product_name AS product_name,
+        p.product_name AS productName,
         pm.model,
         pm.unit,
         sir.weighbridge_doc_path,
diff --git a/src/main/resources/mapper/stock/StockOutRecordMapper.xml b/src/main/resources/mapper/stock/StockOutRecordMapper.xml
index ccf3e5a..dd7cfa5 100644
--- a/src/main/resources/mapper/stock/StockOutRecordMapper.xml
+++ b/src/main/resources/mapper/stock/StockOutRecordMapper.xml
@@ -20,6 +20,7 @@
 
     <select id="listPage" resultType="com.ruoyi.stock.dto.StockOutRecordDto">
         SELECT
+        p1.product_name AS parentName,
         sor.*,
         p.product_name as productName,
         pm.model,
@@ -29,6 +30,7 @@
         FROM stock_out_record as sor
         LEFT JOIN product_model as pm on sor.product_model_id = pm.id
         LEFT JOIN product as p on pm.product_id = p.id
+        INNER JOIN product p1 ON p1.id = p.parent_id AND p1.product_name != '鍗婃垚鍝�'
         LEFT JOIN sys_user as u on sor.create_user = u.user_id
         <where>
             1=1

--
Gitblit v1.9.3