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 | 362 +++++++++++++++++++++++++++++++++++++++++++++------
1 files changed, 316 insertions(+), 46 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 7dea6df..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;
@@ -14,6 +17,8 @@
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;
@@ -38,6 +43,7 @@
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;
@@ -83,6 +89,9 @@
@Autowired
private SysDeptMapper sysDeptMapper;
+
+ @Autowired
+ private SalesLedgerWorkMapper salesLedgerWorkMapper;;
@Override
public HomeBusinessDto business() {
@@ -261,50 +270,83 @@
@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;
}
@@ -374,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