From 4107cf0d0e2edf99dd8d74d5580d95c2b35c1990 Mon Sep 17 00:00:00 2001
From: yaowanxin <3588231647@qq.com>
Date: 星期一, 22 九月 2025 15:06:34 +0800
Subject: [PATCH] 报表统计功能,增添最低库存字段

---
 src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java    |    5 +
 src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDtoCopy.java                |   37 +++++++++
 src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java          |    3 
 src/main/java/com/ruoyi/procurementrecord/dto/ProcurementDto.java                        |    5 +
 src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml                  |   17 ++++
 src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDto.java                    |   33 ++++++++
 src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java |  103 +++++++++++++++++++++++++
 src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java             |    5 +
 8 files changed, 204 insertions(+), 4 deletions(-)

diff --git a/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java b/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java
index a106fb2..4a7b85a 100644
--- a/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java
+++ b/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java
@@ -80,6 +80,11 @@
         IPage<ProcurementPageDtoCopy> result =procurementRecordService.listPageCopy(page, procurementDto);
         return AjaxResult.success(result);
     }
+    @GetMapping("/getReportList")
+    @Log(title = "搴撳瓨鎶ヨ〃鏌ヨ", businessType = BusinessType.OTHER)
+    public AjaxResult getReportList(Page page, ProcurementPageDto procurementDto) {
+        return AjaxResult.success(procurementRecordService.getReportList(page, procurementDto));
+    }
 
     /**
      * 瀵煎嚭
diff --git a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementDto.java b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementDto.java
index 63ce258..7864f93 100644
--- a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementDto.java
+++ b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementDto.java
@@ -57,6 +57,11 @@
     private BigDecimal quantity;
 
     /**
+     * 鏈�浣庡簱瀛樻暟閲�
+     */
+    @Excel(name = "鏈�浣庡簱瀛樻暟閲�")
+    private BigDecimal minStock;
+    /**
      * 寰呭叆搴撴暟閲�
      */
     @Excel(name = "寰呭叆搴撴暟閲�")
diff --git a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDto.java b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDto.java
index 51ad7bd..387a8b5 100644
--- a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDto.java
+++ b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDto.java
@@ -1,10 +1,13 @@
 package com.ruoyi.procurementrecord.dto;
 
+
 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.LocalDate;
 import java.time.LocalDateTime;
 
 /**
@@ -112,5 +115,35 @@
      */
     @Excel(name = "涓嶅惈绋庢�讳环")
     private BigDecimal taxExclusiveTotalPrice;
+    /**
+     * 鎶ヨ〃鏃ユ姤
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate reportDate;
+    /**
+     * 鎶ヨ〃鏈堟姤
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate startMonth;
+    /**
+     * 鎶ヨ〃鏈堟姤
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate endMonth;
+    /**
+     * 鎶ヨ〃鏈堟姤
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate startDate;
+    /**
+     * 鎶ヨ〃鏈堟姤
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate endDate;
 
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDtoCopy.java b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDtoCopy.java
index 9ef5677..f2e214e 100644
--- a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDtoCopy.java
+++ b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDtoCopy.java
@@ -5,6 +5,7 @@
 import lombok.Data;
 
 import java.math.BigDecimal;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 
 /**
@@ -43,7 +44,11 @@
     @Excel(name = "寰呭嚭搴撴暟閲�")
     private BigDecimal inboundNum0;
 
-
+    /**
+     * 鏈�浣庡簱瀛樻暟閲�
+     */
+    @Excel(name = "鏈�浣庡簱瀛樻暟閲�")
+    private BigDecimal minStock;
     /**
      * 鍑哄叆搴撴椂闂�
      */
@@ -124,5 +129,35 @@
      */
     @Excel(name = "涓嶅惈绋庢�讳环")
     private BigDecimal taxExclusiveTotalPrice;
+    /**
+     * 鎶ヨ〃鏃ユ姤
+     */
+    @Excel(name = "鎶ヨ〃鏃ユ姤")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private LocalDate reportDate;
+    /**
+     * 鎶ヨ〃鏈堟姤
+     */
+    @Excel(name = "鎶ヨ〃鏈堟姤寮�濮嬫椂闂�")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private LocalDate startMonth;
+    /**
+     * 鎶ヨ〃鏈堟姤
+     */
+    @Excel(name = "鎶ヨ〃鏈堟姤缁撴潫鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private LocalDate endMonth;
+    /**
+     * 鎶ヨ〃鏈堟姤
+     */
+    @Excel(name = "鎶ヨ〃浣滀笟寮�濮嬫椂闂�")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private LocalDate startDate;
+    /**
+     * 鎶ヨ〃鏈堟姤
+     */
+    @Excel(name = "鎶ヨ〃浣滀笟缁撴潫鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private LocalDate endDate;
 
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java b/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java
index 495a8a6..a0f73d9 100644
--- a/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java
+++ b/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java
@@ -35,12 +35,17 @@
      * 鍏ュ簱鏁伴噺
      */
     private BigDecimal inboundNum;
+//    /**
+//     * 鏈�浣庡簱瀛樻暟閲�
+//     */
+//    private BigDecimal minStock;
 
     /**
      * 鍏ュ簱鐢ㄦ埛
      */
     private String createBy;
 
+
     /**
      * 鍏ュ簱鐢ㄦ埛id
      */
diff --git a/src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java b/src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java
index c7e1699..79603ae 100644
--- a/src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java
+++ b/src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java
@@ -8,6 +8,7 @@
 
 import javax.servlet.http.HttpServletResponse;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @author :yys
@@ -31,4 +32,6 @@
     int updateManagement(ProcurementManagementUpdateDto procurementDto);
 
     void exportCopy(HttpServletResponse response);
+
+    Map<String, Object> getReportList(Page page, ProcurementPageDto 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 06612f6..1e237f0 100644
--- a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
+++ b/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
@@ -4,7 +4,6 @@
 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.DateUtils;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.framework.security.LoginUser;
@@ -17,7 +16,6 @@
 import com.ruoyi.project.system.domain.SysUser;
 import com.ruoyi.project.system.mapper.SysUserMapper;
 import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
-import com.ruoyi.sales.pojo.SalesLedgerProduct;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -25,9 +23,10 @@
 
 import javax.servlet.http.HttpServletResponse;
 import java.math.BigDecimal;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
-import java.util.List;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -231,6 +230,104 @@
     }
 
     @Override
+    public Map<String, Object> getReportList(Page page, ProcurementPageDto procurementDto) {
+        // 鏋勫缓鎶ヨ〃鏁版嵁缁撴瀯
+        Map<String, Object> reportData = new HashMap<>();
+        // 2. 鏋勫缓鍥捐〃鏁版嵁
+        Map<String, Object> chartData = new HashMap<>();
+
+        IPage<ProcurementPageDtoCopy> procurementPageDtoCopyIPage = procurementRecordMapper.listPageCopy(page, procurementDto);
+        List<ProcurementPageDtoCopy> procurementPageDtoCopyList = procurementPageDtoCopyIPage.getRecords();
+        // 璁$畻寰呭叆搴撴暟閲�
+        reportData.put("tableData", procurementPageDtoCopyList);
+        // 鏌ヨ閲囪喘璁板綍宸插叆搴撴暟閲�
+        List<Integer> collect = procurementPageDtoCopyList.stream().map(ProcurementPageDtoCopy::getId).collect(Collectors.toList());
+        if(CollectionUtils.isEmpty(collect)){
+             return reportData;
+        }
+        LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, collect);
+        List<ProcurementRecordOut> procurementRecords = procurementRecordOutMapper.selectList(procurementRecordLambdaQueryWrapper);
+        if(CollectionUtils.isEmpty( procurementRecords)){
+             return reportData;
+        }
+        int totalIn =0;
+        int totalOut =0;
+        int currentStock =0;
+        int turnoverRate =0;
+        List<String> dates = new ArrayList<>();
+        List<Integer> values = new ArrayList<>();
+        List<String> comparisonDates = new ArrayList<>();
+        List<Integer> inValues = new ArrayList<>();
+        List<Integer> outValues = new ArrayList<>();
+        // 瀹氫箟鏃ユ湡鏍煎紡鍖栧櫒锛屾寚瀹氫负yyyy-MM-dd鏍煎紡
+        DateTimeFormatter dateFormatter = DateTimeFormatter.ISO_LOCAL_DATE;
+        for (ProcurementPageDtoCopy dto : procurementPageDtoCopyList) {
+            dates.add(dto.getCreateTime().format(dateFormatter));
+            comparisonDates.add(dto.getCreateTime().format(dateFormatter));
+
+            // 鏍规嵁閲囪喘鍙拌处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));
+
+            // 璁$畻鎬诲叆搴撴暟閲�
+            totalIn += dto.getInboundNum().intValue();
+            inValues.add(totalIn);
+            // 璁$畻鎬诲嚭搴撴暟閲�
+            totalOut += totalInboundNum.intValue();
+            outValues.add(totalOut);
+            // 璁$畻褰撳墠搴撳瓨
+            currentStock += dto.getInboundNum().intValue() - totalInboundNum.intValue();
+            values.add(currentStock);
+            // 璁$畻鍛ㄨ浆鐜�
+            if(totalIn > 0){
+                turnoverRate = totalOut * 100 / totalIn;
+            }
+        }
+
+
+        // 1. 鏋勫缓姹囨�绘暟鎹�
+        Map<String, Object> summary = new HashMap<>();
+        summary.put("totalIn", totalIn);          // 鎬诲叆搴撻噺锛屽疄闄呭簲浠庢暟鎹绠�
+        summary.put("totalOut", totalOut);         // 鎬诲嚭搴撻噺锛屽疄闄呭簲浠庢暟鎹绠�
+        summary.put("currentStock", currentStock);     // 褰撳墠搴撳瓨閲忥紝瀹為檯搴斾粠鏁版嵁璁$畻
+        summary.put("turnoverRate", turnoverRate);      // 鍛ㄨ浆鐜囷紝瀹為檯搴斾粠鏁版嵁璁$畻
+        reportData.put("summary", summary);
+
+        // 2. 鏋勫缓鍥捐〃鏁版嵁
+//        Map<String, Object> chartData = new HashMap<>();
+//        List<String> dates = Arrays.asList("2025-09-15", "2025-09-16", "2025-09-17", "2025-09-18", "2025-09-19");
+//        List<Integer> values = Arrays.asList(300, 350, 400, 380, 420);
+
+        chartData.put("dates", dates);
+        chartData.put("values", values);
+        chartData.put("comparisonDates", comparisonDates);  // 瀹為檯搴斾粠鏁版嵁璁$畻
+        chartData.put("inValues", inValues);         // 瀹為檯搴斾粠鏁版嵁璁$畻
+        chartData.put("outValues", outValues);        // 瀹為檯搴斾粠鏁版嵁璁$畻
+        reportData.put("chartData", chartData);
+
+        // 3. 璁剧疆琛ㄦ牸鏁版嵁
+        reportData.put("tableData", procurementPageDtoCopyList);
+
+        return reportData;
+    }
+
+    @Override
     public int add(ProcurementAddDto procurementDto) {
         LoginUser loginUser = SecurityUtils.getLoginUser();
         // 鎵归噺鏂板
diff --git a/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml b/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml
index 7d0f59b..e367bc8 100644
--- a/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml
+++ b/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml
@@ -11,6 +11,7 @@
             t2.specification_model,
             t2.unit,
             t2.quantity,
+            t2.min_stock,
             t2.quantity as quantity0,
             t2.tax_rate,
             t2.tax_inclusive_unit_price,
@@ -89,6 +90,7 @@
         t1.create_user,
         t2.specification_model,
         t2.unit,
+        t2.min_stock,
         t2.tax_rate,
         t2.tax_inclusive_unit_price,
         t2.tax_inclusive_total_price,
@@ -107,6 +109,21 @@
             <if test="req.supplierName != null and req.supplierName != ''">
                 and t3.supplier_name like  concat('%',#{req.supplierName},'%')
             </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>
     </select>
     <select id="listCopy" resultType="com.ruoyi.procurementrecord.dto.ProcurementPageDtoCopy">

--
Gitblit v1.9.3