From ea2aae8086322b2397f8c50e4ed327b0b3abf4fc Mon Sep 17 00:00:00 2001
From: maven <2163098428@qq.com>
Date: 星期五, 12 十二月 2025 16:32:10 +0800
Subject: [PATCH] yys

---
 src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java |  441 ++++++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 374 insertions(+), 67 deletions(-)

diff --git a/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java b/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
index d346d41..c238f57 100644
--- a/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
+++ b/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
@@ -1,6 +1,9 @@
 package com.ruoyi.home.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.ruoyi.account.pojo.AccountExpense;
+import com.ruoyi.account.pojo.AccountIncome;
 import com.ruoyi.approve.mapper.ApproveProcessMapper;
 import com.ruoyi.approve.pojo.ApproveProcess;
 import com.ruoyi.common.utils.SecurityUtils;
@@ -8,10 +11,14 @@
 import com.ruoyi.framework.security.LoginUser;
 import com.ruoyi.home.dto.*;
 import com.ruoyi.home.service.HomeService;
+import com.ruoyi.lavorissue.mapper.LavorIssueMapper;
+import com.ruoyi.lavorissue.pojo.LaborIssue;
 import com.ruoyi.procurementrecord.mapper.ProcurementRecordMapper;
 import com.ruoyi.procurementrecord.mapper.ProcurementRecordOutMapper;
 import com.ruoyi.procurementrecord.pojo.ProcurementRecordOut;
 import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage;
+import com.ruoyi.production.mapper.SalesLedgerWorkMapper;
+import com.ruoyi.production.pojo.SalesLedgerWork;
 import com.ruoyi.project.system.domain.SysDept;
 import com.ruoyi.project.system.mapper.SysDeptMapper;
 import com.ruoyi.purchase.mapper.PaymentRegistrationMapper;
@@ -29,10 +36,14 @@
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.time.*;
+import java.time.format.DateTimeFormatter;
 import java.time.temporal.TemporalAdjusters;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -74,10 +85,18 @@
     private PaymentRegistrationMapper paymentRegistrationMapper;
 
     @Autowired
+    private LavorIssueMapper lavorIssueMapper;
+
+    @Autowired
     private SysDeptMapper sysDeptMapper;
+
+    @Autowired
+    private SalesLedgerWorkMapper salesLedgerWorkMapper;;
 
     @Override
     public HomeBusinessDto business() {
+        // 鏋勫缓缁撴灉
+        HomeBusinessDto homeBusinessDto = new HomeBusinessDto();
         LocalDate now = LocalDate.now();
         YearMonth currentMonth = YearMonth.from(now);
         // 鍒涘缓LambdaQueryWrapper
@@ -85,6 +104,9 @@
         salesLedgerLambdaQueryWrapper.ge(SalesLedger::getEntryDate, currentMonth.atDay(1).atStartOfDay())  // 澶т簬绛変簬鏈湀绗竴澶�
                 .lt(SalesLedger::getEntryDate, currentMonth.plusMonths(1).atDay(1).atStartOfDay()); // 灏忎簬涓嬫湀绗竴澶�
         List<SalesLedger> salesLedgers = salesLedgerMapper.selectList(salesLedgerLambdaQueryWrapper);
+        if(CollectionUtils.isEmpty(salesLedgers)){
+            return homeBusinessDto;
+        }
         // 鍚堣鍚堝悓閲戦
         BigDecimal contractAmount = salesLedgers.stream().map(SalesLedger::getContractAmount)
                 .filter(Objects::nonNull)
@@ -97,7 +119,8 @@
         BigDecimal noInvoiceAmountTotal = salesLedgerProducts.stream().map(SalesLedgerProduct::getNoInvoiceAmount)
                 .filter(Objects::nonNull)
                 .reduce(BigDecimal.ZERO, BigDecimal::add);
-
+        homeBusinessDto.setMonthSaleMoney(contractAmount.setScale(2, RoundingMode.HALF_UP).toString());
+        homeBusinessDto.setMonthSaleHaveMoney(noInvoiceAmountTotal.setScale(2, RoundingMode.HALF_UP).toString());
         // 鍒涘缓LambdaQueryWrapper
         LambdaQueryWrapper<PurchaseLedger> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.ge(PurchaseLedger::getEntryDate, currentMonth.atDay(1).atStartOfDay())  // 澶т簬绛変簬鏈湀绗竴澶�
@@ -105,6 +128,9 @@
 
         // 鎵ц鏌ヨ骞惰绠楁�诲拰
         List<PurchaseLedger> purchaseLedgers = purchaseLedgerMapper.selectList(queryWrapper);
+        if(CollectionUtils.isEmpty(purchaseLedgers)){
+            return homeBusinessDto;
+        }
 
         LambdaQueryWrapper<SalesLedgerProduct> salesLedgerProductMapperLambdaQueryWrapperCopy = new LambdaQueryWrapper<SalesLedgerProduct>();
         salesLedgerProductMapperLambdaQueryWrapper.eq(SalesLedgerProduct::getType, 2)
@@ -142,15 +168,11 @@
                 .map(ProcurementRecordStorage::getInboundNum)
                 .filter(Objects::nonNull)
                 .reduce(BigDecimal.ZERO, BigDecimal::add);
-        // 鏋勫缓缁撴灉
-        HomeBusinessDto homeBusinessDto = new HomeBusinessDto();
-        homeBusinessDto.setMonthSaleMoney(contractAmount);
-        homeBusinessDto.setMonthSaleHaveMoney(noInvoiceAmountTotal);
-        homeBusinessDto.setMonthPurchaseMoney(receiveAmount);
-        homeBusinessDto.setMonthPurchaseHaveMoney(unReceiptPaymentAmount);
-        homeBusinessDto.setInventoryNum(stock);
-        homeBusinessDto.setTodayInventoryNum(stockAmount1);
 
+        homeBusinessDto.setMonthPurchaseMoney(receiveAmount.setScale(2, RoundingMode.HALF_UP).toString());
+        homeBusinessDto.setMonthPurchaseHaveMoney(unReceiptPaymentAmount.setScale(2, RoundingMode.HALF_UP).toString());
+        homeBusinessDto.setInventoryNum(stock.setScale(2, RoundingMode.HALF_UP).toString());
+        homeBusinessDto.setTodayInventoryNum(stockAmount1.setScale(2, RoundingMode.HALF_UP).toString());
         return homeBusinessDto;
     }
 
@@ -172,7 +194,7 @@
         LocalDate endOfWeek = today.with(DayOfWeek.SUNDAY);
         List<SalesLedger> salesLedgers1 = salesLedgerMapper.selectList(new LambdaQueryWrapper<SalesLedger>()
                 .ge(SalesLedger::getEntryDate, startOfWeek)  // 澶т簬绛変簬鏈懆鍛ㄤ竴
-                .gt(SalesLedger::getEntryDate, endOfWeek));
+                .lt(SalesLedger::getEntryDate, endOfWeek.plusDays(1))); // 淇敼锛氫娇鐢� lt 骞跺姞涓婁竴澶╂潵鍖呭惈鍛ㄦ棩
         BigDecimal weekContractAmount = salesLedgers1.stream().map(SalesLedger::getContractAmount)
                 .filter(Objects::nonNull)
                 .reduce(BigDecimal.ZERO, BigDecimal::add);
@@ -181,7 +203,7 @@
         LocalDate lastYearEndOfWeek = today.minusYears(1).with(DayOfWeek.SUNDAY);
         List<SalesLedger> salesLedgers2 = salesLedgerMapper.selectList(new LambdaQueryWrapper<SalesLedger>()
                 .ge(SalesLedger::getEntryDate, lastYearStartOfWeek)  // 澶т簬绛変簬鍘诲勾鏈懆鍛ㄤ竴
-                .gt(SalesLedger::getEntryDate, lastYearEndOfWeek));
+                .lt(SalesLedger::getEntryDate, lastYearEndOfWeek.plusDays(1))); // 淇敼锛氫娇鐢� lt 骞跺姞涓婁竴澶╂潵鍖呭惈鍛ㄦ棩
         BigDecimal lastYearWeekContractAmount = salesLedgers2.stream().map(SalesLedger::getContractAmount)
                 .filter(Objects::nonNull)
                 .reduce(BigDecimal.ZERO, BigDecimal::add);
@@ -199,18 +221,18 @@
         LocalDate yesterday = today.minusDays(1);
         LocalDate plusDays = today.plusDays(1);
         List<SalesLedger> salesLedgers3 = salesLedgerMapper.selectList(new LambdaQueryWrapper<SalesLedger>()
-                .ge(SalesLedger::getEntryDate, today)  // 澶т簬绛変簬鏄ㄥぉ
-                .lt(SalesLedger::getEntryDate, plusDays));
-        BigDecimal yesterdayContractAmount = salesLedgers3.stream().map(SalesLedger::getContractAmount)
+                .ge(SalesLedger::getEntryDate, today)  // 澶т簬绛変簬浠婂ぉ
+                .lt(SalesLedger::getEntryDate, plusDays)); // 淇敼锛氫娇鐢� lt 骞跺姞涓婁竴澶╂潵鍖呭惈褰撳ぉ
+        BigDecimal todayContractAmount = salesLedgers3.stream().map(SalesLedger::getContractAmount)
                 .filter(Objects::nonNull)
                 .reduce(BigDecimal.ZERO, BigDecimal::add);
         List<SalesLedger> salesLedgers4 = salesLedgerMapper.selectList(new LambdaQueryWrapper<SalesLedger>()
-                .ge(SalesLedger::getEntryDate, yesterday)  // 澶т簬绛変簬鍘诲勾鏄ㄥぉ
-                .lt(SalesLedger::getEntryDate, today));
+                .ge(SalesLedger::getEntryDate, yesterday)  // 澶т簬绛変簬鏄ㄥぉ
+                .lt(SalesLedger::getEntryDate, today)); // 淇敼锛氫娇鐢� lt 鑰屼笉鏄� gt
         BigDecimal lastYearYesterdayContractAmount = salesLedgers4.stream().map(SalesLedger::getContractAmount)
                 .filter(Objects::nonNull)
                 .reduce(BigDecimal.ZERO, BigDecimal::add);
-        BigDecimal subtract1 = yesterdayContractAmount.subtract(lastYearYesterdayContractAmount);
+        BigDecimal subtract1 = todayContractAmount.subtract(lastYearYesterdayContractAmount); // 淇敼锛氫娇鐢� todayContractAmount 鑰屼笉鏄� yesterdayContractAmount
         // 鏃ョ幆姣�
         String chain = "";
         if(subtract1.compareTo(BigDecimal.ZERO) == 0 || lastYearYesterdayContractAmount.compareTo(BigDecimal.ZERO) == 0){
@@ -221,7 +243,8 @@
 
 
         AnalysisCustomerContractAmountsDto analysisCustomerContractAmountsDto = new AnalysisCustomerContractAmountsDto();
-        analysisCustomerContractAmountsDto.setSum(contractAmount);
+        // 淇敼锛氬皢鍚堝悓閲戦淇濈暀涓や綅灏忔暟
+        analysisCustomerContractAmountsDto.setSum(contractAmount.setScale(2, RoundingMode.HALF_UP).toString());
         analysisCustomerContractAmountsDto.setYny(weekYny);
         analysisCustomerContractAmountsDto.setChain(chain);
 
@@ -231,7 +254,8 @@
         collect.forEach((k,v)->{
             MapDto mapDto = new MapDto();
             mapDto.setName(k);
-            mapDto.setValue(v);
+            // 淇敼锛氬皢閲戦鍊间繚鐣欎袱浣嶅皬鏁�
+            mapDto.setValue(v.setScale(2, RoundingMode.HALF_UP).toString());
             if(contractAmount.compareTo(new BigDecimal(0)) == 0){
                 mapDto.setRate("0");
             }else{
@@ -243,64 +267,119 @@
         return analysisCustomerContractAmountsDto;
     }
 
+
     @Override
     public QualityStatisticsDto qualityStatistics() {
-        // 鑾峰彇涓�鍛ㄦ暟鎹�
-        // 鑾峰彇褰撳墠鏃堕棿
+        // 鑾峰彇杩戝洓涓湀鏁版嵁锛堝線鍓嶆帹涓変釜鏈堬紝鍏�4涓畬鏁存湀浠斤級
         LocalDate today = LocalDate.now();
-        // 鑾峰彇鏈懆鍛ㄤ竴
-        LocalDate startOfWeek = today.with(DayOfWeek.MONDAY);
-        // 鑾峰彇鏈懆鍛ㄦ棩
-        LocalDate endOfWeek = today.with(DayOfWeek.SUNDAY);
-        LambdaQueryWrapper<QualityInspect> qualityInspectLambdaQueryWrapper = new LambdaQueryWrapper<>();
-        qualityInspectLambdaQueryWrapper.ge(QualityInspect::getCheckTime, startOfWeek)
-                .gt(QualityInspect::getCheckTime, endOfWeek);
-        List<QualityInspect> qualityInspects = qualityStatisticsMapper.selectList(qualityInspectLambdaQueryWrapper);
+        // 瀹氫箟鏃ユ湡鏍煎紡鍖栧櫒锛堢敤浜庢樉绀衡�滃勾鏈堚�濇牸寮忥級
+        DateTimeFormatter monthFormatter = DateTimeFormatter.ofPattern("yyyy-MM");
+
         QualityStatisticsDto qualityStatisticsDto = new QualityStatisticsDto();
-        qualityStatisticsDto.setSupplierNum(qualityInspects.stream().filter(item -> item.getInspectType().equals(0)).map(QualityInspect::getQuantity).reduce(BigDecimal.ZERO, BigDecimal::add));
-        qualityStatisticsDto.setProcessNum(qualityInspects.stream().filter(item -> item.getInspectType().equals(1)).map(QualityInspect::getQuantity).reduce(BigDecimal.ZERO, BigDecimal::add));
-        qualityStatisticsDto.setFactoryNum(qualityInspects.stream().filter(item -> item.getInspectType().equals(2)).map(QualityInspect::getQuantity).reduce(BigDecimal.ZERO, BigDecimal::add));
         List<QualityStatisticsItem> qualityStatisticsItems = new ArrayList<>();
-        for (int j = 1; j < 8; j++) {
-            LocalDate endTime = startOfWeek.plusDays(j);
-            LocalDate startTime = endTime.minusDays(1);
-            QualityStatisticsItem qualityStatisticsItem = new QualityStatisticsItem();
-            qualityStatisticsItem.setDate(startTime.toString());
-            qualityStatisticsItem.setSupplierNum(qualityInspects.stream()
-                    .filter(item -> item.getInspectType().equals(0) && "涓嶅悎鏍�".equals(item.getCheckResult())
-                            && (startTime.isEqual(item.getCheckTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate()) || startTime.isAfter(item.getCheckTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate()))
-                            && endTime.isBefore(item.getCheckTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate()))
+
+        BigDecimal supplierNum = new BigDecimal(0);
+        BigDecimal factoryNum = new BigDecimal(0);
+        BigDecimal processNum = new BigDecimal(0);
+        // 寰幆4娆★紝鍒嗗埆缁熻杩�4涓湀鐨勬暟鎹紙褰撳墠鏈堛�佸墠1涓湀銆佸墠2涓湀銆佸墠3涓湀锛�
+        for (int i = 3; i >= 0; i--) {
+            // 璁$畻褰撳墠寰幆瀵瑰簲鐨勬湀浠斤紙i=0锛氬綋鍓嶆湀锛宨=1锛氬墠1涓湀锛屼互姝ょ被鎺級
+            LocalDate currentMonth = today.minusMonths(i);
+            // 褰撴湀鐨勫紑濮嬫棩鏈燂紙姣忔湀1鍙凤級
+            LocalDate monthStart = currentMonth.withDayOfMonth(1);
+            // 褰撴湀鐨勭粨鏉熸棩鏈燂紙姣忔湀鏈�鍚庝竴澶╋級
+            LocalDate monthEnd = currentMonth.withDayOfMonth(currentMonth.lengthOfMonth());
+
+            // 鏋勫缓褰撴湀鐨勬煡璇㈡潯浠讹紙濡傛灉鎯充竴娆℃�ф煡鍏�4涓湀鏁版嵁鍐嶅唴瀛樼瓫閫夛紝鍙紭鍖栦负鍏堟煡鍏ㄥ啀寰幆绛涢�夛級
+            LambdaQueryWrapper<QualityInspect> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.ge(QualityInspect::getCheckTime, monthStart)
+                    .le(QualityInspect::getCheckTime, monthEnd); // 绛涢�夊綋鏈堟暟鎹�
+            List<QualityInspect> monthInspects = qualityStatisticsMapper.selectList(queryWrapper);
+            BigDecimal reduce = monthInspects.stream()
+                    .filter(inspect -> inspect.getInspectType().equals(0))
                     .map(QualityInspect::getQuantity)
-                    .reduce(BigDecimal.ZERO, BigDecimal::add)
-            );
-            qualityStatisticsItem.setFactoryNum(qualityInspects.stream()
-                    .filter(item -> item.getInspectType().equals(1) && "涓嶅悎鏍�".equals(item.getCheckResult())
-                            && (startTime.isEqual(item.getCheckTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate()) || startTime.isAfter(item.getCheckTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate()))
-                            && endTime.isBefore(item.getCheckTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate()))
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+            supplierNum = supplierNum.add(reduce);
+            BigDecimal reduce1 = monthInspects.stream()
+                    .filter(inspect -> inspect.getInspectType().equals(1))
                     .map(QualityInspect::getQuantity)
-                    .reduce(BigDecimal.ZERO, BigDecimal::add)
-            );
-            qualityStatisticsItem.setProcessNum(qualityInspects.stream()
-                    .filter(item -> item.getInspectType().equals(2) && "涓嶅悎鏍�".equals(item.getCheckResult())
-                            && (startTime.isEqual(item.getCheckTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate()) || startTime.isAfter(item.getCheckTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate()))
-                            && endTime.isBefore(item.getCheckTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate()))
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+            processNum= processNum.add(reduce1);
+            BigDecimal reduce2 = monthInspects.stream()
+                    .filter(inspect -> inspect.getInspectType().equals(2))
                     .map(QualityInspect::getQuantity)
-                    .reduce(BigDecimal.ZERO, BigDecimal::add));
-            qualityStatisticsItems.add(qualityStatisticsItem);
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+            factoryNum = factoryNum.add(reduce2);
+
+            // 鏋勫缓褰撴湀缁熻椤�
+            QualityStatisticsItem item = new QualityStatisticsItem();
+            item.setDate(monthStart.format(monthFormatter)); // 鏃ユ湡鏄剧ず涓衡�滃勾鏈堚�濓紙濡� 2025-10锛�
+
+            // 1. 渚涘簲鍟嗘楠岋紙绫诲瀷0锛�- 鍚堟牸鏁伴噺
+            BigDecimal supplierQualified = monthInspects.stream()
+                    .filter(inspect -> inspect.getInspectType().equals(0)
+                            && "鍚堟牸".equals(inspect.getCheckResult()))
+                    .map(QualityInspect::getQuantity)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+            item.setSupplierNum(supplierQualified);
+
+            // 2. 宸ュ簭妫�楠岋紙绫诲瀷1锛�- 鍚堟牸鏁伴噺
+            BigDecimal processQualified = monthInspects.stream()
+                    .filter(inspect -> inspect.getInspectType().equals(1)
+                            && "鍚堟牸".equals(inspect.getCheckResult()))
+                    .map(QualityInspect::getQuantity)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+            item.setProcessNum(processQualified);
+
+            // 3. 宸ュ巶妫�楠岋紙绫诲瀷2锛�- 鍚堟牸鏁伴噺
+            BigDecimal factoryQualified = monthInspects.stream()
+                    .filter(inspect -> inspect.getInspectType().equals(2)
+                            && "鍚堟牸".equals(inspect.getCheckResult()))
+                    .map(QualityInspect::getQuantity)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+            item.setFactoryNum(factoryQualified);
+
+            qualityStatisticsItems.add(item);
         }
+        // 缁熻杩�4涓湀鎬绘暟鎹紙鎵�鏈夋湀浠芥眹鎬伙級
+        qualityStatisticsDto.setProcessNum(processNum);
+        qualityStatisticsDto.setSupplierNum(supplierNum);
+        qualityStatisticsDto.setFactoryNum(factoryNum);
         qualityStatisticsDto.setItem(qualityStatisticsItems);
+
         return qualityStatisticsDto;
     }
 
     @Override
-    public List<ApproveProcess> todos() {
+    public List<ApproveProcess> todos() throws ParseException {
         LoginUser loginUser = SecurityUtils.getLoginUser();
         LambdaQueryWrapper<ApproveProcess> approveProcessLambdaQueryWrapper = new LambdaQueryWrapper<>();
         approveProcessLambdaQueryWrapper.eq(ApproveProcess::getApproveDelete, 0)
                 .eq(ApproveProcess::getApproveUserCurrentId, loginUser.getUserId())
                 .ne(ApproveProcess::getApproveStatus, 2)
                 .eq(ApproveProcess::getTenantId, loginUser.getTenantId());
-        return approveProcessMapper.selectList(approveProcessLambdaQueryWrapper);
+        List<ApproveProcess> approveProcesses = approveProcessMapper.selectList(approveProcessLambdaQueryWrapper);
+        if(CollectionUtils.isEmpty(approveProcesses)){
+            approveProcesses = new ArrayList<>();
+        }
+        // 鏌ヨ鏈鐢ㄥ姵淇濊褰�
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+
+        LaborIssue laborIssue1 = new LaborIssue();
+        laborIssue1.setAdoptedDate(new Date());
+        laborIssue1.setIssueDate(sdf.parse(sdf.format(new Date())));
+        List<LaborIssue> laborIssues = lavorIssueMapper.list(laborIssue1);
+        if(!CollectionUtils.isEmpty(laborIssues)){
+            for (LaborIssue laborIssue : laborIssues) {
+                ApproveProcess approveProcess = new ApproveProcess();
+                approveProcess.setApproveId(laborIssue.getOrderNo());
+                approveProcess.setApproveDeptName(sysDeptMapper.selectDeptById(loginUser.getTenantId()).getDeptName());
+                approveProcess.setApproveTime(laborIssue.getIssueDate());
+                approveProcess.setApproveReason(laborIssue.getDictTypeName() + "-" + laborIssue.getDictName() + "瓒呮椂鏈鍙�");
+                approveProcesses.add(approveProcess);
+            }
+        }
+        return approveProcesses;
     }
 
     /**
@@ -337,32 +416,260 @@
         }
         // 搴旀敹
         List<SalesLedger> salesLedgers = salesLedgerMapper.selectList(new LambdaQueryWrapper<SalesLedger>()
-                .ge(SalesLedger::getEntryDate, startDate)
-                .lt(SalesLedger::getEntryDate, endDate)
+//                .ge(SalesLedger::getEntryDate, startDate)
+//                .lt(SalesLedger::getEntryDate, endDate)
         );
         BigDecimal receivableMoney = salesLedgers.stream().map(SalesLedger::getContractAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
         // 搴斾粯
         List<PurchaseLedger> procurementRecords = purchaseLedgerMapper.selectList(new LambdaQueryWrapper<PurchaseLedger>()
-                .ge(PurchaseLedger::getEntryDate, startDate)
-                .lt(PurchaseLedger::getEntryDate, endDate)
+//                .ge(PurchaseLedger::getEntryDate, startDate)
+//                .lt(PurchaseLedger::getEntryDate, endDate)
         );
         BigDecimal payableMoney = procurementRecords.stream().map(PurchaseLedger::getContractAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
         // 棰勬敹
         List<ReceiptPayment> receiptPayments = receiptPaymentMapper.selectList(new LambdaQueryWrapper<ReceiptPayment>()
-                .ge(ReceiptPayment::getReceiptPaymentDate, startDate)
-                .lt(ReceiptPayment::getReceiptPaymentDate, endDate));
+//                .ge(ReceiptPayment::getReceiptPaymentDate, startDate)
+//                .lt(ReceiptPayment::getReceiptPaymentDate, endDate)
+        );
         BigDecimal advanceMoney = receiptPayments.stream().map(ReceiptPayment::getReceiptPaymentAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
         // 棰勪粯
         List<PaymentRegistration> paymentRegistrations = paymentRegistrationMapper.selectList(new LambdaQueryWrapper<PaymentRegistration>()
-                .ge(PaymentRegistration::getPaymentDate, startDate)
-                .lt(PaymentRegistration::getPaymentDate, endDate));
+//                .ge(PaymentRegistration::getPaymentDate, startDate)
+//                .lt(PaymentRegistration::getPaymentDate, endDate)
+        );
         BigDecimal prepayMoney = paymentRegistrations.stream().map(PaymentRegistration::getCurrentPaymentAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
         StatisticsReceivablePayableDto statisticsReceivablePayableDto = new StatisticsReceivablePayableDto();
-        statisticsReceivablePayableDto.setPayableMoney(payableMoney);
-        statisticsReceivablePayableDto.setReceivableMoney(receivableMoney);
+        statisticsReceivablePayableDto.setPayableMoney(payableMoney.subtract(prepayMoney));
+        statisticsReceivablePayableDto.setReceivableMoney(receivableMoney.subtract(advanceMoney));
         statisticsReceivablePayableDto.setAdvanceMoney(advanceMoney);
         statisticsReceivablePayableDto.setPrepayMoney(prepayMoney);
 
         return statisticsReceivablePayableDto;
     }
+
+    @Override
+    public QualityProductQualifiedRateDto qualityProductQualifiedRate() {
+        QualityProductQualifiedRateDto qualityProductQualifiedRateDto = new QualityProductQualifiedRateDto();
+        List<QualityInspect> qualityInspects = qualityStatisticsMapper.selectList(null);
+        if(!CollectionUtils.isEmpty(qualityInspects)){
+            // 鍘熸潗鏂欏悎鏍肩巼
+            BigDecimal rawwMaterialCount = qualityInspects.stream().filter(qualityInspect -> qualityInspect.getInspectType() == 0)
+                    .map(QualityInspect::getQuantity)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+            BigDecimal count = qualityInspects.stream().filter(qualityInspect -> "鍚堟牸".equals(qualityInspect.getCheckResult()) && qualityInspect.getInspectType() == 0)
+                    .map(QualityInspect::getQuantity)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+            if(count.compareTo(BigDecimal.ZERO) != 0){
+                qualityProductQualifiedRateDto.setRawMaterialQualifiedRate(rawwMaterialCount
+                        .divide(count, 4, RoundingMode.HALF_UP)
+                        .multiply(BigDecimal.valueOf(100.0)));
+            }
+            // 杩囩▼鍚堟牸鐜�
+            BigDecimal processCount = qualityInspects.stream().filter(qualityInspect -> qualityInspect.getInspectType() == 1)
+                    .map(QualityInspect::getQuantity)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+            BigDecimal countOne = qualityInspects.stream().filter(qualityInspect -> "鍚堟牸".equals(qualityInspect.getCheckResult()) && qualityInspect.getInspectType() == 1)
+                    .map(QualityInspect::getQuantity)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+            if(countOne.compareTo(BigDecimal.ZERO) != 0){
+                qualityProductQualifiedRateDto.setProcessQualifiedRate(processCount
+                        .divide(countOne, 4, RoundingMode.HALF_UP)
+                        .multiply(BigDecimal.valueOf(100.0)));
+            }
+            // 鍑哄巶鍚堟牸鐜�
+            BigDecimal factoryCount = qualityInspects.stream().filter(qualityInspect -> qualityInspect.getInspectType() == 2)
+                    .map(QualityInspect::getQuantity)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+            BigDecimal countTwo = qualityInspects.stream().filter(qualityInspect -> "鍚堟牸".equals(qualityInspect.getCheckResult()) && qualityInspect.getInspectType() == 2)
+                    .map(QualityInspect::getQuantity)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+            if(countTwo.compareTo(BigDecimal.ZERO) != 0){
+                qualityProductQualifiedRateDto.setFactoryQualifiedRate(factoryCount
+                        .divide(countTwo, 4, RoundingMode.HALF_UP)
+                        .multiply(BigDecimal.valueOf(100.0)));
+            }
+        }
+        // 搴撳瓨鍛ㄨ浆鐜囩粺璁″綋鏈堝嚭搴擄紙浣跨敤锛夌殑鐗╂枡鎬绘暟閲徝峰钩鍧囩殑搴撳瓨鐗╂枡鎬绘暟閲徝�100%銆傦級
+        // 鑾峰彇褰撳墠鏈�
+        LocalDate today = LocalDate.now();
+        LocalDate startDate = today.with(TemporalAdjusters.firstDayOfMonth());
+        LocalDate endDate = today.with(TemporalAdjusters.lastDayOfMonth());
+        // 鑾峰彇褰撳墠鏈堝嚭搴擄紙浣跨敤锛夌殑鐗╂枡鎬绘暟閲�
+        List<ProcurementRecordOut> procurementRecordOuts = procurementRecordOutMapper.selectList(new LambdaQueryWrapper<ProcurementRecordOut>()
+                .ge(ProcurementRecordOut::getCreateTime, startDate)
+                .lt(ProcurementRecordOut::getCreateTime, endDate));
+        // 鑾峰彇褰撳墠鏈堝叆搴撶殑鐗╂枡鎬绘暟閲�
+        List<ProcurementRecordStorage> procurementRecordStorages = procurementRecordStorageMapper.selectList(new LambdaQueryWrapper<ProcurementRecordStorage>()
+                .ge(ProcurementRecordStorage::getCreateTime, startDate)
+                .lt(ProcurementRecordStorage::getCreateTime, endDate));
+        BigDecimal reduce = procurementRecordOuts.stream()
+                .map(ProcurementRecordOut::getInboundNum)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+        BigDecimal reduceOne = procurementRecordStorages.stream()
+                .map(ProcurementRecordStorage::getInboundNum)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+        if(reduce.compareTo(BigDecimal.ZERO) > 0){
+            qualityProductQualifiedRateDto.setInventoryTurnoverRate(reduceOne.divide(reduce, 4, RoundingMode.HALF_UP)
+                    .multiply(BigDecimal.valueOf(100.0)));
+        }
+
+        return qualityProductQualifiedRateDto;
+    }
+
+    @Override
+    public QualityStatisticsDto inventoryStatistics() {
+        // 鑾峰彇杩戝洓涓湀鏁版嵁锛堝線鍓嶆帹涓変釜鏈堬紝鍏�4涓畬鏁存湀浠斤級
+        LocalDate today = LocalDate.now();
+        // 瀹氫箟鏃ユ湡鏍煎紡鍖栧櫒锛堢敤浜庢樉绀衡�滃勾鏈堚�濇牸寮忥級
+        DateTimeFormatter monthFormatter = DateTimeFormatter.ofPattern("yyyy-MM");
+
+        QualityStatisticsDto qualityStatisticsDto = new QualityStatisticsDto();
+        List<QualityStatisticsItem> qualityStatisticsItems = new ArrayList<>();
+
+        BigDecimal supplierNum = new BigDecimal(0); //鍏ュ簱鏁伴噺
+        BigDecimal factoryNum = new BigDecimal(0); //鍑哄簱鏁伴噺
+        // 寰幆4娆★紝鍒嗗埆缁熻杩�4涓湀鐨勬暟鎹紙褰撳墠鏈堛�佸墠1涓湀銆佸墠2涓湀銆佸墠3涓湀锛�
+        for (int i = 3; i >= 0; i--) {
+            // 璁$畻褰撳墠寰幆瀵瑰簲鐨勬湀浠斤紙i=0锛氬綋鍓嶆湀锛宨=1锛氬墠1涓湀锛屼互姝ょ被鎺級
+            LocalDate currentMonth = today.minusMonths(i);
+            // 褰撴湀鐨勫紑濮嬫棩鏈燂紙姣忔湀1鍙凤級
+            LocalDate monthStart = currentMonth.withDayOfMonth(1);
+            // 褰撴湀鐨勭粨鏉熸棩鏈燂紙姣忔湀鏈�鍚庝竴澶╋級
+            LocalDate monthEnd = currentMonth.withDayOfMonth(currentMonth.lengthOfMonth());
+
+            // 鍏ュ簱鏁伴噺
+            // 鏋勫缓褰撴湀鐨勬煡璇㈡潯浠讹紙濡傛灉鎯充竴娆℃�ф煡鍏�4涓湀鏁版嵁鍐嶅唴瀛樼瓫閫夛紝鍙紭鍖栦负鍏堟煡鍏ㄥ啀寰幆绛涢�夛級
+            LambdaQueryWrapper<ProcurementRecordStorage> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.ge(ProcurementRecordStorage::getCreateTime, monthStart)
+                    .le(ProcurementRecordStorage::getCreateTime, monthEnd); // 绛涢�夊綋鏈堟暟鎹�
+            List<ProcurementRecordStorage> monthInspects = procurementRecordStorageMapper.selectList(queryWrapper);
+            // 鍑哄簱鏁伴噺
+            LambdaQueryWrapper<ProcurementRecordOut> queryWrapper1 = new LambdaQueryWrapper<>();
+            queryWrapper1.ge(ProcurementRecordOut::getCreateTime, monthStart)
+                    .le(ProcurementRecordOut::getCreateTime, monthEnd);
+            List<ProcurementRecordOut> monthInspects1 = procurementRecordOutMapper.selectList(queryWrapper1);
+            BigDecimal reduce = monthInspects.stream()
+                    .map(ProcurementRecordStorage::getInboundNum)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+            supplierNum = supplierNum.add(reduce);
+            BigDecimal reduce1 = monthInspects1.stream()
+                    .map(ProcurementRecordOut::getInboundNum)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+            factoryNum= factoryNum.add(reduce1);
+
+            // 鏋勫缓褰撴湀缁熻椤�
+            QualityStatisticsItem item = new QualityStatisticsItem();
+            item.setDate(monthStart.format(monthFormatter)); // 鏃ユ湡鏄剧ず涓衡�滃勾鏈堚�濓紙濡� 2025-10锛�
+
+            // 1. 渚涘簲鍟嗘楠岋紙绫诲瀷0锛�- 鍚堟牸鏁伴噺
+            BigDecimal supplierQualified = monthInspects.stream()
+                    .map(ProcurementRecordStorage::getInboundNum)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+            item.setSupplierNum(supplierQualified);
+
+            // 3. 宸ュ巶妫�楠岋紙绫诲瀷2锛�- 鍚堟牸鏁伴噺
+            BigDecimal factoryQualified = monthInspects1.stream()
+                    .map(ProcurementRecordOut::getInboundNum)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+            item.setFactoryNum(factoryQualified);
+
+            qualityStatisticsItems.add(item);
+        }
+        // 缁熻杩�4涓湀鎬绘暟鎹紙鎵�鏈夋湀浠芥眹鎬伙級
+        qualityStatisticsDto.setSupplierNum(supplierNum);
+        qualityStatisticsDto.setFactoryNum(factoryNum);
+        qualityStatisticsDto.setItem(qualityStatisticsItems);
+
+        return qualityStatisticsDto;
+    }
+
+    @Override
+    public Map<String, List<String>> productionStatistics() {
+        // 鑾峰彇鏈�杩戝洓涓湀锛堝綋鍓嶆湀 + 鍓�3涓湀锛夌殑鏃堕棿鑼冨洿
+        LocalDate today = LocalDate.now();
+        DateTimeFormatter monthFormatter = DateTimeFormatter.ofPattern("yyyy-MM"); // 骞存湀鏍煎紡鍖栧櫒
+        Map<String, List<String>> result = new HashMap<>();
+        List<String> months = new ArrayList<>(); // 瀛樺偍骞存湀锛堝 2025-12銆�2025-11锛�
+        List<String> totalIncomeList = new ArrayList<>(); // 姣忔湀鎬绘敹鍏�
+        List<String> totalExpenseList = new ArrayList<>(); // 姣忔湀鎬绘敮鍑�
+        List<String> netIncomeList = new ArrayList<>(); // 姣忔湀鍑�鏀跺叆锛堟敹鍏�-鏀嚭锛�
+
+        // 姝ラ1锛氳绠楄繎4涓湀鐨勫勾鏈堝垪琛紙褰撳墠鏈堛�佸墠1鏈堛�佸墠2鏈堛�佸墠3鏈堬級
+        List<String> targetMonths = new ArrayList<>();
+        for (int i = 0; i < 4; i++) {
+            LocalDate currentMonth = today.minusMonths(i);
+            String monthStr = currentMonth.format(monthFormatter);
+            targetMonths.add(monthStr);
+        }
+        // 鍙嶈浆鍒楄〃锛岀‘淇濋『搴忎负銆屽墠3鏈� 鈫� 褰撳墠鏈堛�嶏紙鍙�夛紝鎸夐渶姹傝皟鏁撮『搴忥級
+        Collections.reverse(targetMonths);
+
+        // 姝ラ2锛氫竴娆℃�ф煡璇㈣繎4涓湀鎵�鏈夋敹鍏ユ暟鎹紝鎸夆�滃勾鏈堚�濆垎缁勬眹鎬�
+        LocalDate fourMonthsAgo = today.minusMonths(3).withDayOfMonth(1); // 杩�4涓湀璧峰鏃ワ紙鍓�3鏈�1鍙凤級
+        LocalDate currentMonthEnd = today.withDayOfMonth(today.lengthOfMonth()); // 褰撳墠鏈堢粨鏉熸棩
+        ZoneId zoneId = ZoneId.of("Asia/Shanghai");
+        // 鏌ヨ杩�4涓湀鎵�鏈夋敹鍏�
+        List<SalesLedgerWork> allIncomes = salesLedgerWorkMapper.selectList(
+                Wrappers.<SalesLedgerWork>lambdaQuery()
+                        .ge(SalesLedgerWork::getSchedulingDate, fourMonthsAgo.toString()) // 澶т簬绛変簬璧峰鏃�
+                        .le(SalesLedgerWork::getSchedulingDate, currentMonthEnd.toString()) // 灏忎簬绛変簬缁撴潫鏃�
+        );
+
+        // 寰呯敓浜�
+        Map<String, BigDecimal> monthlyIncomeMap = allIncomes.stream()
+                .filter(income -> income.getSchedulingNum() != null && income.getStatus().equals(1)) // 杩囨护绌洪噾棰�
+                .collect(Collectors.groupingBy(
+                        income -> {
+                            // 灏嗚緭鍏ユ椂闂达紙瀛楃涓诧級杞崲涓篖ocalDate锛屽啀鏍煎紡鍖栦负骞存湀
+                            return income.getSchedulingDate().format(monthFormatter);
+                        },
+                        Collectors.reducing(BigDecimal.ZERO, SalesLedgerWork::getSchedulingNum, BigDecimal::add)
+                ));
+
+        // 鐢熶骇涓�
+        Map<String, BigDecimal> monthlyExpenseMap = allIncomes.stream()
+                .filter(income -> income.getSchedulingNum() != null && income.getStatus().equals(2)) // 杩囨护绌洪噾棰�
+                .collect(Collectors.groupingBy(
+                        income -> {
+                            // 灏嗚緭鍏ユ椂闂达紙瀛楃涓诧級杞崲涓篖ocalDate锛屽啀鏍煎紡鍖栦负骞存湀
+                            return income.getSchedulingDate().format(monthFormatter);
+                        },
+                        Collectors.reducing(BigDecimal.ZERO, SalesLedgerWork::getSchedulingNum, BigDecimal::add)
+                ));
+
+        // 宸叉姤宸�
+        Map<String, BigDecimal> successIncomeMap = allIncomes.stream()
+                .filter(income -> income.getSchedulingNum() != null && income.getStatus().equals(3)) // 杩囨护绌洪噾棰�
+                .collect(Collectors.groupingBy(
+                        income -> {
+                            // 灏嗚緭鍏ユ椂闂达紙瀛楃涓诧級杞崲涓篖ocalDate锛屽啀鏍煎紡鍖栦负骞存湀
+                            return income.getSchedulingDate().format(monthFormatter);
+                        },
+                        Collectors.reducing(BigDecimal.ZERO, SalesLedgerWork::getSchedulingNum, BigDecimal::add)
+                ));
+
+        // 姝ラ4锛氬惊鐜�4涓洰鏍囨湀浠斤紝濉厖缁熻鏁版嵁锛堟棤鏁版嵁鏃堕粯璁や负0锛�
+        for (String month : targetMonths) {
+            // 寰呯敓浜�
+            BigDecimal totalIncome = monthlyIncomeMap.getOrDefault(month, BigDecimal.ZERO);
+            // 鐢熶骇涓�
+            BigDecimal totalExpense = monthlyExpenseMap.getOrDefault(month, BigDecimal.ZERO);
+            // 宸叉姤宸�
+            BigDecimal netIncome =  successIncomeMap.getOrDefault(month, BigDecimal.ZERO);
+
+            // 濉厖鍒楄〃
+            months.add(month);
+            totalIncomeList.add(totalIncome.toString());
+            totalExpenseList.add(totalExpense.toString());
+            netIncomeList.add(netIncome.toString());
+        }
+
+        // 缁勮缁撴灉
+        result.put("days", months); // 骞存湀锛堝 ["2025-09", "2025-10", "2025-11", "2025-12"]锛�
+        result.put("totalIncome", totalIncomeList); // 寰呯敓浜�
+        result.put("totalExpense", totalExpenseList); // 鐢熶骇涓�
+        result.put("netIncome", netIncomeList); // 宸叉姤宸�
+
+        return result;
+    }
 }

--
Gitblit v1.9.3