From 2eff4202b5f986e181d36aaf17d95caa7832b21b Mon Sep 17 00:00:00 2001
From: huminmin <mac@MacBook-Pro.local>
Date: 星期二, 23 六月 2026 15:50:36 +0800
Subject: [PATCH] Merge branch 'dev_New_pro' of http://114.132.189.42:9002/r/product-inventory-management-after into dev_New_pro

---
 src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java |  215 +++++++++++++++++++++++++++++++++++++----------------
 1 files changed, 148 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 e4e8888..8aa7871 100644
--- a/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
+++ b/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
@@ -3,14 +3,26 @@
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.account.bean.dto.purchase.PurchaseInboundDto;
+import com.ruoyi.account.bean.dto.purchase.PurchaseReturnDto;
+import com.ruoyi.account.bean.dto.sales.SalesOutboundDto;
+import com.ruoyi.account.bean.dto.sales.SalesReturnDto;
+import com.ruoyi.account.bean.vo.purchase.PurchaseInboundVo;
+import com.ruoyi.account.bean.vo.purchase.PurchaseReturnVo;
+import com.ruoyi.account.bean.vo.sales.SalesOutboundVo;
+import com.ruoyi.account.bean.vo.sales.SalesReturnVo;
 import com.ruoyi.account.mapper.AccountStatementMapper;
 import com.ruoyi.account.mapper.purchase.AccountPurchasePaymentMapper;
 import com.ruoyi.account.mapper.sales.AccountSalesCollectionMapper;
-import com.ruoyi.account.pojo.AccountStatement;
 import com.ruoyi.account.pojo.purchase.AccountPurchasePayment;
 import com.ruoyi.account.pojo.sales.AccountSalesCollection;
 import com.ruoyi.approve.mapper.ApproveProcessMapper;
+import com.ruoyi.approve.mapper.ApprovalInstanceMapper;
+import com.ruoyi.approve.mapper.ApprovalTaskMapper;
 import com.ruoyi.approve.pojo.ApproveProcess;
+import com.ruoyi.approve.pojo.ApprovalInstance;
+import com.ruoyi.approve.pojo.ApprovalTask;
 import com.ruoyi.basic.mapper.CustomerMapper;
 import com.ruoyi.basic.mapper.ProductMapper;
 import com.ruoyi.basic.mapper.SupplierManageMapper;
@@ -20,6 +32,7 @@
 import com.ruoyi.collaborativeApproval.mapper.NoticeMapper;
 import com.ruoyi.collaborativeApproval.pojo.Notice;
 import com.ruoyi.common.enums.ApproveTypeEnum;
+import com.ruoyi.common.enums.TypeEnums;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.device.mapper.DeviceRepairMapper;
@@ -29,11 +42,13 @@
 import com.ruoyi.home.dto.*;
 import com.ruoyi.home.mapper.HomeMapper;
 import com.ruoyi.home.service.HomeService;
+import com.ruoyi.procurementrecord.mapper.ReturnManagementMapper;
 import com.ruoyi.production.bean.dto.ProductionProductOutputDto;
 import com.ruoyi.production.mapper.*;
 import com.ruoyi.project.system.domain.SysDept;
 import com.ruoyi.project.system.mapper.SysDeptMapper;
 import com.ruoyi.purchase.mapper.PurchaseLedgerMapper;
+import com.ruoyi.purchase.mapper.PurchaseReturnOrdersMapper;
 import com.ruoyi.purchase.pojo.PurchaseLedger;
 import com.ruoyi.quality.mapper.QualityInspectMapper;
 import com.ruoyi.quality.mapper.QualityUnqualifiedMapper;
@@ -45,7 +60,9 @@
 import com.ruoyi.sales.pojo.SalesLedgerProduct;
 import com.ruoyi.staff.mapper.StaffOnJobMapper;
 import com.ruoyi.staff.pojo.StaffOnJob;
+import com.ruoyi.stock.mapper.StockInRecordMapper;
 import com.ruoyi.stock.mapper.StockInventoryMapper;
+import com.ruoyi.stock.mapper.StockOutRecordMapper;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -71,6 +88,10 @@
 public class HomeServiceImpl implements HomeService {
 
     private final SalesLedgerMapper salesLedgerMapper;
+    private final StockOutRecordMapper stockOutRecordMapper;
+    private final ReturnManagementMapper returnManagementMapper;
+    private final StockInRecordMapper stockInRecordMapper;
+    private final PurchaseReturnOrdersMapper purchaseReturnOrdersMapper;
 
     private final PurchaseLedgerMapper purchaseLedgerMapper;
 
@@ -81,6 +102,10 @@
     private final QualityInspectMapper qualityStatisticsMapper;
 
     private final ApproveProcessMapper approveProcessMapper;
+
+    private final ApprovalTaskMapper approvalTaskMapper;
+
+    private final ApprovalInstanceMapper approvalInstanceMapper;
 
     private final SysDeptMapper sysDeptMapper;
 
@@ -368,40 +393,58 @@
     @Override
     public List<ApproveProcess> todos() throws ParseException {
         LoginUser loginUser = SecurityUtils.getLoginUser();
+        List<ApproveProcess> approveProcesses = new ArrayList<>();
+
+        // 鏌ヨ鏃у鎵硅〃锛坅pprove_process锛�
         LambdaQueryWrapper<ApproveProcess> approveProcessLambdaQueryWrapper = new LambdaQueryWrapper<>();
         approveProcessLambdaQueryWrapper.eq(ApproveProcess::getApproveDelete, 0)
                 .eq(ApproveProcess::getApproveUserCurrentId, loginUser.getUserId())
                 .ne(ApproveProcess::getApproveStatus, 2);
-        // .eq(ApproveProcess::getTenantId, loginUser.getTenantId());
-        List<ApproveProcess> approveProcesses = approveProcessMapper.selectList(approveProcessLambdaQueryWrapper);
-        if (CollectionUtils.isEmpty(approveProcesses)) {
-            approveProcesses = new ArrayList<>();
+        List<ApproveProcess> oldList = approveProcessMapper.selectList(approveProcessLambdaQueryWrapper);
+        if (!CollectionUtils.isEmpty(oldList)) {
+            oldList.forEach(a -> {
+                if (a.getApproveType() != null) {
+                    a.setApproveTypeName(ApproveTypeEnum.getNameByCode(a.getApproveType()));
+                }
+            });
+            approveProcesses.addAll(oldList);
         }
 
-        approveProcesses.forEach(a -> {
-            if (a.getApproveType() != null) {
-                a.setApproveTypeName(ApproveTypeEnum.getNameByCode(a.getApproveType()));
+        // 鏌ヨ鏂板鎵硅〃锛坅pproval_task + approval_instance锛�
+        List<ApprovalTask> pendingTasks = approvalTaskMapper.selectList(new LambdaQueryWrapper<ApprovalTask>()
+                .eq(ApprovalTask::getApproverId, loginUser.getUserId())
+                .eq(ApprovalTask::getTaskStatus, "PENDING")
+                .eq(ApprovalTask::getDeleted, 0));
+        if (!CollectionUtils.isEmpty(pendingTasks)) {
+            List<Long> instanceIds = pendingTasks.stream()
+                    .map(ApprovalTask::getInstanceId)
+                    .distinct()
+                    .collect(Collectors.toList());
+            List<ApprovalInstance> instances = approvalInstanceMapper.selectList(new LambdaQueryWrapper<ApprovalInstance>()
+                    .in(ApprovalInstance::getId, instanceIds)
+                    .eq(ApprovalInstance::getDeleted, 0));
+            Map<Long, ApprovalInstance> instanceMap = instances.stream()
+                    .collect(Collectors.toMap(ApprovalInstance::getId, i -> i, (a, b) -> a));
+
+            for (ApprovalTask task : pendingTasks) {
+                ApprovalInstance instance = instanceMap.get(task.getInstanceId());
+                if (instance == null) {
+                    continue;
+                }
+                ApproveProcess ap = new ApproveProcess();
+                ap.setId(instance.getId());
+                ap.setApproveId(instance.getInstanceNo());
+                ap.setApproveReason(instance.getTitle());
+                ap.setApproveTime(instance.getApplyTime() != null ? java.sql.Timestamp.valueOf(instance.getApplyTime()) : null);
+                ap.setApproveUserName(instance.getApplicantName());
+                ap.setApproveDeptName(instance.getTemplateName());
+                if (instance.getBusinessType() != null) {
+                    ap.setApproveType(instance.getBusinessType().intValue());
+                    ap.setApproveTypeName(TypeEnums.getLabelByValue(instance.getBusinessType()));
+                }
+                approveProcesses.add(ap);
             }
-        });
-        // // 鏌ヨ鏈鐢ㄥ姵淇濊褰�
-        // 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;
     }
@@ -417,14 +460,26 @@
         LocalDate startDate = range[0];
         LocalDate endDate = range[1];
 
+        //閿�鍞嚭搴�
         BigDecimal receivableBase = sumSalesContractAmount(startDate, endDate);
+        //閿�鍞��璐�
+        BigDecimal salesReturnAmount = sumSalesReturnAmount(startDate, endDate);
+        //閲囪喘鍏ュ簱
         BigDecimal payableBase = sumPurchaseContractAmount(startDate, endDate);
+        //閲囪喘閫�璐�
+        BigDecimal purchaseReturnAmount = sumPurchaseReturnAmount(startDate, endDate);
+        //鏀舵
         BigDecimal advanceMoney = sumCollectionAmount(startDate, endDate);
+        //浠樻
         BigDecimal prepayMoney = sumPaymentAmount(startDate, endDate);
 
-        dto.setReceivableMoney(scaleMoney(maxZero(receivableBase.subtract(advanceMoney))));
-        dto.setPayableMoney(scaleMoney(maxZero(payableBase.subtract(prepayMoney))));
+        //搴旀敹閲戦=閿�鍞嚭搴�-閿�鍞��璐�
+        dto.setReceivableMoney(scaleMoney(maxZero(receivableBase.subtract(salesReturnAmount))));
+        //搴斾粯閲戦=閲囪喘鍏ュ簱-閲囪喘閫�璐�
+        dto.setPayableMoney(scaleMoney(maxZero(payableBase.subtract(purchaseReturnAmount))));
+        //鏀舵閲戦=鏀舵鍗�
         dto.setAdvanceMoney(scaleMoney(advanceMoney));
+        //浠樻閲戦=浠樻鍗�
         dto.setPrepayMoney(scaleMoney(prepayMoney));
         return dto;
     }
@@ -442,18 +497,23 @@
 
     @Override
     public Map<String, Object> approveAndDeviceTodos() {
-        // 瀹℃壒鍗忓悓寰呭姙
-        Long aLong = approveProcessMapper.selectCount(new LambdaQueryWrapper<ApproveProcess>()
+        // 鏃у鎵硅〃寰呭姙
+        Long oldCount = approveProcessMapper.selectCount(new LambdaQueryWrapper<ApproveProcess>()
                 .eq(ApproveProcess::getApproveUserCurrentId, SecurityUtils.getUserId())
                 .eq(ApproveProcess::getApproveDelete, 0)
                 .in(ApproveProcess::getApproveStatus, 0, 1, 3));
+        // 鏂板鎵硅〃寰呭姙
+        Long newCount = approvalTaskMapper.selectCount(new LambdaQueryWrapper<ApprovalTask>()
+                .eq(ApprovalTask::getApproverId, SecurityUtils.getUserId())
+                .eq(ApprovalTask::getTaskStatus, "PENDING")
+                .eq(ApprovalTask::getDeleted, 0));
         // 璁惧鎶ヤ慨寰呭姙
         Long aLong1 = deviceRepairMapper.selectCount(new LambdaQueryWrapper<DeviceRepair>()
                 .eq(DeviceRepair::getStatus, 0)
                 .eq(DeviceRepair::getRepairName, SecurityUtils.getLoginUser().getNickName()));
         return new HashMap<String, Object>() {
             {
-                put("approveTodo", aLong);
+                put("approveTodo", oldCount + newCount);
                 put("deviceRepairTodo", aLong1);
             }
         };
@@ -1239,33 +1299,21 @@
         YearMonth currentMonth = YearMonth.from(today);
         LocalDate startDate = currentMonth.atDay(1);
         LocalDate endDate = currentMonth.atEndOfMonth();
-
+        //鏀舵
         BigDecimal monthlyIncome = sumCollectionAmount(startDate, endDate);
+        //閿�鍞嚭搴�
         BigDecimal receivableBase = sumSalesContractAmount(startDate, endDate);
-        String collectionRate = toRateString(monthlyIncome, receivableBase);
-
-        String currentMonthText = currentMonth.toString();
-        List<AccountStatement> receivableStatements = defaultList(accountStatementMapper.selectList(
-                new LambdaQueryWrapper<AccountStatement>()
-                        .eq(AccountStatement::getAccountType, 1)
-                        .le(AccountStatement::getStatementMonth, currentMonthText)));
-
-        long overdueNum = receivableStatements.stream()
-                .filter(item -> item.getStatementMonth() != null && item.getStatementMonth().compareTo(currentMonthText) < 0)
-                .filter(item -> defaultDecimal(item.getClosingBalance()).compareTo(BigDecimal.ZERO) > 0)
-                .count();
-
-        long totalReceivableCount = receivableStatements.size();
-        String overdueRate = totalReceivableCount == 0
-                ? "0.00"
-                : BigDecimal.valueOf(overdueNum)
-                .multiply(BigDecimal.valueOf(100))
-                .divide(BigDecimal.valueOf(totalReceivableCount), 2, RoundingMode.HALF_UP)
-                .toString();
-
+        //閿�鍞��璐�
+        BigDecimal salesReturnAmount = sumSalesReturnAmount(startDate, endDate);
+        //鍥炴鐜�=鏀舵/(閿�鍞嚭搴�-閿�鍞��璐�)搴旀敹
+        String collectionRate = toRateString(monthlyIncome, receivableBase.subtract(salesReturnAmount));
+        //閫炬湡鏁�=(閿�鍞嚭搴撻噾棰�-閿�鍞��璐ч噾棰�)搴旀敹閲戦-鏀舵閲戦
+        BigDecimal overdueAmount = receivableBase.subtract(salesReturnAmount).subtract(monthlyIncome);
+        //閫炬湡鐜�=閫炬湡鏁�/搴旀敹閲戦
+        String overdueRate = toRateString(overdueAmount, receivableBase);
         dto.setMonthlyIncome(scaleMoney(monthlyIncome));
         dto.setCollectionRate(collectionRate);
-        dto.setOverdueNum(BigDecimal.valueOf(overdueNum));
+        dto.setOverdueNum(overdueAmount);
         dto.setOverdueRate(overdueRate);
         return dto;
     }
@@ -1277,16 +1325,25 @@
         YearMonth currentMonth = YearMonth.from(today);
         LocalDate startDate = currentMonth.atDay(1);
         LocalDate endDate = currentMonth.atEndOfMonth();
-
+        //鏀嚭
         BigDecimal monthlyExpenditure = sumPaymentAmount(startDate, endDate);
+        //閲囪喘鍏ュ簱
         BigDecimal payableBase = sumPurchaseContractAmount(startDate, endDate);
+        //閲囪喘閫�璐�
+        BigDecimal purchaseReturnAmount = sumPurchaseReturnAmount(startDate, endDate);
+        //浠樻鐜�=浠樻/(閲囪喘鍏ュ簱-閲囪喘閫�璐�)搴斾粯
+        String paymentRate = toRateString(monthlyExpenditure, payableBase.subtract(purchaseReturnAmount));
+        //鏀舵
         BigDecimal monthlyIncome = sumCollectionAmount(startDate, endDate);
+        //姣涘埄娑�= 鏀舵-鏀嚭
         BigDecimal grossProfit = monthlyIncome.subtract(monthlyExpenditure);
+        //鍒╂鼎鐜�=姣涘埄娑�/鏀舵
+        String profitMarginRate = toRateString(grossProfit, monthlyIncome);
 
         dto.setMonthlyExpenditure(scaleMoney(monthlyExpenditure));
-        dto.setPaymentRate(toRateString(monthlyExpenditure, payableBase));
+        dto.setPaymentRate(paymentRate);
         dto.setGrossProfit(scaleMoney(grossProfit));
-        dto.setProfitMarginRate(toRateString(grossProfit, monthlyIncome));
+        dto.setProfitMarginRate(profitMarginRate);
         return dto;
     }
 
@@ -2317,20 +2374,43 @@
         return new LocalDate[]{startDate, endDate};
     }
 
+    //璁$畻鏃ユ湡鍐呯殑閿�鍞嚭搴撻噾棰�
     private BigDecimal sumSalesContractAmount(LocalDate startDate, LocalDate endDate) {
-        List<SalesLedger> salesLedgers = defaultList(salesLedgerMapper.selectList(new LambdaQueryWrapper<SalesLedger>()
-                .ge(SalesLedger::getEntryDate, toDate(startDate))
-                .lt(SalesLedger::getEntryDate, toExclusiveEndDate(endDate))));
-        return sumAmount(salesLedgers, SalesLedger::getContractAmount);
+        SalesOutboundDto salesOutboundDto = new SalesOutboundDto();
+        salesOutboundDto.setStartDate(startDate);
+        salesOutboundDto.setEndDate(endDate);
+        List<SalesOutboundVo> salesOutboundVos = stockOutRecordMapper.listPageAccountSales(new Page(1, -1), salesOutboundDto).getRecords();
+        return sumAmount(salesOutboundVos, SalesOutboundVo::getOutboundAmount);
     }
 
+    //璁$畻鏃ユ湡鍐呯殑閿�鍞��璐ч噾棰�
+    private BigDecimal sumSalesReturnAmount(LocalDate startDate, LocalDate endDate) {
+        SalesReturnDto salesReturnDto = new SalesReturnDto();
+        salesReturnDto.setStartDate(startDate);
+        salesReturnDto.setEndDate(endDate);
+        List<SalesReturnVo> salesReturnVos = returnManagementMapper.listPageAccountSalesReturn(new Page(1, -1), salesReturnDto).getRecords();
+        return sumAmount(salesReturnVos, SalesReturnVo::getRefundAmount);
+    }
+
+    //璁$畻鏃ユ湡鍐呯殑閲囪喘鍏ュ簱閲戦
     private BigDecimal sumPurchaseContractAmount(LocalDate startDate, LocalDate endDate) {
-        List<PurchaseLedger> purchaseLedgers = defaultList(purchaseLedgerMapper.selectList(new LambdaQueryWrapper<PurchaseLedger>()
-                .ge(PurchaseLedger::getEntryDate, toDate(startDate))
-                .lt(PurchaseLedger::getEntryDate, toExclusiveEndDate(endDate))));
-        return sumAmount(purchaseLedgers, PurchaseLedger::getContractAmount);
+        PurchaseInboundDto purchaseInboundDto = new PurchaseInboundDto();
+        purchaseInboundDto.setStartDate(startDate);
+        purchaseInboundDto.setEndDate(endDate);
+        List<PurchaseInboundVo> purchaseInboundVos = stockInRecordMapper.listPageAccountPurchase(new Page(1, -1), purchaseInboundDto).getRecords();
+        return sumAmount(purchaseInboundVos, PurchaseInboundVo::getInboundAmount);
     }
 
+    //璁$畻鏃ユ湡鍐呯殑閲囪喘閫�璐ч噾棰�
+    private BigDecimal sumPurchaseReturnAmount(LocalDate startDate, LocalDate endDate) {
+        PurchaseReturnDto purchaseReturnDto = new PurchaseReturnDto();
+        purchaseReturnDto.setStartDate(startDate);
+        purchaseReturnDto.setEndDate(endDate);
+        List<PurchaseReturnVo> purchaseReturnVos = purchaseReturnOrdersMapper.listPageAccountPurchaseReturn(new Page(1, -1), purchaseReturnDto).getRecords();
+        return sumAmount(purchaseReturnVos, PurchaseReturnVo::getTotalAmount);
+    }
+
+    //璁$畻鏃ユ湡鍐呯殑鎬绘敹娆鹃噾棰�
     private BigDecimal sumCollectionAmount(LocalDate startDate, LocalDate endDate) {
         List<AccountSalesCollection> collections = defaultList(accountSalesCollectionMapper.selectList(
                 new LambdaQueryWrapper<AccountSalesCollection>()
@@ -2339,6 +2419,7 @@
         return sumAmount(collections, AccountSalesCollection::getCollectionAmount);
     }
 
+    //璁$畻鏃ユ湡鍐呯殑鎬讳粯娆鹃噾棰�
     private BigDecimal sumPaymentAmount(LocalDate startDate, LocalDate endDate) {
         List<AccountPurchasePayment> payments = defaultList(accountPurchasePaymentMapper.selectList(
                 new LambdaQueryWrapper<AccountPurchasePayment>()

--
Gitblit v1.9.3