From 8ec6234d1879d9f554f04f6a864a1ca1ff253df4 Mon Sep 17 00:00:00 2001
From: maven <2163098428@qq.com>
Date: 星期五, 09 一月 2026 17:19:54 +0800
Subject: [PATCH] yys  仓储物流

---
 src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordOutMapper.java                  |    8 
 src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementPlanServiceImpl.java            |    1 
 src/main/java/com/ruoyi/procurementrecord/dto/ProcurementDto.java                                 |    2 
 src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java                          |   16 
 src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java                      |   19 
 src/main/resources/mapper/procurementrecord/ProcurementRecordOutMapper.xml                        |  126 +++++
 src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java             |  136 +++++
 src/main/java/com/ruoyi/procurementrecord/pojo/CustomStorage.java                                 |  128 +++++
 src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutAdd.java                        |    5 
 src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordOutService.java                |    4 
 src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDto.java                             |   43 +
 src/main/java/com/ruoyi/procurementrecord/pojo/InboundManagement.java                             |    1 
 src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutPageDto.java                    |   40 +
 src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordOutController.java          |   51 ++
 src/main/java/com/ruoyi/procurementrecord/dto/ProcurementManagementUpdateDto.java                 |   19 
 src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDtoCopy.java                         |   33 +
 src/main/resources/mapper/procurementrecord/CustomStorageMapper.xml                               |   50 ++
 src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java          |  364 +++++++++++++++
 src/main/java/com/ruoyi/procurementrecord/service/impl/GasTankWarningServiceImpl.java             |    2 
 src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementPriceManagementServiceImpl.java |    2 
 src/main/java/com/ruoyi/procurementrecord/pojo/ReturnManagement.java                              |    1 
 src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java                   |   27 +
 src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordOutServiceImpl.java       |   29 +
 src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordMapper.java                     |    8 
 src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml                           |  209 ++++++++
 src/main/java/com/ruoyi/procurementrecord/mapper/CustomStorageMapper.java                         |   17 
 src/main/java/com/ruoyi/procurementrecord/dto/ProcurementAddDto.java                              |    7 
 src/main/java/com/ruoyi/procurementrecord/dto/ProcurementUpdateDto.java                           |   11 
 src/main/java/com/ruoyi/procurementrecord/dto/Details.java                                        |    9 
 29 files changed, 1,293 insertions(+), 75 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..a0761e8 100644
--- a/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java
+++ b/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java
@@ -2,11 +2,14 @@
 
 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;
@@ -30,10 +33,23 @@
     @Autowired
     private ProcurementRecordService procurementRecordService;
 
+
+    /**
+     * 閫氳繃閿�鍞骇鍝乮d鑾峰彇鍏ュ簱鏁伴噺
+     * @param salesProductId
+     * @return
+     */
+    @GetMapping("/getProcurementAmount")
+    @ApiOperation(value = "閫氳繃閿�鍞骇鍝乮d鑾峰彇鍏ュ簱鏁伴噺")
+    public AjaxResult getProcurementAmount(@RequestParam("salesProductId") Long salesProductId) {
+        return AjaxResult.success(procurementRecordService.getProcurementAmount(salesProductId));
+    }
+
+
     @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 +57,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);
+    }
+
+    @PostMapping("/delteCustom")
+    @Log(title = "鑷畾涔夊叆搴�-鍏ュ簱绠$悊-鍒犻櫎鍏ュ簱", businessType = BusinessType.DELETE)
+    @Transactional
+    public AjaxResult deleteCustom(@RequestBody List<Long> ids) {
+        return procurementRecordService.deleteCustom(ids);
     }
 
     @PostMapping("/update")
@@ -52,10 +91,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 +115,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 +163,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..d7f1a84 100644
--- a/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordOutController.java
+++ b/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordOutController.java
@@ -2,20 +2,22 @@
 
 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.ProcurementPageDto;
 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 +32,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 +73,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..3f3ed35 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 taxInclusiveUnitPrice;
+    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/ProcurementDto.java b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementDto.java
index d8004b4..4b4392d 100644
--- a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementDto.java
+++ b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementDto.java
@@ -1,11 +1,9 @@
 package com.ruoyi.procurementrecord.dto;
 
-import com.fasterxml.jackson.annotation.JsonFormat;
 import com.ruoyi.framework.aspectj.lang.annotation.Excel;
 import lombok.Data;
 
 import java.math.BigDecimal;
-import java.time.LocalDateTime;
 
 /**
  * @author :yys
diff --git a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementManagementUpdateDto.java b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementManagementUpdateDto.java
index 0356de7..0d97384 100644
--- a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementManagementUpdateDto.java
+++ b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementManagementUpdateDto.java
@@ -1,11 +1,8 @@
 package com.ruoyi.procurementrecord.dto;
 
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.ruoyi.framework.aspectj.lang.annotation.Excel;
 import lombok.Data;
 
 import java.math.BigDecimal;
-import java.time.LocalDateTime;
 
 /**
  * @author :yys
@@ -17,6 +14,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..27ac770 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,41 @@
     private Long createUser;
 
     /**
+     * true:鍘绘帀鍓╀綑搴撳瓨涓�0
+     */
+    private Boolean flag;
+
+    /**
+     * 鍏ュ簱绫诲瀷 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 +67,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..a2be0d6 100644
--- a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutPageDto.java
+++ b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutPageDto.java
@@ -20,6 +20,26 @@
     private Integer id;
 
     private BigDecimal warnNum;
+    /**
+     * 閲囪喘鍚堝悓鍙�
+     */
+    private String purchaseContractNumber;
+    /**
+     * 閿�鍞悎鍚屽彿
+     */
+    private String salesContractNo;
+
+    /**
+     * 瀹㈡埛鍚堝悓鍙�
+     */
+    private String customerContractNo;
+
+    /**
+     * 瀹㈡埛鍚嶇О
+     */
+    @Excel(name = "瀹㈡埛鍚嶇О")
+    private String customerName;
+
 
     /**
      * 鍑哄叆搴撴暟閲�
@@ -28,10 +48,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 +82,8 @@
      */
     @Excel(name = "渚涘簲鍟嗗悕绉�")
     private String supplierName;
+
+
 
 
     /**
@@ -94,4 +128,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..bb23e64 100644
--- a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementUpdateDto.java
+++ b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementUpdateDto.java
@@ -12,12 +12,23 @@
 @Data
 public class ProcurementUpdateDto {
 
+    private String inboundDate;
+
     private Integer id;
 
     private BigDecimal warnNum;
 
     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..6ccbb4a
--- /dev/null
+++ b/src/main/java/com/ruoyi/procurementrecord/mapper/CustomStorageMapper.java
@@ -0,0 +1,17 @@
+package com.ruoyi.procurementrecord.mapper;
+
+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);
+
+    IPage<CustomStorage> listPageByCustom(Page page,@Param("req") CustomStorage customStorage);
+}
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..5599500
--- /dev/null
+++ b/src/main/java/com/ruoyi/procurementrecord/pojo/CustomStorage.java
@@ -0,0 +1,128 @@
+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 {
+
+    @TableField(exist = false)
+    private Boolean flag;
+
+
+    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;
+
+    /**
+     * 缂栧彿
+     */
+    @Excel(name = "缂栧彿")
+    private String code;
+
+    @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/InboundManagement.java b/src/main/java/com/ruoyi/procurementrecord/pojo/InboundManagement.java
index 56f322e..d6708ca 100644
--- a/src/main/java/com/ruoyi/procurementrecord/pojo/InboundManagement.java
+++ b/src/main/java/com/ruoyi/procurementrecord/pojo/InboundManagement.java
@@ -7,7 +7,6 @@
 import lombok.Data;
 import org.springframework.format.annotation.DateTimeFormat;
 
-import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.util.Date;
 
diff --git a/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java b/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java
index b09b0f3..aa85a3d 100644
--- a/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java
+++ b/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java
@@ -22,7 +22,7 @@
     private Integer id;
 
     /**
-     * 浜у搧淇℃伅琛╥d
+     * 浜у搧淇℃伅琛╥d锛堣嚜瀹氫箟鍏ュ簱鏃朵负0锛�
      */
     private Integer salesLedgerProductId;
 
@@ -43,32 +43,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/pojo/ReturnManagement.java b/src/main/java/com/ruoyi/procurementrecord/pojo/ReturnManagement.java
index 54091ab..e3cdb06 100644
--- a/src/main/java/com/ruoyi/procurementrecord/pojo/ReturnManagement.java
+++ b/src/main/java/com/ruoyi/procurementrecord/pojo/ReturnManagement.java
@@ -8,7 +8,6 @@
 import org.springframework.format.annotation.DateTimeFormat;
 
 import java.time.LocalDateTime;
-import java.util.Date;
 
 /**
  * @author :yys
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..1b699ef 100644
--- a/src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java
+++ b/src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java
@@ -3,10 +3,13 @@
 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;
+import java.math.BigDecimal;
 import java.util.List;
 import java.util.Map;
 
@@ -27,11 +30,31 @@
 
     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);
+
+    BigDecimal getProcurementAmount(Long salesProductId);
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/service/impl/GasTankWarningServiceImpl.java b/src/main/java/com/ruoyi/procurementrecord/service/impl/GasTankWarningServiceImpl.java
index 772869b..204ad17 100644
--- a/src/main/java/com/ruoyi/procurementrecord/service/impl/GasTankWarningServiceImpl.java
+++ b/src/main/java/com/ruoyi/procurementrecord/service/impl/GasTankWarningServiceImpl.java
@@ -4,9 +4,7 @@
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.poi.ExcelUtil;
-import com.ruoyi.procurementrecord.dto.ProcurementPageDto;
 import com.ruoyi.procurementrecord.mapper.GasTankWarningMapper;
 import com.ruoyi.procurementrecord.pojo.GasTankWarning;
 import com.ruoyi.procurementrecord.service.GasTankWarningService;
diff --git a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementPlanServiceImpl.java b/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementPlanServiceImpl.java
index 81216db..3226e8c 100644
--- a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementPlanServiceImpl.java
+++ b/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementPlanServiceImpl.java
@@ -6,7 +6,6 @@
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.procurementrecord.mapper.ProcurementPlanMapper;
 import com.ruoyi.procurementrecord.pojo.ProcurementPlan;
-import com.ruoyi.procurementrecord.pojo.ProcurementPriceManagement;
 import com.ruoyi.procurementrecord.service.ProcurementPlanService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
diff --git a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementPriceManagementServiceImpl.java b/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementPriceManagementServiceImpl.java
index e90a7a2..2321b7e 100644
--- a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementPriceManagementServiceImpl.java
+++ b/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementPriceManagementServiceImpl.java
@@ -3,9 +3,7 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.ruoyi.common.utils.excel.ExcelUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
-import com.ruoyi.procurementrecord.dto.ProcurementPageDto;
 import com.ruoyi.procurementrecord.mapper.ProcurementPriceManagementMapper;
 import com.ruoyi.procurementrecord.pojo.ProcurementPriceManagement;
 import com.ruoyi.procurementrecord.service.ProcurementPriceManagementService;
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..c8fedc3 100644
--- a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordOutServiceImpl.java
+++ b/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordOutServiceImpl.java
@@ -10,20 +10,20 @@
 import com.ruoyi.procurementrecord.dto.ProcurementUpdateDto;
 import com.ruoyi.procurementrecord.mapper.ProcurementRecordOutMapper;
 import com.ruoyi.procurementrecord.pojo.ProcurementRecordOut;
-import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage;
 import com.ruoyi.procurementrecord.service.ProcurementRecordOutService;
 import com.ruoyi.project.system.domain.SysUser;
 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;
 
 import javax.servlet.http.HttpServletResponse;
 import java.math.BigDecimal;
-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 +54,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 +73,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 +104,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..f653427 100644
--- a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
+++ b/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
@@ -4,14 +4,18 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.utils.OrderUtils;
 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.ProcurementRecordStorage;
+import com.ruoyi.procurementrecord.pojo.CustomStorage;
 import com.ruoyi.procurementrecord.pojo.ProcurementRecordOut;
+import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage;
 import com.ruoyi.procurementrecord.service.ProcurementRecordService;
 import com.ruoyi.project.system.domain.SysUser;
 import com.ruoyi.project.system.mapper.SysUserMapper;
@@ -26,8 +30,12 @@
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.LocalTime;
 import java.time.format.DateTimeFormatter;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 /**
@@ -102,10 +110,13 @@
     @Override
     public int updatePro(ProcurementUpdateDto procurementDto) {
         ProcurementRecordStorage procurementRecordStorageById = getProcurementRecordById(procurementDto.getId());
+        procurementRecordStorageById.setCreateTime(LocalDate.parse(procurementDto.getInboundDate(), DateTimeFormatter.ofPattern("yyyy-MM-dd")).atTime(LocalTime.MIDNIGHT));
         procurementRecordStorageById.setInboundNum(procurementDto.getQuantityStock());
         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 +126,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 +136,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 +153,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 +200,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 +243,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 +271,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 +420,257 @@
     }
 
     @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());
+            item.setCode(OrderUtils.countTodayByCreateTime(customStorageMapper, ""));
+            customStorageMapper.insert(item);
+        });
+        return AjaxResult.success("鑷畾涔夊叆搴撴垚鍔�");
+    }
+
+    @Override
+    public IPage<CustomStorage> listPageByCustom(Page page, CustomStorage customStorage) {
+        IPage<CustomStorage> procurementPageDtoIPage = customStorageMapper.listPageByCustom(page, customStorage);
+        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) {
+        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 BigDecimal getProcurementAmount(Long salesProductId) {
+        LambdaQueryWrapper<ProcurementRecordStorage> procurementRecordStorageLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        procurementRecordStorageLambdaQueryWrapper.eq(ProcurementRecordStorage::getSalesLedgerProductId, salesProductId)
+                .eq(ProcurementRecordStorage::getType, 2);
+        List<ProcurementRecordStorage> procurementRecordStorages = procurementRecordMapper.selectList(procurementRecordStorageLambdaQueryWrapper);
+        if(CollectionUtils.isEmpty( procurementRecordStorages)){
+            return BigDecimal.ZERO;
+        }
+        return procurementRecordStorages.stream()
+                .map(ProcurementRecordStorage::getInboundNum)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+    }
+
+    @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.getTaxInclusiveUnitPrice())
+                    .totalPrice(detail.getInboundQuantity().multiply(detail.getTaxInclusiveUnitPrice()))
                     .createTime(LocalDateTime.now())
                     .createUser(loginUser.getUserId())
                     .updateTime(LocalDateTime.now())
@@ -380,7 +701,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 +742,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 +750,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 +768,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/mapper/procurementrecord/CustomStorageMapper.xml b/src/main/resources/mapper/procurementrecord/CustomStorageMapper.xml
new file mode 100644
index 0000000..ffce0ba
--- /dev/null
+++ b/src/main/resources/mapper/procurementrecord/CustomStorageMapper.xml
@@ -0,0 +1,50 @@
+<?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.tax_inclusive_total_price) as totalPrice,
+                sum(t1.inbound_num) as inboundNum,
+                sum(t1.inbound_num) as inboundNum0,
+                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>
+            t2.type = 3
+            <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
+        order by t1.inbound_date desc
+    </select>
+    <select id="listPageByCustom" 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,
+        (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
+        <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.id
+        order by t1.inbound_date desc
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml b/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml
index c378c6a..dd03d4d 100644
--- a/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml
+++ b/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml
@@ -20,7 +20,7 @@
             t2.tax_exclusive_total_price,
             t3.inbound_num as quantityStock
         from  purchase_ledger t1
-        left join sales_ledger_product t2 on t1.id = t2.sales_ledger_id
+        left join sales_ledger_product t2 on t1.id = t2.sales_ledger_id and t2.type = 2
         left join procurement_record_storage t3 on t2.id = t3.sales_ledger_product_id
         where t1.purchase_contract_number = #{req.purchaseContractNumber}
         <if test="req.id != null and req.id != ''">
@@ -42,25 +42,37 @@
         t2.tax_inclusive_unit_price,
         (t1.inbound_num * t2.tax_inclusive_unit_price) as taxInclusiveTotalPrice,
         (t1.inbound_num * t2.tax_inclusive_unit_price - t1.inbound_num * t2.tax_inclusive_unit_price * t2.tax_rate / 100) as taxExclusiveTotalPrice,
+        t1.unit_price,
+        t1.total_price,
         t1.inbound_batches,
         t1.inbound_num,
         t1.inbound_num as inboundNum0,
         t1.create_time,
         t1.update_time,
         t1.create_by,
-        t2.warn_num
+        t2.warn_num,
+        (t1.inbound_num - COALESCE(SUM(t4.inbound_num), 0)) / count(1) AS availableStock
         from  procurement_record_storage t1
-                  left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id
+                  left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id and t2.type = 2
                   left join purchase_ledger t3 on t3.id = t2.sales_ledger_id
+        left join procurement_record_out t4 on t1.id = t4.procurement_record_storage_id and t4.type = 1
         <where>
-            1 = 1
+            t1.type = 1
             <if test="req.supplierName != null and req.supplierName != ''">
                 and t3.supplier_name like  concat('%',#{req.supplierName},'%')
+            </if>
+            <if test="req.productCategory != null and req.productCategory != ''">
+                and t2.product_category like  concat('%',#{req.productCategory},'%')
             </if>
             <if test="req.timeStr != null and req.timeStr != ''">
                 and t1.create_time like  concat('%',#{req.timeStr},'%')
             </if>
         </where>
+        group by t1.id
+        <if test="req.flag != null and req.flag">
+            having availableStock > 0
+        </if>
+        order by t1.create_time desc
     </select>
     <select id="list" resultType="com.ruoyi.procurementrecord.dto.ProcurementPageDto">
         select
@@ -84,6 +96,32 @@
         from  procurement_record_storage t1
                   left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id
                   left join purchase_ledger t3 on t3.id = t2.sales_ledger_id
+                where t1.type = 1
+    </select>
+    <select id="listOne" resultType="com.ruoyi.procurementrecord.dto.ProcurementPageDto">
+        select
+            t3.customer_contract_no,
+            t3.sales_contract_no,
+            t3.customer_name,
+            t2.product_category,
+            t1.id,
+            t2.specification_model,
+            t2.unit,
+            t2.quantity,
+            t2.quantity as quantity0,
+            t2.tax_rate,
+            t2.tax_inclusive_unit_price,
+            t2.tax_inclusive_total_price,
+            t2.tax_exclusive_total_price,
+            t1.inbound_batches,
+            t1.inbound_num,
+            t1.create_time,
+            t1.create_time as time,
+            t1.create_by
+        from  procurement_record_storage t1
+            left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id
+            left join sales_ledger t3 on t3.id = t2.sales_ledger_id
+        where t1.type = 2
     </select>
     <select id="listPageCopy" resultType="com.ruoyi.procurementrecord.dto.ProcurementPageDtoCopy">
         select
@@ -101,20 +139,26 @@
         t2.tax_inclusive_total_price,
         t2.tax_exclusive_total_price,
         t1.inbound_batches,
-        sum(t1.inbound_num) as inboundNum,
-        sum(t1.inbound_num) as inboundNum0,
-        t1.inbound_num as totalInboundNum,
+        t1.unit_price as unitPrice,
+        sum(t1.total_price) as totalPrice,
+        sum(t1.inbound_num) / COALESCE(count(1), 1) as inboundNum,
+        sum(t1.inbound_num) / COALESCE(count(1), 1) as inboundNum0,
         t1.create_time,
         t1.update_time,
         t1.create_by,
-        t2.warn_num
+        t2.warn_num,
+        (SUM(t1.inbound_num) - COALESCE(SUM(t4.inbound_num), 0)) / COALESCE(count(1), 1) AS availableStock
         from  procurement_record_storage t1
-        left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id
+        left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id and t2.type = 2
         left join purchase_ledger t3 on t3.id = t2.sales_ledger_id
+        left join procurement_record_out t4 on t1.id = t4.procurement_record_storage_id and t4.type = 1
         <where>
-            1 = 1
+            t1.type = 1 and t4.type = 1
             <if test="req.supplierName != null and req.supplierName != ''">
                 and t3.supplier_name like  concat('%',#{req.supplierName},'%')
+            </if>
+            <if test="req.productCategory != null and req.productCategory != ''">
+                and t2.product_category like  concat('%',#{req.productCategory},'%')
             </if>
             <if test="req.timeStr != null and req.timeStr != ''">
                 and t1.create_time like  concat('%',#{req.timeStr},'%')
@@ -135,7 +179,9 @@
                 and t1.create_time &lt;= #{req.endDate}
             </if>
         </where>
-        group by t3.supplier_name,t2.product_category,t2.specification_model
+        group by t2.product_category,t2.specification_model,t1.unit_price
+        having availableStock > 0
+        order by t1.create_time desc
     </select>
     <select id="listCopy" resultType="com.ruoyi.procurementrecord.dto.ProcurementPageDtoCopy">
         select
@@ -160,7 +206,146 @@
             t1.update_time as uTime,
             t1.create_by
         from  procurement_record_storage t1
-                  left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id
+                  left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id and t2.type = 2
                   left join purchase_ledger t3 on t3.id = t2.sales_ledger_id
+        where t1.type = 1
+        group by t3.supplier_name,t2.product_category,t2.specification_model
+    </select>
+    <select id="listCopyOne" resultType="com.ruoyi.procurementrecord.dto.ProcurementPageDtoCopy">
+        select
+            t3.customer_contract_no,
+            t3.sales_contract_no,
+            t3.customer_name,
+            t2.product_category,
+            t1.id,
+            t1.sales_ledger_product_id,
+            t1.create_user,
+            t2.specification_model,
+            t2.unit,
+            t2.tax_rate,
+            t2.tax_inclusive_unit_price,
+            t2.tax_inclusive_total_price,
+            t2.tax_exclusive_total_price,
+            t1.inbound_batches,
+            t1.inbound_num,
+            t1.inbound_num as inboundNum0,
+            t1.create_time,
+            t1.update_time,
+            t1.create_time as cTime,
+            t1.update_time as uTime,
+            t1.create_by
+        from  procurement_record_storage t1
+                  left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id and t2.type = 1
+                  left join sales_ledger t3 on t3.id = t2.sales_ledger_id
+        where t1.type = 2
+        group by t3.customer_name,t2.product_category,t2.specification_model
+    </select>
+    <select id="listPageByProduction" resultType="com.ruoyi.procurementrecord.dto.ProcurementPageDto">
+        select
+        t3.customer_contract_no,
+        t3.sales_contract_no,
+        t3.customer_name,
+        t2.product_category,
+        t1.id,
+        t1.sales_ledger_product_id,
+        t1.create_user,
+        t2.specification_model,
+        t2.unit,
+        t2.tax_rate,
+        t2.tax_inclusive_unit_price,
+        (t1.inbound_num * t2.tax_inclusive_unit_price) as taxInclusiveTotalPrice,
+        (t1.inbound_num * t2.tax_inclusive_unit_price - t1.inbound_num * t2.tax_inclusive_unit_price * t2.tax_rate / 100) as taxExclusiveTotalPrice,
+        t1.unit_price,
+        t1.total_price,
+        t1.inbound_batches,
+        t1.inbound_num,
+        t1.inbound_num as inboundNum0,
+        t1.create_time,
+        t1.update_time,
+        t1.create_by,
+        t2.warn_num,
+        (t1.inbound_num - COALESCE(SUM(t4.inbound_num), 0)) / count(1) AS availableStock
+        from  procurement_record_storage t1
+        left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id and t2.type = 1
+        left join sales_ledger t3 on t3.id = t2.sales_ledger_id
+        left join procurement_record_out t4 on t4.procurement_record_storage_id = t1.id and t1.type = 2
+        <where>
+            t1.type = 2
+            <if test="req.customerName != null and req.customerName != ''">
+                and t3.customer_name like  concat('%',#{req.customerName},'%')
+            </if>
+            <if test="req.productCategory != null and req.productCategory != ''">
+                and t2.product_category like  concat('%',#{req.productCategory},'%')
+            </if>
+            <if test="req.timeStr != null and req.timeStr != ''">
+                and t1.create_time like  concat('%',#{req.timeStr},'%')
+            </if>
+        </where>
+        group by t1.id
+        <if test="req.flag != null and req.flag">
+            having availableStock > 0
+        </if>
+        order by t1.create_time desc
+    </select>
+    <select id="listPageCopyByProduction" resultType="com.ruoyi.procurementrecord.dto.ProcurementPageDtoCopy">
+        select
+        t3.customer_contract_no,
+        t3.sales_contract_no,
+        t3.customer_name,
+        t2.product_category,
+        t1.id,
+        t1.sales_ledger_product_id,
+        t1.create_user,
+        t2.specification_model,
+        t2.unit,
+        t2.min_stock,
+        t2.tax_rate,
+        t2.tax_inclusive_unit_price,
+        t2.tax_inclusive_total_price,
+        t2.tax_exclusive_total_price,
+        t1.inbound_batches,
+        sum(t1.total_price) as totalPrice,
+        t1.unit_price,
+        sum(t1.inbound_num) as inboundNum,
+        sum(t1.inbound_num) as inboundNum0,
+        t1.create_time,
+        t1.update_time,
+        t1.create_by,
+        t2.warn_num,
+        SUM(t1.inbound_num) - COALESCE(SUM(t4.inbound_num), 0) / COALESCE(count(1), 1) AS availableStock
+        from  procurement_record_storage t1
+        left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id and t2.type = 1
+        left join sales_ledger t3 on t3.id = t2.sales_ledger_id
+        left join procurement_record_out t4 on t1.id = t4.procurement_record_storage_id and t4.type = 2
+        <where>
+            t4.type = 2 and t1.type = 2
+            <if test="req.customerName != null and req.customerName != ''">
+                and t3.customer_name like  concat('%',#{req.customerName},'%')
+            </if>
+            <if test="req.productCategory != null and req.productCategory != ''">
+                and t2.product_category like  concat('%',#{req.productCategory},'%')
+            </if>
+            <if test="req.timeStr != null and req.timeStr != ''">
+                and t1.create_time like  concat('%',#{req.timeStr},'%')
+            </if>
+            <if test="req.reportDate != null">
+                and t1.create_time >= #{req.reportDate} and t1.create_time &lt; DATE_ADD(#{req.reportDate}, INTERVAL 1 DAY)
+            </if>
+            <if test="req.startMonth != null">
+                and t1.create_time >= #{req.startMonth}
+            </if>
+            <if test="req.endMonth != null">
+                and t1.create_time &lt;= #{req.endMonth}
+            </if>
+            <if test="req.startDate != null">
+                and t1.create_time >= #{req.startDate}
+            </if>
+            <if test="req.endDate != null">
+                and t1.create_time &lt;= #{req.endDate}
+            </if>
+        </where>
+        group by t2.product_category,t2.specification_model,t1.unit_price
+        HAVING availableStock > 0
+        order by t1.create_time desc
     </select>
 </mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/procurementrecord/ProcurementRecordOutMapper.xml b/src/main/resources/mapper/procurementrecord/ProcurementRecordOutMapper.xml
index ec91c53..21117a3 100644
--- a/src/main/resources/mapper/procurementrecord/ProcurementRecordOutMapper.xml
+++ b/src/main/resources/mapper/procurementrecord/ProcurementRecordOutMapper.xml
@@ -17,19 +17,27 @@
         t1.inbound_num,
         t1.create_time,
         t1.create_by,
-        t2.warn_num
+        t2.warn_num,
+        t4.unit_price,
+        t4.unit_price *  t1.inbound_num as totalPrice,
+        t3.purchase_contract_number
         from  procurement_record_out t1
-        left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id
+        left join procurement_record_storage t4 on t4.id = t1.procurement_record_storage_id
+        left join sales_ledger_product t2 on t2.id = t4.sales_ledger_product_id and t2.type = 2
         left join purchase_ledger t3 on t3.id = t2.sales_ledger_id
         <where>
-            1 = 1
+            and t1.type = 1
             <if test="req.supplierName != null and req.supplierName != ''">
                 and t3.supplier_name like  concat('%',#{req.supplierName},'%')
+            </if>
+            <if test="req.productCategory != null and req.productCategory != ''">
+                and t2.product_category like  concat('%',#{req.productCategory},'%')
             </if>
             <if test="req.timeStr != null and req.timeStr != ''">
                 and t1.create_time like  concat('%',#{req.timeStr},'%')
             </if>
         </where>
+        order by t1.create_time desc
     </select>
     <select id="list" resultType="com.ruoyi.procurementrecord.dto.ProcurementRecordOutPageDto">
         select
@@ -49,5 +57,117 @@
         from  procurement_record_out t1
                   left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id
                   left join purchase_ledger t3 on t3.id = t2.sales_ledger_id
+            where t1.type = 1
+    </select>
+
+    <select id="listOne" resultType="com.ruoyi.procurementrecord.dto.ProcurementRecordOutPageDto">
+        select
+            t3.customer_contract_no,
+            t3.sales_contract_no,
+            t3.customer_name,
+            t2.product_category,
+            t1.id,
+            t2.specification_model,
+            t2.unit,
+            t2.tax_rate,
+            t2.tax_inclusive_unit_price,
+            t2.tax_inclusive_total_price,
+            t2.tax_exclusive_total_price,
+            t1.inbound_num,
+            t1.create_time,
+            t1.create_time as time,
+            t1.create_by
+        from  procurement_record_out t1
+            left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id
+            left join sales_ledger t3 on t3.id = t2.sales_ledger_id
+        where t1.type = 2
+    </select>
+
+    <select id="listTwo" resultType="com.ruoyi.procurementrecord.dto.ProcurementRecordOutPageDto">
+        select
+            t1.supplier_name,
+            t1.product_category,
+            t1.id,
+            t1.specification_model,
+            t1.unit,
+            t1.tax_rate,
+            t1.tax_inclusive_unit_price,
+            t1.tax_inclusive_total_price,
+            t1.tax_exclusive_total_price,
+            t1.inbound_num,
+            t1.create_time,
+            t1.create_time as time,
+            t1.create_by
+        from  procurement_record_out t1
+        where t1.type = 3
+    </select>
+    <select id="listPageByProduct" resultType="com.ruoyi.procurementrecord.dto.ProcurementRecordOutPageDto">
+        select
+        t3.customer_contract_no,
+        t3.sales_contract_no,
+        t3.customer_name,
+        t2.product_category,
+        t1.id,
+        t1.code,
+        t2.specification_model,
+        t2.unit,
+        t2.tax_rate,
+        t2.tax_inclusive_unit_price,
+        t2.tax_inclusive_total_price,
+        t2.tax_exclusive_total_price,
+        t1.inbound_num,
+        t1.create_time,
+        t1.create_by,
+        t4.unit_price,
+        t4.unit_price *  t1.inbound_num as totalPrice
+        from  procurement_record_out t1
+        left join procurement_record_storage t4 on t4.id = t1.procurement_record_storage_id
+        left join sales_ledger_product t2 on t2.id = t4.sales_ledger_product_id and t2.type = 1
+        left join sales_ledger t3 on t3.id = t2.sales_ledger_id
+        <where>
+            and t1.type = 2
+            <if test="req.customerName != null and req.customerName != ''">
+                and t3.customer_name like  concat('%',#{req.customerName},'%')
+            </if>
+            <if test="req.productCategory != null and req.productCategory != ''">
+                and t2.product_category like  concat('%',#{req.productCategory},'%')
+            </if>
+            <if test="req.timeStr != null and req.timeStr != ''">
+                and t1.create_time like  concat('%',#{req.timeStr},'%')
+            </if>
+        </where>
+        order by t1.create_time desc
+    </select>
+    <select id="listPageByCustom" resultType="com.ruoyi.procurementrecord.dto.ProcurementRecordOutPageDto">
+        select
+        t2.supplier_name,
+        t2.product_category,
+        t1.id,
+        t2.specification_model,
+        t2.unit,
+        t2.tax_rate,
+        t2.tax_inclusive_unit_price,
+        t2.tax_inclusive_unit_price * t1.inbound_num as totalPrice,
+        t2.tax_exclusive_total_price,
+        t1.inbound_num,
+        t1.create_time,
+        t1.create_by,
+        t2.item_type,
+        t2.code
+        from  procurement_record_out t1
+        left join custom_storage t2 on t2.id = t1.procurement_record_storage_id
+        <where>
+            t1.type = 3
+            <if test="req.supplierName != null and req.supplierName != ''">
+                and t2.supplier_name like  concat('%',#{req.supplierName},'%')
+            </if>
+            <if test="req.productCategory != null and req.productCategory != ''">
+                and t2.product_category like  concat('%',#{req.productCategory},'%')
+            </if>
+            <if test="req.timeStr != null and req.timeStr != ''">
+                and t1.create_time like  concat('%',#{req.timeStr},'%')
+            </if>
+        </where>
+        order by t1.create_time desc
     </select>
 </mapper>
\ No newline at end of file

--
Gitblit v1.9.3