From e5e8464e8a6385683187b3459f8bfb5f9682a8ae Mon Sep 17 00:00:00 2001
From: maven <2163098428@qq.com>
Date: 星期四, 22 一月 2026 14:37:54 +0800
Subject: [PATCH] yys  发货台账优化

---
 src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java |  184 ++++++++++++++++++++++++++++++++++++---------
 1 files changed, 146 insertions(+), 38 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 5630e84..57bd17d 100644
--- a/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
+++ b/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
@@ -1,8 +1,13 @@
 package com.ruoyi.home.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.approve.mapper.ApproveProcessMapper;
 import com.ruoyi.approve.pojo.ApproveProcess;
+import com.ruoyi.basic.mapper.ProductModelMapper;
+import com.ruoyi.basic.pojo.ProductModel;
 import com.ruoyi.collaborativeApproval.mapper.NoticeMapper;
 import com.ruoyi.collaborativeApproval.pojo.Notice;
 import com.ruoyi.common.utils.SecurityUtils;
@@ -22,6 +27,17 @@
 import com.ruoyi.procurementrecord.pojo.CustomStorage;
 import com.ruoyi.procurementrecord.pojo.ProcurementRecordOut;
 import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage;
+import com.ruoyi.procurementrecord.utils.StockUtils;
+import com.ruoyi.production.dto.ProductOrderDto;
+import com.ruoyi.production.dto.ProductWorkOrderDto;
+import com.ruoyi.production.dto.ProductionProductMainDto;
+import com.ruoyi.production.mapper.ProductOrderMapper;
+import com.ruoyi.production.mapper.ProductProcessMapper;
+import com.ruoyi.production.mapper.ProductWorkOrderMapper;
+import com.ruoyi.production.mapper.ProductionProductMainMapper;
+import com.ruoyi.production.pojo.ProductOrder;
+import com.ruoyi.production.pojo.ProductProcess;
+import com.ruoyi.production.pojo.ProductWorkOrder;
 import com.ruoyi.project.system.domain.SysDept;
 import com.ruoyi.project.system.mapper.SysDeptMapper;
 import com.ruoyi.purchase.mapper.PaymentRegistrationMapper;
@@ -30,12 +46,14 @@
 import com.ruoyi.purchase.pojo.PurchaseLedger;
 import com.ruoyi.quality.mapper.QualityInspectMapper;
 import com.ruoyi.quality.pojo.QualityInspect;
+import com.ruoyi.sales.dto.ReceiptPaymentDto;
 import com.ruoyi.sales.mapper.ReceiptPaymentMapper;
 import com.ruoyi.sales.mapper.SalesLedgerMapper;
 import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
 import com.ruoyi.sales.pojo.ReceiptPayment;
 import com.ruoyi.sales.pojo.SalesLedger;
 import com.ruoyi.sales.pojo.SalesLedgerProduct;
+import com.ruoyi.sales.service.impl.ReceiptPaymentServiceImpl;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -47,6 +65,7 @@
 import java.text.SimpleDateFormat;
 import java.time.*;
 import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
 import java.time.temporal.TemporalAdjusters;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -98,7 +117,16 @@
 
     @Autowired
     private NoticeMapper noticeMapper;
-
+    @Autowired
+    private ProductOrderMapper productOrderMapper;
+    @Autowired
+    private ProductProcessMapper productProcessMapper;
+    @Autowired
+    private ProductWorkOrderMapper productWorkOrderMapper;
+    @Autowired
+    private ProductModelMapper productModelMapper;
+    @Autowired
+    private StockUtils stockUtils;
     @Override
     public HomeBusinessDto business() {
         // 鏋勫缓缁撴灉
@@ -151,23 +179,35 @@
             homeBusinessDto.setMonthPurchaseHaveMoney(unReceiptPaymentAmount.setScale(2, RoundingMode.HALF_UP).toString());
         }
         // 缁熻搴撳瓨
-        List<ProcurementRecordStorage> procurementRecordStorages = procurementRecordStorageMapper.selectList(null);
-        BigDecimal stockAmount = procurementRecordStorages.stream()
-                .map(ProcurementRecordStorage::getInboundNum)
-                .filter(Objects::nonNull)
-                .reduce(BigDecimal.ZERO, BigDecimal::add);
-        // 鑷畾涔夊簱瀛�
-        List<CustomStorage> customStorages = customStorageMapper.selectList(null);
-        BigDecimal customStockAmount = customStorages.stream()
-                .map(CustomStorage::getInboundNum)
-                .filter(Objects::nonNull)
-                .reduce(BigDecimal.ZERO, BigDecimal::add);
-        List<ProcurementRecordOut> procurementRecordOuts = procurementRecordOutMapper.selectList(null);
-        BigDecimal outboundAmount = procurementRecordOuts.stream()
-                .map(ProcurementRecordOut::getInboundNum)
-                .filter(Objects::nonNull)
-                .reduce(BigDecimal.ZERO, BigDecimal::add);
-        BigDecimal stock = stockAmount.add(customStockAmount).subtract(outboundAmount);
+//        List<ProcurementRecordStorage> procurementRecordStorages = procurementRecordStorageMapper.selectList(null);
+//        BigDecimal stockAmount = procurementRecordStorages.stream()
+//                .map(ProcurementRecordStorage::getInboundNum)
+//                .filter(Objects::nonNull)
+//                .reduce(BigDecimal.ZERO, BigDecimal::add);
+//        // 鑷畾涔夊簱瀛�
+//        List<CustomStorage> customStorages = customStorageMapper.selectList(null);
+//        BigDecimal customStockAmount = customStorages.stream()
+//                .map(CustomStorage::getInboundNum)
+//                .filter(Objects::nonNull)
+//                .reduce(BigDecimal.ZERO, BigDecimal::add);
+//        List<ProcurementRecordOut> procurementRecordOuts = procurementRecordOutMapper.selectList(null);
+//        BigDecimal outboundAmount = procurementRecordOuts.stream()
+//                .map(ProcurementRecordOut::getInboundNum)
+//                .filter(Objects::nonNull)
+//                .reduce(BigDecimal.ZERO, BigDecimal::add);
+//        BigDecimal stock = stockAmount.add(customStockAmount).subtract(outboundAmount);
+        IPage<ProductModel> productModelIPage = productModelMapper.listPageProductModel(new Page<>(1, -1), new ProductModel());
+        if(!CollectionUtils.isEmpty(productModelIPage.getRecords())){
+            //鑾峰彇瑙勬牸id
+            List<Long> modelIds = productModelIPage.getRecords().stream().map(ProductModel::getId).collect(Collectors.toList());
+            BigDecimal stockQuantityTotal = modelIds.stream()
+                    .map(stockUtils::getStockQuantity)
+                    .map(map -> map.get("stockQuantity"))
+                    .filter(Objects::nonNull)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+            homeBusinessDto.setInventoryNum(stockQuantityTotal.setScale(2, RoundingMode.HALF_UP).toString());
+        }
+
         // 鑾峰彇褰撳ぉ鍏ュ簱鏁伴噺
         LambdaQueryWrapper<ProcurementRecordStorage> procurementRecordStorageLambdaQueryWrapper = new LambdaQueryWrapper<>();
         procurementRecordStorageLambdaQueryWrapper.ge(ProcurementRecordStorage::getCreateTime, now)  // 澶т簬绛変簬褰撳ぉ
@@ -177,7 +217,7 @@
                 .map(ProcurementRecordStorage::getInboundNum)
                 .filter(Objects::nonNull)
                 .reduce(BigDecimal.ZERO, BigDecimal::add);
-        homeBusinessDto.setInventoryNum(stock.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;
     }
@@ -362,29 +402,29 @@
         LambdaQueryWrapper<ApproveProcess> approveProcessLambdaQueryWrapper = new LambdaQueryWrapper<>();
         approveProcessLambdaQueryWrapper.eq(ApproveProcess::getApproveDelete, 0)
                 .eq(ApproveProcess::getApproveUserCurrentId, loginUser.getUserId())
-                .ne(ApproveProcess::getApproveStatus, 2)
-                .eq(ApproveProcess::getTenantId, loginUser.getTenantId());
+                .ne(ApproveProcess::getApproveStatus, 2);
+//                .eq(ApproveProcess::getTenantId, loginUser.getTenantId())
         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);
-            }
-        }
+//        // 鏌ヨ鏈鐢ㄥ姵淇濊褰�
+//        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);  //staff_join_leave_record琛ㄨ鍒犻櫎
+//        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;
     }
 
@@ -490,4 +530,72 @@
                 .eq(Notice::getStatus, 1) // 1琛ㄧず鍙戝竷鐘舵��
                 .ge(Notice::getExpirationDate, new Date())); // 杩囨湡鏃堕棿澶т簬绛変簬褰撳墠鏃ユ湡
     }
+
+    @Override
+    public ProductionProgressDto productionProgress() {
+        ProductionProgressDto productionProgressDto = new ProductionProgressDto();
+        ProductOrderDto orderDto = new ProductOrderDto();
+        orderDto.setStartTime(LocalDateTime.now().minusMonths(1));
+        orderDto.setEndTime(LocalDateTime.now());
+        List<ProductOrderDto> productOrderDtos = productOrderMapper.pageProductOrder(new Page<>(1, -1), orderDto).getRecords();
+        productionProgressDto.setCompletedOrderDetails(productOrderDtos);
+        long totalCount = productOrderDtos.size();
+        long count = productOrderDtos.stream().filter(productOrderDto -> productOrderDto.getCompleteQuantity().compareTo(productOrderDto.getQuantity()) >= 0).count();
+        long count2 = productOrderDtos.stream().filter(productOrderDto -> productOrderDto.getCompleteQuantity().compareTo(BigDecimal.ZERO) == 0).count();
+        productionProgressDto.setTotalOrderCount(totalCount);
+        productionProgressDto.setCompletedOrderCount(count);
+        productionProgressDto.setUncompletedOrderCount(count2);
+        productionProgressDto.setPartialCompletedOrderCount(totalCount-count-count2);
+        return productionProgressDto;
+    }
+    @Override
+    public ProductionTurnoverDto workInProcessTurnover() {
+        ProductionTurnoverDto productionTurnoverDto = new ProductionTurnoverDto();
+        ProductWorkOrderDto workOrder = new ProductWorkOrderDto();
+        workOrder.setPlanStartTime(LocalDate.now().minusMonths(1));
+        workOrder.setPlanEndTime(LocalDate.now());
+        List<ProductWorkOrderDto> productWorkOrders = productWorkOrderMapper.pageProductWorkOrder(new Page<>(1, -1), workOrder).getRecords();
+        long sum = productWorkOrders.stream()
+                .filter(productWorkOrder -> productWorkOrder.getPlanQuantity().compareTo(productWorkOrder.getCompleteQuantity()) > 0)
+                .map(ProductWorkOrder::getPlanQuantity)
+                .mapToLong(BigDecimal::longValue)
+                .sum();
+        if (sum == 0)return null;
+        productionTurnoverDto.setTotalOrderCount(sum);//鎬诲湪鍒跺搧鏁伴噺
+        productionTurnoverDto.setAverageTurnoverDays(BigDecimal.valueOf(sum).divide(BigDecimal.valueOf(ChronoUnit.DAYS.between(LocalDateTime.now().minusMonths(1), LocalDateTime.now())),2,RoundingMode.HALF_UP));
+        long completeQuantity = productWorkOrders.stream()
+                .filter(productWorkOrder -> productWorkOrder.getCompleteQuantity().compareTo(productWorkOrder.getPlanQuantity()) >= 0)
+                .map(ProductWorkOrder::getCompleteQuantity)
+                .mapToLong(BigDecimal::longValue)
+                .sum();
+        productionTurnoverDto.setTurnoverEfficiency(BigDecimal.valueOf(completeQuantity).divide(BigDecimal.valueOf(sum),2,RoundingMode.HALF_UP));
+        Map<String, List<ProductWorkOrderDto>> map = productWorkOrders.stream()
+                .filter(productWorkOrder -> productWorkOrder.getPlanQuantity().compareTo(productWorkOrder.getCompleteQuantity()) > 0)
+                .collect(Collectors.groupingBy(ProductWorkOrderDto::getProcessName));
+        List<String> strings = new ArrayList<>();
+        List<Long> processQuantityDetails = new ArrayList<>();
+        map.entrySet().stream().forEach(entry -> {
+            String key = entry.getKey();
+            long completeSum = entry.getValue().stream().map(ProductWorkOrderDto::getCompleteQuantity).mapToLong(BigDecimal::longValue).sum();
+            strings.add(key);
+            processQuantityDetails.add(completeSum);
+        });
+        productionTurnoverDto.setProcessDetails(strings);
+        productionTurnoverDto.setProcessQuantityDetails(processQuantityDetails);
+        return productionTurnoverDto;
+
+    }
+
+    @Override
+    public Long overdueReceivable() {
+        // 閫氳繃鐧昏鏃ユ湡瓒呰繃15澶╃殑鏈洖娆炬彁绀�
+        LambdaQueryWrapper<SalesLedgerProduct> lambdaWrapper = new LambdaQueryWrapper<>();
+        // 鏃堕棿鏉′欢锛歳egisterDate < 褰撳墠鏃堕棿 - 15澶�
+        lambdaWrapper.apply("register_date < DATE_SUB(NOW(), INTERVAL 15 DAY)");
+        // 鏈洖娆炬潯浠讹細pendingInvoiceTotal > 0
+        lambdaWrapper.gt(SalesLedgerProduct::getPendingInvoiceTotal, 0);
+        return salesLedgerProductMapper.selectCount(lambdaWrapper);
+    }
+
+
 }

--
Gitblit v1.9.3