Browse Source

现用户所见的资金支付情况与中央资金支付需求(子项目)

master
gjh 1 week ago
parent
commit
2eddd5b423
  1. 3
      huzhou/src/main/java/com/easy/admin/modules/huzhou/dao/mapping/HuzhouContractinfoMapper.xml
  2. 8
      huzhou/src/main/java/com/easy/admin/modules/huzhou/service/impl/HuzhouPlaninfoServiceImpl.java
  3. 253
      huzhou/src/main/java/com/easy/admin/modules/huzhou/service/impl/HuzhouProjectinfoServiceImpl.java
  4. 12
      huzhou/src/main/java/com/easy/admin/modules/huzhou/vo/ProjectContactShouYeOV.java

3
huzhou/src/main/java/com/easy/admin/modules/huzhou/dao/mapping/HuzhouContractinfoMapper.xml

@ -276,7 +276,8 @@
where project_id in where project_id in
<foreach item="projectId" index="index" collection="projectIds" open="(" separator="," close=")"> <foreach item="projectId" index="index" collection="projectIds" open="(" separator="," close=")">
#{projectId} #{projectId}
</foreach> and flag = '实际' </foreach>
and flag = '实际'
</select> </select>

8
huzhou/src/main/java/com/easy/admin/modules/huzhou/service/impl/HuzhouPlaninfoServiceImpl.java

@ -1340,6 +1340,13 @@ public class HuzhouPlaninfoServiceImpl extends ServiceImpl<HuzhouPlaninfoMapper,
@Override @Override
public List<Select> getTaskNameTypeDict(String projectid) { public List<Select> getTaskNameTypeDict(String projectid) {
List<HuzhouPlaninfo> listByProjectId = getListByProjectId(projectid); List<HuzhouPlaninfo> listByProjectId = getListByProjectId(projectid);
List<String> names = Arrays.asList("项目立项阶段", "项目采购阶段", "项目建设阶段","绩效评估阶段","项目验收阶段","合同签订","招标结果确认","招标文件编制",
"可研报告初稿编制","可研技术审查报告确认","可研报告送审稿编制","造价评估报告确认","联合技术审查","集中核验","立项审批");
listByProjectId =listByProjectId
.stream()
.filter(planinfo -> !names.contains(planinfo.getTaskName()))
.collect(Collectors.toList());
List<Select> selectList = new ArrayList<>(); List<Select> selectList = new ArrayList<>();
for (HuzhouPlaninfo planinfo:listByProjectId for (HuzhouPlaninfo planinfo:listByProjectId
) { ) {
@ -1348,6 +1355,7 @@ public class HuzhouPlaninfoServiceImpl extends ServiceImpl<HuzhouPlaninfoMapper,
select.setValue(planinfo.getTaskName()); select.setValue(planinfo.getTaskName());
selectList.add(select); selectList.add(select);
} }
return selectList; return selectList;
} }

253
huzhou/src/main/java/com/easy/admin/modules/huzhou/service/impl/HuzhouProjectinfoServiceImpl.java

@ -2544,45 +2544,52 @@ 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){
BigDecimal totalAcount = totalMap.get("totalAcount");
BigDecimal totalcentralAcount = totalMap.get("centralAcount");
// BigDecimal totalPayment = paymentsMap.get("totalPayment");
// BigDecimal centralPayment = paymentsMap.get("centralPayment");
Double contractTotalMoney = projectinfoMoney.getContractTotalMoney();
Double contractCentralMoney = projectinfoMoney.getContractCentralMoney();
BigDecimal totalPayment = (contractTotalMoney != null) ? new BigDecimal(contractTotalMoney.toString()) : BigDecimal.ZERO;
BigDecimal centralPayment = (contractCentralMoney != null) ? new BigDecimal(contractCentralMoney.toString()) : BigDecimal.ZERO;
// 默认值
String projectFundPaymentProgress = "0";
String centralFundPaymentSituation = "0";
// 判断除数是否为 0,再进行除法
if (totalAcount != null && totalAcount.compareTo(BigDecimal.ZERO) != 0) {
projectFundPaymentProgress = totalAcount
.divide(totalPayment, 4, BigDecimal.ROUND_HALF_UP)
.multiply(new BigDecimal("100")) // ✅ 乘以 100
.setScale(0, BigDecimal.ROUND_HALF_UP) // ✅ 四舍五入取整
.toString();
}
if (totalcentralAcount != null && totalcentralAcount.compareTo(BigDecimal.ZERO) != 0) { if (totalMap!=null&&projectinfoMoney!=null){
centralFundPaymentSituation = totalcentralAcount BigDecimal totalAcount = totalMap.get("totalAcount");
.divide(centralPayment, 4, BigDecimal.ROUND_HALF_UP) BigDecimal totalCentralAcount = totalMap.get("centralAcount");
.multiply(new BigDecimal("100")) // ✅ 乘以 100
.setScale(0, BigDecimal.ROUND_HALF_UP) // ✅ 四舍五入取整 Double contractTotalMoney = projectinfoMoney.getContractTotalMoney();
.toString(); Double contractCentralMoney = projectinfoMoney.getContractCentralMoney();
} BigDecimal totalPayment = (contractTotalMoney != null) ? new BigDecimal(contractTotalMoney.toString()) : BigDecimal.ZERO;
BigDecimal centralPayment = (contractCentralMoney != null) ? new BigDecimal(contractCentralMoney.toString()) : BigDecimal.ZERO;
// 默认值
String projectFundPaymentProgress = "0";
String centralFundPaymentSituation = "0";
// 判断除数是否为 0,再进行除法
if (totalAcount != null && totalAcount.compareTo(BigDecimal.ZERO) != 0) {
projectFundPaymentProgress = totalAcount
.divide(totalPayment, 4, BigDecimal.ROUND_HALF_UP)
.multiply(new BigDecimal("100")) // ✅ 乘以 100
.setScale(0, BigDecimal.ROUND_HALF_UP) // ✅ 四舍五入取整
.toString();
}
projectContactShouYeOV.setProjectFundPaymentProgress(projectFundPaymentProgress); if (totalCentralAcount != null && totalCentralAcount.compareTo(BigDecimal.ZERO) != 0) {
projectContactShouYeOV.setCentralFundPaymentSituation(centralFundPaymentSituation); centralFundPaymentSituation = totalCentralAcount
projectContactShouYeOVS.add(projectContactShouYeOV); .divide(centralPayment, 4, BigDecimal.ROUND_HALF_UP)
}else{ .multiply(new BigDecimal("100")) // ✅ 乘以 100
projectContactShouYeOV.setProjectFundPaymentProgress("0"); .setScale(0, BigDecimal.ROUND_HALF_UP) // ✅ 四舍五入取整
projectContactShouYeOV.setCentralFundPaymentSituation("0"); .toString();
}
projectContactShouYeOV.setProjectFundPaymentProgress(projectFundPaymentProgress);
projectContactShouYeOV.setCentralFundPaymentSituation(centralFundPaymentSituation);
}else {
projectContactShouYeOV.setProjectFundPaymentProgress("0");
projectContactShouYeOV.setCentralFundPaymentSituation("0");
}
// 存在子项目的情况
if (this.queryHasSubProject(huzhouProjectinfoOV.getId())){
ProjectContactShouYeOV dto = processProjectShouYeFundInfo(huzhouProjectinfoOV);
//资金支付进度(total)
projectContactShouYeOV.setProjectFundPaymentProgress(dto.getProjectFundPaymentProgress());
//中央资金支付情况
projectContactShouYeOV.setCentralFundPaymentSituation(dto.getCentralFundPaymentSituation());
}
projectContactShouYeOVS.add(projectContactShouYeOV); 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) {
// 分子
Double totalCentralMoney =0.0;
Double totalProvincialMoney =0.0;
// 分母
Double totalContractProvincialMoney =0.0;
Double totalContractCentralMoney =0.0;
// 基本信息
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);
} // 打印待处理项目名称
} waitFillList.forEach(p -> log.info("有子项目的项目名称:{}", p.getProjectName()));
log.info("存在子项目的:{}:上级资金执行率:{}", projectInfo.getProjectName(), projectInfo.getSuperiorFundPayRate());
// 处理每个主项目
waitFillList.forEach(this::processProjectFundingRate);
}
private void processProjectFundingRate(HuzhouProjectinfo projectInfo) {
String projectId = projectInfo.getId();
// 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);
} }
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;
} }

12
huzhou/src/main/java/com/easy/admin/modules/huzhou/vo/ProjectContactShouYeOV.java

@ -7,15 +7,19 @@ import java.util.List;
@Data @Data
public class ProjectContactShouYeOV { public class ProjectContactShouYeOV {
//项目名称 //项目名称
//项目总进度
//资金支付进度
//中央资金支付情况
private String projectName; private String projectName;
//项目总进度
private String projectTotalProgress; private String projectTotalProgress;
//资金支付进度
private String projectFundPaymentProgress; private String projectFundPaymentProgress;
//中央资金支付情况
private String centralFundPaymentSituation; private String centralFundPaymentSituation;
//项目进度详情 //项目进度详情
private List<HuzhouPlaninfoOV> projectProgressDetail; private List<HuzhouPlaninfoOV> projectProgressDetail;
} }

Loading…
Cancel
Save