|
@ -2544,12 +2544,11 @@ public class HuzhouProjectinfoServiceImpl extends ServiceImpl<HuzhouProjectinfoM |
|
|
Map<String, BigDecimal> totalMap = contractinfoMapper.getTotalByProjectIds(Arrays.asList(huzhouProjectinfoOV.getId())); |
|
|
Map<String, BigDecimal> totalMap = contractinfoMapper.getTotalByProjectIds(Arrays.asList(huzhouProjectinfoOV.getId())); |
|
|
//获取:huzhou_projectinfo_money
|
|
|
//获取:huzhou_projectinfo_money
|
|
|
HuzhouProjectinfoMoney projectinfoMoney = huzhouProjectinfoMoneyService.getById(huzhouProjectinfoOV.getId()); |
|
|
HuzhouProjectinfoMoney projectinfoMoney = huzhouProjectinfoMoneyService.getById(huzhouProjectinfoOV.getId()); |
|
|
//Map<String, BigDecimal> paymentsMap = contractinfoMapper.getPaymentsByProjectIds(Arrays.asList(huzhouProjectinfoOV.getId()));
|
|
|
|
|
|
if(totalMap!=null&&projectinfoMoney!=null){ |
|
|
if (totalMap!=null&&projectinfoMoney!=null){ |
|
|
BigDecimal totalAcount = totalMap.get("totalAcount"); |
|
|
BigDecimal totalAcount = totalMap.get("totalAcount"); |
|
|
BigDecimal totalcentralAcount = totalMap.get("centralAcount"); |
|
|
BigDecimal totalCentralAcount = totalMap.get("centralAcount"); |
|
|
// BigDecimal totalPayment = paymentsMap.get("totalPayment");
|
|
|
|
|
|
// BigDecimal centralPayment = paymentsMap.get("centralPayment");
|
|
|
|
|
|
Double contractTotalMoney = projectinfoMoney.getContractTotalMoney(); |
|
|
Double contractTotalMoney = projectinfoMoney.getContractTotalMoney(); |
|
|
Double contractCentralMoney = projectinfoMoney.getContractCentralMoney(); |
|
|
Double contractCentralMoney = projectinfoMoney.getContractCentralMoney(); |
|
|
BigDecimal totalPayment = (contractTotalMoney != null) ? new BigDecimal(contractTotalMoney.toString()) : BigDecimal.ZERO; |
|
|
BigDecimal totalPayment = (contractTotalMoney != null) ? new BigDecimal(contractTotalMoney.toString()) : BigDecimal.ZERO; |
|
@ -2567,8 +2566,8 @@ public class HuzhouProjectinfoServiceImpl extends ServiceImpl<HuzhouProjectinfoM |
|
|
.toString(); |
|
|
.toString(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if (totalcentralAcount != null && totalcentralAcount.compareTo(BigDecimal.ZERO) != 0) { |
|
|
if (totalCentralAcount != null && totalCentralAcount.compareTo(BigDecimal.ZERO) != 0) { |
|
|
centralFundPaymentSituation = totalcentralAcount |
|
|
centralFundPaymentSituation = totalCentralAcount |
|
|
.divide(centralPayment, 4, BigDecimal.ROUND_HALF_UP) |
|
|
.divide(centralPayment, 4, BigDecimal.ROUND_HALF_UP) |
|
|
.multiply(new BigDecimal("100")) // ✅ 乘以 100
|
|
|
.multiply(new BigDecimal("100")) // ✅ 乘以 100
|
|
|
.setScale(0, BigDecimal.ROUND_HALF_UP) // ✅ 四舍五入取整
|
|
|
.setScale(0, BigDecimal.ROUND_HALF_UP) // ✅ 四舍五入取整
|
|
@ -2577,12 +2576,20 @@ public class HuzhouProjectinfoServiceImpl extends ServiceImpl<HuzhouProjectinfoM |
|
|
|
|
|
|
|
|
projectContactShouYeOV.setProjectFundPaymentProgress(projectFundPaymentProgress); |
|
|
projectContactShouYeOV.setProjectFundPaymentProgress(projectFundPaymentProgress); |
|
|
projectContactShouYeOV.setCentralFundPaymentSituation(centralFundPaymentSituation); |
|
|
projectContactShouYeOV.setCentralFundPaymentSituation(centralFundPaymentSituation); |
|
|
projectContactShouYeOVS.add(projectContactShouYeOV); |
|
|
}else { |
|
|
}else{ |
|
|
|
|
|
projectContactShouYeOV.setProjectFundPaymentProgress("0"); |
|
|
projectContactShouYeOV.setProjectFundPaymentProgress("0"); |
|
|
projectContactShouYeOV.setCentralFundPaymentSituation("0"); |
|
|
projectContactShouYeOV.setCentralFundPaymentSituation("0"); |
|
|
projectContactShouYeOVS.add(projectContactShouYeOV); |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
// 存在子项目的情况
|
|
|
|
|
|
if (this.queryHasSubProject(huzhouProjectinfoOV.getId())){ |
|
|
|
|
|
ProjectContactShouYeOV dto = processProjectShouYeFundInfo(huzhouProjectinfoOV); |
|
|
|
|
|
//资金支付进度(total)
|
|
|
|
|
|
projectContactShouYeOV.setProjectFundPaymentProgress(dto.getProjectFundPaymentProgress()); |
|
|
|
|
|
//中央资金支付情况
|
|
|
|
|
|
projectContactShouYeOV.setCentralFundPaymentSituation(dto.getCentralFundPaymentSituation()); |
|
|
|
|
|
} |
|
|
|
|
|
projectContactShouYeOVS.add(projectContactShouYeOV); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
@ -3036,75 +3043,123 @@ public class HuzhouProjectinfoServiceImpl extends ServiceImpl<HuzhouProjectinfoM |
|
|
|
|
|
|
|
|
@Override |
|
|
@Override |
|
|
public void fillSuperiorFundPayRateByChildren(List<HuzhouProjectinfo> projectInfoList) { |
|
|
public void fillSuperiorFundPayRateByChildren(List<HuzhouProjectinfo> projectInfoList) { |
|
|
List<HuzhouSubProjectinfo> records = subProjectinfoService.list(); |
|
|
List<HuzhouSubProjectinfo> subProjects = subProjectinfoService.list(); |
|
|
// 获取子项目对应的 主项目id集合
|
|
|
|
|
|
List<String> hasSubProjectIds = records.stream() |
|
|
// 提取所有有子项目的主项目ID
|
|
|
|
|
|
List<String> hasSubProjectIds = subProjects.stream() |
|
|
.map(HuzhouSubProjectinfo::getProjectId) |
|
|
.map(HuzhouSubProjectinfo::getProjectId) |
|
|
.collect(Collectors.toList()); |
|
|
.collect(Collectors.toList()); |
|
|
// 对所有存在子项目的主项目进行填充上级资金执行率
|
|
|
|
|
|
List<HuzhouProjectinfo> waitFillProjectInfoList = new ArrayList<>(); |
|
|
// 过滤出需要填充资金执行率的主项目
|
|
|
waitFillProjectInfoList= projectInfoList.stream() |
|
|
List<HuzhouProjectinfo> waitFillList = projectInfoList.stream() |
|
|
.filter(project -> hasSubProjectIds.contains(project.getId())) |
|
|
.filter(p -> hasSubProjectIds.contains(p.getId())) |
|
|
.collect(Collectors.toList()); |
|
|
.collect(Collectors.toList()); |
|
|
waitFillProjectInfoList.forEach(item ->log.info("有子项目的项目名称:{}",item.getProjectName())); |
|
|
|
|
|
|
|
|
// 打印待处理项目名称
|
|
|
for (HuzhouProjectinfo projectInfo : waitFillProjectInfoList) { |
|
|
waitFillList.forEach(p -> log.info("有子项目的项目名称:{}", p.getProjectName())); |
|
|
// 分子
|
|
|
|
|
|
Double totalCentralMoney =0.0; |
|
|
// 处理每个主项目
|
|
|
Double totalProvincialMoney =0.0; |
|
|
waitFillList.forEach(this::processProjectFundingRate); |
|
|
// 分母
|
|
|
} |
|
|
Double totalContractProvincialMoney =0.0; |
|
|
|
|
|
Double totalContractCentralMoney =0.0; |
|
|
|
|
|
// 基本信息
|
|
|
private void processProjectFundingRate(HuzhouProjectinfo projectInfo) { |
|
|
String projectId = projectInfo.getId(); |
|
|
String projectId = projectInfo.getId(); |
|
|
LambdaQueryWrapper<HuzhouSubProjectinfo> queryWrapper = new LambdaQueryWrapper<>(); |
|
|
|
|
|
queryWrapper.eq(HuzhouSubProjectinfo::getProjectId,projectId); |
|
|
|
|
|
//获取对应的子项目数据
|
|
|
|
|
|
List<HuzhouSubProjectinfo> subProjectInfos = subProjectinfoMapper.selectList(queryWrapper); |
|
|
|
|
|
for (HuzhouSubProjectinfo subProjectInfo : subProjectInfos) { |
|
|
|
|
|
String subProjectName = subProjectInfo.getProjectName(); |
|
|
|
|
|
String subProjectId = subProjectInfo.getProjectId(); |
|
|
|
|
|
|
|
|
|
|
|
// 合同金额(实际)
|
|
|
|
|
|
Map<String, Double> actualFunds = calculateActualFunds(subProjectInfo.getId()); |
|
|
|
|
|
Double centralMoney = actualFunds.get("centralMoney"); |
|
|
|
|
|
Double provincialMoney = actualFunds.get("provincialMoney"); |
|
|
|
|
|
totalCentralMoney += centralMoney; |
|
|
|
|
|
totalProvincialMoney += provincialMoney; |
|
|
|
|
|
log.info("子项目名称:{}", subProjectName); |
|
|
|
|
|
log.info("合同金额(实际累加):{}+{}", totalCentralMoney,totalProvincialMoney); |
|
|
|
|
|
|
|
|
|
|
|
// 合同金额(计划)
|
|
|
|
|
|
Boolean flag = planinfoService.taskNameIsFinished(subProjectId); |
|
|
|
|
|
HuzhouProjectinfoMoney contractMoneyInfo = huzhouProjectinfoMoneyService.getById(subProjectId); |
|
|
|
|
|
|
|
|
|
|
|
if (contractMoneyInfo != null) { |
|
|
|
|
|
Double contractCentralMoney = contractMoneyInfo.getContractCentralMoney(); |
|
|
|
|
|
Double contractProvincialMoney = contractMoneyInfo.getContractProvincialMoney(); |
|
|
|
|
|
if (!flag){ |
|
|
|
|
|
contractCentralMoney = 0.0; |
|
|
|
|
|
contractProvincialMoney = 0.0; |
|
|
|
|
|
} |
|
|
|
|
|
totalContractCentralMoney += (contractCentralMoney != null ) ? contractCentralMoney : 0.0; |
|
|
|
|
|
totalContractProvincialMoney += (contractProvincialMoney != null ) ? contractProvincialMoney : 0.0; |
|
|
|
|
|
log.info("计划合同金额(中央+省级):{}--{}", contractCentralMoney, contractProvincialMoney); |
|
|
|
|
|
} |
|
|
|
|
|
if (totalContractProvincialMoney == 0.0 && totalContractCentralMoney == 0.0){ |
|
|
|
|
|
projectInfo.setSuperiorFundPayRate(0.0); |
|
|
|
|
|
}else { |
|
|
|
|
|
double rate = (totalCentralMoney + totalProvincialMoney) / (totalContractProvincialMoney + totalContractCentralMoney); |
|
|
|
|
|
double formattedRate = Math.round(rate * 100.0) / 100.0; |
|
|
|
|
|
int percentageRate = (int)(formattedRate * 100); |
|
|
|
|
|
projectInfo.setSuperiorFundPayRate((double) percentageRate); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 1.获取该主项目下的所有关联的子项目信息
|
|
|
|
|
|
List<HuzhouSubProjectinfo> subProjects = subProjectinfoMapper.selectList( |
|
|
|
|
|
new LambdaQueryWrapper<HuzhouSubProjectinfo>() |
|
|
|
|
|
.eq(HuzhouSubProjectinfo::getProjectId, projectId)); |
|
|
|
|
|
|
|
|
|
|
|
// 2.初始化金额统计
|
|
|
|
|
|
double totalCentralMoney = 0.0; |
|
|
|
|
|
double totalProvincialMoney = 0.0; |
|
|
|
|
|
double totalContractCentralMoney = 0.0; |
|
|
|
|
|
double totalContractProvincialMoney = 0.0; |
|
|
|
|
|
|
|
|
|
|
|
// 3.对所有子项目进行统计
|
|
|
|
|
|
for (HuzhouSubProjectinfo sub : subProjects) { |
|
|
|
|
|
// 分子:实际支付金额
|
|
|
|
|
|
Map<String, Double> actualFunds = calculateActualFunds(sub.getId()); |
|
|
|
|
|
totalCentralMoney += Optional.ofNullable(actualFunds.get("centralMoney")).orElse(0.0); |
|
|
|
|
|
totalProvincialMoney += Optional.ofNullable(actualFunds.get("provincialMoney")).orElse(0.0); |
|
|
|
|
|
|
|
|
|
|
|
// 分母:合同金额(根据任务状态判断是否计入)
|
|
|
|
|
|
Boolean flag = planinfoService.taskNameIsFinished(sub.getProjectId()); |
|
|
|
|
|
HuzhouProjectinfoMoney contractMoney = huzhouProjectinfoMoneyService.getById(sub.getId()); |
|
|
|
|
|
|
|
|
|
|
|
if (contractMoney != null) { |
|
|
|
|
|
double central = flag ? Optional.ofNullable(contractMoney.getContractCentralMoney()).orElse(0.0) : 0.0; |
|
|
|
|
|
double provincial = flag ? Optional.ofNullable(contractMoney.getContractProvincialMoney()).orElse(0.0) : 0.0; |
|
|
|
|
|
|
|
|
|
|
|
totalContractCentralMoney += central; |
|
|
|
|
|
totalContractProvincialMoney += provincial; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 计算执行率
|
|
|
|
|
|
double ratePercentage = 0.0; |
|
|
|
|
|
if (totalContractCentralMoney + totalContractProvincialMoney > 0) { |
|
|
|
|
|
double rate = (totalCentralMoney + totalProvincialMoney) / |
|
|
|
|
|
(totalContractCentralMoney + totalContractProvincialMoney); |
|
|
|
|
|
ratePercentage = Math.round(rate * 100); // 四舍五入到整数百分比
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
projectInfo.setSuperiorFundPayRate(ratePercentage); |
|
|
|
|
|
log.info("存在子项目的:{}:上级资金执行率:{}", projectInfo.getProjectName(), ratePercentage); |
|
|
} |
|
|
} |
|
|
log.info("存在子项目的:{}:上级资金执行率:{}", projectInfo.getProjectName(), projectInfo.getSuperiorFundPayRate()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private ProjectContactShouYeOV processProjectShouYeFundInfo(HuzhouProjectinfo projectInfo){ |
|
|
|
|
|
String projectId = projectInfo.getId(); |
|
|
|
|
|
ProjectContactShouYeOV projectContactShouYeOV = new ProjectContactShouYeOV(); |
|
|
|
|
|
|
|
|
|
|
|
// 1.获取该主项目下的所有关联的子项目信息
|
|
|
|
|
|
List<HuzhouSubProjectinfo> subProjects = subProjectinfoMapper.selectList( |
|
|
|
|
|
new LambdaQueryWrapper<HuzhouSubProjectinfo>() |
|
|
|
|
|
.eq(HuzhouSubProjectinfo::getProjectId, projectId)); |
|
|
|
|
|
// 2.初始化金额统计
|
|
|
|
|
|
double totalMoney = 0.0; |
|
|
|
|
|
double totalCentralMoney = 0.0; |
|
|
|
|
|
double totalContractCentralMoney = 0.0; |
|
|
|
|
|
double totalContractTotalMoney = 0.0; |
|
|
|
|
|
|
|
|
|
|
|
// 3.对所有子项目进行统计
|
|
|
|
|
|
for (HuzhouSubProjectinfo sub : subProjects) { |
|
|
|
|
|
// 分子:实际支付金额
|
|
|
|
|
|
Map<String, Double> actualFunds = calculateActualFunds(sub.getId()); |
|
|
|
|
|
totalCentralMoney += Optional.ofNullable(actualFunds.get("centralMoney")).orElse(0.0); |
|
|
|
|
|
totalMoney += Optional.ofNullable(actualFunds.get("totalMoney")).orElse(0.0); |
|
|
|
|
|
|
|
|
|
|
|
// 分母:合同金额(根据任务状态判断是否计入)
|
|
|
|
|
|
Boolean flag = planinfoService.taskNameIsFinished(sub.getProjectId()); |
|
|
|
|
|
HuzhouProjectinfoMoney contractMoney = huzhouProjectinfoMoneyService.getById(sub.getId()); |
|
|
|
|
|
|
|
|
|
|
|
if (contractMoney != null) { |
|
|
|
|
|
double central = flag ? Optional.ofNullable(contractMoney.getContractCentralMoney()).orElse(0.0) : 0.0; |
|
|
|
|
|
double total = flag ? Optional.ofNullable(contractMoney.getContractTotalMoney()).orElse(0.0) : 0.0; |
|
|
|
|
|
|
|
|
|
|
|
totalContractCentralMoney += central; |
|
|
|
|
|
totalContractTotalMoney += total; |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
// 计算执行率
|
|
|
|
|
|
double totalRatePercentage = 0.0; |
|
|
|
|
|
if (totalContractTotalMoney> 0) { |
|
|
|
|
|
double rate = totalMoney /totalContractTotalMoney; |
|
|
|
|
|
totalRatePercentage = Math.round(rate * 100); // 四舍五入到整数百分比
|
|
|
} |
|
|
} |
|
|
|
|
|
//资金支付进度(total)
|
|
|
|
|
|
projectContactShouYeOV.setProjectFundPaymentProgress(Double.toString(totalRatePercentage)); |
|
|
|
|
|
|
|
|
|
|
|
double centralRatePercentage = 0.0; |
|
|
|
|
|
if (totalContractCentralMoney> 0) { |
|
|
|
|
|
double rate = totalCentralMoney /totalContractCentralMoney; |
|
|
|
|
|
centralRatePercentage = Math.round(rate * 100); // 四舍五入到整数百分比
|
|
|
|
|
|
} |
|
|
|
|
|
//中央资金支付情况
|
|
|
|
|
|
projectContactShouYeOV.setCentralFundPaymentSituation(Double.toString(centralRatePercentage)); |
|
|
|
|
|
return projectContactShouYeOV; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
private void fillSuperiorFundPayRate(HuzhouProjectinfo projectInfo) { |
|
|
private void fillSuperiorFundPayRate(HuzhouProjectinfo projectInfo) { |
|
|
String projectId = projectInfo.getId(); |
|
|
String projectId = projectInfo.getId(); |
|
@ -3267,6 +3322,7 @@ public class HuzhouProjectinfoServiceImpl extends ServiceImpl<HuzhouProjectinfoM |
|
|
private Map<String, Double> calculateActualFunds(String projectId) { |
|
|
private Map<String, Double> calculateActualFunds(String projectId) { |
|
|
Double centralMoney = 0.0; |
|
|
Double centralMoney = 0.0; |
|
|
Double provincialMoney = 0.0; |
|
|
Double provincialMoney = 0.0; |
|
|
|
|
|
Double totalMoney = 0.0; |
|
|
|
|
|
|
|
|
LambdaQueryWrapper<HuzhouContractinfo> qw = new LambdaQueryWrapper<>(); |
|
|
LambdaQueryWrapper<HuzhouContractinfo> qw = new LambdaQueryWrapper<>(); |
|
|
qw.eq(HuzhouContractinfo::getProjectId, projectId) |
|
|
qw.eq(HuzhouContractinfo::getProjectId, projectId) |
|
@ -3276,14 +3332,17 @@ public class HuzhouProjectinfoServiceImpl extends ServiceImpl<HuzhouProjectinfoM |
|
|
for (HuzhouContractinfo huzhouContractinfo : contractInfoList) { |
|
|
for (HuzhouContractinfo huzhouContractinfo : contractInfoList) { |
|
|
Double currentCentralMoney = huzhouContractinfo.getCentralMoney(); |
|
|
Double currentCentralMoney = huzhouContractinfo.getCentralMoney(); |
|
|
Double currentProvincialMoney = huzhouContractinfo.getProvincialMoney(); |
|
|
Double currentProvincialMoney = huzhouContractinfo.getProvincialMoney(); |
|
|
|
|
|
Double currentTotalMoney = huzhouContractinfo.getTotalMoney(); |
|
|
centralMoney += (currentCentralMoney != null) ? currentCentralMoney : 0.0; |
|
|
centralMoney += (currentCentralMoney != null) ? currentCentralMoney : 0.0; |
|
|
provincialMoney += (currentProvincialMoney != null) ? currentProvincialMoney : 0.0; |
|
|
provincialMoney += (currentProvincialMoney != null) ? currentProvincialMoney : 0.0; |
|
|
log.info("查询到阶段:{} 中央资金:{} 省级资金:{}", huzhouContractinfo.getTaskName(), currentCentralMoney, currentProvincialMoney); |
|
|
totalMoney += (currentTotalMoney != null) ? currentTotalMoney : 0.0; |
|
|
|
|
|
log.info("查询到阶段:{} 中央资金:{} 省级资金:{} 总资金:{}", huzhouContractinfo.getTaskName(), currentCentralMoney, currentProvincialMoney, currentTotalMoney); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
Map<String, Double> result = new HashMap<>(); |
|
|
Map<String, Double> result = new HashMap<>(); |
|
|
result.put("centralMoney", centralMoney); |
|
|
result.put("centralMoney", centralMoney); |
|
|
result.put("provincialMoney", provincialMoney); |
|
|
result.put("provincialMoney", provincialMoney); |
|
|
|
|
|
result.put("totalMoney", totalMoney); |
|
|
return result; |
|
|
return result; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|