From 65d2410369591a9128acd4832b362e673772f409 Mon Sep 17 00:00:00 2001
From: maven <2163098428@qq.com>
Date: 星期一, 10 十一月 2025 15:17:31 +0800
Subject: [PATCH] yys  优化仓储物流整体逻辑

---
 src/main/java/com/ruoyi/production/service/impl/SalesLedgerSchedulingServiceImpl.java    |    1 
 src/main/resources/mapper/production/SalesLedgerWorkMapper.xml                           |    1 
 src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDtoCopy.java                |   16 +
 src/main/resources/application-native.yml                                                |  219 ++++++++++++++++++
 src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java                 |    4 
 src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java |  132 +++++++++++
 src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java             |    4 
 src/main/java/com/ruoyi/production/dto/ProcessSchedulingDto.java                         |    6 
 src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java    |   47 +++
 src/main/java/com/ruoyi/procurementrecord/pojo/CustomStorage.java                        |   89 +++++++
 src/main/java/com/ruoyi/production/pojo/SalesLedgerWork.java                             |    5 
 src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java          |   12 +
 src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordMapper.java            |    4 
 src/main/java/com/ruoyi/production/dto/SalesLedgerWorkDto.java                           |    7 
 src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml                  |  102 +++++++
 src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDto.java                    |   17 +
 src/main/java/com/ruoyi/procurementrecord/mapper/CustomStorageMapper.java                |   11 
 src/main/java/com/ruoyi/procurementrecord/dto/ProcurementAddDto.java                     |    2 
 src/main/resources/application.yml                                                       |    2 
 19 files changed, 664 insertions(+), 17 deletions(-)

diff --git a/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java b/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java
index 1f73ebe..8ab1c1a 100644
--- a/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java
+++ b/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java
@@ -7,6 +7,7 @@
 import com.ruoyi.framework.web.controller.BaseController;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.procurementrecord.dto.*;
+import com.ruoyi.procurementrecord.pojo.CustomStorage;
 import com.ruoyi.procurementrecord.service.ProcurementRecordService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -33,7 +34,7 @@
     @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);
     }
 
@@ -44,6 +45,13 @@
         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("/update")
@@ -71,16 +79,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) {
diff --git a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementAddDto.java b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementAddDto.java
index 9e7c186..d3f35a1 100644
--- a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementAddDto.java
+++ b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementAddDto.java
@@ -16,7 +16,7 @@
     private String nickName;
 
     /**
-     * 鍏ュ簱绫诲瀷 1-閲囪喘 2-鐢熶骇
+     * 鍏ュ簱绫诲瀷 1-閲囪喘 2-鐢熶骇 3-鑷畾涔�
      */
     private Integer type;
 
diff --git a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDto.java b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDto.java
index c977127..8e253da 100644
--- a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDto.java
+++ b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDto.java
@@ -33,10 +33,25 @@
     private String inboundBatches;
 
     /**
-     * 鍚堝悓鍙�
+     * 閲囪喘鍚堝悓鍙�
      */
     private String purchaseContractNumber;
 
+    /**
+     * 閿�鍞悎鍚屽彿
+     */
+    private String salesContractNo;
+
+    /**
+     * 瀹㈡埛鍚堝悓鍙�
+     */
+    private String customerContractNo;
+
+    /**
+     * 瀹㈡埛鍚嶇О
+     */
+    private String customerName;
+
     private String salesLedgerProductId;
 
     /**
diff --git a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDtoCopy.java b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDtoCopy.java
index 9592ad1..ce41cd3 100644
--- a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDtoCopy.java
+++ b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDtoCopy.java
@@ -32,6 +32,22 @@
      */
     private String purchaseContractNumber;
 
+
+    /**
+     * 閿�鍞悎鍚屽彿
+     */
+    private String salesContractNo;
+
+    /**
+     * 瀹㈡埛鍚堝悓鍙�
+     */
+    private String customerContractNo;
+
+    /**
+     * 瀹㈡埛鍚嶇О
+     */
+    private String customerName;
+
     private String salesLedgerProductId;
 
     /**
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..06469b6
--- /dev/null
+++ b/src/main/java/com/ruoyi/procurementrecord/mapper/CustomStorageMapper.java
@@ -0,0 +1,11 @@
+package com.ruoyi.procurementrecord.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.procurementrecord.pojo.CustomStorage;
+
+/**
+ * @author :yys
+ * @date : 2025/11/10 13:11
+ */
+public interface CustomStorageMapper extends BaseMapper<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..bd0f2a2 100644
--- a/src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordMapper.java
+++ b/src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordMapper.java
@@ -31,4 +31,8 @@
     List<ProcurementPageDtoCopy> listCopy();
 
     List<ProcurementPageDto> list();
+
+    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/pojo/CustomStorage.java b/src/main/java/com/ruoyi/procurementrecord/pojo/CustomStorage.java
new file mode 100644
index 0000000..0594a58
--- /dev/null
+++ b/src/main/java/com/ruoyi/procurementrecord/pojo/CustomStorage.java
@@ -0,0 +1,89 @@
+package com.ruoyi.procurementrecord.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+/**
+ * @author :yys
+ * @date : 2025/11/10 11:51
+ */
+@TableName("custom_storage")
+@Data
+public class CustomStorage {
+
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    // 鍏ュ簱鏃堕棿
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private Date inboundDate;
+    // 鐗╁搧绫诲瀷
+    private String itemType;
+    // 鍏ュ簱鎵规
+    private String inboundBatches;
+    // 鍏ュ簱鏁伴噺
+    private BigDecimal inboundNum;
+    // 渚涘簲鍟嗗悕绉�
+    private String supplierName;
+    // 浜у搧澶х被
+    private String productCategory;
+    // 瑙勬牸鍨嬪彿
+    private String specificationModel;
+    // 鍗曚綅
+    private String unit;
+    // 鍚◣鍗曚环
+    private BigDecimal taxInclusiveUnitPrice;
+    // 鍚◣鎬讳环
+    private BigDecimal taxInclusiveTotalPrice;
+    // 绋庣巼(%)
+    private BigDecimal taxRate;
+    // 涓嶅惈绋庢�讳环
+    private BigDecimal taxExclusiveTotalPrice;
+    /**
+     * 鍑哄嚭搴撶敤鎴�
+     */
+    private String createBy;
+    /**
+     * 鍏ュ簱鐢ㄦ埛id
+     */
+    @TableField(fill = FieldFill.INSERT)
+    private Long createUser;
+
+    /**
+     * 鍏ュ簱鏃堕棿
+     */
+    @TableField(fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime createTime;
+
+    /**
+     * 淇敼鑰�
+     */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Long updateUser;
+
+    /**
+     * 淇敼鏃堕棿
+     */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime updateTime;
+
+    /**
+     * 绉熸埛ID
+     */
+    @TableField(fill = FieldFill.INSERT)
+    private Long tenantId;
+
+}
diff --git a/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java b/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java
index b09b0f3..45de179 100644
--- a/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java
+++ b/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java
@@ -54,21 +54,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/ProcurementRecordStorage.java b/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java
index 91df389..a749788 100644
--- a/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java
+++ b/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java
@@ -59,21 +59,25 @@
     /**
      * 鍏ュ簱鐢ㄦ埛id
      */
+    @TableField(fill = FieldFill.INSERT)
     private Long createUser;
 
     /**
      * 鍏ュ簱鏃堕棿
      */
+    @TableField(fill = FieldFill.INSERT)
     private LocalDateTime createTime;
 
     /**
      * 淇敼鑰�
      */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
     private Long updateUser;
 
     /**
      * 淇敼鏃堕棿
      */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
     private LocalDateTime updateTime;
 
     /**
diff --git a/src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java b/src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java
index 79603ae..feabbf3 100644
--- a/src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java
+++ b/src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java
@@ -3,7 +3,9 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.procurementrecord.dto.*;
+import com.ruoyi.procurementrecord.pojo.CustomStorage;
 import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage;
 
 import javax.servlet.http.HttpServletResponse;
@@ -34,4 +36,14 @@
     void exportCopy(HttpServletResponse response);
 
     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);
 }
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 3c1a4a8..3d03087 100644
--- a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
+++ b/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
@@ -7,9 +7,12 @@
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.framework.security.LoginUser;
+import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.procurementrecord.dto.*;
+import com.ruoyi.procurementrecord.mapper.CustomStorageMapper;
 import com.ruoyi.procurementrecord.mapper.ProcurementRecordMapper;
 import com.ruoyi.procurementrecord.mapper.ProcurementRecordOutMapper;
+import com.ruoyi.procurementrecord.pojo.CustomStorage;
 import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage;
 import com.ruoyi.procurementrecord.pojo.ProcurementRecordOut;
 import com.ruoyi.procurementrecord.service.ProcurementRecordService;
@@ -21,6 +24,7 @@
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
 
 import javax.servlet.http.HttpServletResponse;
 import java.math.BigDecimal;
@@ -336,6 +340,134 @@
     }
 
     @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);
+        List<ProcurementRecordOut> procurementRecords = procurementRecordOutMapper.selectList(procurementRecordLambdaQueryWrapper);
+        if(CollectionUtils.isEmpty( procurementRecords)){
+            return procurementPageDtoIPage;
+        }
+        for (ProcurementPageDto dto : procurementPageDtos) {
+            // 鏍规嵁閲囪喘鍙拌处ID绛涢�夊搴旂殑鍑哄簱璁板綍
+            List<ProcurementRecordOut> collect1 = procurementRecords.stream()
+                    .filter(ProcurementRecordOut -> ProcurementRecordOut.getProcurementRecordStorageId().equals(dto.getId()))
+                    .collect(Collectors.toList());
+
+            // 濡傛灉娌℃湁鐩稿叧鐨勫嚭搴撹褰曪紝璺宠繃璇ユ潯鏁版嵁
+            if(CollectionUtils.isEmpty(collect1)){
+                dto.setInboundNum0(dto.getInboundNum());
+                continue;
+            }
+
+            // 璁$畻宸插嚭搴撴暟閲忔�诲拰锛屽苟璁剧疆寰呭嚭搴撴暟閲�
+            BigDecimal totalInboundNum = collect1.stream()
+                    .map(ProcurementRecordOut::getInboundNum)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+            // 寰呭嚭搴撴暟閲� = 鎬绘暟閲� - 宸插嚭搴撴暟閲�
+            dto.setInboundNum0(dto.getInboundNum().subtract(totalInboundNum));
+        }
+        return procurementPageDtoIPage;
+    }
+
+    private final CustomStorageMapper customStorageMapper;
+
+    @Override
+    public AjaxResult addCustom(List<CustomStorage> customStorage) {
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        if(CollectionUtils.isEmpty(customStorage)){
+            return AjaxResult.error("鏁版嵁涓嶈兘涓虹┖");
+        }
+        customStorage.forEach(item -> {
+            // 鏌ヨ閲囪喘鍏ュ簱鏁伴噺
+            Long aLong = customStorageMapper.selectCount(null);
+            item.setInboundBatches(aLong.equals(0L) ? "绗�1鎵规(鑷畾涔夊叆搴�)" : "绗�"+ (aLong + 1) + "鎵规(鑷畾涔夊叆搴�)" );
+            item.setCreateBy(loginUser.getNickName());
+            customStorageMapper.insert(item);
+        });
+        return AjaxResult.success("鑷畾涔夊叆搴撴垚鍔�");
+    }
+
+    @Override
+    public IPage<CustomStorage> listPageByCustom(Page page, CustomStorage customStorage) {
+        LambdaQueryWrapper<CustomStorage> customStorageLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        if(customStorage != null){
+            if(!StringUtils.isEmpty(customStorage.getSupplierName())){
+                customStorageLambdaQueryWrapper.like(CustomStorage::getSupplierName, customStorage.getSupplierName());
+            }
+            // 绛涢�夊叆搴撴椂闂�
+            if(customStorage.getInboundDate() != null){
+                customStorageLambdaQueryWrapper.eq(CustomStorage::getInboundDate, customStorage.getInboundDate());
+            }
+        }
+        return customStorageMapper.selectPage(page, customStorageLambdaQueryWrapper);
+    }
+
+    @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);
+        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());
+                continue;
+            }
+
+            // 璁$畻宸插嚭搴撴暟閲忔�诲拰锛屽苟璁剧疆寰呭嚭搴撴暟閲�
+            BigDecimal totalInboundNum = collect1.stream()
+                    .map(ProcurementRecordOut::getInboundNum)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+            // 鍑哄簱鏁伴噺 = 鎬绘暟閲� - 寰呭嚭搴撴暟閲�
+            dto.setTotalInboundNum(totalInboundNum);
+            // 寰呭嚭搴撴暟閲� = 鎬绘暟閲� - 宸插嚭搴撴暟閲�
+            dto.setInboundNum0(dto.getInboundNum().subtract(totalInboundNum));
+        }
+        return procurementPageDtoCopyIPage;
+    }
+
+    @Override
+    public IPage<CustomStorage> listPageCopyByCustom(Page page, CustomStorage customStorage) {
+        LambdaQueryWrapper<CustomStorage> customStorageLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        customStorageLambdaQueryWrapper.groupBy(CustomStorage::getSupplierName, CustomStorage::getProductCategory, CustomStorage::getSpecificationModel);
+        if(customStorage != null){
+            if(!StringUtils.isEmpty(customStorage.getSupplierName())){
+                customStorageLambdaQueryWrapper.like(CustomStorage::getSupplierName, customStorage.getSupplierName());
+            }
+            // 绛涢�夊叆搴撴椂闂�
+            if(customStorage.getInboundDate() != null){
+                customStorageLambdaQueryWrapper.eq(CustomStorage::getInboundDate, customStorage.getInboundDate());
+            }
+        }
+        return customStorageMapper.selectPage(page, customStorageLambdaQueryWrapper);
+    }
+
+    @Override
     public int add(ProcurementAddDto procurementDto) {
         LoginUser loginUser = SecurityUtils.getLoginUser();
         // 鎵归噺鏂板
diff --git a/src/main/java/com/ruoyi/production/dto/ProcessSchedulingDto.java b/src/main/java/com/ruoyi/production/dto/ProcessSchedulingDto.java
index da2ed71..8df5d32 100644
--- a/src/main/java/com/ruoyi/production/dto/ProcessSchedulingDto.java
+++ b/src/main/java/com/ruoyi/production/dto/ProcessSchedulingDto.java
@@ -66,5 +66,11 @@
     @ApiModelProperty(value = "鍙e懗鍒嗙被")
     private String type;
 
+    /**
+     * 棰嗙敤
+     */
+    @ApiModelProperty(value = "棰嗙敤")
+    private String receive;
+
 
 }
diff --git a/src/main/java/com/ruoyi/production/dto/SalesLedgerWorkDto.java b/src/main/java/com/ruoyi/production/dto/SalesLedgerWorkDto.java
index a32bd62..0b3af3c 100644
--- a/src/main/java/com/ruoyi/production/dto/SalesLedgerWorkDto.java
+++ b/src/main/java/com/ruoyi/production/dto/SalesLedgerWorkDto.java
@@ -107,5 +107,12 @@
     @Excel(name = "鍙e懗鍒嗙被")
     private String type;
 
+    /**
+     * 棰嗙敤
+     */
+    @ApiModelProperty(value = "棰嗙敤")
+    @Excel(name = "棰嗙敤")
+    private String receive;
+
 
 }
diff --git a/src/main/java/com/ruoyi/production/pojo/SalesLedgerWork.java b/src/main/java/com/ruoyi/production/pojo/SalesLedgerWork.java
index f6c2a38..50e9ca9 100644
--- a/src/main/java/com/ruoyi/production/pojo/SalesLedgerWork.java
+++ b/src/main/java/com/ruoyi/production/pojo/SalesLedgerWork.java
@@ -93,6 +93,11 @@
     private String type;
 
     /**
+     * 棰嗙敤
+     */
+    private String receive;
+
+    /**
      * 鍒涘缓鑰�
      */
     @TableField(fill = FieldFill.INSERT)
diff --git a/src/main/java/com/ruoyi/production/service/impl/SalesLedgerSchedulingServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/SalesLedgerSchedulingServiceImpl.java
index 995629d..0be634b 100644
--- a/src/main/java/com/ruoyi/production/service/impl/SalesLedgerSchedulingServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/SalesLedgerSchedulingServiceImpl.java
@@ -171,6 +171,7 @@
                     .remark(processSchedulingDto.getRemark())
                     .type(processSchedulingDto.getType())
                     .loss(processSchedulingDto.getLoss())
+                    .receive(processSchedulingDto.getReceive())
                     .salesLedgerProductId(salesLedgerScheduling.getSalesLedgerProductId())
                     .schedulingUserId(salesLedgerScheduling.getSchedulingUserId())
                     .schedulingUserName(sysUser.getNickName())
diff --git a/src/main/resources/application-native.yml b/src/main/resources/application-native.yml
new file mode 100644
index 0000000..e793077
--- /dev/null
+++ b/src/main/resources/application-native.yml
@@ -0,0 +1,219 @@
+# 椤圭洰鐩稿叧閰嶇疆
+ruoyi:
+  # 鍚嶇О
+  name: RuoYi
+  # 鐗堟湰
+  version: 3.8.9
+  # 鐗堟潈骞翠唤
+  copyrightYear: 2025
+  # 鏂囦欢璺緞 绀轰緥锛� Windows閰嶇疆D:/ruoyi/uploadPath锛孡inux閰嶇疆 /home/ruoyi/uploadPath锛�
+  profile: /javaWork/product-inventory-management/file
+
+  # 鑾峰彇ip鍦板潃寮�鍏�
+  addressEnabled: false
+  # 楠岃瘉鐮佺被鍨� math 鏁板瓧璁$畻 char 瀛楃楠岃瘉
+  captchaType: math
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 8080
+  servlet:
+    # 搴旂敤鐨勮闂矾寰�
+    context-path: /
+  tomcat:
+    # tomcat鐨刄RI缂栫爜
+    uri-encoding: UTF-8
+    # 杩炴帴鏁版弧鍚庣殑鎺掗槦鏁帮紝榛樿涓�100
+    accept-count: 1000
+    threads:
+      # tomcat鏈�澶х嚎绋嬫暟锛岄粯璁や负200
+      max: 800
+      # Tomcat鍚姩鍒濆鍖栫殑绾跨▼鏁帮紝榛樿鍊�10
+      min-spare: 100
+
+# 鏃ュ織閰嶇疆
+logging:
+  level:
+    com.ruoyi: warn
+    org.springframework: warn
+
+minio:
+  endpoint: http://114.132.189.42/
+  port: 7019
+  secure: false
+  accessKey: admin
+  secretKey: 12345678
+  preview-expiry: 24 # 棰勮鍦板潃榛樿24灏忔椂
+  default-bucket: demo-product
+# 鐢ㄦ埛閰嶇疆
+user:
+  password:
+    # 瀵嗙爜鏈�澶ч敊璇鏁�
+    maxRetryCount: 5
+    # 瀵嗙爜閿佸畾鏃堕棿锛堥粯璁�10鍒嗛挓锛�
+    lockTime: 10
+
+# Spring閰嶇疆
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.cj.jdbc.Driver
+    druid:
+      # 涓诲簱鏁版嵁婧�
+      master:
+        url: jdbc:mysql://localhost:3306/product-inventory-management?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: 123456
+      # 浠庡簱鏁版嵁婧�
+      slave:
+        # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴
+        enabled: false
+        url:
+        username:
+        password:
+      # 鍒濆杩炴帴鏁�
+      initialSize: 5
+      # 鏈�灏忚繛鎺ユ睜鏁伴噺
+      minIdle: 10
+      # 鏈�澶ц繛鎺ユ睜鏁伴噺
+      maxActive: 20
+      # 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂�
+      maxWait: 60000
+      # 閰嶇疆杩炴帴瓒呮椂鏃堕棿
+      connectTimeout: 30000
+      # 閰嶇疆缃戠粶瓒呮椂鏃堕棿
+      socketTimeout: 60000
+      # 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫�娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶆槸姣
+      timeBetweenEvictionRunsMillis: 60000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�灏忕敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      minEvictableIdleTimeMillis: 300000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�澶х敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      maxEvictableIdleTimeMillis: 900000
+      # 閰嶇疆妫�娴嬭繛鎺ユ槸鍚︽湁鏁�
+      validationQuery: SELECT 1 FROM DUAL
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      webStatFilter:
+        enabled: true
+      statViewServlet:
+        enabled: true
+        # 璁剧疆鐧藉悕鍗曪紝涓嶅~鍒欏厑璁告墍鏈夎闂�
+        allow:
+        url-pattern: /druid/*
+        # 鎺у埗鍙扮鐞嗙敤鎴峰悕鍜屽瘑鐮�
+        login-username: ruoyi
+        login-password: 123456
+      filter:
+        stat:
+          enabled: true
+          # 鎱QL璁板綍
+          log-slow-sql: true
+          slow-sql-millis: 1000
+          merge-sql: true
+        wall:
+          config:
+            multi-statement-allow: true
+  # 璧勬簮淇℃伅
+  messages:
+    # 鍥介檯鍖栬祫婧愭枃浠惰矾寰�
+    basename: i18n/messages
+  # 鏂囦欢涓婁紶
+  servlet:
+    multipart:
+      # 鍗曚釜鏂囦欢澶у皬
+      max-file-size: 1GB
+      # 璁剧疆鎬讳笂浼犵殑鏂囦欢澶у皬
+      max-request-size: 2GB
+  # 鏈嶅姟妯″潡
+  devtools:
+    restart:
+      # 鐑儴缃插紑鍏�
+      enabled: false
+  # redis 閰嶇疆
+  redis:
+    # 鍦板潃
+#    host: 127.0.0.1
+    host: 192.168.1.185
+    # 绔彛锛岄粯璁や负6379
+    port: 6379
+    # 鏁版嵁搴撶储寮�
+    database: 0
+    # 瀵嗙爜
+#    password: root2022!
+    password:
+
+    # 杩炴帴瓒呮椂鏃堕棿
+    timeout: 10s
+    lettuce:
+      pool:
+        # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+        min-idle: 0
+        # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+        max-idle: 8
+        # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+        max-active: 8
+        # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+        max-wait: -1ms
+
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝瀵嗛挜
+  secret: abcdefghijklmnopqrstuvwxyz
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿30鍒嗛挓锛�
+  expireTime: 450
+  
+# MyBatis Plus閰嶇疆
+mybatis-plus:
+  # 鎼滅储鎸囧畾鍖呭埆鍚�   鏍规嵁鑷繁鐨勯」鐩潵
+  typeAliasesPackage: com.ruoyi.**.pojo
+  # 閰嶇疆mapper鐨勬壂鎻忥紝鎵惧埌鎵�鏈夌殑mapper.xml鏄犲皠鏂囦欢
+  mapperLocations: classpath*:mapper/**/*Mapper.xml
+  # 鍔犺浇鍏ㄥ眬鐨勯厤缃枃浠�
+  configLocation: classpath:mybatis/mybatis-config.xml
+  global-config:
+    enable-sql-runner: true
+    db-config:
+      id-type: auto
+  
+# PageHelper鍒嗛〉鎻掍欢
+pagehelper:
+  helperDialect: mysql
+  supportMethodsArguments: true
+  params: count=countSql
+
+# Swagger閰嶇疆
+swagger:
+  # 鏄惁寮�鍚痵wagger
+  enabled: true
+  # 璇锋眰鍓嶇紑
+  pathMapping: /dev-api
+
+# 闃叉XSS鏀诲嚮
+xss:
+  # 杩囨护寮�鍏�
+  enabled: true
+  # 鎺掗櫎閾炬帴锛堝涓敤閫楀彿鍒嗛殧锛�
+  excludes: /system/notice
+  # 鍖归厤閾炬帴
+  urlPatterns: /system/*,/monitor/*,/tool/*
+  
+# 浠g爜鐢熸垚
+gen:
+  # 浣滆��
+  author: ruoyi
+  # 榛樿鐢熸垚鍖呰矾寰� system 闇�鏀规垚鑷繁鐨勬ā鍧楀悕绉� 濡� system monitor tool
+  packageName: com.ruoyi.project.system
+  # 鑷姩鍘婚櫎琛ㄥ墠缂�锛岄粯璁ゆ槸true
+  autoRemovePre: false
+  # 琛ㄥ墠缂�锛堢敓鎴愮被鍚嶄笉浼氬寘鍚〃鍓嶇紑锛屽涓敤閫楀彿鍒嗛殧锛�
+  tablePrefix: sys_
+  # 鏄惁鍏佽鐢熸垚鏂囦欢瑕嗙洊鍒版湰鍦帮紙鑷畾涔夎矾寰勶級锛岄粯璁や笉鍏佽
+  allowOverwrite: false
+
+file:
+  temp-dir: /javaWork/product-inventory-management/file/temp/uploads
+  upload-dir: /javaWork/product-inventory-management/file/prod/uploads
\ No newline at end of file
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 6a88940..8b9d23f 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -1,4 +1,4 @@
 # Spring閰嶇疆
 spring:
   profiles:
-    active: hckx
+    active: native
diff --git a/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml b/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml
index 58fbaa2..3f059e7 100644
--- a/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml
+++ b/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml
@@ -50,15 +50,12 @@
         t1.create_by,
         t2.warn_num
         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>
-            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.type != null and req.type != ''">
-                and t1.type = #{req.type}
             </if>
             <if test="req.timeStr != null and req.timeStr != ''">
                 and t1.create_time like  concat('%',#{req.timeStr},'%')
@@ -112,15 +109,12 @@
         t1.create_by,
         t2.warn_num
         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>
-            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.type != null and req.type != ''">
-                and t1.type = #{req.type}
             </if>
             <if test="req.timeStr != null and req.timeStr != ''">
                 and t1.create_time like  concat('%',#{req.timeStr},'%')
@@ -169,4 +163,92 @@
                   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
     </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.inbound_batches,
+        t1.inbound_num,
+        t1.inbound_num as inboundNum0,
+        t1.create_time,
+        t1.update_time,
+        t1.create_by,
+        t2.warn_num
+        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
+            <if test="req.customerName != null and req.customerName != ''">
+                and t3.customer_name like  concat('%',#{req.customerName},'%')
+            </if>
+            <if test="req.timeStr != null and req.timeStr != ''">
+                and t1.create_time like  concat('%',#{req.timeStr},'%')
+            </if>
+        </where>
+    </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.inbound_num) as inboundNum,
+        sum(t1.inbound_num) as inboundNum0,
+        t1.inbound_num as totalInboundNum,
+        t1.create_time,
+        t1.update_time,
+        t1.create_by,
+        t2.warn_num
+        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
+            <if test="req.customerName != null and req.customerName != ''">
+                and t3.customer_name like  concat('%',#{req.customerName},'%')
+            </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 t3.customer_name,t2.product_category,t2.specification_model
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/production/SalesLedgerWorkMapper.xml b/src/main/resources/mapper/production/SalesLedgerWorkMapper.xml
index 87ede93..3201d62 100644
--- a/src/main/resources/mapper/production/SalesLedgerWorkMapper.xml
+++ b/src/main/resources/mapper/production/SalesLedgerWorkMapper.xml
@@ -16,6 +16,7 @@
         t4.loss,
         t4.type,
         t4.remark,
+        t4.receive,
         T1.sales_contract_no,
         T1.customer_contract_no,
         T1.project_name,

--
Gitblit v1.9.3