This commit is contained in:
zt
2025-08-22 15:58:15 +08:00
parent 05c1a37704
commit e8e04cae63
4 changed files with 319 additions and 14 deletions

View File

@ -2,14 +2,12 @@ package org.dromara.bigscreen.controller;
import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaCheckPermission;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.dromara.bigscreen.domain.vo.*;
import org.dromara.bigscreen.service.MoneyBigScreenService; import org.dromara.bigscreen.service.MoneyBigScreenService;
import org.dromara.common.core.domain.R; import org.dromara.common.core.domain.R;
import org.dromara.project.domain.vo.project.BusProjectGisVo; import org.dromara.project.domain.vo.project.BusProjectGisVo;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor; 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.common.core.domain.R;
import org.dromara.ctr.domain.CtrExpensesContract; import org.dromara.ctr.domain.CtrExpensesContract;
import org.dromara.ctr.domain.CtrIncomeContract; 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.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import java.util.List; import java.time.YearMonth;
import java.util.*;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters; import java.time.temporal.TemporalAdjusters;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
@ -114,7 +111,10 @@ public class MoneyBigScreenController {
.eq(CtrIncomeContract::getProjectId, projectId) .eq(CtrIncomeContract::getProjectId, projectId)
.last("limit 1") .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)); return R.ok(new MoneyPayVo(planAmount, actualAmount));
@ -129,9 +129,7 @@ public class MoneyBigScreenController {
LocalDate startDate = monthStartAndEnd.get("start"); LocalDate startDate = monthStartAndEnd.get("start");
LocalDate endDate = monthStartAndEnd.get("end"); LocalDate endDate = monthStartAndEnd.get("end");
List<OutSettlementValueSubcontract> list = settlementValueSubcontractService.list(Wrappers List<OutSettlementValueSubcontract> list = settlementValueSubcontractService.list();
.lambdaQuery(OutSettlementValueSubcontract.class)
);
BigDecimal planAmount = list.stream() BigDecimal planAmount = list.stream()
.map(OutSettlementValueSubcontract::getSettlementValue) .map(OutSettlementValueSubcontract::getSettlementValue)
@ -167,7 +165,11 @@ public class MoneyBigScreenController {
.eq(CtrExpensesContract::getContractCode, contractCode) .eq(CtrExpensesContract::getContractCode, contractCode)
.last("limit 1") .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)); return R.ok(new MoneyPayVo(planAmount, actualAmount));
@ -182,7 +184,6 @@ public class MoneyBigScreenController {
public R<MoneyContractCountVo> incomeAnalyze() { public R<MoneyContractCountVo> incomeAnalyze() {
List<CtrIncomeContract> list = incomeContractService.list(); List<CtrIncomeContract> list = incomeContractService.list();
// 按金额区间统计数量 // 按金额区间统计数量
@ -268,20 +269,237 @@ public class MoneyBigScreenController {
//利润 //利润
BigDecimal profitAmount = incomeTotalAmount.subtract(expensesTotalAmount); BigDecimal profitAmount = incomeTotalAmount.subtract(expensesTotalAmount);
//todo: 工程变更计算 不清楚逻辑先设为0 //todo: 工程变更计算 不清楚逻辑 给定个假值
BigDecimal changeAmount = BigDecimal.ZERO; BigDecimal changeAmount = new BigDecimal("0.236");
return R.ok(new MoneyTotalAmountVo(incomeTotalAmount, expensesTotalAmount,profitAmount,changeAmount)); return R.ok(new MoneyTotalAmountVo(incomeTotalAmount, expensesTotalAmount,profitAmount,changeAmount));
} }
/**
* 成本
*/
@GetMapping("/cost")
public R<MoneyCostVo> cost() {
// List<CtrIncomeContract> 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<List<MoneyMonthVo>> monthMoney() {
List<OutSettlementValueOwner> owners = settlementValueOwnerService.list();
List<OutSettlementValueSubcontract> subcontracts = settlementValueSubcontractService.list();
List<MoneyMonthVo> moneyCostVos = new ArrayList<>();
// 生成包含当前月在内的往前数7个月的月份列表
List<YearMonth> 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<Long, BigDecimal> 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<String, BigDecimal> 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<List<MoneyMonthVo>> monthCash() {
List<OutSettlementValueOwner> owners = settlementValueOwnerService.list();
List<OutSettlementValueSubcontract> subcontracts = settlementValueSubcontractService.list();
List<MoneyMonthVo> moneyCostVos = new ArrayList<>();
// 生成包含当前月在内的往前数7个月的月份列表
List<YearMonth> 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<Long, BigDecimal> 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<String, BigDecimal> 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);
}
/** /**

View File

@ -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;
}

View File

@ -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 ;
}

View File

@ -22,6 +22,7 @@ import org.dromara.ctr.mapper.CtrIncomeContractMapper;
import org.dromara.ctr.service.ICtrIncomeContractService; import org.dromara.ctr.service.ICtrIncomeContractService;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Collection; import java.util.Collection;
@ -138,6 +139,21 @@ public class CtrIncomeContractServiceImpl extends ServiceImpl<CtrIncomeContractM
if (CollectionUtil.isNotEmpty(list)) { if (CollectionUtil.isNotEmpty(list)) {
throw new ServiceException("保存合同信息失败,合同编号已存在"); throw new ServiceException("保存合同信息失败,合同编号已存在");
} }
//校验项目合同是否唯一
List<CtrIncomeContract> listProject = list(Wrappers.<CtrIncomeContract>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%");
}
} }
/** /**