From 749418cd02075520e7c2e8afc7a8450db78c82f8 Mon Sep 17 00:00:00 2001
From: maven <2163098428@qq.com>
Date: 星期五, 19 十二月 2025 14:36:47 +0800
Subject: [PATCH] yys  移动仓储物流

---
 src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordOutController.java    |   50 ++
 src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordOutMapper.java            |    8 
 src/main/java/com/ruoyi/procurementrecord/dto/ProcurementManagementUpdateDto.java           |   16 
 src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDtoCopy.java                   |   33 +
 src/main/resources/mapper/procurementrecord/CustomStorageMapper.xml                         |   28 +
 src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java                    |   18 
 src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java    |  369 ++++++++++++++++++++
 src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java                |   19 +
 src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java       |  125 ++++++
 src/main/java/com/ruoyi/procurementrecord/pojo/CustomStorage.java                           |  119 +++++++
 src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutAdd.java                  |    5 
 src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java             |   24 +
 src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordOutServiceImpl.java |   27 +
 src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordMapper.java               |    8 
 src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordOutService.java          |    4 
 src/main/resources/application-dev.yml                                                      |    2 
 src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDto.java                       |   38 ++
 src/main/java/com/ruoyi/procurementrecord/mapper/CustomStorageMapper.java                   |   16 
 src/main/java/com/ruoyi/procurementrecord/dto/ProcurementAddDto.java                        |    7 
 src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutPageDto.java              |   36 ++
 src/main/java/com/ruoyi/procurementrecord/dto/ProcurementUpdateDto.java                     |    9 
 src/main/resources/application.yml                                                          |    2 
 src/main/java/com/ruoyi/procurementrecord/dto/Details.java                                  |    9 
 23 files changed, 927 insertions(+), 45 deletions(-)

diff --git a/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java b/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java
index 7fb7b44..ec20ef3 100644
--- a/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java
+++ b/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java
@@ -2,14 +2,18 @@
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.controller.BaseController;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.procurementrecord.dto.*;
+import com.ruoyi.procurementrecord.mapper.CustomStorageMapper;
+import com.ruoyi.procurementrecord.pojo.CustomStorage;
 import com.ruoyi.procurementrecord.service.ProcurementRecordService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.apache.ibatis.annotations.Delete;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
@@ -30,10 +34,11 @@
     @Autowired
     private ProcurementRecordService procurementRecordService;
 
+
     @GetMapping("/productlist")
     @Log(title = "閲囪喘鍏ュ簱-鍏ュ簱绠$悊-鏂板鍏ュ簱鏌ヨ", businessType = BusinessType.OTHER)
     public AjaxResult list(ProcurementDto procurementDto) {
-        List<ProcurementDto> result =procurementRecordService.listProcurementBySalesLedgerId(procurementDto);
+        List<ProcurementDto> result = procurementRecordService.listProcurementBySalesLedgerId(procurementDto);
         return AjaxResult.success(result);
     }
 
@@ -41,7 +46,30 @@
     @Log(title = "閲囪喘鍏ュ簱-鍏ュ簱绠$悊-鏂板鍏ュ簱", businessType = BusinessType.INSERT)
     @Transactional
     public AjaxResult add(@RequestBody ProcurementAddDto procurementDto) {
+        procurementDto.setType(1);
+        procurementDto.setTypeName("閲囪喘鍏ュ簱");
         return AjaxResult.success(procurementRecordService.add(procurementDto));
+    }
+
+    @PostMapping("/addCustom")
+    @Log(title = "鑷畾涔夊叆搴�-鍏ュ簱绠$悊-鏂板鍏ュ簱", businessType = BusinessType.INSERT)
+    @Transactional
+    public AjaxResult addCustom(@RequestBody List<CustomStorage> customStorage) {
+        return procurementRecordService.addCustom(customStorage);
+    }
+
+    @PostMapping("/updateCustom")
+    @Log(title = "鑷畾涔夊叆搴�-鍏ュ簱绠$悊-淇敼鍏ュ簱", businessType = BusinessType.UPDATE)
+    @Transactional
+    public AjaxResult updateCustom(@RequestBody CustomStorage customStorage) {
+        return procurementRecordService.updateCustom(customStorage);
+    }
+
+    @Delete("/delteCustom")
+    @Log(title = "鑷畾涔夊叆搴�-鍏ュ簱绠$悊-鍒犻櫎鍏ュ簱", businessType = BusinessType.DELETE)
+    @Transactional
+    public AjaxResult deleteCustom(@RequestBody List<Long> ids) {
+        return procurementRecordService.deleteCustom(ids);
     }
 
     @PostMapping("/update")
@@ -52,10 +80,17 @@
     }
 
     @PostMapping("/updateManagement")
-    @Log(title = "閲囪喘鍏ュ簱-搴撳瓨鍙拌处-淇敼", businessType = BusinessType.UPDATE)
+    @Log(title = "鎴愬搧鍏ュ簱-搴撳瓨鍙拌处-淇敼", businessType = BusinessType.UPDATE)
     @Transactional
     public AjaxResult updateManagement(@RequestBody ProcurementManagementUpdateDto procurementDto) {
         return AjaxResult.success(procurementRecordService.updateManagement(procurementDto));
+    }
+
+    @PostMapping("/updateManagementByCustom")
+    @Log(title = "鑷畾涔夊叆搴�-搴撳瓨鍙拌处-淇敼", businessType = BusinessType.UPDATE)
+    @Transactional
+    public AjaxResult updateManagementByCustom(@RequestBody ProcurementManagementUpdateDto procurementDto) {
+        return AjaxResult.success(procurementRecordService.updateManagementByCustom(procurementDto));
     }
 
     @PostMapping("/del")
@@ -69,16 +104,47 @@
     @Log(title = "閲囪喘鍏ュ簱-鍏ュ簱绠$悊-鍏ュ簱鏌ヨ", businessType = BusinessType.OTHER)
     @ApiOperation(value = "鍏ュ簱鏌ヨ")
     public AjaxResult listPage(Page page, ProcurementPageDto procurementDto) {
-        IPage<ProcurementPageDto> result =procurementRecordService.listPage(page, procurementDto);
+        IPage<ProcurementPageDto> result = procurementRecordService.listPage(page, procurementDto);
+        return AjaxResult.success(result);
+    }
+
+    @GetMapping("/listPageByProduction")
+    @Log(title = "鐢熶骇鍏ュ簱-鍏ュ簱绠$悊-鍏ュ簱鏌ヨ", businessType = BusinessType.OTHER)
+    @ApiOperation(value = "鍏ュ簱鏌ヨ")
+    public AjaxResult listPageByProduction(Page page, ProcurementPageDto procurementDto) {
+        IPage<ProcurementPageDto> result = procurementRecordService.listPageByProduction(page, procurementDto);
+        return AjaxResult.success(result);
+    }
+
+    @GetMapping("/listPageByCustom")
+    @Log(title = "鑷畾涔夊叆搴�-鍏ュ簱绠$悊-鍏ュ簱鏌ヨ", businessType = BusinessType.OTHER)
+    @ApiOperation(value = "鍏ュ簱鏌ヨ")
+    public AjaxResult listPageByCustom(Page page, CustomStorage customStorage) {
+        IPage<CustomStorage> result = procurementRecordService.listPageByCustom(page, customStorage);
         return AjaxResult.success(result);
     }
 
     @GetMapping("/listPageCopy")
-    @Log(title = "閲囪喘鍏ュ簱-鍏ュ簱绠$悊-鍏ュ簱鏌ヨ", businessType = BusinessType.OTHER)
+    @Log(title = "閲囪喘鍏ュ簱-搴撳瓨绠$悊-鍒嗛〉鏌ヨ", businessType = BusinessType.OTHER)
     public AjaxResult listPageCopy(Page page, ProcurementPageDto procurementDto) {
-        IPage<ProcurementPageDtoCopy> result =procurementRecordService.listPageCopy(page, procurementDto);
+        IPage<ProcurementPageDtoCopy> result = procurementRecordService.listPageCopy(page, procurementDto);
         return AjaxResult.success(result);
     }
+
+    @GetMapping("/listPageCopyByProduction")
+    @Log(title = "鐢熶骇鍏ュ簱-搴撳瓨绠$悊-鍒嗛〉鏌ヨ", businessType = BusinessType.OTHER)
+    public AjaxResult listPageCopyByProduction(Page page, ProcurementPageDto procurementDto) {
+        IPage<ProcurementPageDtoCopy> result = procurementRecordService.listPageCopyByProduction(page, procurementDto);
+        return AjaxResult.success(result);
+    }
+
+    @GetMapping("/listPageCopyByCustom")
+    @Log(title = "鑷畾涔夊叆搴�-搴撳瓨绠$悊-鍒嗛〉鏌ヨ", businessType = BusinessType.OTHER)
+    public AjaxResult listPageCopyByCustom(Page page, CustomStorage customStorage) {
+        IPage<CustomStorage> result = procurementRecordService.listPageCopyByCustom(page, customStorage);
+        return AjaxResult.success(result);
+    }
+
     @GetMapping("/getReportList")
     @Log(title = "搴撳瓨鎶ヨ〃鏌ヨ", businessType = BusinessType.OTHER)
     public AjaxResult getReportList(Page page, ProcurementPageDto procurementDto) {
@@ -86,21 +152,62 @@
     }
 
     /**
-     * 瀵煎嚭
+     * 搴撳瓨绠$悊閲囪喘瀵煎嚭
      * @param response
      */
     @PostMapping("/exportCopy")
     public void exportCopy(HttpServletResponse response) {
-        procurementRecordService.exportCopy(response);
+        procurementRecordService.exportCopy(response,1);
     }
 
     /**
-     * 瀵煎嚭
+     * 搴撳瓨绠$悊鐢熶骇瀵煎嚭
+     * @param response
+     */
+    @PostMapping("/exportCopyOne")
+    public void exportCopyOne(HttpServletResponse response) {
+        procurementRecordService.exportCopy(response,2);
+    }
+
+    /**
+     * 搴撳瓨绠$悊鑷畾涔夊鍑�
+     * @param response
+     */
+    @PostMapping("/exportCopyTwo")
+    public void exportCopyTwo(HttpServletResponse response) {
+        procurementRecordService.exportCopyTwo(response,3);
+    }
+
+    /**
+     * 鍏ュ簱锛屽嚭搴撶鐞嗛噰璐鍑�
      * @param response
      */
     @PostMapping("/export")
     public void export(HttpServletResponse response) {
-        procurementRecordService.export(response);
+        procurementRecordService.export(response,1);
+    }
+
+    /**
+     * 鍏ュ簱锛屽嚭搴撶鐞嗙敓浜у鍑�
+     * @param response
+     */
+    @PostMapping("/exportOne")
+    public void exportOne(HttpServletResponse response) {
+        procurementRecordService.export(response,2);
+    }
+
+    @Autowired
+    private CustomStorageMapper customStorageMapper;
+
+    /**
+     * 鍏ュ簱锛屽嚭搴撶鐞嗚嚜瀹氫箟瀵煎嚭
+     * @param response
+     */
+    @PostMapping("/exportTwo")
+    public void exportTwo(HttpServletResponse response) {
+        List<CustomStorage> customStorages = customStorageMapper.selectList(null);
+        ExcelUtil<CustomStorage> util = new ExcelUtil<CustomStorage>(CustomStorage.class);
+        util.exportExcel(response, customStorages, "鍏ュ簱鍙拌处");
     }
 
 
diff --git a/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordOutController.java b/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordOutController.java
index 1a656be..5245149 100644
--- a/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordOutController.java
+++ b/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordOutController.java
@@ -2,6 +2,7 @@
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.controller.BaseController;
@@ -10,12 +11,14 @@
 import com.ruoyi.procurementrecord.dto.ProcurementRecordOutAdd;
 import com.ruoyi.procurementrecord.dto.ProcurementRecordOutPageDto;
 import com.ruoyi.procurementrecord.dto.ProcurementUpdateDto;
+import com.ruoyi.procurementrecord.mapper.ProcurementRecordOutMapper;
 import com.ruoyi.procurementrecord.service.ProcurementRecordOutService;
 import io.swagger.annotations.Api;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
+import java.util.List;
 
 /**
  * @author :yys
@@ -30,26 +33,40 @@
     private ProcurementRecordOutService procurementRecordOutService;
 
     @PostMapping("/stockout")
-    @Log(title = "閲囪喘鍏ュ簱-鍑哄簱绠$悊-鍑哄簱", businessType = BusinessType.INSERT)
+    @Log(title = "閲囪喘鍑哄簱-鍑哄簱绠$悊-鍑哄簱", businessType = BusinessType.INSERT)
     public AjaxResult stockout(@RequestBody ProcurementRecordOutAdd procurementRecordOutAdd) {
         return AjaxResult.success(procurementRecordOutService.stockout(procurementRecordOutAdd));
     }
 
     @GetMapping("/listPage")
-    @Log(title = "閲囪喘鍏ュ簱-鍑哄簱绠$悊-鍑哄簱鏌ヨ", businessType = BusinessType.OTHER)
+    @Log(title = "閲囪喘鍑哄簱-鍑哄簱鍙拌处-鍑哄簱鏌ヨ", businessType = BusinessType.OTHER)
     public AjaxResult listPage(Page page, ProcurementRecordOutPageDto procurementDto) {
         IPage<ProcurementRecordOutPageDto> result = procurementRecordOutService.listPage(page, procurementDto);
         return AjaxResult.success(result);
     }
 
+    @GetMapping("/listPageByProduct")
+    @Log(title = "鐢熶骇鍑哄簱-鍑哄簱鍙拌处-鍑哄簱鏌ヨ", businessType = BusinessType.OTHER)
+    public AjaxResult listPageByProduct(Page page, ProcurementRecordOutPageDto procurementDto) {
+        IPage<ProcurementRecordOutPageDto> result = procurementRecordOutService.listPageByProduct(page, procurementDto);
+        return AjaxResult.success(result);
+    }
+
+    @GetMapping("/listPageByCustom")
+    @Log(title = "鑷畾涔夊嚭搴�-鍑哄簱鍙拌处-鍑哄簱鏌ヨ", businessType = BusinessType.OTHER)
+    public AjaxResult listPageByCustom(Page page, ProcurementRecordOutPageDto procurementDto) {
+        IPage<ProcurementRecordOutPageDto> result = procurementRecordOutService.listPageByCustom(page, procurementDto);
+        return AjaxResult.success(result);
+    }
+
     @PostMapping("/del")
-    @Log(title = "閲囪喘鍏ュ簱-鍑哄簱绠$悊-鍒犻櫎鍑哄簱", businessType = BusinessType.DELETE)
+    @Log(title = "閲囪喘鍑哄簱-鍑哄簱鍙拌处-鍒犻櫎鍑哄簱", businessType = BusinessType.DELETE)
     public AjaxResult deletePro(@RequestBody ProcurementUpdateDto procurementDto) {
         return AjaxResult.success(procurementRecordOutService.deletePro(procurementDto));
     }
 
     /**
-     * 瀵煎嚭
+     * 閲囪喘鍑哄簱瀵煎嚭
      * @param response
      */
     @PostMapping("/export")
@@ -57,4 +74,29 @@
         procurementRecordOutService.export(response);
     }
 
+
+    @Autowired
+    public ProcurementRecordOutMapper procurementRecordOutMapper;
+    /**
+     * 鐢熶骇鍑哄簱瀵煎嚭
+     * @param response
+     */
+    @PostMapping("/exportOne")
+    public void exportOne(HttpServletResponse response) {
+        List<ProcurementRecordOutPageDto> list = procurementRecordOutMapper.listOne();
+        ExcelUtil<ProcurementRecordOutPageDto> util = new ExcelUtil<>(ProcurementRecordOutPageDto.class);
+        util.exportExcel(response, list, "鐢熶骇鍑哄簱鍙拌处");
+    }
+
+    /**
+     * 鑷畾涔夊嚭搴撳鍑�
+     * @param response
+     */
+    @PostMapping("/exportTwo")
+    public void exportTwo(HttpServletResponse response) {
+        List<ProcurementRecordOutPageDto> list = procurementRecordOutMapper.listTwo();
+        ExcelUtil<ProcurementRecordOutPageDto> util = new ExcelUtil<>(ProcurementRecordOutPageDto.class);
+        util.exportExcel(response, list, "鐢熶骇鍑哄簱鍙拌处");
+    }
+
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/dto/Details.java b/src/main/java/com/ruoyi/procurementrecord/dto/Details.java
index b2e5a21..2257765 100644
--- a/src/main/java/com/ruoyi/procurementrecord/dto/Details.java
+++ b/src/main/java/com/ruoyi/procurementrecord/dto/Details.java
@@ -10,7 +10,10 @@
  */
 @Data
 public class Details {
-    private Integer id;
-    private BigDecimal inboundQuantity;
-    private BigDecimal warnNum;
+    private Integer id;  // 浜у搧id
+    private BigDecimal inboundQuantity;  // 鍏ュ簱鏁伴噺
+    private BigDecimal warnNum;  // 棰勮鏁伴噺锛堥噰璐叆搴撴墠鏈夛級
+    //鍗曚环
+    private BigDecimal unitPrice;
+    private BigDecimal totalPrice;
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementAddDto.java b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementAddDto.java
index 73d9895..d3f35a1 100644
--- a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementAddDto.java
+++ b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementAddDto.java
@@ -15,4 +15,11 @@
 
     private String nickName;
 
+    /**
+     * 鍏ュ簱绫诲瀷 1-閲囪喘 2-鐢熶骇 3-鑷畾涔�
+     */
+    private Integer type;
+
+    private String typeName;
+
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementManagementUpdateDto.java b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementManagementUpdateDto.java
index 0356de7..ac896a2 100644
--- a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementManagementUpdateDto.java
+++ b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementManagementUpdateDto.java
@@ -17,6 +17,22 @@
     private String createBy;
     private BigDecimal minStock;
 
+
+    /**
+     * 鍗曚环
+     */
+    private BigDecimal unitPrice;
+
+    /**
+     * 鎬讳环
+     */
+    private BigDecimal totalPrice;
+
+    // 鍗曚环
+    private BigDecimal taxInclusiveUnitPrice;
+    // 鎬讳环
+    private BigDecimal taxInclusiveTotalPrice;
+
     private Long createUser;
 
     private String createTime;
diff --git a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDto.java b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDto.java
index 4f3f260..2ac434b 100644
--- a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDto.java
+++ b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDto.java
@@ -3,6 +3,7 @@
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.ruoyi.framework.aspectj.lang.annotation.Excel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import org.springframework.format.annotation.DateTimeFormat;
 
@@ -22,15 +23,36 @@
     private Long createUser;
 
     /**
+     * 鍏ュ簱绫诲瀷 1-閲囪喘 2-鐢熶骇
+     */
+    private Integer type;
+
+    /**
      * 鍏ュ簱鎵规
      */
     @Excel(name = "鍏ュ簱鎵规")
     private String inboundBatches;
 
     /**
-     * 鍚堝悓鍙�
+     * 閲囪喘鍚堝悓鍙�
      */
     private String purchaseContractNumber;
+
+    /**
+     * 閿�鍞悎鍚屽彿
+     */
+    private String salesContractNo;
+
+    /**
+     * 瀹㈡埛鍚堝悓鍙�
+     */
+    private String customerContractNo;
+
+    /**
+     * 瀹㈡埛鍚嶇О
+     */
+    @Excel(name = "瀹㈡埛鍚嶇О")
+    private String customerName;
 
     private String salesLedgerProductId;
 
@@ -40,6 +62,20 @@
     @Excel(name = "鍏ュ簱鏁伴噺")
     private BigDecimal inboundNum;
 
+    /**
+     * 鍏ュ簱鍗曚环
+     */
+    @ApiModelProperty(value = "鍏ュ簱鍗曚环")
+    @Excel(name = "鍏ュ簱鍗曚环")
+    private BigDecimal unitPrice;
+
+    /**
+     * 鍏ュ簱鎬讳环
+     */
+    @ApiModelProperty(value = "鍏ュ簱鎬讳环")
+    @Excel(name = "鍏ュ簱鎬讳环")
+    private BigDecimal totalPrice;
+
     @Excel(name = "棰勮鏁伴噺")
     private BigDecimal warnNum;
 
diff --git a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDtoCopy.java b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDtoCopy.java
index 9592ad1..b5dcb70 100644
--- a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDtoCopy.java
+++ b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDtoCopy.java
@@ -2,6 +2,7 @@
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.ruoyi.framework.aspectj.lang.annotation.Excel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.math.BigDecimal;
@@ -32,6 +33,22 @@
      */
     private String purchaseContractNumber;
 
+
+    /**
+     * 閿�鍞悎鍚屽彿
+     */
+    private String salesContractNo;
+
+    /**
+     * 瀹㈡埛鍚堝悓鍙�
+     */
+    private String customerContractNo;
+
+    /**
+     * 瀹㈡埛鍚嶇О
+     */
+    private String customerName;
+
     private String salesLedgerProductId;
 
     /**
@@ -39,6 +56,20 @@
      */
     @Excel(name = "鍏ュ簱鏁伴噺")
     private BigDecimal inboundNum;
+
+    /**
+     * 鍏ュ簱鍗曚环
+     */
+    @ApiModelProperty(value = "鍏ュ簱鍗曚环")
+    @Excel(name = "鍏ュ簱鍗曚环")
+    private BigDecimal unitPrice;
+
+    /**
+     * 鍏ュ簱鎬讳环
+     */
+    @ApiModelProperty(value = "鍏ュ簱鎬讳环")
+    @Excel(name = "鍏ュ簱鎬讳环")
+    private BigDecimal totalPrice;
 
     /**
      * 寰呭嚭搴撴暟閲�
@@ -49,7 +80,7 @@
      * 鍑哄簱鏁伴噺
      */
     @Excel(name = "鍑哄簱鏁伴噺")
-    private BigDecimal totalInboundNum;
+    private BigDecimal totalInboundNum = BigDecimal.ZERO;
 
     /**
      * 鏈�浣庡簱瀛樻暟閲�
diff --git a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutAdd.java b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutAdd.java
index 6c76cdd..9124e75 100644
--- a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutAdd.java
+++ b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutAdd.java
@@ -19,4 +19,9 @@
 
     private Integer salesLedgerProductId;
 
+    /**
+     * 鍑哄簱绫诲瀷 1-閲囪喘鍑哄簱 2-閿�鍞嚭搴� 3-鑷畾涔�
+     */
+    private Integer type;
+
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutPageDto.java b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutPageDto.java
index 55ceb9c..173893a 100644
--- a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutPageDto.java
+++ b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutPageDto.java
@@ -20,6 +20,22 @@
     private Integer id;
 
     private BigDecimal warnNum;
+    /**
+     * 閿�鍞悎鍚屽彿
+     */
+    private String salesContractNo;
+
+    /**
+     * 瀹㈡埛鍚堝悓鍙�
+     */
+    private String customerContractNo;
+
+    /**
+     * 瀹㈡埛鍚嶇О
+     */
+    @Excel(name = "瀹㈡埛鍚嶇О")
+    private String customerName;
+
 
     /**
      * 鍑哄叆搴撴暟閲�
@@ -28,10 +44,22 @@
     private BigDecimal inboundNum;
 
     /**
+     * 鍗曚环
+     */
+    @Excel(name = "鍗曚环")
+    private BigDecimal unitPrice;
+
+    /**
+     * 鎬讳环
+     */
+    @Excel(name = "鎬讳环")
+    private BigDecimal totalPrice;
+
+    /**
      * 鍑哄叆搴撴椂闂�
      */
 //    @Excel(name = "鍑哄簱鏃堕棿")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
     private LocalDateTime createTime;
 
     private String timeStr;
@@ -50,6 +78,8 @@
      */
     @Excel(name = "渚涘簲鍟嗗悕绉�")
     private String supplierName;
+
+
 
 
     /**
@@ -94,4 +124,8 @@
     @Excel(name = "涓嶅惈绋庢�讳环")
     private BigDecimal taxExclusiveTotalPrice;
 
+    /**
+     * 鐗╁搧绫诲瀷
+     */
+    private String itemType;
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementUpdateDto.java b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementUpdateDto.java
index 82e02f1..1a51301 100644
--- a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementUpdateDto.java
+++ b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementUpdateDto.java
@@ -18,6 +18,15 @@
 
     private BigDecimal quantityStock;
 
+    private BigDecimal unitPrice;
+
+    private BigDecimal totalPrice;
+
     private List<Integer> ids;
 
+    /**
+     * 鍑哄簱绫诲瀷 1-閲囪喘 2-閿�鍞� 3-鑷畾涔�
+     */
+    private Integer type;
+
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/mapper/CustomStorageMapper.java b/src/main/java/com/ruoyi/procurementrecord/mapper/CustomStorageMapper.java
new file mode 100644
index 0000000..1b4b703
--- /dev/null
+++ b/src/main/java/com/ruoyi/procurementrecord/mapper/CustomStorageMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.procurementrecord.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.procurementrecord.pojo.CustomStorage;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * @author :yys
+ * @date : 2025/11/10 13:11
+ */
+public interface CustomStorageMapper extends BaseMapper<CustomStorage> {
+    IPage<CustomStorage> listPageCopyByCustom(Page page,@Param("req") CustomStorage customStorageLambdaQueryWrapper);
+}
diff --git a/src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordMapper.java b/src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordMapper.java
index 1336f39..183d62c 100644
--- a/src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordMapper.java
+++ b/src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordMapper.java
@@ -30,5 +30,13 @@
 
     List<ProcurementPageDtoCopy> listCopy();
 
+    List<ProcurementPageDtoCopy> listCopyOne();
+
     List<ProcurementPageDto> list();
+
+    List<ProcurementPageDto> listOne();
+
+    IPage<ProcurementPageDto> listPageByProduction(Page page, @Param("req") ProcurementPageDto procurementDto);
+
+    IPage<ProcurementPageDtoCopy> listPageCopyByProduction(Page page, @Param("req") ProcurementPageDto procurementDto);
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordOutMapper.java b/src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordOutMapper.java
index 4a9390b..6cd9dab 100644
--- a/src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordOutMapper.java
+++ b/src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordOutMapper.java
@@ -18,4 +18,12 @@
     IPage<ProcurementRecordOutPageDto> listPage(Page page,@Param("req") ProcurementRecordOutPageDto procurementDto);
 
     List<ProcurementRecordOutPageDto> list();
+
+    List<ProcurementRecordOutPageDto> listOne();
+
+    List<ProcurementRecordOutPageDto> listTwo();
+
+    IPage<ProcurementRecordOutPageDto> listPageByProduct(Page page,@Param("req") ProcurementRecordOutPageDto procurementDto);
+
+    IPage<ProcurementRecordOutPageDto> listPageByCustom(Page page,@Param("req") ProcurementRecordOutPageDto procurementDto);
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/pojo/CustomStorage.java b/src/main/java/com/ruoyi/procurementrecord/pojo/CustomStorage.java
new file mode 100644
index 0000000..c9930a2
--- /dev/null
+++ b/src/main/java/com/ruoyi/procurementrecord/pojo/CustomStorage.java
@@ -0,0 +1,119 @@
+package com.ruoyi.procurementrecord.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.framework.aspectj.lang.annotation.Excel;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+/**
+ * @author :yys
+ * @date : 2025/11/10 11:51
+ */
+@TableName("custom_storage")
+@Data
+public class CustomStorage {
+
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    // 鍏ュ簱鏃堕棿
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "鍏ュ簱鏃堕棿", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date inboundDate;
+
+    @TableField(exist = false)
+    private String timeStr;
+
+    /**
+     * 寰呭嚭搴撴暟閲�
+     */
+    @Excel(name = "寰呭嚭搴撴暟閲�")
+    @TableField(exist = false)
+    private BigDecimal inboundNum0;
+    /**
+     * 鍑哄簱鏁伴噺
+     */
+    @Excel(name = "鍑哄簱鏁伴噺")
+    @TableField(exist = false)
+    private BigDecimal totalInboundNum = BigDecimal.ZERO;
+    // 鐗╁搧绫诲瀷
+    @Excel(name = "鐗╁搧绫诲瀷")
+    private String itemType;
+    // 鍏ュ簱鎵规
+    @Excel(name = "鍏ュ簱鎵规")
+    private String inboundBatches;
+    // 鍏ュ簱鏁伴噺
+    @Excel(name = "鍏ュ簱鏁伴噺")
+    private BigDecimal inboundNum;
+    // 渚涘簲鍟嗗悕绉�
+    @Excel(name = "渚涘簲鍟嗗悕绉�")
+    private String supplierName;
+    // 浜у搧澶х被
+    @Excel(name = "浜у搧澶х被")
+    private String productCategory;
+    // 瑙勬牸鍨嬪彿
+    @Excel(name = "瑙勬牸鍨嬪彿")
+    private String specificationModel;
+    // 鍗曚綅
+    @Excel(name = "鍗曚綅")
+    private String unit;
+    // 鍚◣鍗曚环
+    @Excel(name = "鍚◣鍗曚环")
+    private BigDecimal taxInclusiveUnitPrice;
+    // 鍚◣鎬讳环
+    @Excel(name = "鍚◣鎬讳环")
+    private BigDecimal taxInclusiveTotalPrice;
+    // 绋庣巼(%)
+    @Excel(name = "绋庣巼(%)")
+    private BigDecimal taxRate;
+    // 涓嶅惈绋庢�讳环
+    @Excel(name = "涓嶅惈绋庢�讳环")
+    private BigDecimal taxExclusiveTotalPrice;
+    /**
+     * 鍏ュ簱鐢ㄦ埛
+     */
+    @Excel(name = "鍏ュ簱鐢ㄦ埛")
+    private String createBy;
+    /**
+     * 鍏ュ簱鐢ㄦ埛id
+     */
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    /**
+     * 鍏ュ簱鏃堕棿
+     */
+    @TableField(fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDateTime createTime;
+
+    /**
+     * 淇敼鑰�
+     */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    /**
+     * 淇敼鏃堕棿
+     */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime updateTime;
+
+    /**
+     * 绉熸埛ID
+     */
+    @TableField(fill = FieldFill.INSERT)
+    private Long tenantId;
+
+}
diff --git a/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java b/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java
index b09b0f3..7f1cde6 100644
--- a/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java
+++ b/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java
@@ -1,6 +1,8 @@
 package com.ruoyi.procurementrecord.pojo;
 
 import com.baomidou.mybatisplus.annotation.*;
+import com.ruoyi.framework.aspectj.lang.annotation.Excel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Builder;
 import lombok.Data;
 
@@ -22,7 +24,7 @@
     private Integer id;
 
     /**
-     * 浜у搧淇℃伅琛╥d
+     * 浜у搧淇℃伅琛╥d锛堣嚜瀹氫箟鍏ュ簱鏃朵负0锛�
      */
     private Integer salesLedgerProductId;
 
@@ -43,32 +45,42 @@
     private String inboundBatches;
 
     /**
-     * 鍑哄嚭搴撴暟閲�
+     * 鍑哄簱鏁伴噺
      */
     private BigDecimal inboundNum;
 
+
     /**
-     * 鍑哄嚭搴撶敤鎴�
+     * 鍑哄簱绫诲瀷 1-閲囪喘 2-閿�鍞� 3-鑷畾涔�
+     */
+    private Integer type;
+
+    /**
+     * 鍑哄簱鐢ㄦ埛
      */
     private String createBy;
     /**
      * 鍏ュ簱鐢ㄦ埛id
      */
+    @TableField(fill = FieldFill.INSERT)
     private Long createUser;
 
     /**
      * 鍏ュ簱鏃堕棿
      */
+    @TableField(fill = FieldFill.INSERT)
     private LocalDateTime createTime;
 
     /**
      * 淇敼鑰�
      */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
     private Long updateUser;
 
     /**
      * 淇敼鏃堕棿
      */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
     private LocalDateTime updateTime;
 
     /**
diff --git a/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java b/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java
index 28cee3c..5240715 100644
--- a/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java
+++ b/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java
@@ -37,9 +37,24 @@
     private BigDecimal inboundNum;
 
     /**
+     * 鍗曚环
+     */
+    private BigDecimal unitPrice;
+
+    /**
+     * 鎬讳环
+     */
+    private BigDecimal totalPrice;
+
+    /**
      * 棰勮鏁伴噺
      */
     private BigDecimal warnNum;
+
+    /**
+     * 鍏ュ簱绫诲瀷 1-閲囪喘鍏ュ簱 2-鐢熶骇鍏ュ簱
+     */
+    private Integer type;
 //    /**
 //     * 鏈�浣庡簱瀛樻暟閲�
 //     */
@@ -54,21 +69,25 @@
     /**
      * 鍏ュ簱鐢ㄦ埛id
      */
+    @TableField(fill = FieldFill.INSERT)
     private Long createUser;
 
     /**
      * 鍏ュ簱鏃堕棿
      */
+    @TableField(fill = FieldFill.INSERT)
     private LocalDateTime createTime;
 
     /**
      * 淇敼鑰�
      */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
     private Long updateUser;
 
     /**
      * 淇敼鏃堕棿
      */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
     private LocalDateTime updateTime;
 
     /**
diff --git a/src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordOutService.java b/src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordOutService.java
index 785efc4..a8fb7eb 100644
--- a/src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordOutService.java
+++ b/src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordOutService.java
@@ -23,4 +23,8 @@
     int deletePro(ProcurementUpdateDto procurementDto);
 
     void export(HttpServletResponse response);
+
+    IPage<ProcurementRecordOutPageDto> listPageByProduct(Page page, ProcurementRecordOutPageDto procurementDto);
+
+    IPage<ProcurementRecordOutPageDto> listPageByCustom(Page page, ProcurementRecordOutPageDto procurementDto);
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java b/src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java
index 79603ae..56e9bc7 100644
--- a/src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java
+++ b/src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java
@@ -3,7 +3,9 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.procurementrecord.dto.*;
+import com.ruoyi.procurementrecord.pojo.CustomStorage;
 import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage;
 
 import javax.servlet.http.HttpServletResponse;
@@ -27,11 +29,29 @@
 
     int deletePro(ProcurementUpdateDto procurementDto);
 
-    void export(HttpServletResponse response);
+    void export(HttpServletResponse response,Integer type);
 
     int updateManagement(ProcurementManagementUpdateDto procurementDto);
 
-    void exportCopy(HttpServletResponse response);
+    void exportCopy(HttpServletResponse response,Integer type);
+
+    void exportCopyTwo(HttpServletResponse response,Integer type);
 
     Map<String, Object> getReportList(Page page, ProcurementPageDto procurementDto);
+
+    IPage<ProcurementPageDto> listPageByProduction(Page page, ProcurementPageDto procurementDto);
+
+    AjaxResult addCustom(List<CustomStorage> customStorage);
+
+    IPage<CustomStorage> listPageByCustom(Page page, CustomStorage customStorage);
+
+    IPage<ProcurementPageDtoCopy> listPageCopyByProduction(Page page, ProcurementPageDto procurementDto);
+
+    IPage<CustomStorage> listPageCopyByCustom(Page page, CustomStorage customStorage);
+
+    AjaxResult updateCustom(CustomStorage customStorage);
+
+    AjaxResult deleteCustom(List<Long> ids);
+
+    int updateManagementByCustom(ProcurementManagementUpdateDto procurementDto);
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordOutServiceImpl.java b/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordOutServiceImpl.java
index 29cba69..0735a39 100644
--- a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordOutServiceImpl.java
+++ b/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordOutServiceImpl.java
@@ -16,6 +16,7 @@
 import com.ruoyi.project.system.mapper.SysUserMapper;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
@@ -24,6 +25,7 @@
 import java.text.DateFormat;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.LocalTime;
 import java.time.format.DateTimeFormatter;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -54,7 +56,15 @@
         procurementRecordOutLambdaQueryWrapper.ge(ProcurementRecordOut::getCreateTime, now)  // 澶т簬绛変簬褰撳ぉ
                 .lt(ProcurementRecordOut::getCreateTime, now.plusDays(1)); // 灏忎簬鏄庡ぉ
         Long aLong1 = procurementRecordOutMapper.selectCount(procurementRecordOutLambdaQueryWrapper);
-
+        // 2. 瀹氫箟鏃ユ湡鏍煎紡锛堝繀椤讳笌瀛楃涓叉牸寮忓畬鍏ㄥ尮閰嶏級
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        LocalDateTime localDateTime = null;
+        // 3. 杞崲锛歋tring 鈫� LocalDate 鈫� LocalDateTime锛堣ˉ鍏�0鐐规椂闂达級
+        if(StringUtils.isNotEmpty(procurementRecordOutAdd.getTime())){
+            LocalDate localDate = LocalDate.parse(procurementRecordOutAdd.getTime(), formatter);
+            // 鑾峰彇褰撳墠鏃跺垎绉�
+            LocalTime localTime = LocalTime.now();
+            localDateTime = localDate.atTime(localTime);}
         // 鏌ヨ閲囪喘鍑哄簱鏁伴噺
         LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
         procurementRecordLambdaQueryWrapper.eq(ProcurementRecordOut::getProcurementRecordStorageId, procurementRecordOutAdd.getId());
@@ -65,7 +75,8 @@
                 .salesLedgerProductId(procurementRecordOutAdd.getSalesLedgerProductId())
                 .inboundBatches(aLong.equals(0L) ? "绗�1鎵规" : "绗�"+ (aLong + 1) + "鎵规")
                 .inboundNum(new BigDecimal(procurementRecordOutAdd.getQuantity()))
-                .createTime(LocalDateTime.now())
+                .type(procurementRecordOutAdd.getType())
+                .createTime(localDateTime == null ? LocalDateTime.now() : localDateTime)
                 .createUser(Long.valueOf(procurementRecordOutAdd.getUserId()))
                 .createBy(sysUser.getNickName())
                 .updateUser(Long.valueOf(procurementRecordOutAdd.getUserId()))
@@ -95,8 +106,18 @@
 
     @Override
     public void export(HttpServletResponse response) {
-        List<ProcurementRecordOutPageDto> list =procurementRecordOutMapper.list();
+        List<ProcurementRecordOutPageDto> list = procurementRecordOutMapper.list();
         ExcelUtil<ProcurementRecordOutPageDto> util = new ExcelUtil<>(ProcurementRecordOutPageDto.class);
         util.exportExcel(response, list, "鍑哄簱鍙拌处");
     }
+
+    @Override
+    public IPage<ProcurementRecordOutPageDto> listPageByProduct(Page page, ProcurementRecordOutPageDto procurementDto) {
+        return procurementRecordOutMapper.listPageByProduct(page, procurementDto);
+    }
+
+    @Override
+    public IPage<ProcurementRecordOutPageDto> listPageByCustom(Page page, ProcurementRecordOutPageDto procurementDto) {
+        return procurementRecordOutMapper.listPageByCustom(page, procurementDto);
+    }
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java b/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
index 1675069..ab73804 100644
--- a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
+++ b/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
@@ -7,9 +7,12 @@
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.framework.security.LoginUser;
+import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.procurementrecord.dto.*;
+import com.ruoyi.procurementrecord.mapper.CustomStorageMapper;
 import com.ruoyi.procurementrecord.mapper.ProcurementRecordMapper;
 import com.ruoyi.procurementrecord.mapper.ProcurementRecordOutMapper;
+import com.ruoyi.procurementrecord.pojo.CustomStorage;
 import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage;
 import com.ruoyi.procurementrecord.pojo.ProcurementRecordOut;
 import com.ruoyi.procurementrecord.service.ProcurementRecordService;
@@ -21,6 +24,7 @@
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
 
 import javax.servlet.http.HttpServletResponse;
 import java.math.BigDecimal;
@@ -106,6 +110,8 @@
         procurementRecordStorageById.setWarnNum(procurementDto.getWarnNum());
         procurementRecordStorageById.setUpdateUser(SecurityUtils.getLoginUser().getUserId());
         procurementRecordStorageById.setUpdateTime(LocalDateTime.now());
+        procurementRecordStorageById.setUnitPrice(procurementDto.getUnitPrice());
+        procurementRecordStorageById.setTotalPrice(procurementDto.getTotalPrice());
         return procurementRecordMapper.updateById(procurementRecordStorageById);
     }
 
@@ -115,7 +121,8 @@
         procurementRecordMapper.deleteBatchIds(procurementRecordStorageById.stream().map(ProcurementRecordStorage::getId).collect(Collectors.toList()));
         // 鍒犻櫎鎵�鏈夊搴旂殑鍑哄簱璁板綍
         LambdaQueryWrapper<ProcurementRecordOut> procurementRecordOutLambdaQueryWrapper = new LambdaQueryWrapper<>();
-        procurementRecordOutLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, procurementDto.getIds());
+        procurementRecordOutLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, procurementDto.getIds())
+                .eq(ProcurementRecordOut::getType,procurementDto.getType());
         List<ProcurementRecordOut> procurementRecordOuts = procurementRecordOutMapper.selectList(procurementRecordOutLambdaQueryWrapper);
         if(!CollectionUtils.isEmpty(procurementRecordOuts)){
             procurementRecordOutMapper.deleteBatchIds(procurementRecordOuts.stream().map(ProcurementRecordOut::getId).collect(Collectors.toList()));
@@ -124,8 +131,13 @@
     }
 
     @Override
-    public void export(HttpServletResponse response) {
-        List<ProcurementPageDto> list =procurementRecordMapper.list();
+    public void export(HttpServletResponse response,Integer type) {
+        List<ProcurementPageDto> list = new ArrayList<>();
+        if(type == 1){
+            list = procurementRecordMapper.list();
+        }else{
+            list = procurementRecordMapper.listOne();
+        }
         // 璁$畻寰呭叆搴撴暟閲�
         // 鏌ヨ閲囪喘璁板綍宸插叆搴撴暟閲�
         List<Integer> collect = list.stream().map(ProcurementPageDto::getId).collect(Collectors.toList());
@@ -136,6 +148,7 @@
         }
         LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
         procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, collect);
+        procurementRecordLambdaQueryWrapper.eq(ProcurementRecordOut::getType, type);
         List<ProcurementRecordOut> procurementRecords = procurementRecordOutMapper.selectList(procurementRecordLambdaQueryWrapper);
         if(CollectionUtils.isEmpty( procurementRecords)){
             ExcelUtil<ProcurementPageDto> util = new ExcelUtil<ProcurementPageDto>(ProcurementPageDto.class);
@@ -182,21 +195,39 @@
         if(salesLedgerProduct == null){
             throw new RuntimeException("閿�鍞彴璐︿骇鍝佷笉瀛樺湪");
         }
+        // 鏍规嵁澶х被锛岃鏍兼煡璇㈡墍鏈変骇鍝乮d
+        LambdaQueryWrapper<SalesLedgerProduct> salesLedgerProductLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        salesLedgerProductLambdaQueryWrapper.eq(SalesLedgerProduct::getProductCategory, salesLedgerProduct.getProductCategory())
+                .eq(SalesLedgerProduct::getSpecificationModel, salesLedgerProduct.getSpecificationModel())
+                .eq(SalesLedgerProduct::getType, 1);
+        List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectList(salesLedgerProductLambdaQueryWrapper);
+        if(CollectionUtils.isEmpty(salesLedgerProducts)){
+            throw new RuntimeException("娌℃湁鎵惧埌瀵瑰簲鐨勪骇鍝�");
+        }
         salesLedgerProduct.setMinStock(procurementDto.getMinStock());
         salesLedgerProductMapper.updateById(salesLedgerProduct);
-        ProcurementRecordStorage procurementRecordStorageById = getProcurementRecordById(procurementDto.getId());
-        procurementRecordStorageById.setCreateBy(sysUser.getNickName());
-        procurementRecordStorageById.setCreateUser(sysUser.getUserId());
-        procurementRecordStorageById.setUpdateTime(LocalDateTime.parse(entryDateStr,df));
-        procurementRecordStorageById.setUpdateUser(loginUser.getUserId());
-        procurementRecordStorageById.setCreateTime(LocalDateTime.parse(createTimeStr,df));
-        procurementRecordMapper.updateById(procurementRecordStorageById);
+        LambdaQueryWrapper<ProcurementRecordStorage> procurementRecordStorageLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        procurementRecordStorageLambdaQueryWrapper.in(ProcurementRecordStorage::getSalesLedgerProductId, salesLedgerProducts.stream().map(SalesLedgerProduct::getId).collect(Collectors.toList()));
+        ProcurementRecordStorage procurementRecordStorage = ProcurementRecordStorage.builder().build();
+        procurementRecordStorage.setUnitPrice(procurementDto.getUnitPrice());
+        procurementRecordStorage.setTotalPrice(procurementDto.getTotalPrice());
+        procurementRecordStorage.setCreateBy(sysUser.getNickName());
+        procurementRecordStorage.setCreateUser(sysUser.getUserId());
+        procurementRecordStorage.setUpdateTime(LocalDateTime.parse(entryDateStr,df));
+        procurementRecordStorage.setUpdateUser(loginUser.getUserId());
+        procurementRecordStorage.setCreateTime(LocalDateTime.parse(createTimeStr,df));
+        procurementRecordMapper.update(procurementRecordStorage,procurementRecordStorageLambdaQueryWrapper);
         return 0;
     }
 
     @Override
-    public void exportCopy(HttpServletResponse response) {
-        List<ProcurementPageDtoCopy> list =procurementRecordMapper.listCopy();
+    public void exportCopy(HttpServletResponse response,Integer type) {
+        List<ProcurementPageDtoCopy> list = new ArrayList<>();
+        if(type == 1){
+            list = procurementRecordMapper.listCopy();
+        }else{
+            list = procurementRecordMapper.listCopyOne();
+        }
         // 璁$畻寰呭叆搴撴暟閲�
         // 鏌ヨ閲囪喘璁板綍宸插叆搴撴暟閲�
         List<Integer> collect = list.stream().map(ProcurementPageDtoCopy::getId).collect(Collectors.toList());
@@ -207,6 +238,7 @@
         }
         LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
         procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, collect);
+        procurementRecordLambdaQueryWrapper.eq(ProcurementRecordOut::getType, type);
         List<ProcurementRecordOut> procurementRecords = procurementRecordOutMapper.selectList(procurementRecordLambdaQueryWrapper);
         if(CollectionUtils.isEmpty( procurementRecords)){
             ExcelUtil<ProcurementPageDtoCopy> util = new ExcelUtil<ProcurementPageDtoCopy>(ProcurementPageDtoCopy.class);
@@ -234,6 +266,53 @@
             dto.setInboundNum0(dto.getInboundNum().subtract(totalInboundNum));
         }
         ExcelUtil<ProcurementPageDtoCopy> util = new ExcelUtil<ProcurementPageDtoCopy>(ProcurementPageDtoCopy.class);
+        util.exportExcel(response, list, "搴撳瓨绠$悊");
+    }
+
+    @Override
+    public void exportCopyTwo(HttpServletResponse response,Integer type) {
+        LambdaQueryWrapper<CustomStorage> customStorageLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        customStorageLambdaQueryWrapper.groupBy(CustomStorage::getSupplierName, CustomStorage::getProductCategory, CustomStorage::getSpecificationModel);
+        List<CustomStorage> list = customStorageMapper.selectList(customStorageLambdaQueryWrapper);
+        // 璁$畻寰呭叆搴撴暟閲�
+        // 鏌ヨ閲囪喘璁板綍宸插叆搴撴暟閲�
+        List<Integer> collect = list.stream().map(CustomStorage::getId).collect(Collectors.toList());
+        if(CollectionUtils.isEmpty( collect)){
+            ExcelUtil<CustomStorage> util = new ExcelUtil<CustomStorage>(CustomStorage.class);
+            util.exportExcel(response, list, "搴撳瓨绠$悊");
+            return;
+        }
+        LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, collect);
+        procurementRecordLambdaQueryWrapper.eq(ProcurementRecordOut::getType, type);
+        procurementRecordLambdaQueryWrapper.eq(ProcurementRecordOut::getType, type);
+        List<ProcurementRecordOut> procurementRecords = procurementRecordOutMapper.selectList(procurementRecordLambdaQueryWrapper);
+        if(CollectionUtils.isEmpty( procurementRecords)){
+            ExcelUtil<CustomStorage> util = new ExcelUtil<CustomStorage>(CustomStorage.class);
+            util.exportExcel(response, list, "搴撳瓨绠$悊");
+            return;
+        }
+        for (CustomStorage dto : list) {
+            // 鏍规嵁閲囪喘鍙拌处ID绛涢�夊搴旂殑鍑哄簱璁板綍
+            List<ProcurementRecordOut> collect1 = procurementRecords.stream()
+                    .filter(ProcurementRecordOut -> ProcurementRecordOut.getProcurementRecordStorageId().equals(dto.getId()))
+                    .collect(Collectors.toList());
+
+            // 濡傛灉娌℃湁鐩稿叧鐨勫嚭搴撹褰曪紝璺宠繃璇ユ潯鏁版嵁
+            if(CollectionUtils.isEmpty(collect1)){
+                dto.setInboundNum0(dto.getInboundNum());
+                continue;
+            }
+
+            // 璁$畻宸插嚭搴撴暟閲忔�诲拰锛屽苟璁剧疆寰呭嚭搴撴暟閲�
+            BigDecimal totalInboundNum = collect1.stream()
+                    .map(ProcurementRecordOut::getInboundNum)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+            // 寰呭嚭搴撴暟閲� = 鎬绘暟閲� - 宸插嚭搴撴暟閲�
+            dto.setInboundNum0(dto.getInboundNum().subtract(totalInboundNum));
+        }
+        ExcelUtil<CustomStorage> util = new ExcelUtil<CustomStorage>(CustomStorage.class);
         util.exportExcel(response, list, "搴撳瓨绠$悊");
     }
 
@@ -336,20 +415,271 @@
     }
 
     @Override
+    public IPage<ProcurementPageDto> listPageByProduction(Page page, ProcurementPageDto procurementDto) {
+        IPage<ProcurementPageDto> procurementPageDtoIPage = procurementRecordMapper.listPageByProduction(page, procurementDto);
+        List<ProcurementPageDto> procurementPageDtos = procurementPageDtoIPage.getRecords();
+        // 璁$畻寰呭叆搴撴暟閲�
+        // 鏌ヨ閲囪喘璁板綍宸插叆搴撴暟閲�
+        List<Integer> collect = procurementPageDtos.stream().map(ProcurementPageDto::getId).collect(Collectors.toList());
+        if(CollectionUtils.isEmpty( collect)){
+            return procurementPageDtoIPage;
+        }
+        LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, collect)
+                .eq(ProcurementRecordOut::getType,2);
+        List<ProcurementRecordOut> procurementRecords = procurementRecordOutMapper.selectList(procurementRecordLambdaQueryWrapper);
+        if(CollectionUtils.isEmpty( procurementRecords)){
+            return procurementPageDtoIPage;
+        }
+        for (ProcurementPageDto dto : procurementPageDtos) {
+            // 鏍规嵁閲囪喘鍙拌处ID绛涢�夊搴旂殑鍑哄簱璁板綍
+            List<ProcurementRecordOut> collect1 = procurementRecords.stream()
+                    .filter(ProcurementRecordOut -> ProcurementRecordOut.getProcurementRecordStorageId().equals(dto.getId()))
+                    .collect(Collectors.toList());
+
+            // 濡傛灉娌℃湁鐩稿叧鐨勫嚭搴撹褰曪紝璺宠繃璇ユ潯鏁版嵁
+            if(CollectionUtils.isEmpty(collect1)){
+                dto.setInboundNum0(dto.getInboundNum());
+                continue;
+            }
+
+            // 璁$畻宸插嚭搴撴暟閲忔�诲拰锛屽苟璁剧疆寰呭嚭搴撴暟閲�
+            BigDecimal totalInboundNum = collect1.stream()
+                    .map(ProcurementRecordOut::getInboundNum)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+            // 寰呭嚭搴撴暟閲� = 鎬绘暟閲� - 宸插嚭搴撴暟閲�
+            dto.setInboundNum0(dto.getInboundNum().subtract(totalInboundNum));
+        }
+        return procurementPageDtoIPage;
+    }
+
+    private final CustomStorageMapper customStorageMapper;
+
+    @Override
+    public AjaxResult addCustom(List<CustomStorage> customStorage) {
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        if(CollectionUtils.isEmpty(customStorage)){
+            return AjaxResult.error("鏁版嵁涓嶈兘涓虹┖");
+        }
+        customStorage.forEach(item -> {
+            // 鏌ヨ閲囪喘鍏ュ簱鏁伴噺
+            Long aLong = customStorageMapper.selectCount(null);
+            item.setInboundBatches(aLong.equals(0L) ? "绗�1鎵规(鑷畾涔夊叆搴�)" : "绗�"+ (aLong + 1) + "鎵规(鑷畾涔夊叆搴�)" );
+            item.setCreateBy(loginUser.getNickName());
+            customStorageMapper.insert(item);
+        });
+        return AjaxResult.success("鑷畾涔夊叆搴撴垚鍔�");
+    }
+
+    @Override
+    public IPage<CustomStorage> listPageByCustom(Page page, CustomStorage customStorage) {
+        LambdaQueryWrapper<CustomStorage> customStorageLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        if(customStorage != null){
+            if(!StringUtils.isEmpty(customStorage.getSupplierName())){
+                customStorageLambdaQueryWrapper.like(CustomStorage::getSupplierName, customStorage.getSupplierName());
+            }
+            // 绛涢�夊叆搴撴椂闂�
+            if(customStorage.getTimeStr() != null){
+                customStorageLambdaQueryWrapper.eq(CustomStorage::getInboundDate, customStorage.getTimeStr());
+            }
+            if(!StringUtils.isEmpty(customStorage.getProductCategory())){
+                customStorageLambdaQueryWrapper.like(CustomStorage::getProductCategory, customStorage.getProductCategory());
+            }
+        }
+        customStorageLambdaQueryWrapper.orderByDesc(CustomStorage::getInboundDate);
+        IPage<CustomStorage> procurementPageDtoIPage = customStorageMapper.selectPage(page, customStorageLambdaQueryWrapper);
+        procurementPageDtoIPage.getRecords().forEach(item -> item.setInboundNum0(item.getInboundNum()));
+        List<CustomStorage> procurementPageDtos = procurementPageDtoIPage.getRecords();
+        // 璁$畻寰呭叆搴撴暟閲�
+        // 鏌ヨ閲囪喘璁板綍宸插叆搴撴暟閲�
+        List<Integer> collect = procurementPageDtos.stream().map(CustomStorage::getId).collect(Collectors.toList());
+        if(CollectionUtils.isEmpty( collect)){
+            return procurementPageDtoIPage;
+        }
+        LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, collect)
+                .eq(ProcurementRecordOut::getType, 3);
+        List<ProcurementRecordOut> procurementRecords = procurementRecordOutMapper.selectList(procurementRecordLambdaQueryWrapper);
+        if(CollectionUtils.isEmpty( procurementRecords)){
+            return procurementPageDtoIPage;
+        }
+        for (CustomStorage dto : procurementPageDtos) {
+            // 鏍规嵁閲囪喘鍙拌处ID绛涢�夊搴旂殑鍑哄簱璁板綍
+            List<ProcurementRecordOut> collect1 = procurementRecords.stream()
+                    .filter(ProcurementRecordOut -> ProcurementRecordOut.getProcurementRecordStorageId().equals(dto.getId()))
+                    .collect(Collectors.toList());
+
+            // 濡傛灉娌℃湁鐩稿叧鐨勫嚭搴撹褰曪紝璺宠繃璇ユ潯鏁版嵁
+            if(CollectionUtils.isEmpty(collect1)){
+                dto.setInboundNum0(dto.getInboundNum());
+                continue;
+            }
+
+            // 璁$畻宸插嚭搴撴暟閲忔�诲拰锛屽苟璁剧疆寰呭嚭搴撴暟閲�
+            BigDecimal totalInboundNum = collect1.stream()
+                    .map(ProcurementRecordOut::getInboundNum)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+            // 寰呭嚭搴撴暟閲� = 鎬绘暟閲� - 宸插嚭搴撴暟閲�
+            dto.setInboundNum0(dto.getInboundNum().subtract(totalInboundNum));
+        }
+        return procurementPageDtoIPage;
+    }
+
+    @Override
+    public IPage<ProcurementPageDtoCopy> listPageCopyByProduction(Page page, ProcurementPageDto procurementDto) {
+        IPage<ProcurementPageDtoCopy> procurementPageDtoCopyIPage = procurementRecordMapper.listPageCopyByProduction(page, procurementDto);
+        List<ProcurementPageDtoCopy> procurementPageDtoCopyList = procurementPageDtoCopyIPage.getRecords();
+        // 璁$畻寰呭叆搴撴暟閲�
+        // 鏌ヨ閲囪喘璁板綍宸插叆搴撴暟閲�
+        List<Integer> collect = procurementPageDtoCopyList.stream().map(ProcurementPageDtoCopy::getId).collect(Collectors.toList());
+        if(CollectionUtils.isEmpty( collect)){
+            return procurementPageDtoCopyIPage;
+        }
+        LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, collect);
+        procurementRecordLambdaQueryWrapper.eq(ProcurementRecordOut::getType, 2);
+        List<ProcurementRecordOut> procurementRecords = procurementRecordOutMapper.selectList(procurementRecordLambdaQueryWrapper);
+        if(CollectionUtils.isEmpty( procurementRecords)){
+            return procurementPageDtoCopyIPage;
+        }
+        for (ProcurementPageDtoCopy dto : procurementPageDtoCopyList) {
+            // 鏍规嵁閲囪喘鍙拌处ID绛涢�夊搴旂殑鍑哄簱璁板綍
+            List<ProcurementRecordOut> collect1 = procurementRecords.stream()
+                    .filter(ProcurementRecordOut -> ProcurementRecordOut.getProcurementRecordStorageId().equals(dto.getId()))
+                    .collect(Collectors.toList());
+
+            // 濡傛灉娌℃湁鐩稿叧鐨勫嚭搴撹褰曪紝璺宠繃璇ユ潯鏁版嵁
+            if(CollectionUtils.isEmpty(collect1)){
+                dto.setInboundNum0(dto.getInboundNum());
+                dto.setTotalInboundNum(BigDecimal.ZERO);
+                continue;
+            }
+
+            // 璁$畻宸插嚭搴撴暟閲忔�诲拰锛屽苟璁剧疆寰呭嚭搴撴暟閲�
+            BigDecimal totalInboundNum = collect1.stream()
+                    .map(ProcurementRecordOut::getInboundNum)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+            // 鍑哄簱鏁伴噺 = 鎬绘暟閲� - 寰呭嚭搴撴暟閲�
+            dto.setTotalInboundNum(totalInboundNum);
+            // 寰呭嚭搴撴暟閲� = 鎬绘暟閲� - 宸插嚭搴撴暟閲�
+            dto.setInboundNum0(dto.getInboundNum().subtract(totalInboundNum));
+            // 搴撳瓨浠峰��
+            if(dto.getUnitPrice() != null){
+                dto.setTotalPrice(dto.getTotalInboundNum().multiply(dto.getUnitPrice()));
+            }
+        }
+        return procurementPageDtoCopyIPage;
+    }
+
+    @Override
+    public IPage<CustomStorage> listPageCopyByCustom(Page page, CustomStorage customStorage) {
+//        LambdaQueryWrapper<CustomStorage> customStorageLambdaQueryWrapper = new LambdaQueryWrapper<>();
+//        customStorageLambdaQueryWrapper.groupBy(CustomStorage::getProductCategory, CustomStorage::getSpecificationModel,CustomStorage::getTaxInclusiveUnitPrice);
+//        if(customStorage != null){
+//            if(!StringUtils.isEmpty(customStorage.getSupplierName())){
+//                customStorageLambdaQueryWrapper.like(CustomStorage::getSupplierName, customStorage.getSupplierName());
+//            }
+//            // 绛涢�夊叆搴撴椂闂�
+//            if(customStorage.getInboundDate() != null){
+//                customStorageLambdaQueryWrapper.eq(CustomStorage::getInboundDate, customStorage.getInboundDate());
+//            }
+//            if(!StringUtils.isEmpty(customStorage.getProductCategory())){
+//                customStorageLambdaQueryWrapper.like(CustomStorage::getProductCategory, customStorage.getProductCategory());
+//            }
+//        }
+//        customStorageLambdaQueryWrapper.orderByDesc(CustomStorage::getInboundDate);
+        IPage<CustomStorage> pageList = customStorageMapper.listPageCopyByCustom(page, customStorage);
+
+        List<CustomStorage> procurementPageDtoCopyList = pageList.getRecords();
+        // 璁$畻寰呭叆搴撴暟閲�
+        // 鏌ヨ閲囪喘璁板綍宸插叆搴撴暟閲�
+        List<Integer> collect = procurementPageDtoCopyList.stream().map(CustomStorage::getId).collect(Collectors.toList());
+        if(CollectionUtils.isEmpty( collect)){
+            return pageList;
+        }
+        LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, collect);
+        procurementRecordLambdaQueryWrapper.eq(ProcurementRecordOut::getType, 3);
+        List<ProcurementRecordOut> procurementRecords = procurementRecordOutMapper.selectList(procurementRecordLambdaQueryWrapper);
+        if(CollectionUtils.isEmpty( procurementRecords)){
+            return pageList;
+        }
+        for (CustomStorage dto : procurementPageDtoCopyList) {
+            // 鏍规嵁閲囪喘鍙拌处ID绛涢�夊搴旂殑鍑哄簱璁板綍
+            List<ProcurementRecordOut> collect1 = procurementRecords.stream()
+                    .filter(ProcurementRecordOut -> ProcurementRecordOut.getProcurementRecordStorageId().equals(dto.getId()))
+                    .collect(Collectors.toList());
+
+            // 濡傛灉娌℃湁鐩稿叧鐨勫嚭搴撹褰曪紝璺宠繃璇ユ潯鏁版嵁
+            if(CollectionUtils.isEmpty(collect1)){
+                dto.setInboundNum0(dto.getInboundNum());
+                dto.setTotalInboundNum(BigDecimal.ZERO);
+                continue;
+            }
+
+            // 璁$畻宸插嚭搴撴暟閲忔�诲拰锛屽苟璁剧疆寰呭嚭搴撴暟閲�
+            BigDecimal totalInboundNum = collect1.stream()
+                    .map(ProcurementRecordOut::getInboundNum)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+            // 鍑哄簱鏁伴噺 = 鎬绘暟閲� - 寰呭嚭搴撴暟閲�
+            dto.setTotalInboundNum(totalInboundNum);
+            // 寰呭嚭搴撴暟閲� = 鎬绘暟閲� - 宸插嚭搴撴暟閲�
+            dto.setInboundNum0(dto.getInboundNum().subtract(totalInboundNum));
+            // 搴撳瓨浠峰��
+            if(dto.getTaxInclusiveUnitPrice() != null){
+                dto.setTaxInclusiveTotalPrice(dto.getInboundNum0().multiply(dto.getTaxInclusiveUnitPrice()));
+            }
+        }
+        pageList.setRecords(procurementPageDtoCopyList);
+        return pageList;
+    }
+
+    @Override
+    public AjaxResult updateCustom(CustomStorage customStorage) {
+        return AjaxResult.success(customStorageMapper.updateById(customStorage));
+    }
+
+    @Override
+    public AjaxResult deleteCustom(List<Long> ids) {
+        return AjaxResult.success(customStorageMapper.deleteBatchIds(ids));
+    }
+
+    @Override
+    public int updateManagementByCustom(ProcurementManagementUpdateDto procurementDto) {
+        CustomStorage customStorage = customStorageMapper.selectById(procurementDto.getId());
+        if(customStorage == null){
+            throw new RuntimeException("鏉愭枡搴撳瓨涓嶅瓨鍦�");
+        }
+        LambdaQueryWrapper<CustomStorage> customStorageLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        customStorageLambdaQueryWrapper.eq(CustomStorage::getProductCategory, customStorage.getProductCategory())
+                .eq(CustomStorage::getSpecificationModel, customStorage.getSpecificationModel());
+        CustomStorage one = new CustomStorage();
+        one.setTaxInclusiveUnitPrice(procurementDto.getTaxInclusiveUnitPrice());
+        one.setTaxInclusiveTotalPrice(procurementDto.getTaxInclusiveTotalPrice());
+        return customStorageMapper.update(one,customStorageLambdaQueryWrapper);
+    }
+
+    @Override
     public int add(ProcurementAddDto procurementDto) {
         LoginUser loginUser = SecurityUtils.getLoginUser();
         // 鎵归噺鏂板
         for (Details detail : procurementDto.getDetails()) {
             // 鏌ヨ閲囪喘鍏ュ簱鏁伴噺
             LambdaQueryWrapper<ProcurementRecordStorage> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
-            procurementRecordLambdaQueryWrapper.eq(ProcurementRecordStorage::getSalesLedgerProductId, detail.getId());
+            procurementRecordLambdaQueryWrapper.eq(ProcurementRecordStorage::getSalesLedgerProductId, detail.getId())
+                    .eq(ProcurementRecordStorage::getType, procurementDto.getType());
             Long aLong = procurementRecordMapper.selectCount(procurementRecordLambdaQueryWrapper);
 
             ProcurementRecordStorage.ProcurementRecordStorageBuilder procurementRecordBuilder = ProcurementRecordStorage.builder()
                     .salesLedgerProductId(detail.getId())
-                    .inboundBatches(aLong.equals(0L) ? "绗�1鎵规" : "绗�"+ (aLong + 1) + "鎵规")
+                    .inboundBatches(aLong.equals(0L) ? "绗�1鎵规("+ procurementDto.getTypeName() +")" : "绗�"+ (aLong + 1) + "鎵规(" + procurementDto.getTypeName() + ")" )
                     .inboundNum(detail.getInboundQuantity())
+                    .type(procurementDto.getType())
                     .warnNum(detail.getWarnNum())
+                    .unitPrice(detail.getUnitPrice())
+                    .totalPrice(detail.getInboundQuantity().multiply(detail.getUnitPrice()))
                     .createTime(LocalDateTime.now())
                     .createUser(loginUser.getUserId())
                     .updateTime(LocalDateTime.now())
@@ -380,7 +710,8 @@
             return procurementPageDtoIPage;
         }
         LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
-        procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, collect);
+        procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, collect)
+                .eq(ProcurementRecordOut::getType, 1);
         List<ProcurementRecordOut> procurementRecords = procurementRecordOutMapper.selectList(procurementRecordLambdaQueryWrapper);
         if(CollectionUtils.isEmpty( procurementRecords)){
             return procurementPageDtoIPage;
@@ -420,6 +751,7 @@
         }
         LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
         procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, collect);
+        procurementRecordLambdaQueryWrapper.eq(ProcurementRecordOut::getType,1);
         List<ProcurementRecordOut> procurementRecords = procurementRecordOutMapper.selectList(procurementRecordLambdaQueryWrapper);
         if(CollectionUtils.isEmpty( procurementRecords)){
             return procurementPageDtoCopyIPage;
@@ -427,12 +759,13 @@
         for (ProcurementPageDtoCopy dto : procurementPageDtoCopyList) {
             // 鏍规嵁閲囪喘鍙拌处ID绛涢�夊搴旂殑鍑哄簱璁板綍
             List<ProcurementRecordOut> collect1 = procurementRecords.stream()
-                    .filter(ProcurementRecordOut -> ProcurementRecordOut.getProcurementRecordStorageId().equals(dto.getId()))
+                    .filter(ProcurementRecordOut -> ProcurementRecordOut.getProcurementRecordStorageId().equals(dto.getId()) && ProcurementRecordOut.getType().equals(1))
                     .collect(Collectors.toList());
 
             // 濡傛灉娌℃湁鐩稿叧鐨勫嚭搴撹褰曪紝璺宠繃璇ユ潯鏁版嵁
             if(CollectionUtils.isEmpty(collect1)){
                 dto.setInboundNum0(dto.getInboundNum());
+                dto.setTotalInboundNum(BigDecimal.ZERO);
                 continue;
             }
 
@@ -444,6 +777,10 @@
             dto.setTotalInboundNum(totalInboundNum);
             // 寰呭嚭搴撴暟閲� = 鎬绘暟閲� - 宸插嚭搴撴暟閲�
             dto.setInboundNum0(dto.getInboundNum().subtract(totalInboundNum));
+            // 搴撳瓨浠峰��
+            if(dto.getUnitPrice() != null){
+                dto.setTotalPrice(dto.getInboundNum0().multiply(dto.getUnitPrice()));
+            }
         }
         return procurementPageDtoCopyIPage;
     }
diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml
index a0b7864..8283a19 100644
--- a/src/main/resources/application-dev.yml
+++ b/src/main/resources/application-dev.yml
@@ -62,7 +62,7 @@
     druid:
       # 涓诲簱鏁版嵁婧�
       master:
-        url: jdbc:mysql://localhost:3306/product-inventory-management?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        url: jdbc:mysql://localhost:3306/product-inventory-management-sqd?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
         username: root
         password: 123456
       # 浠庡簱鏁版嵁婧�
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 446134b..c79d967 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -1,4 +1,4 @@
 # Spring閰嶇疆
 spring:
   profiles:
-    active: sqd
+    active: dev
diff --git a/src/main/resources/mapper/procurementrecord/CustomStorageMapper.xml b/src/main/resources/mapper/procurementrecord/CustomStorageMapper.xml
new file mode 100644
index 0000000..ba0e289
--- /dev/null
+++ b/src/main/resources/mapper/procurementrecord/CustomStorageMapper.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.procurementrecord.mapper.CustomStorageMapper">
+
+    <select id="listPageCopyByCustom" resultType="com.ruoyi.procurementrecord.pojo.CustomStorage">
+        select t1.*,
+               sum(t1.inbound_num) as inboundNum,
+               sum(t1.inbound_num) as inboundNum0,
+               sum(t1.tax_inclusive_total_price) as taxInclusiveTotalPrice,
+               SUM(t1.inbound_num) - COALESCE(SUM(t2.inbound_num), 0) AS availableStock
+               from custom_storage t1
+               left join procurement_record_out t2 on t1.id = t2.procurement_record_storage_id and t2.type = 3
+        <where>
+            <if test="req.productCategory != null and req.productCategory != ''">
+                and t1.product_category like  concat('%',#{req.productCategory},'%')
+            </if>
+            <if test="req.supplierName !=null and req.supplierName != ''">
+                and t1.supplier_name like concat('%',#{req.supplierName},'%')
+            </if>
+            <if test="req.timeStr != null and req.timeStr != ''">
+                and t1.inbound_date like concat('%',#{req.timeStr},'%')
+            </if>
+        </where>
+        group by t1.product_category, t1.specification_model, t1.tax_inclusive_unit_price
+        HAVING availableStock > 0
+        order by t1.inbound_date desc
+    </select>
+</mapper>
\ No newline at end of file

--
Gitblit v1.9.3