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. 195
      huzhou/src/main/java/com/easy/admin/modules/huzhou/service/impl/HuzhouProjectinfoServiceImpl.java
  4. 10
      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
<foreach item="projectId" index="index" collection="projectIds" open="(" separator="," close=")">
#{projectId}
</foreach> and flag = '实际'
</foreach>
and flag = '实际'
</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
public List<Select> getTaskNameTypeDict(String 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<>();
for (HuzhouPlaninfo planinfo:listByProjectId
) {
@ -1348,6 +1355,7 @@ public class HuzhouPlaninfoServiceImpl extends ServiceImpl<HuzhouPlaninfoMapper,
select.setValue(planinfo.getTaskName());
selectList.add(select);
}
return selectList;
}

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

@ -2544,12 +2544,11 @@ public class HuzhouProjectinfoServiceImpl extends ServiceImpl<HuzhouProjectinfoM
Map<String, BigDecimal> totalMap = contractinfoMapper.getTotalByProjectIds(Arrays.asList(huzhouProjectinfoOV.getId()));
//获取:huzhou_projectinfo_money
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 totalcentralAcount = totalMap.get("centralAcount");
// BigDecimal totalPayment = paymentsMap.get("totalPayment");
// BigDecimal centralPayment = paymentsMap.get("centralPayment");
BigDecimal totalCentralAcount = totalMap.get("centralAcount");
Double contractTotalMoney = projectinfoMoney.getContractTotalMoney();
Double contractCentralMoney = projectinfoMoney.getContractCentralMoney();
BigDecimal totalPayment = (contractTotalMoney != null) ? new BigDecimal(contractTotalMoney.toString()) : BigDecimal.ZERO;
@ -2567,8 +2566,8 @@ public class HuzhouProjectinfoServiceImpl extends ServiceImpl<HuzhouProjectinfoM
.toString();
}
if (totalcentralAcount != null && totalcentralAcount.compareTo(BigDecimal.ZERO) != 0) {
centralFundPaymentSituation = totalcentralAcount
if (totalCentralAcount != null && totalCentralAcount.compareTo(BigDecimal.ZERO) != 0) {
centralFundPaymentSituation = totalCentralAcount
.divide(centralPayment, 4, BigDecimal.ROUND_HALF_UP)
.multiply(new BigDecimal("100")) // ✅ 乘以 100
.setScale(0, BigDecimal.ROUND_HALF_UP) // ✅ 四舍五入取整
@ -2577,12 +2576,20 @@ public class HuzhouProjectinfoServiceImpl extends ServiceImpl<HuzhouProjectinfoM
projectContactShouYeOV.setProjectFundPaymentProgress(projectFundPaymentProgress);
projectContactShouYeOV.setCentralFundPaymentSituation(centralFundPaymentSituation);
projectContactShouYeOVS.add(projectContactShouYeOV);
}else{
}else {
projectContactShouYeOV.setProjectFundPaymentProgress("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
public void fillSuperiorFundPayRateByChildren(List<HuzhouProjectinfo> projectInfoList) {
List<HuzhouSubProjectinfo> records = subProjectinfoService.list();
// 获取子项目对应的 主项目id集合
List<String> hasSubProjectIds = records.stream()
List<HuzhouSubProjectinfo> subProjects = subProjectinfoService.list();
// 提取所有有子项目的主项目ID
List<String> hasSubProjectIds = subProjects.stream()
.map(HuzhouSubProjectinfo::getProjectId)
.collect(Collectors.toList());
// 对所有存在子项目的主项目进行填充上级资金执行率
List<HuzhouProjectinfo> waitFillProjectInfoList = new ArrayList<>();
waitFillProjectInfoList= projectInfoList.stream()
.filter(project -> hasSubProjectIds.contains(project.getId()))
// 过滤出需要填充资金执行率的主项目
List<HuzhouProjectinfo> waitFillList = projectInfoList.stream()
.filter(p -> hasSubProjectIds.contains(p.getId()))
.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;
// 基本信息
// 打印待处理项目名称
waitFillList.forEach(p -> log.info("有子项目的项目名称:{}", p.getProjectName()));
// 处理每个主项目
waitFillList.forEach(this::processProjectFundingRate);
}
private void processProjectFundingRate(HuzhouProjectinfo projectInfo) {
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) {
String projectId = projectInfo.getId();
@ -3267,6 +3322,7 @@ public class HuzhouProjectinfoServiceImpl extends ServiceImpl<HuzhouProjectinfoM
private Map<String, Double> calculateActualFunds(String projectId) {
Double centralMoney = 0.0;
Double provincialMoney = 0.0;
Double totalMoney = 0.0;
LambdaQueryWrapper<HuzhouContractinfo> qw = new LambdaQueryWrapper<>();
qw.eq(HuzhouContractinfo::getProjectId, projectId)
@ -3276,14 +3332,17 @@ public class HuzhouProjectinfoServiceImpl extends ServiceImpl<HuzhouProjectinfoM
for (HuzhouContractinfo huzhouContractinfo : contractInfoList) {
Double currentCentralMoney = huzhouContractinfo.getCentralMoney();
Double currentProvincialMoney = huzhouContractinfo.getProvincialMoney();
Double currentTotalMoney = huzhouContractinfo.getTotalMoney();
centralMoney += (currentCentralMoney != null) ? currentCentralMoney : 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<>();
result.put("centralMoney", centralMoney);
result.put("provincialMoney", provincialMoney);
result.put("totalMoney", totalMoney);
return result;
}

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

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

Loading…
Cancel
Save