From 32b536caa833c1861c6f273d78d7202206445b74 Mon Sep 17 00:00:00 2001
From: liyong <18434998025@163.com>
Date: 星期五, 23 一月 2026 15:22:01 +0800
Subject: [PATCH] feat(stock): 库存导入接口开发

---
 src/main/java/com/ruoyi/stock/service/StockInventoryService.java           |    2 
 src/main/java/com/ruoyi/stock/execl/StockInventoryExportData.java          |   19 +++++++++
 src/main/resources/mapper/sales/SalesLedgerProductMapper.xml               |   17 +++++++-
 src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java                 |    3 +
 src/main/java/com/ruoyi/sales/controller/SalesLedgerProductController.java |   14 ++++---
 src/main/java/com/ruoyi/sales/mapper/SalesLedgerProductMapper.java         |    2 +
 src/main/java/com/ruoyi/stock/controller/StockInventoryController.java     |   18 ++++++++
 src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java  |   31 +++++++++++----
 8 files changed, 88 insertions(+), 18 deletions(-)

diff --git a/src/main/java/com/ruoyi/sales/controller/SalesLedgerProductController.java b/src/main/java/com/ruoyi/sales/controller/SalesLedgerProductController.java
index 79e6cb5..8632313 100644
--- a/src/main/java/com/ruoyi/sales/controller/SalesLedgerProductController.java
+++ b/src/main/java/com/ruoyi/sales/controller/SalesLedgerProductController.java
@@ -86,14 +86,16 @@
 //            procurementDto.setSalesLedgerProductId(item.getId());
 //            procurementDto.setProductCategory(item.getProductCategory());
 //            IPage<ProcurementPageDtoCopy> result = procurementRecordService.listPageCopyByProduction(new Page<>(1,-1), procurementDto);
-            BigDecimal stockQuantity = stockUtils.getStockQuantity(item.getProductModelId()).get("stockQuantity");
-            if(stockQuantity != null) {
+//            BigDecimal stockQuantity = stockUtils.getStockQuantity(item.getProductModelId()).get("stockQuantity");
+
 //                ProcurementPageDtoCopy procurementDtoCopy = result.getRecords().get(0);
-                if (item.getQuantity().compareTo(stockQuantity) <= 0 && item.getApproveStatus() == 0) {
-                    item.setApproveStatus(1);
-                    salesLedgerProductService.addOrUpdateSalesLedgerProduct(item);
+                if (item.getApproveStatus() != 2) {
+                    if (item.getHasSufficientStock() == 0) {
+                        item.setApproveStatus(0);
+                    }else {
+                        item.setApproveStatus(1);
+                    }
                 }
-            }
         });
         return AjaxResult.success(list);
     }
diff --git a/src/main/java/com/ruoyi/sales/mapper/SalesLedgerProductMapper.java b/src/main/java/com/ruoyi/sales/mapper/SalesLedgerProductMapper.java
index 514f6cd..9db21f5 100644
--- a/src/main/java/com/ruoyi/sales/mapper/SalesLedgerProductMapper.java
+++ b/src/main/java/com/ruoyi/sales/mapper/SalesLedgerProductMapper.java
@@ -20,6 +20,8 @@
  * @date 2025-05-08
  */
 public interface SalesLedgerProductMapper extends MyBaseMapper<SalesLedgerProduct> {
+     List<SalesLedgerProduct> selectProduct() ;
+
     List<SalesLedgerProduct> selectSalesLedgerProductList(@Param("salesLedgerProduct") SalesLedgerProduct salesLedgerProduct);
 
     SalesLedgerProduct selectSalesLedgerProductByMainId(@Param("productMainId") Long productMainId);
diff --git a/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java b/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
index 742529c..3deefb0 100644
--- a/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
+++ b/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
@@ -224,4 +224,7 @@
 
     @ApiModelProperty(value = "鏄惁璐ㄦ")
     private Boolean isChecked;
+
+    @TableField(exist = false)
+    private Integer hasSufficientStock;
 }
diff --git a/src/main/java/com/ruoyi/stock/controller/StockInventoryController.java b/src/main/java/com/ruoyi/stock/controller/StockInventoryController.java
index 445ac81..8d5db33 100644
--- a/src/main/java/com/ruoyi/stock/controller/StockInventoryController.java
+++ b/src/main/java/com/ruoyi/stock/controller/StockInventoryController.java
@@ -3,14 +3,23 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.common.enums.StockQualifiedRecordTypeEnum;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.compensationperformance.pojo.CompensationPerformance;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.stock.dto.StockInventoryDto;
+import com.ruoyi.stock.execl.StockInventoryExportData;
 import com.ruoyi.stock.service.StockInventoryService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * <p>
@@ -56,7 +65,14 @@
     @GetMapping("importStockInventory")
     @ApiOperation("瀵煎叆搴撳瓨")
     public R importStockInventory(MultipartFile  file) {
-        return R.ok(stockInventoryService.importStockInventory(file));
+        return stockInventoryService.importStockInventory(file);
+    }
 
+    @Log(title = "涓嬭浇搴撳瓨瀵煎叆妯℃澘", businessType = BusinessType.EXPORT)
+    @PostMapping("/exportStockInventory")
+    public void exportStockInventory(HttpServletResponse response) {
+        List<StockInventoryExportData> list = new ArrayList<>();
+        ExcelUtil<StockInventoryExportData> util = new ExcelUtil<>(StockInventoryExportData.class);
+        util.exportExcel(response, list, "涓嬭浇钖祫绠$悊鍒楄〃妯℃澘");
     }
 }
diff --git a/src/main/java/com/ruoyi/stock/execl/StockInventoryExportData.java b/src/main/java/com/ruoyi/stock/execl/StockInventoryExportData.java
index c917d30..8937fbb 100644
--- a/src/main/java/com/ruoyi/stock/execl/StockInventoryExportData.java
+++ b/src/main/java/com/ruoyi/stock/execl/StockInventoryExportData.java
@@ -1,5 +1,24 @@
 package com.ruoyi.stock.execl;
 
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.ruoyi.framework.aspectj.lang.annotation.Excel;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
 public class StockInventoryExportData {
 
+    @Excel(name = "浜у搧鍚嶇О")
+    private String model;
+
+    @Excel(name = "瑙勬牸")
+    private String productName;
+
+    @Excel(name = "搴撳瓨鏁伴噺")
+    private BigDecimal qualitity;
+
+    @Excel(name = "澶囨敞")
+    private String remark;
+
 }
diff --git a/src/main/java/com/ruoyi/stock/service/StockInventoryService.java b/src/main/java/com/ruoyi/stock/service/StockInventoryService.java
index 0dc849c..41a2f7f 100644
--- a/src/main/java/com/ruoyi/stock/service/StockInventoryService.java
+++ b/src/main/java/com/ruoyi/stock/service/StockInventoryService.java
@@ -24,5 +24,5 @@
 
     Boolean subtractStockInventory(StockInventoryDto stockInventoryDto);
 
-    Boolean importStockInventory(MultipartFile file);
+    R importStockInventory(MultipartFile file);
 }
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 d30e7bc..3beaf09 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
@@ -6,9 +6,13 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.basic.excel.SupplierManageExcelDto;
 import com.ruoyi.basic.pojo.SupplierManage;
+import com.ruoyi.common.enums.StockQualifiedRecordTypeEnum;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.framework.web.domain.R;
+import com.ruoyi.procurementrecord.utils.StockUtils;
+import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
+import com.ruoyi.sales.pojo.SalesLedgerProduct;
 import com.ruoyi.stock.dto.StockInRecordDto;
 import com.ruoyi.stock.dto.StockInventoryDto;
 import com.ruoyi.stock.dto.StockOutRecordDto;
@@ -30,6 +34,8 @@
 import java.time.LocalDate;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -46,7 +52,8 @@
     private  StockInventoryMapper stockInventoryMapper;
     private StockInRecordService stockInRecordService;
     private StockOutRecordService stockOutRecordService;
-
+    private SalesLedgerProductMapper salesLedgerProductMapper;
+    private StockUtils stockUtils;
     @Override
     public IPage<StockInventoryDto> pagestockInventory(Page page, StockInventoryDto stockInventoryDto) {
         return stockInventoryMapper.pagestockInventory(page, stockInventoryDto);
@@ -102,20 +109,28 @@
     }
 
     @Override
-    public Boolean importStockInventory(MultipartFile file) {
+    public R importStockInventory(MultipartFile file) {
         try {
+            final StringBuffer[] errorMsg = {new StringBuffer()};
+            //鏌ヨ鎵�鏈夌殑浜у搧
+            List<SalesLedgerProduct> salesLedgerProducts =salesLedgerProductMapper.selectProduct();
+
             ExcelUtil<StockInventoryExportData> util = new ExcelUtil<StockInventoryExportData>(StockInventoryExportData.class);
             List<StockInventoryExportData> list = util.importExcel(file.getInputStream());
-            ArrayList<StockInventory> stockInventories = new ArrayList<>();
             list.stream().forEach(dto -> {
-               // TODO: 2026/1/21 娣诲姞鍏ュ簱璁板綍
+                salesLedgerProducts.stream().forEach(item->{
+                    if (item.getProductCategory().equals(dto.getProductName())&&item.getSpecificationModel().equals(dto.getModel())) {
+                            //鏇存柊搴撳瓨
+                            stockUtils.addStock(item.getId(),dto.getQualitity(), StockQualifiedRecordTypeEnum.CUSTOMIZATION_STOCK_IN.getCode(),0L);
+                    }else {
+                        errorMsg[0] = errorMsg[0].append("浜у搧鍚嶇О锛�"+dto.getProductName()+"瑙勬牸锛�"+dto.getModel()+"涓嶅瓨鍦�").append("\n");
+                    }
+                });
             });
-
-            this.saveOrUpdateBatch(stockInventories);
-            return true;
+            return R.ok(errorMsg[0]);
         }catch (Exception e){
             e.printStackTrace();
         }
-        return false;
+        return R.fail();
     }
 }
diff --git a/src/main/resources/mapper/sales/SalesLedgerProductMapper.xml b/src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
index 67c56c7..f74c3fa 100644
--- a/src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
+++ b/src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
@@ -8,10 +8,15 @@
         SELECT
         T1.*,
         t3.shipping_car_number,
-        t3.shipping_date
+        t3.shipping_date,
+        CASE
+        WHEN t2.qualitity > T1.quantity THEN 1
+        ELSE 0
+        END as has_sufficient_stock
         FROM
         sales_ledger_product T1
-        left join shipping_info t3 on T1.id = t3.sales_ledger_product_id
+        LEFT JOIN stock_inventory t2 ON T1.product_model_id = t2.product_model_id
+        LEFT JOIN shipping_info t3 ON T1.id = t3.sales_ledger_product_id
         <where>
             1=1
             <if test="salesLedgerProduct.salesLedgerId != null and salesLedgerProduct.salesLedgerId != '' ">
@@ -147,4 +152,12 @@
               WHERE sl.id = #{salesLedegerId}) A
         group by a.model, a.product_name, a.unit
     </select>
+    <select id="selectProduct" resultType="com.ruoyi.sales.pojo.SalesLedgerProduct">
+        select
+            p.product_name as product_category,
+            pm.model as specification_model,
+            pm.id
+        from product_model pm
+        left join product p on pm.product_id = p.id
+    </select>
 </mapper>
\ No newline at end of file

--
Gitblit v1.9.3