大屏
This commit is contained in:
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -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 ;
|
||||||
|
}
|
@ -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%");
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Reference in New Issue
Block a user