From 530b456eded06e0692e1d8bd5891069439c8f8f8 Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期五, 17 四月 2026 15:10:56 +0800
Subject: [PATCH] fix: 1.已发货的销售台账对应的出入库记录做限制不能删除;2.销售台账入库操作后,点击删除,对应的销售入库记录未一并删除;3.销售台账入库状态新增部分入库

---
 src/main/resources/mapper/sales/SalesLedgerMapper.xml                     |    2 
 src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java                  |    4 
 src/main/java/com/ruoyi/stock/pojo/StockInRecord.java                     |    6 
 src/main/resources/mybatis/mybatis-config.xml                             |   22 +-
 src/main/resources/mapper/stock/StockInventoryMapper.xml                  |    4 
 src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java                |    6 
 src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java |   15 ++
 src/main/java/com/ruoyi/stock/pojo/StockOutRecord.java                    |    6 
 src/main/java/com/ruoyi/sales/pojo/SalesLedger.java                       |    4 
 src/main/java/com/ruoyi/sales/service/ISalesLedgerService.java            |    2 
 src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java           |   47 ++++++
 src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java  |   72 +++++++++-
 doc/河南鹤壁天沐钢化玻璃厂.sql                                                       |   14 ++
 src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java  |    5 
 src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java       |    4 
 src/main/java/com/ruoyi/sales/dto/SalesProductStockDto.java               |   28 ++++
 src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java   |   24 +-
 src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java    |   66 +++++++-
 src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java |   34 +++-
 src/main/java/com/ruoyi/common/enums/StockInQualifiedRecordTypeEnum.java  |    2 
 20 files changed, 299 insertions(+), 68 deletions(-)

diff --git "a/doc/\346\262\263\345\215\227\351\271\244\345\243\201\345\244\251\346\262\220\351\222\242\345\214\226\347\216\273\347\222\203\345\216\202.sql" "b/doc/\346\262\263\345\215\227\351\271\244\345\243\201\345\244\251\346\262\220\351\222\242\345\214\226\347\216\273\347\222\203\345\216\202.sql"
index a5d9b35..0585f98 100644
--- "a/doc/\346\262\263\345\215\227\351\271\244\345\243\201\345\244\251\346\262\220\351\222\242\345\214\226\347\216\273\347\222\203\345\216\202.sql"
+++ "b/doc/\346\262\263\345\215\227\351\271\244\345\243\201\345\244\251\346\262\220\351\222\242\345\214\226\347\216\273\347\222\203\345\216\202.sql"
@@ -109,3 +109,17 @@
                                                                     `user_id` int NULL DEFAULT NULL COMMENT '鐢ㄦ埛id',
                                                                     PRIMARY KEY (`id`)
     );
+
+ALTER TABLE `product-inventory-management-hbtmblc`.`stock_in_record`
+    ADD COLUMN `sales_ledger_id`         bigint NULL COMMENT '閿�鍞彴璐D' AFTER `weighing_date`,
+    ADD COLUMN `sales_ledger_product_id` bigint NULL COMMENT '閿�鍞彴璐︿骇鍝両D' AFTER `sales_ledger_id`;
+
+ALTER TABLE `product-inventory-management-hbtmblc`.`sales_ledger_product`
+    ADD COLUMN `product_stock_status` int NULL COMMENT '浜у搧鍏ュ簱鐘舵��' AFTER `floor_code`;
+
+ALTER TABLE `product-inventory-management-hbtmblc`.`stock_out_record`
+    MODIFY COLUMN `outbound_batches` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '鍑哄簱鎵规' AFTER `id`,
+    MODIFY COLUMN `stock_out_num` decimal(16, 4) NULL DEFAULT NULL COMMENT '鍑哄簱鏁伴噺' AFTER `outbound_batches`,
+    MODIFY COLUMN `record_id` int NULL DEFAULT NULL COMMENT '鍑哄簱鏉ユ簮id' AFTER `stock_out_num`,
+    ADD COLUMN `sales_ledger_id`         bigint NULL COMMENT '閿�鍞鍗旾D' AFTER `type`,
+    ADD COLUMN `sales_ledger_product_id` bigint NULL COMMENT '閿�鍞鍗曚骇鍝両D' AFTER `sales_ledger_id`;
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/common/enums/StockInQualifiedRecordTypeEnum.java b/src/main/java/com/ruoyi/common/enums/StockInQualifiedRecordTypeEnum.java
index 3b9bee6..05a6ffb 100644
--- a/src/main/java/com/ruoyi/common/enums/StockInQualifiedRecordTypeEnum.java
+++ b/src/main/java/com/ruoyi/common/enums/StockInQualifiedRecordTypeEnum.java
@@ -12,7 +12,7 @@
     QUALITYINSPECT_STOCK_IN("6", "璐ㄦ-鍚堟牸鍏ュ簱"),
     DEFECTIVE_PASS("11", "涓嶅悎鏍�-璁╂鏀捐"),
     RETURN_HE_IN("14", "閿�鍞��璐�-鍚堟牸鍏ュ簱"),
-    SALE_STOCK_IN("15", "閿�鍞�-鍚堟牸鍏ュ簱");
+    SALE_STOCK_IN("15", "閿�鍞鍗�-鍚堟牸鍏ュ簱");
 
 
     private final String code;
diff --git a/src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java b/src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java
index 819ce65..b1bb2cf 100644
--- a/src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java
+++ b/src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java
@@ -35,12 +35,13 @@
 
     /**
      * 涓嶅悎鏍煎叆搴�
+     *
      * @param productModelId
      * @param quantity
      * @param recordType
      * @param recordId
      */
-    public void addUnStock(Long productModelId, BigDecimal quantity, String recordType,Long recordId) {
+    public void addUnStock(Long productModelId, BigDecimal quantity, String recordType, Long recordId) {
         StockUninventoryDto stockUninventoryDto = new StockUninventoryDto();
         stockUninventoryDto.setRecordId(recordId);
         stockUninventoryDto.setRecordType(String.valueOf(recordType));
@@ -51,12 +52,13 @@
 
     /**
      * 涓嶅悎鏍煎嚭搴�
+     *
      * @param productModelId
      * @param quantity
      * @param recordType
      * @param recordId
      */
-    public void subtractUnStock(Long productModelId, BigDecimal quantity, Integer recordType,Long recordId) {
+    public void subtractUnStock(Long productModelId, BigDecimal quantity, Integer recordType, Long recordId) {
         StockUninventoryDto stockUninventoryDto = new StockUninventoryDto();
         stockUninventoryDto.setRecordId(recordId);
         stockUninventoryDto.setRecordType(String.valueOf(recordType));
@@ -67,33 +69,69 @@
 
     /**
      * 鍚堟牸鍏ュ簱
+     *
      * @param productModelId
      * @param quantity
      * @param recordType
      * @param recordId
      */
-    public void addStock(Long productModelId, BigDecimal quantity, String recordType,Long recordId) {
+    public void addStock(Long productModelId, BigDecimal quantity, String recordType, Long recordId) {
+        addStock(null, null, productModelId, quantity, recordType, recordId);
+    }
+
+    /**
+     * 鍚堟牸鍏ュ簱
+     *
+     * @param productModelId
+     * @param quantity
+     * @param recordType
+     * @param recordId
+     */
+    public void addStock(Long salesLedgerId, Long salesLedgerProductId, Long productModelId, BigDecimal quantity, String recordType, Long recordId) {
         StockInventoryDto stockInventoryDto = new StockInventoryDto();
         stockInventoryDto.setRecordId(recordId);
         stockInventoryDto.setRecordType(String.valueOf(recordType));
         stockInventoryDto.setQualitity(quantity);
         stockInventoryDto.setProductModelId(productModelId);
+        stockInventoryDto.setSalesLedgerId(salesLedgerId);
+        stockInventoryDto.setSalesLedgerProductId(salesLedgerProductId);
         stockInventoryService.addstockInventory(stockInventoryDto);
+    }
+
+
+    /**
+     * 鍚堟牸鍑哄簱
+     *
+     * @param productModelId
+     * @param quantity
+     * @param recordType
+     * @param recordId
+     */
+    public void substractStock(Long productModelId, BigDecimal quantity, String recordType, Long recordId) {
+        StockInventoryDto stockInventoryDto = new StockInventoryDto();
+        stockInventoryDto.setRecordId(recordId);
+        stockInventoryDto.setRecordType(String.valueOf(recordType));
+        stockInventoryDto.setQualitity(quantity);
+        stockInventoryDto.setProductModelId(productModelId);
+        stockInventoryService.subtractStockInventory(stockInventoryDto);
     }
 
     /**
      * 鍚堟牸鍑哄簱
+     *
      * @param productModelId
      * @param quantity
      * @param recordType
      * @param recordId
      */
-    public void substractStock(Long productModelId, BigDecimal quantity, String recordType,Long recordId) {
+    public void substractStock(Long salesId, Long salseProductId, Long productModelId, BigDecimal quantity, String recordType, Long recordId) {
         StockInventoryDto stockInventoryDto = new StockInventoryDto();
         stockInventoryDto.setRecordId(recordId);
         stockInventoryDto.setRecordType(String.valueOf(recordType));
         stockInventoryDto.setQualitity(quantity);
         stockInventoryDto.setProductModelId(productModelId);
+        stockInventoryDto.setSalesLedgerId(salesId);
+        stockInventoryDto.setSalesLedgerProductId(salseProductId);
         stockInventoryService.subtractStockInventory(stockInventoryDto);
     }
 
@@ -106,6 +144,7 @@
             stockInRecordService.batchDelete(Collections.singletonList(one.getId()));
         }
     }
+
     public void deleteStockOutRecord(Long recordId, String recordType) {
         StockOutRecord one = stockOutRecordService.getOne(new QueryWrapper<StockOutRecord>()
                 .lambda().eq(StockOutRecord::getRecordId, recordId)
diff --git a/src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java b/src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
index 01c2c96..58c3234 100644
--- a/src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
+++ b/src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
@@ -397,8 +397,8 @@
 
     @PostMapping("/salesStock")
     @ApiOperation("閿�鍞彴璐︿骇鍝佸叆搴�")
-    public AjaxResult salesStock(@RequestBody SalesLedger salesLedger) {
-        salesLedgerService.salesStock(salesLedger);
+    public AjaxResult salesStock(@RequestBody SalesProductStockDto dto) {
+        salesLedgerService.salesStock(dto);
         return AjaxResult.success();
     }
 
diff --git a/src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java b/src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java
index 49548e1..eb82017 100644
--- a/src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java
+++ b/src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java
@@ -40,7 +40,7 @@
     @GetMapping("/listPage")
     @ApiOperation("鍙戣揣瀹℃壒鍒楄〃")
     public AjaxResult listPage(Page page, ShipmentApproval req) {
-        IPage<ShipmentApproval> listPage = shipmentApprovalService.listPage(page,req);
+        IPage<ShipmentApproval> listPage = shipmentApprovalService.listPage(page, req);
         return AjaxResult.success(listPage);
     }
 
@@ -87,12 +87,11 @@
 
 
             //鍑哄簱
-            stockUtils.addStock(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), req.getId());
+            stockUtils.addStock(salesLedgerProduct.getSalesLedgerId(), salesLedgerProduct.getId(), salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), req.getId());
         }
 
         return AjaxResult.success();
     }
-
 
 
     /**
diff --git a/src/main/java/com/ruoyi/sales/dto/SalesProductStockDto.java b/src/main/java/com/ruoyi/sales/dto/SalesProductStockDto.java
new file mode 100644
index 0000000..70c1d06
--- /dev/null
+++ b/src/main/java/com/ruoyi/sales/dto/SalesProductStockDto.java
@@ -0,0 +1,28 @@
+package com.ruoyi.sales.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * <br>
+ * 閿�鍞鍗曚骇鍝佸叆搴揇to
+ * </br>
+ *
+ * @author deslrey
+ * @version 1.0
+ * @since 2026/4/17 13:53
+ */
+@Data
+@ApiModel(value = "SalesProductStockDto", description = "閿�鍞鍗曚骇鍝佸叆搴揇to")
+public class SalesProductStockDto {
+
+    @ApiModelProperty("閿�鍞鍗旾d")
+    private Long salesLedgerId;
+
+    @ApiModelProperty("閿�鍞鍗曚骇鍝両d")
+    private List<Long> salesLedgerProducts;
+
+}
diff --git a/src/main/java/com/ruoyi/sales/pojo/SalesLedger.java b/src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
index e77e4f7..18cecc3 100644
--- a/src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
+++ b/src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
@@ -149,9 +149,9 @@
     private Integer deliveryStatus;
 
     /**
-     * 鍏ュ簱鐘舵�侊細0-鏈叆搴擄紝1-宸插叆搴�
+     * 鍏ュ簱鐘舵�侊細0-鏈叆搴擄紝1-閮ㄥ垎鍏ュ簱锛�2-宸插叆搴�
      */
-    @ApiModelProperty("鍏ュ簱鐘舵�侊細0-鏈叆搴擄紝1-宸插叆搴�")
+    @ApiModelProperty("鍏ュ簱鐘舵�侊細0-鏈叆搴擄紝1-閮ㄥ垎鍏ュ簱锛�2-宸插叆搴�")
     private Integer stockStatus;
 
     @TableField(exist = false)
diff --git a/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java b/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
index 46b3ad3..02d5080 100644
--- a/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
+++ b/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
@@ -292,6 +292,12 @@
     @ApiModelProperty("妤煎眰缂栧彿")
     private String floorCode;
 
+    /**
+     * 浜у搧鍏ュ簱鐘舵��   0-鏈叆搴擄紝1-宸插叆搴�
+     */
+    @ApiModelProperty("浜у搧鍏ュ簱鐘舵��")
+    private Integer productStockStatus;
+
     @TableField(exist = false)
     @ApiModelProperty("閿�鍞骇鍝侀澶栧姞宸�")
     private List<SalesLedgerProductProcess> salesProductProcessList;
diff --git a/src/main/java/com/ruoyi/sales/service/ISalesLedgerService.java b/src/main/java/com/ruoyi/sales/service/ISalesLedgerService.java
index 444be9d..2e9d5b4 100644
--- a/src/main/java/com/ruoyi/sales/service/ISalesLedgerService.java
+++ b/src/main/java/com/ruoyi/sales/service/ISalesLedgerService.java
@@ -67,5 +67,5 @@
 
     List<SalesLabelDto> salesLabel(Long salesLedgerId);
 
-    void salesStock(SalesLedger salesLedger);
+    void salesStock(SalesProductStockDto dto);
 }
diff --git a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
index 276e8c6..4847c22 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -49,7 +49,13 @@
 import com.ruoyi.sales.service.ISalesLedgerProductProcessService;
 import com.ruoyi.sales.service.ISalesLedgerService;
 import com.ruoyi.stock.dto.StockInventoryDto;
+import com.ruoyi.stock.mapper.StockInRecordMapper;
+import com.ruoyi.stock.mapper.StockOutRecordMapper;
+import com.ruoyi.stock.pojo.StockInRecord;
+import com.ruoyi.stock.pojo.StockOutRecord;
+import com.ruoyi.stock.service.StockInRecordService;
 import com.ruoyi.stock.service.StockInventoryService;
+import com.ruoyi.stock.service.StockOutRecordService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.io.FilenameUtils;
@@ -130,6 +136,10 @@
     private final ISalesLedgerProcessRouteService salesLedgerProcessRouteService;
 
     private final StockInventoryService stockInventoryService;
+    private final StockInRecordMapper stockInRecordMapper;
+    private final StockOutRecordMapper stockOutRecordMapper;
+    private final StockInRecordService stockInRecordService;
+    private final StockOutRecordService stockOutRecordService;
 
     @Autowired
     private SysDeptMapper sysDeptMapper;
@@ -703,6 +713,25 @@
         if (CollectionUtils.isNotEmpty(shippingInfos)) {
             shippingInfoServiceImpl.delete(shippingInfos.stream().map(ShippingInfo::getId).collect(Collectors.toList()));
         }
+        // 鍒犻櫎鍏宠仈鐨勫叆搴�/鍑哄簱璁板綍锛堣蛋鏈嶅姟灞傚垹闄わ紝瑙﹀彂搴撳瓨鏁伴噺鍥為��锛�
+        List<Long> stockInRecordIds = stockInRecordMapper.selectList(new LambdaQueryWrapper<StockInRecord>()
+                        .in(StockInRecord::getSalesLedgerId, idList)
+                        .select(StockInRecord::getId))
+                .stream()
+                .map(StockInRecord::getId)
+                .collect(Collectors.toList());
+        if (CollectionUtils.isNotEmpty(stockInRecordIds)) {
+            stockInRecordService.batchDelete(stockInRecordIds);
+        }
+        List<Long> stockOutRecordIds = stockOutRecordMapper.selectList(new LambdaQueryWrapper<StockOutRecord>()
+                        .in(StockOutRecord::getSalesLedgerId, idList)
+                        .select(StockOutRecord::getId))
+                .stream()
+                .map(StockOutRecord::getId)
+                .collect(Collectors.toList());
+        if (CollectionUtils.isNotEmpty(stockOutRecordIds)) {
+            stockOutRecordService.batchDelete(stockOutRecordIds);
+        }
         // 鍒犻櫎闄勪欢琛�
         commonFileService.deleteByBusinessIds(idList, FileNameType.SALE.getValue());
 
@@ -860,6 +889,7 @@
         if (!updateList.isEmpty()) {
             for (SalesLedgerProduct product : updateList) {
                 product.setType(type.getCode());
+                product.setProductStockStatus(0);
                 salesLedgerProductMapper.updateById(product);
                 //  娓呯┖閿�鍞骇鍝佺粦瀹氱殑鍔犲伐
                 salesLedgerProductProcessBindService.updateProductProcessBind(product.getSalesProductProcessList(), product.getId());
@@ -872,6 +902,7 @@
                 salesLedgerProduct.setNoInvoiceNum(salesLedgerProduct.getQuantity());
                 salesLedgerProduct.setNoInvoiceAmount(salesLedgerProduct.getTaxInclusiveTotalPrice());
                 salesLedgerProduct.setPendingInvoiceTotal(salesLedgerProduct.getTaxInclusiveTotalPrice());
+                salesLedgerProduct.setProductStockStatus(0);
                 salesLedgerProductMapper.insert(salesLedgerProduct);
                 //  缁戝畾浜у搧棰濆鍔犲伐
                 //  娓呯┖閿�鍞骇鍝佺粦瀹氱殑鍔犲伐
@@ -1509,23 +1540,27 @@
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void salesStock(SalesLedger salesLedger) {
-        if (salesLedger == null || salesLedger.getId() == null) {
+    public void salesStock(SalesProductStockDto dto) {
+        if (dto == null || dto.getSalesLedgerId() == null) {
             throw new NullPointerException("鍏ュ簱澶辫触,璇烽�夋嫨闇�瑕佸叆搴撶殑閿�鍞鍗�");
         }
         //  鏌ヨ閿�鍞鍗曟槸鍚﹀瓨鍦�
-        SalesLedger ledger = baseMapper.selectById(salesLedger.getId());
+        SalesLedger ledger = baseMapper.selectById(dto.getSalesLedgerId());
         if (ledger == null) {
             throw new ServiceException("鍏ュ簱澶辫触,閿�鍞鍗曚笉瀛樺湪");
         }
         if (ledger.getStockStatus() == null) {
             throw new ServiceException("鍏ュ簱澶辫触,閿�鍞鍗曞叆搴撶姸鎬佸紓甯�");
         }
-        if (ledger.getStockStatus() == 1) {
+        if (ledger.getStockStatus() == 2) {
             throw new ServiceException("鍏ュ簱澶辫触,璇ラ攢鍞鍗曞凡鍏ュ簱,璇峰嬁閲嶅鍏ュ簱");
         }
+        List<Long> products = dto.getSalesLedgerProducts();
+        if (products == null || products.isEmpty()) {
+            throw new ServiceException("鍏ュ簱澶辫触,鍏ュ簱浜у搧涓嶈兘涓虹┖");
+        }
         //  鏌ヨ閿�鍞鍗曠殑浜у搧
-        List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectList(Wrappers.<SalesLedgerProduct>lambdaQuery().eq(SalesLedgerProduct::getSalesLedgerId, ledger.getId()));
+        List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectList(Wrappers.<SalesLedgerProduct>lambdaQuery().in(SalesLedgerProduct::getId, products));
         if (salesLedgerProducts == null || salesLedgerProducts.isEmpty()) {
             throw new ServiceException("鍏ュ簱澶辫触,鏈煡璇㈠埌璇ラ攢鍞鍗曠殑閿�鍞骇鍝�");
         }
@@ -1533,15 +1568,20 @@
             if (product.getProductModelId() == null) {
                 continue;
             }
-            StockInventoryDto dto = new StockInventoryDto();
-            dto.setRecordId(product.getId());
-            dto.setRecordType(StockInQualifiedRecordTypeEnum.SALE_STOCK_IN.getCode());
-            dto.setQualitity(product.getQuantity());
-            dto.setProductModelId(product.getProductModelId());
-            stockInventoryService.addstockInventory(dto);
+            StockInventoryDto stockInventoryDto = new StockInventoryDto();
+            stockInventoryDto.setRecordId(product.getId());
+            stockInventoryDto.setRecordType(StockInQualifiedRecordTypeEnum.SALE_STOCK_IN.getCode());
+            stockInventoryDto.setQualitity(product.getQuantity());
+            stockInventoryDto.setProductModelId(product.getProductModelId());
+            stockInventoryDto.setSalesLedgerId(ledger.getId());
+            stockInventoryDto.setSalesLedgerProductId(product.getId());
+            stockInventoryService.addstockInventory(stockInventoryDto);
         }
-        //  鏇存柊閿�鍞鍗曞叆搴撶姸鎬�
-        ledger.setStockStatus(1);
+        //  鎸夐攢鍞鍗曚骇鍝佸叆搴撴儏鍐垫洿鏂颁富鍗曞叆搴撶姸鎬侊細1-閮ㄥ垎鍏ュ簱锛�2-宸插叆搴�
+        List<SalesLedgerProduct> ledgerAllProducts = salesLedgerProductMapper.selectList(Wrappers.<SalesLedgerProduct>lambdaQuery().eq(SalesLedgerProduct::getSalesLedgerId, ledger.getId()));
+        boolean hasStocked = CollectionUtils.isNotEmpty(ledgerAllProducts) && ledgerAllProducts.stream().anyMatch(item -> Objects.equals(item.getProductStockStatus(), 1));
+        boolean allStocked = CollectionUtils.isNotEmpty(ledgerAllProducts) && ledgerAllProducts.stream().allMatch(item -> Objects.equals(item.getProductStockStatus(), 1));
+        ledger.setStockStatus(allStocked ? 2 : (hasStocked ? 1 : 0));
         baseMapper.updateById(ledger);
     }
 }
diff --git a/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java
index 5394ded..fe8e425 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java
@@ -24,9 +24,11 @@
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import org.springframework.transaction.annotation.Transactional;
+
 import java.math.BigDecimal;
 import java.util.HashMap;
 import java.util.Map;
+
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -68,7 +70,7 @@
     @Override
     public IPage<ShippingInfoDto> listPage(Page page, ShippingInfo req) {
         IPage<ShippingInfoDto> listPage = shippingInfoMapper.listPage(page, req);
-        listPage.getRecords().forEach(item ->{
+        listPage.getRecords().forEach(item -> {
             item.setCommonFileList(commonFileService.getFileListByBusinessId(item.getId(), FileNameType.SHIP.getValue()));
         });
         return listPage;
@@ -82,10 +84,10 @@
             throw new RuntimeException("鍙戣揣淇℃伅涓嶅瓨鍦�");
         }
         //鎵e噺搴撳瓨
-        if(!"宸插彂璐�".equals(byId.getStatus())){
+        if (!"宸插彂璐�".equals(byId.getStatus())) {
             SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectById(byId.getSalesLedgerProductId());
             if (salesLedgerProduct != null) {
-                stockUtils.substractStock(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), req.getId());
+                stockUtils.substractStock(salesLedgerProduct.getSalesLedgerId(), salesLedgerProduct.getId(), salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), req.getId());
             }
         }
         byId.setExpressNumber(req.getExpressNumber());
@@ -108,10 +110,10 @@
         }
 
         // 杩佺Щ鏂囦欢
-        if(CollectionUtils.isNotEmpty(req.getTempFileIds())){
+        if (CollectionUtils.isNotEmpty(req.getTempFileIds())) {
             tempFileService.migrateTempFilesToFormal(req.getId(), req.getTempFileIds(), FileNameType.SHIP.getValue());
         }
-        return update ;
+        return update;
     }
 
 
@@ -119,21 +121,21 @@
     public boolean delete(List<Long> ids) {
         List<ShippingInfo> shippingInfos = shippingInfoMapper.selectList(new LambdaQueryWrapper<ShippingInfo>()
                 .in(ShippingInfo::getId, ids));
-        if(CollectionUtils.isEmpty(shippingInfos)) return false;
+        if (CollectionUtils.isEmpty(shippingInfos)) return false;
         // 鍒犻櫎闄勪欢
         commonFileService.deleteByBusinessIds(ids, FileNameType.SHIP.getValue());
         // 鎵e凡鍙戣揣搴撳瓨
         for (ShippingInfo shippingInfo : shippingInfos) {
-            if("宸插彂璐�".equals(shippingInfo.getStatus())) {
+            if ("宸插彂璐�".equals(shippingInfo.getStatus())) {
                 stockUtils.deleteStockOutRecord(shippingInfo.getId(), StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode());
             }
         }
         // 鍒犻櫎鍙戣揣瀹℃壒
-        if(CollectionUtils.isNotEmpty(shippingInfos)){
-            for (ShippingInfo shippingInfo : shippingInfos){
+        if (CollectionUtils.isNotEmpty(shippingInfos)) {
+            for (ShippingInfo shippingInfo : shippingInfos) {
                 ApproveProcess one = approveProcessService.getOne(new LambdaQueryWrapper<ApproveProcess>()
                         .like(ApproveProcess::getApproveReason, shippingInfo.getShippingNo()));
-                if(one != null){
+                if (one != null) {
                     approveProcessService.delByIds(Collections.singletonList(one.getId()));
                 }
             }
@@ -144,7 +146,7 @@
 
     @Override
     public List<SalesLedgerProductDto> getReturnManagementDtoById(Long shippingId) {
-        return shippingInfoMapper.getReturnManagementDtoById(shippingId );
+        return shippingInfoMapper.getReturnManagementDtoById(shippingId);
 
     }
 
diff --git a/src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java b/src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java
index 125b52b..0aa38f0 100644
--- a/src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java
+++ b/src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java
@@ -39,4 +39,8 @@
     private BigDecimal currentStock;
 
     private BigDecimal  unLockedQuantity;
+
+    private Long salesLedgerId;
+
+    private Long salesLedgerProductId;
 }
diff --git a/src/main/java/com/ruoyi/stock/pojo/StockInRecord.java b/src/main/java/com/ruoyi/stock/pojo/StockInRecord.java
index 395d18f..fc5af97 100644
--- a/src/main/java/com/ruoyi/stock/pojo/StockInRecord.java
+++ b/src/main/java/com/ruoyi/stock/pojo/StockInRecord.java
@@ -62,4 +62,10 @@
     @ApiModelProperty(value = "淇敼鐢ㄦ埛")
     @TableField(fill = FieldFill.INSERT_UPDATE)
     private Integer updateUser;
+
+    @ApiModelProperty("閿�鍞鍗旾D")
+    private Long salesLedgerId;
+
+    @ApiModelProperty("閿�鍞鍗曚骇鍝両D")
+    private Long salesLedgerProductId;
 }
diff --git a/src/main/java/com/ruoyi/stock/pojo/StockOutRecord.java b/src/main/java/com/ruoyi/stock/pojo/StockOutRecord.java
index e4e3b82..9d66234 100644
--- a/src/main/java/com/ruoyi/stock/pojo/StockOutRecord.java
+++ b/src/main/java/com/ruoyi/stock/pojo/StockOutRecord.java
@@ -71,4 +71,10 @@
 
     @ApiModelProperty(value = "绫诲瀷  0鍚堟牸鍏ュ簱 1涓嶅悎鏍煎叆搴�")
     private String type;
+
+    @ApiModelProperty("閿�鍞鍗旾D")
+    private Long salesLedgerId;
+
+    @ApiModelProperty("閿�鍞鍗曚骇鍝両D")
+    private Long salesLedgerProductId;
 }
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 30e545f..1bbba92 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
@@ -2,6 +2,8 @@
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
@@ -11,6 +13,10 @@
 import com.ruoyi.common.utils.OrderUtils;
 import com.ruoyi.common.utils.bean.BeanUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.sales.mapper.SalesLedgerMapper;
+import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
+import com.ruoyi.sales.pojo.SalesLedger;
+import com.ruoyi.sales.pojo.SalesLedgerProduct;
 import com.ruoyi.stock.dto.StockInRecordDto;
 import com.ruoyi.stock.dto.StockInventoryDto;
 import com.ruoyi.stock.dto.StockUninventoryDto;
@@ -28,6 +34,7 @@
 
 import javax.servlet.http.HttpServletResponse;
 import java.util.List;
+import java.util.Objects;
 
 @Service
 @AllArgsConstructor
@@ -36,6 +43,8 @@
     private StockInRecordMapper stockInRecordMapper;
     private StockInventoryMapper stockInventoryMapper;
     private StockUninventoryMapper stockUninventoryMapper;
+    private SalesLedgerProductMapper salesLedgerProductMapper;
+    private SalesLedgerMapper salesLedgerMapper;
 
     @Override
     public IPage<StockInRecordDto> listPage(Page page, StockInRecordDto stockInRecordDto) {
@@ -58,7 +67,7 @@
     public int update(Long id, StockInRecordDto stockInRecordDto) {
         // 鍒ゆ柇瀵硅薄鏄惁瀛樺湪
         StockInRecord stockInRecord = stockInRecordMapper.selectById(id);
-        if (stockInRecord == null){
+        if (stockInRecord == null) {
             throw new BaseException("璇ュ叆搴撹褰曚笉瀛樺湪,鏃犳硶鏇存柊!!!");
         }
 
@@ -72,29 +81,76 @@
     public int batchDelete(List<Long> ids) {
         for (Long id : ids) {
             StockInRecord stockInRecord = stockInRecordMapper.selectById(id);
+            validateCanDeleteBySalesLedger(stockInRecord);
             if (stockInRecord.getType().equals("0")) {
                 StockInventory stockInventory = stockInventoryMapper.selectOne(new LambdaQueryWrapper<StockInventory>().eq(StockInventory::getProductModelId, stockInRecord.getProductModelId()));
                 if (stockInventory == null) {
                     throw new BaseException("搴撳瓨璁板綍涓病鏈夊搴旂殑浜у搧,鏃犳硶鍒犻櫎!!!");
-                }else {
+                } else {
                     StockInventoryDto stockInRecordDto = new StockInventoryDto();
                     stockInRecordDto.setProductModelId(stockInventory.getProductModelId());
                     stockInRecordDto.setQualitity(stockInRecord.getStockInNum());
-                    stockInventoryMapper.updateSubtractStockInventory(stockInRecordDto);
+                    int affectRows = stockInventoryMapper.updateSubtractStockInventory(stockInRecordDto);
+                    if (affectRows <= 0) {
+                        throw new BaseException("搴撳瓨鍥為��澶辫触,褰撳墠搴撳瓨涓嶈冻,鏃犳硶鍒犻櫎璇ュ叆搴撹褰�");
+                    }
+                    // 閿�鍞叆搴撹褰曞垹闄ゆ椂锛屽洖閫�閿�鍞骇鍝佸拰閿�鍞鍗曞叆搴撶姸鎬�
+                    rollbackSalesStockStatus(stockInRecord);
                 }
-            }else if (stockInRecord.getType().equals("1")) {
+            } else if (stockInRecord.getType().equals("1")) {
                 StockUninventory stockUninventory = stockUninventoryMapper.selectOne(new LambdaQueryWrapper<StockUninventory>().eq(StockUninventory::getProductModelId, stockInRecord.getProductModelId()));
                 if (stockUninventory == null) {
                     throw new BaseException("搴撳瓨璁板綍涓病鏈夊搴旂殑浜у搧,鏃犳硶鍒犻櫎!!!");
-                }else {
+                } else {
                     StockUninventoryDto stockUninventoryDto = new StockUninventoryDto();
                     stockUninventoryDto.setProductModelId(stockUninventory.getProductModelId());
                     stockUninventoryDto.setQualitity(stockInRecord.getStockInNum());
-                    stockUninventoryMapper.updateSubtractStockUnInventory(stockUninventoryDto);
+                    int affectRows = stockUninventoryMapper.updateSubtractStockUnInventory(stockUninventoryDto);
+                    if (affectRows <= 0) {
+                        throw new BaseException("涓嶅悎鏍煎簱瀛樺洖閫�澶辫触,褰撳墠搴撳瓨涓嶈冻,鏃犳硶鍒犻櫎璇ュ叆搴撹褰�");
+                    }
                 }
             }
         }
         return stockInRecordMapper.deleteBatchIds(ids);
+    }
+
+    private void validateCanDeleteBySalesLedger(StockInRecord stockInRecord) {
+        if (stockInRecord == null || stockInRecord.getSalesLedgerId() == null) {
+            return;
+        }
+        SalesLedger salesLedger = salesLedgerMapper.selectById(stockInRecord.getSalesLedgerId());
+        if (salesLedger != null && Objects.equals(salesLedger.getDeliveryStatus(), 5)) {
+            throw new BaseException("閿�鍞鍗曞凡鍙戣揣,瀵瑰簲鍏ュ簱璁板綍涓嶅厑璁稿垹闄�");
+        }
+    }
+
+    private void rollbackSalesStockStatus(StockInRecord stockInRecord) {
+        if (stockInRecord == null || stockInRecord.getSalesLedgerProductId() == null) {
+            return;
+        }
+        SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectById(stockInRecord.getSalesLedgerProductId());
+        if (salesLedgerProduct == null) {
+            return;
+        }
+        salesLedgerProduct.setProductStockStatus(0);
+        salesLedgerProductMapper.updateById(salesLedgerProduct);
+
+        Long salesLedgerId = stockInRecord.getSalesLedgerId() != null ? stockInRecord.getSalesLedgerId() : salesLedgerProduct.getSalesLedgerId();
+        if (salesLedgerId == null) {
+            return;
+        }
+        SalesLedger salesLedger = salesLedgerMapper.selectById(salesLedgerId);
+        if (salesLedger == null) {
+            return;
+        }
+        List<SalesLedgerProduct> ledgerProducts = salesLedgerProductMapper.selectList(Wrappers.<SalesLedgerProduct>lambdaQuery().eq(SalesLedgerProduct::getSalesLedgerId, salesLedgerId));
+        boolean hasStocked = CollectionUtils.isNotEmpty(ledgerProducts)
+                && ledgerProducts.stream().anyMatch(item -> Objects.equals(item.getProductStockStatus(), 1));
+        boolean allStocked = CollectionUtils.isNotEmpty(ledgerProducts)
+                && ledgerProducts.stream().allMatch(item -> Objects.equals(item.getProductStockStatus(), 1));
+        salesLedger.setStockStatus(allStocked ? 2 : (hasStocked ? 1 : 0));
+        salesLedgerMapper.updateById(salesLedger);
     }
 
     @Override
@@ -103,11 +159,11 @@
         for (StockInRecordExportData 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<StockInRecordExportData> util = new ExcelUtil<>(StockInRecordExportData.class);
-        util.exportExcel(response,list, "鍏ュ簱璁板綍淇℃伅");
+        util.exportExcel(response, list, "鍏ュ簱璁板綍淇℃伅");
     }
 }
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 5cb6dda..d98bc5a 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
@@ -7,6 +7,7 @@
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
 import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
+import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
@@ -42,10 +43,11 @@
 @AllArgsConstructor
 public class StockInventoryServiceImpl extends ServiceImpl<StockInventoryMapper, StockInventory> implements StockInventoryService {
 
-    private  StockInventoryMapper stockInventoryMapper;
+    private StockInventoryMapper stockInventoryMapper;
     private StockInRecordService stockInRecordService;
     private StockOutRecordService stockOutRecordService;
     private SalesLedgerProductMapper salesLedgerProductMapper;
+
     @Override
     public IPage<StockInventoryDto> pagestockInventory(Page page, StockInventoryDto stockInventoryDto) {
         return stockInventoryMapper.pagestockInventory(page, stockInventoryDto);
@@ -56,12 +58,22 @@
     @Transactional(rollbackFor = Exception.class)
     public Boolean addstockInventory(StockInventoryDto stockInventoryDto) {
         //鏂板鍏ュ簱璁板綍鍐嶆坊鍔犲簱瀛�
+        //  鏇存柊浜у搧鍏ュ簱鐘舵��
+        SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectById(stockInventoryDto.getSalesLedgerProductId());
+        if (salesLedgerProduct == null) {
+            throw new ServiceException("鍏ュ簱澶辫触,閿�鍞骇鍝佷笉瀛樺湪");
+        }
+        salesLedgerProduct.setProductStockStatus(1);
+        salesLedgerProductMapper.updateById(salesLedgerProduct);
+
         StockInRecordDto stockInRecordDto = new StockInRecordDto();
         stockInRecordDto.setRecordId(stockInventoryDto.getRecordId());
         stockInRecordDto.setRecordType(stockInventoryDto.getRecordType());
         stockInRecordDto.setStockInNum(stockInventoryDto.getQualitity());
         stockInRecordDto.setProductModelId(stockInventoryDto.getProductModelId());
         stockInRecordDto.setType("0");
+        stockInRecordDto.setSalesLedgerId(stockInventoryDto.getSalesLedgerId());
+        stockInRecordDto.setSalesLedgerProductId(stockInventoryDto.getSalesLedgerProductId());
         stockInRecordService.add(stockInRecordDto);
         //鍐嶈繘琛屾柊澧炲簱瀛樻暟閲忓簱瀛�
         //鍏堟煡璇㈠簱瀛樿〃涓殑浜у搧鏄惁瀛樺湪锛屼笉瀛樺湪鏂板锛屽瓨鍦ㄦ洿鏂�
@@ -75,8 +87,8 @@
             newStockInventory.setLockedQuantity(stockInventoryDto.getLockedQuantity());
             newStockInventory.setWarnNum(stockInventoryDto.getWarnNum());
             stockInventoryMapper.insert(newStockInventory);
-        }else {
-             stockInventoryMapper.updateAddStockInventory(stockInventoryDto);
+        } else {
+            stockInventoryMapper.updateAddStockInventory(stockInventoryDto);
         }
         return true;
     }
@@ -92,6 +104,8 @@
         stockOutRecordDto.setStockOutNum(stockInventoryDto.getQualitity());
         stockOutRecordDto.setProductModelId(stockInventoryDto.getProductModelId());
         stockOutRecordDto.setType("0");
+        stockOutRecordDto.setSalesLedgerId(stockInventoryDto.getSalesLedgerId());
+        stockOutRecordDto.setSalesLedgerProductId(stockInventoryDto.getSalesLedgerProductId());
         stockOutRecordService.add(stockOutRecordDto);
         StockInventory oldStockInventory = stockInventoryMapper.selectOne(new QueryWrapper<StockInventory>().lambda().eq(StockInventory::getProductModelId, stockInventoryDto.getProductModelId()));
         if (ObjectUtils.isEmpty(oldStockInventory)) {
@@ -132,7 +146,7 @@
                         stockInventoryDto.setQualitity(dto.getQualitity());
                         stockInventoryDto.setRemark(dto.getRemark());
                         stockInventoryDto.setWarnNum(dto.getWarnNum());
-                        if (ObjectUtils.isNotEmpty(dto.getLockedQuantity())&&dto.getLockedQuantity().compareTo(dto.getQualitity())>0) {
+                        if (ObjectUtils.isNotEmpty(dto.getLockedQuantity()) && dto.getLockedQuantity().compareTo(dto.getQualitity()) > 0) {
                             throw new RuntimeException("鍐荤粨鏁伴噺涓嶈兘瓒呰繃鏈瀵煎叆鐨勫簱瀛樻暟閲�");
                         }
                         stockInventoryDto.setLockedQuantity(dto.getLockedQuantity());
@@ -171,28 +185,28 @@
 
         List<StockInventoryExportData> list = stockInventoryMapper.listStockInventoryExportData(stockInventoryDto);
         ExcelUtil<StockInventoryExportData> util = new ExcelUtil<>(StockInventoryExportData.class);
-        util.exportExcel(response,list, "搴撳瓨淇℃伅");
+        util.exportExcel(response, list, "搴撳瓨淇℃伅");
     }
 
     @Override
     public IPage<StockInRecordDto> stockInventoryPage(StockInventoryDto stockInventoryDto, Page page) {
-        return stockInventoryMapper.stockInventoryPage(stockInventoryDto,page);
+        return stockInventoryMapper.stockInventoryPage(stockInventoryDto, page);
     }
 
     @Override
     public IPage<StockInventoryDto> stockInAndOutRecord(StockInventoryDto stockInventoryDto, Page page) {
-        return stockInventoryMapper.stockInAndOutRecord(stockInventoryDto,page);
+        return stockInventoryMapper.stockInAndOutRecord(stockInventoryDto, page);
     }
 
     @Override
     public Boolean frozenStock(StockInventoryDto stockInventoryDto) {
         StockInventory stockInventory = stockInventoryMapper.selectById(stockInventoryDto.getId());
-        if (stockInventory.getQualitity().compareTo(stockInventoryDto.getLockedQuantity())<0) {
+        if (stockInventory.getQualitity().compareTo(stockInventoryDto.getLockedQuantity()) < 0) {
             throw new RuntimeException("鍐荤粨鏁伴噺涓嶈兘瓒呰繃搴撳瓨鏁伴噺");
         }
         if (ObjectUtils.isEmpty(stockInventory.getLockedQuantity())) {
             stockInventory.setLockedQuantity(stockInventoryDto.getLockedQuantity());
-        }else {
+        } else {
             stockInventory.setLockedQuantity(stockInventory.getLockedQuantity().add(stockInventoryDto.getLockedQuantity()));
         }
         return this.updateById(stockInventory);
@@ -201,7 +215,7 @@
     @Override
     public Boolean thawStock(StockInventoryDto stockInventoryDto) {
         StockInventory stockInventory = stockInventoryMapper.selectById(stockInventoryDto.getId());
-        if (stockInventory.getLockedQuantity().compareTo(stockInventoryDto.getLockedQuantity())<0) {
+        if (stockInventory.getLockedQuantity().compareTo(stockInventoryDto.getLockedQuantity()) < 0) {
             throw new RuntimeException("瑙e喕鏁伴噺涓嶈兘瓒呰繃鍐荤粨鏁伴噺");
         }
         stockInventory.setLockedQuantity(stockInventory.getLockedQuantity().subtract(stockInventoryDto.getLockedQuantity()));
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 e01fe5d..7dd9576 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java
@@ -11,6 +11,8 @@
 import com.ruoyi.common.utils.OrderUtils;
 import com.ruoyi.common.utils.bean.BeanUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.sales.mapper.SalesLedgerMapper;
+import com.ruoyi.sales.pojo.SalesLedger;
 import com.ruoyi.stock.dto.StockInventoryDto;
 import com.ruoyi.stock.dto.StockOutRecordDto;
 import com.ruoyi.stock.dto.StockUninventoryDto;
@@ -28,6 +30,7 @@
 
 import javax.servlet.http.HttpServletResponse;
 import java.util.List;
+import java.util.Objects;
 
 /**
  * <p>
@@ -43,6 +46,7 @@
     private StockOutRecordMapper stockOutRecordMapper;
     private StockInventoryMapper stockInventoryMapper;
     private StockUninventoryMapper stockUninventoryMapper;
+    private SalesLedgerMapper salesLedgerMapper;
 
     @Override
     public IPage<StockOutRecordDto> listPage(Page page, StockOutRecordDto stockOutRecordDto) {
@@ -75,6 +79,7 @@
     public int batchDelete(List<Long> ids) {
         for (Long id : ids) {
             StockOutRecord stockOutRecord = stockOutRecordMapper.selectById(id);
+            validateCanDeleteBySalesLedger(stockOutRecord);
             if (stockOutRecord.getType().equals("0")) {
                 StockInventory stockInventory = stockInventoryMapper.selectOne(new LambdaQueryWrapper<StockInventory>().eq(StockInventory::getProductModelId, stockOutRecord.getProductModelId()));
                 if (stockInventory == null) {
@@ -100,6 +105,16 @@
         return stockOutRecordMapper.deleteBatchIds(ids);
     }
 
+    private void validateCanDeleteBySalesLedger(StockOutRecord stockOutRecord) {
+        if (stockOutRecord == null || stockOutRecord.getSalesLedgerId() == null) {
+            return;
+        }
+        SalesLedger salesLedger = salesLedgerMapper.selectById(stockOutRecord.getSalesLedgerId());
+        if (salesLedger != null && Objects.equals(salesLedger.getDeliveryStatus(), 5)) {
+            throw new BaseException("閿�鍞鍗曞凡鍙戣揣,瀵瑰簲鍑哄簱璁板綍涓嶅厑璁稿垹闄�");
+        }
+    }
+
     @Override
     public void exportStockOutRecord(HttpServletResponse response, StockOutRecordDto stockOutRecordDto) {
         List<StockOutRecordExportData> list = stockOutRecordMapper.listStockOutRecordExportData(stockOutRecordDto);
diff --git a/src/main/resources/mapper/sales/SalesLedgerMapper.xml b/src/main/resources/mapper/sales/SalesLedgerMapper.xml
index 06f4591..38592a3 100644
--- a/src/main/resources/mapper/sales/SalesLedgerMapper.xml
+++ b/src/main/resources/mapper/sales/SalesLedgerMapper.xml
@@ -96,7 +96,7 @@
                 AND T1.stock_status = #{salesLedgerDto.stockStatus}
             </if>
         </where>
-        ORDER BY T1.entry_date DESC
+        ORDER BY T1.entry_date DESC,T1.id DESC
     </select>
 
     <select id="selectIncomeStats" resultType="com.ruoyi.home.dto.IncomeExpenseAnalysisDto">
diff --git a/src/main/resources/mapper/stock/StockInventoryMapper.xml b/src/main/resources/mapper/stock/StockInventoryMapper.xml
index ebda2fc..3931022 100644
--- a/src/main/resources/mapper/stock/StockInventoryMapper.xml
+++ b/src/main/resources/mapper/stock/StockInventoryMapper.xml
@@ -51,6 +51,7 @@
         </set>
         where product_model_id = #{ew.productModelId} and qualitity >= #{ew.qualitity}
     </update>
+
     <select id="pagestockInventory" resultType="com.ruoyi.stock.dto.StockInventoryDto">
         select si.id,
         si.qualitity,
@@ -66,7 +67,7 @@
         pm.unit,
         p.product_name
         from stock_inventory si
-        left join product_model pm on si. = pm.id
+        left join product_model pm on si.product_model_id = pm.id
         left join product p on pm.product_id = p.id
         where 1 = 1
         <if test="ew.productName != null and ew.productName !=''">
@@ -76,6 +77,7 @@
             and si.product_model_id = #{ew.productModelId}
         </if>
     </select>
+
     <select id="listStockInventoryExportData" resultType="com.ruoyi.stock.execl.StockInventoryExportData">
         select si.qualitity,
         pm.model,
diff --git a/src/main/resources/mybatis/mybatis-config.xml b/src/main/resources/mybatis/mybatis-config.xml
index ee4d2a1..2552373 100644
--- a/src/main/resources/mybatis/mybatis-config.xml
+++ b/src/main/resources/mybatis/mybatis-config.xml
@@ -1,21 +1,21 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE configuration
-PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
-"http://mybatis.org/dtd/mybatis-3-config.dtd">
+        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-config.dtd">
 <configuration>
     <!-- 鍏ㄥ眬鍙傛暟 -->
     <settings>
         <!-- 浣垮叏灞�鐨勬槧灏勫櫒鍚敤鎴栫鐢ㄧ紦瀛� -->
-        <setting name="cacheEnabled"             value="true"   />
+        <setting name="cacheEnabled" value="true"/>
         <!-- 鍏佽JDBC 鏀寔鑷姩鐢熸垚涓婚敭 -->
-        <setting name="useGeneratedKeys"         value="true"   />
+        <setting name="useGeneratedKeys" value="true"/>
         <!-- 閰嶇疆榛樿鐨勬墽琛屽櫒.SIMPLE灏辨槸鏅�氭墽琛屽櫒;REUSE鎵ц鍣ㄤ細閲嶇敤棰勫鐞嗚鍙�(prepared statements);BATCH鎵ц鍣ㄥ皢閲嶇敤璇彞骞舵墽琛屾壒閲忔洿鏂� -->
-        <setting name="defaultExecutorType"      value="SIMPLE" />
-		<!-- 鎸囧畾 MyBatis 鎵�鐢ㄦ棩蹇楃殑鍏蜂綋瀹炵幇 -->
-        <setting name="logImpl"                  value="SLF4J"  />
-<!--        <setting name="logImpl"                  value="org.apache.ibatis.logging.stdout.StdOutImpl"  />-->
+        <setting name="defaultExecutorType" value="SIMPLE"/>
+        <!-- 鎸囧畾 MyBatis 鎵�鐢ㄦ棩蹇楃殑鍏蜂綋瀹炵幇 -->
+        <!--        <setting name="logImpl"                  value="SLF4J"  />-->
+        <setting name="logImpl" value="org.apache.ibatis.logging.stdout.StdOutImpl"/>
         <!-- 浣跨敤椹煎嘲鍛藉悕娉曡浆鎹㈠瓧娈� -->
-		<!-- <setting name="mapUnderscoreToCamelCase" value="true"/> -->
-	</settings>
-	
+        <!-- <setting name="mapUnderscoreToCamelCase" value="true"/> -->
+    </settings>
+
 </configuration>

--
Gitblit v1.9.3