From e8e04cae63c32edd6b8e256a6491feb207a21bc3 Mon Sep 17 00:00:00 2001 From: zt Date: Fri, 22 Aug 2025 15:58:15 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=A7=E5=B1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/MoneyBigScreenController.java | 246 +++++++++++++++++- .../bigscreen/domain/vo/MoneyCostVo.java | 37 +++ .../bigscreen/domain/vo/MoneyMonthVo.java | 34 +++ .../impl/CtrIncomeContractServiceImpl.java | 16 ++ 4 files changed, 319 insertions(+), 14 deletions(-) create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/MoneyCostVo.java create mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/MoneyMonthVo.java diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/controller/MoneyBigScreenController.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/controller/MoneyBigScreenController.java index 408749ce..4d123ecb 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/controller/MoneyBigScreenController.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/controller/MoneyBigScreenController.java @@ -2,14 +2,12 @@ package org.dromara.bigscreen.controller; import cn.dev33.satoken.annotation.SaCheckPermission; import jakarta.annotation.Resource; +import org.dromara.bigscreen.domain.vo.*; import org.dromara.bigscreen.service.MoneyBigScreenService; import org.dromara.common.core.domain.R; import org.dromara.project.domain.vo.project.BusProjectGisVo; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; -import org.dromara.bigscreen.domain.vo.MoneyContractCountVo; -import org.dromara.bigscreen.domain.vo.MoneyPayVo; -import org.dromara.bigscreen.domain.vo.MoneyTotalAmountVo; import org.dromara.common.core.domain.R; import org.dromara.ctr.domain.CtrExpensesContract; import org.dromara.ctr.domain.CtrIncomeContract; @@ -24,14 +22,13 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import java.util.List; +import java.time.YearMonth; +import java.util.*; import java.math.BigDecimal; import java.time.LocalDate; import java.time.temporal.TemporalAdjusters; -import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.stream.Collectors; /** @@ -114,7 +111,10 @@ public class MoneyBigScreenController { .eq(CtrIncomeContract::getProjectId, projectId) .last("limit 1") ); - actualAmount = actualAmount.add(projectMonthlyAmountMap.get(projectId).multiply(contract.getPayRatio()).divide(HUNDRED)); + if(contract != null){ + actualAmount = actualAmount.add(projectMonthlyAmountMap.get(projectId).multiply(contract.getPayRatio()).divide(HUNDRED)); + } + } return R.ok(new MoneyPayVo(planAmount, actualAmount)); @@ -129,9 +129,7 @@ public class MoneyBigScreenController { LocalDate startDate = monthStartAndEnd.get("start"); LocalDate endDate = monthStartAndEnd.get("end"); - List list = settlementValueSubcontractService.list(Wrappers - .lambdaQuery(OutSettlementValueSubcontract.class) - ); + List list = settlementValueSubcontractService.list(); BigDecimal planAmount = list.stream() .map(OutSettlementValueSubcontract::getSettlementValue) @@ -167,7 +165,11 @@ public class MoneyBigScreenController { .eq(CtrExpensesContract::getContractCode, contractCode) .last("limit 1") ); - actualAmount = actualAmount.add(projectAmountMap.get(contractCode).multiply(contract.getPayRatio()).divide(HUNDRED)); + + if(contract != null){ + actualAmount = actualAmount.add(projectAmountMap.get(contractCode).multiply(contract.getPayRatio()).divide(HUNDRED)); + } + } return R.ok(new MoneyPayVo(planAmount, actualAmount)); @@ -182,7 +184,6 @@ public class MoneyBigScreenController { public R incomeAnalyze() { - List list = incomeContractService.list(); // 按金额区间统计数量 @@ -268,20 +269,237 @@ public class MoneyBigScreenController { //利润 BigDecimal profitAmount = incomeTotalAmount.subtract(expensesTotalAmount); - //todo: 工程变更计算 不清楚逻辑先设为0 - BigDecimal changeAmount = BigDecimal.ZERO; + //todo: 工程变更计算 不清楚逻辑 给定个假值 + BigDecimal changeAmount = new BigDecimal("0.236"); return R.ok(new MoneyTotalAmountVo(incomeTotalAmount, expensesTotalAmount,profitAmount,changeAmount)); } + /** + * 成本 + */ + @GetMapping("/cost") + public R cost() { + +// List incomeContracts = incomeContractService.list(); +// BigDecimal incomeTotalAmount = incomeContracts.stream() +// .filter(contract -> contract.getAmount() != null) +// .map(CtrIncomeContract::getAmount) +// .reduce(BigDecimal.ZERO, BigDecimal::add); + + //todo: 不清楚逻辑 给定个假值 + BigDecimal materialCost = new BigDecimal("2634.48"); + BigDecimal subcontractCost = new BigDecimal("28768.56"); + BigDecimal LaborCost = new BigDecimal("16304.89"); + BigDecimal manageCost = new BigDecimal("8623.61"); + + return R.ok(new MoneyCostVo(materialCost, subcontractCost,LaborCost,manageCost)); + } + /** + * 按月资金统计 + */ + @GetMapping("/monthMoney") + public R> monthMoney() { + List owners = settlementValueOwnerService.list(); + List subcontracts = settlementValueSubcontractService.list(); + + List moneyCostVos = new ArrayList<>(); + + // 生成包含当前月在内的往前数7个月的月份列表 + List last7Months = new ArrayList<>(); + YearMonth currentYearMonth = YearMonth.now(); + + for (int i = 6; i >= 0; i--) { + last7Months.add(currentYearMonth.minusMonths(i)); + } + + // 遍历每个月份,筛选对应的数据 + for (YearMonth yearMonth : last7Months) { + // 获取该月的第一天和最后一天 + LocalDate startDate = yearMonth.atDay(1); + LocalDate endDate = yearMonth.atEndOfMonth(); + + // 筛选业主结算数据(应收)并按项目ID分组统计金额 + Map incomeGroupedByProject = owners.stream() + .filter(owner -> { + LocalDate settlementDate = owner.getSettlementDate(); + return settlementDate != null && + !settlementDate.isBefore(startDate) && + !settlementDate.isAfter(endDate); + }) + .collect(Collectors.groupingBy( + OutSettlementValueOwner::getProjectId, + Collectors.reducing( + BigDecimal.ZERO, + OutSettlementValueOwner::getSettlementValue, + BigDecimal::add + ) + )); + + BigDecimal incomeAmount =BigDecimal.ZERO; + + for (Long projectId : incomeGroupedByProject.keySet()) { + + CtrIncomeContract contract = incomeContractService.getOne(Wrappers.lambdaQuery(CtrIncomeContract.class) + .eq(CtrIncomeContract::getProjectId, projectId) + .last("limit 1") + ); + if(contract != null){ + incomeAmount = incomeAmount.add(incomeGroupedByProject.get(projectId).multiply(contract.getPayRatio()).divide(HUNDRED)); + } + + } + + // 筛选分包商结算数据(应付)并按合同编号分组统计金额 + Map expenseGroupedByContract = subcontracts.stream() + .filter(subcontract -> { + LocalDate settlementDate = subcontract.getSettlementDate(); + return settlementDate != null && + !settlementDate.isBefore(startDate) && + !settlementDate.isAfter(endDate); + }) + .collect(Collectors.groupingBy( + OutSettlementValueSubcontract::getContractCode, + Collectors.reducing( + BigDecimal.ZERO, + OutSettlementValueSubcontract::getSettlementValue, + BigDecimal::add + ) + )); + + BigDecimal expensesAmount =BigDecimal.ZERO; + + for (String contractCode: expenseGroupedByContract.keySet()) { + + CtrExpensesContract contract = expensesContractService.getOne(Wrappers.lambdaQuery(CtrExpensesContract.class) + .eq(CtrExpensesContract::getContractCode, contractCode) + .last("limit 1") + ); + + if(contract != null){ + expensesAmount = expensesAmount.add(expenseGroupedByContract.get(contractCode).multiply(contract.getPayRatio()).divide(HUNDRED)); + } + + } + MoneyMonthVo monthData = new MoneyMonthVo( + yearMonth.toString(), + incomeAmount, + expensesAmount, + incomeAmount.subtract(expensesAmount) + ); + + moneyCostVos.add(monthData); + } + + return R.ok(moneyCostVos); + } + /** + * 按月现金统计 + */ + @GetMapping("/monthCash") + public R> monthCash() { + List owners = settlementValueOwnerService.list(); + List subcontracts = settlementValueSubcontractService.list(); + + List moneyCostVos = new ArrayList<>(); + + // 生成包含当前月在内的往前数7个月的月份列表 + List last7Months = new ArrayList<>(); + YearMonth currentYearMonth = YearMonth.now(); + + for (int i = 6; i >= 0; i--) { + last7Months.add(currentYearMonth.minusMonths(i)); + } + + // 遍历每个月份,筛选对应的数据 + for (YearMonth yearMonth : last7Months) { + // 获取该月的第一天和最后一天 + LocalDate startDate = yearMonth.atDay(1); + LocalDate endDate = yearMonth.atEndOfMonth(); + + // 筛选业主结算数据(应收)并按项目ID分组统计金额 + Map incomeGroupedByProject = owners.stream() + .filter(owner -> { + LocalDate settlementDate = owner.getSettlementDate(); + return settlementDate != null && + !settlementDate.isBefore(startDate) && + !settlementDate.isAfter(endDate); + }) + .collect(Collectors.groupingBy( + OutSettlementValueOwner::getProjectId, + Collectors.reducing( + BigDecimal.ZERO, + OutSettlementValueOwner::getSettlementValue, + BigDecimal::add + ) + )); + + BigDecimal incomeAmount =BigDecimal.ZERO; + + for (Long projectId : incomeGroupedByProject.keySet()) { + + CtrIncomeContract contract = incomeContractService.getOne(Wrappers.lambdaQuery(CtrIncomeContract.class) + .eq(CtrIncomeContract::getProjectId, projectId) + .last("limit 1") + ); + if(contract != null){ + incomeAmount = incomeAmount.add(incomeGroupedByProject.get(projectId).multiply(contract.getPayRatio()).divide(HUNDRED)); + } + + } + + // 筛选分包商结算数据(应付)并按合同编号分组统计金额 + Map expenseGroupedByContract = subcontracts.stream() + .filter(subcontract -> { + LocalDate settlementDate = subcontract.getSettlementDate(); + return settlementDate != null && + !settlementDate.isBefore(startDate) && + !settlementDate.isAfter(endDate); + }) + .collect(Collectors.groupingBy( + OutSettlementValueSubcontract::getContractCode, + Collectors.reducing( + BigDecimal.ZERO, + OutSettlementValueSubcontract::getSettlementValue, + BigDecimal::add + ) + )); + + BigDecimal expensesAmount =BigDecimal.ZERO; + + for (String contractCode: expenseGroupedByContract.keySet()) { + + CtrExpensesContract contract = expensesContractService.getOne(Wrappers.lambdaQuery(CtrExpensesContract.class) + .eq(CtrExpensesContract::getContractCode, contractCode) + .last("limit 1") + ); + + if(contract != null){ + expensesAmount = expensesAmount.add(expenseGroupedByContract.get(contractCode).multiply(contract.getPayRatio()).divide(HUNDRED)); + } + + } + + MoneyMonthVo monthData = new MoneyMonthVo( + yearMonth.toString(), + incomeAmount, + expensesAmount, + incomeAmount.subtract(expensesAmount) + ); + + moneyCostVos.add(monthData); + } + + return R.ok(moneyCostVos); + } /** diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/MoneyCostVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/MoneyCostVo.java new file mode 100644 index 00000000..dfeb84dc --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/MoneyCostVo.java @@ -0,0 +1,37 @@ +package org.dromara.bigscreen.domain.vo; + + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class MoneyCostVo { + + /** + * 材料 + */ + private BigDecimal materialCost; + + /** + * 分包 + */ + private BigDecimal subcontractCost; + + /** + * 劳务 + */ + private BigDecimal LaborCost; + + + /** + * 管理 + */ + private BigDecimal manageCost; + + +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/MoneyMonthVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/MoneyMonthVo.java new file mode 100644 index 00000000..a891e59e --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/bigscreen/domain/vo/MoneyMonthVo.java @@ -0,0 +1,34 @@ +package org.dromara.bigscreen.domain.vo; + + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class MoneyMonthVo { + + /** + * 月份 + */ + private String month; + + /** + * 收入 + */ + private BigDecimal incomeAmount ; + + /** + * 支出 + */ + private BigDecimal expensesAmount ; + + /** + * 净现金 + */ + private BigDecimal profitAmount ; +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/ctr/service/impl/CtrIncomeContractServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/ctr/service/impl/CtrIncomeContractServiceImpl.java index f35f92eb..740a31db 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/ctr/service/impl/CtrIncomeContractServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/ctr/service/impl/CtrIncomeContractServiceImpl.java @@ -22,6 +22,7 @@ import org.dromara.ctr.mapper.CtrIncomeContractMapper; import org.dromara.ctr.service.ICtrIncomeContractService; import org.springframework.transaction.annotation.Transactional; +import java.math.BigDecimal; import java.util.List; import java.util.Map; import java.util.Collection; @@ -138,6 +139,21 @@ public class CtrIncomeContractServiceImpl extends ServiceImpl listProject = list(Wrappers.lambdaQuery() + .eq(CtrIncomeContract::getProjectId, entity.getProjectId()) + .ne(entity.getId() != null, CtrIncomeContract::getId, entity.getId()) + ); + if (CollectionUtil.isNotEmpty(listProject)) { + throw new ServiceException("保存合同信息失败,项目下已存在合同"); + } + BigDecimal assuranceDepositRatio = entity.getAssuranceDepositRatio(); + entity.getPayRatio().add(entity.getAdvancePayRatio()).add(entity.getBalancePayRatio()).add(assuranceDepositRatio); + //校验支付比例是否100% + if (assuranceDepositRatio.compareTo(new BigDecimal(100)) != 0) { + throw new ServiceException("保存合同信息失败,付款比例必须为100%"); + } + } /**