diff --git a/huzhou/src/main/java/com/easy/admin/modules/huzhou/service/impl/HuzhouContractinfoServiceImpl.java b/huzhou/src/main/java/com/easy/admin/modules/huzhou/service/impl/HuzhouContractinfoServiceImpl.java index b5d5679..057c5c4 100644 --- a/huzhou/src/main/java/com/easy/admin/modules/huzhou/service/impl/HuzhouContractinfoServiceImpl.java +++ b/huzhou/src/main/java/com/easy/admin/modules/huzhou/service/impl/HuzhouContractinfoServiceImpl.java @@ -493,25 +493,54 @@ public class HuzhouContractinfoServiceImpl extends ServiceImpl planContractInfoList = contractinfoService.getPlanContractinfoByprojectId(contractInfo.getProjectId()); // 合同实际金额(contractList) <= 计划金额 (planContractInfoList) // [{"projectId":"1828610662885105665","payDate":"2025-02-13","taskName":"首付支付","totalMoney":600,"centralMoney":600,"provincialMoney":0,"cityMoney":0,"countyMoney":0,"selfMoney":0}] - if (planContractInfoList.size() > 0){ + + if (planContractInfoList.size() > 0) { // 存在计划金额则比较实际金额 - Map realContractMap = new HashMap<>(); + Map> realContractMap = new HashMap<>(); for (HuzhouContractinfo realContract : contractList) { - realContractMap.put(realContract.getTaskName(), realContract); + // 使用 computeIfAbsent 方法确保每个任务名称都有一个对应的列表 + realContractMap.computeIfAbsent(realContract.getTaskName(), k -> new ArrayList<>()) + .add(realContract); // 将当前合同添加到列表中 } + // 遍历计划合同信息列表,并比较实际金额和计划金额 for (HuzhouContractinfo planContractInfo : planContractInfoList) { - HuzhouContractinfo realContract = realContractMap.get(planContractInfo.getTaskName()); - if ( realContract != null){ - if ( realContract.getTotalMoney() >planContractInfo.getTotalMoney() ) { - throw new EasyException("合同实际金额大于计划金额!请重新填写合同信息 "); + String taskNameFromContract = planContractInfo.getTaskName(); + List realContracts = realContractMap.get(taskNameFromContract); + + if (realContracts != null && !realContracts.isEmpty()) { + // 对实际合同信息列表按 payDate 排序 + realContracts.sort(Comparator.comparing(HuzhouContractinfo::getPayDate)); + + // 假设计划合同信息列表也需要按某种顺序排序,这里假设也是按 payDate + List sortedPlanContracts = planContractInfoList.stream() + .filter(contract -> contract.getTaskName().equals(taskNameFromContract)) + .sorted(Comparator.comparing(HuzhouContractinfo::getPayDate)) + .collect(Collectors.toList()); + + // 同步遍历两个列表进行比较 + for (int i = 0; i < Math.min(realContracts.size(), sortedPlanContracts.size()); i++) { + HuzhouContractinfo realContract = realContracts.get(i); + HuzhouContractinfo planContract = sortedPlanContracts.get(i); + + Double RealTotalMoney = realContract.getTotalMoney(); + Double PlanTotalMoney = planContract.getTotalMoney(); + log.info("real:{}--->plan:{}", RealTotalMoney, PlanTotalMoney); + if (RealTotalMoney > PlanTotalMoney) { + throw new EasyException("合同实际金额大于计划金额!请重新填写合同信息 "); + } + } + + // 如果实际合同数量多于计划合同数量,也可以在此处处理这种情况 + if (realContracts.size() > sortedPlanContracts.size()) { + throw new EasyException("存在未匹配的实际合同,请检查输入数据!"); } + } else { + log.warn("未找到任务名称 '{}' 的实际合同信息", taskNameFromContract); } } - } } - return flag; } diff --git a/huzhou/src/main/java/com/easy/admin/modules/huzhou/service/impl/HuzhouProjectinfoServiceImpl.java b/huzhou/src/main/java/com/easy/admin/modules/huzhou/service/impl/HuzhouProjectinfoServiceImpl.java index 02957cc..1846af0 100644 --- a/huzhou/src/main/java/com/easy/admin/modules/huzhou/service/impl/HuzhouProjectinfoServiceImpl.java +++ b/huzhou/src/main/java/com/easy/admin/modules/huzhou/service/impl/HuzhouProjectinfoServiceImpl.java @@ -2815,63 +2815,57 @@ public class HuzhouProjectinfoServiceImpl extends ServiceImpl queryProjectTimeOutInfo() { - // 记录开始时间 - long startTime = System.currentTimeMillis(); - // 获取所有项目信息 - List projectInfoList = this.list(); - for (HuzhouProjectinfo projectInfo : projectInfoList) { - String projectId = projectInfo.getId(); - // 1.获取当且任务所处的节点名称 - String currentPointName = planinfoMapper.getCurrentPointName(projectId); - if (StringUtils.isNotBlank(currentPointName)) { - projectInfo.setCurrentPointName(currentPointName); - LambdaQueryWrapper qw = new LambdaQueryWrapper<>(); - qw.eq(HuzhouPlaninfo::getTaskName, currentPointName) - .eq(HuzhouPlaninfo::getProjectId, projectId); - HuzhouPlaninfo planInfo = planinfoMapper.selectOne(qw); - - Date actualStartTime = planInfo.getActualStartTime(); - Date scheduledEndTime = planInfo.getScheduledEndTime(); - if (actualStartTime != null) { - LocalDate realUpFileDate = actualStartTime.toInstant().atZone(java.time.ZoneId.of("Asia/Shanghai")).toLocalDate(); - LocalDate scheduledEndDate = scheduledEndTime.toInstant().atZone(java.time.ZoneId.of("Asia/Shanghai")).toLocalDate(); - // 计算相差天数 - long daysBetween = ChronoUnit.DAYS.between(scheduledEndDate, realUpFileDate); - if (daysBetween > 0) { - projectInfo.setProjectTimeOutSituation(String.valueOf(daysBetween)); - log.info("项目:{}->当且节点:{}->超时完成天数为:{}", projectInfo.getProjectName(),currentPointName, daysBetween); - log.info("计划结束时间为:{}->实际开始提交时间为:{}", scheduledEndDate,realUpFileDate); - }else { - projectInfo.setProjectTimeOutSituation("未超时"); + try { + // 记录开始时间 + long startTime = System.currentTimeMillis(); + // 获取所有项目信息 + List projectInfoList = this.list(); + for (HuzhouProjectinfo projectInfo : projectInfoList) { + String projectId = projectInfo.getId(); + // 1.获取当且任务所处的节点名称 + String currentPointName = planinfoMapper.getCurrentPointName(projectId); + if (StringUtils.isNotBlank(currentPointName)) { + projectInfo.setCurrentPointName(currentPointName); + LambdaQueryWrapper qw = new LambdaQueryWrapper<>(); + qw.eq(HuzhouPlaninfo::getTaskName, currentPointName) + .eq(HuzhouPlaninfo::getProjectId, projectId); + HuzhouPlaninfo planInfo = planinfoMapper.selectOne(qw); + + Date actualStartTime = planInfo.getActualStartTime(); + Date scheduledEndTime = planInfo.getScheduledEndTime(); + if (actualStartTime != null) { + LocalDate realUpFileDate = actualStartTime.toInstant().atZone(java.time.ZoneId.of("Asia/Shanghai")).toLocalDate(); + LocalDate scheduledEndDate = scheduledEndTime.toInstant().atZone(java.time.ZoneId.of("Asia/Shanghai")).toLocalDate(); + // 计算相差天数 + long daysBetween = ChronoUnit.DAYS.between(scheduledEndDate, realUpFileDate); + if (daysBetween > 0) { + projectInfo.setProjectTimeOutSituation(String.valueOf(daysBetween)); + log.info("项目:{}->当且节点:{}->超时完成天数为:{}", projectInfo.getProjectName(),currentPointName, daysBetween); + log.info("计划结束时间为:{}->实际开始提交时间为:{}", scheduledEndDate,realUpFileDate); + } else { + projectInfo.setProjectTimeOutSituation("未超时"); + } } + } else { + projectInfo.setCurrentPointName("未执行"); } - } else { - projectInfo.setCurrentPointName("未执行"); - } - // 2.设置整体资金支付情况:上级资金支付比例=(实际支付上级资金/计划支付上级资金)*100% - fillSuperiorFundPayRate(projectInfo); + // 其他设置操作... + } + // 按照责任工作地点排序 + projectInfoList = projectInfoList.stream() + .sorted(Comparator.comparing(HuzhouProjectinfo::getReformName)) + .collect(Collectors.toList()); - // 3.设置节点资金支付情况:资金支付超时时间=实际支付时间-计划支付时间 - ContractPayInfoDTO tmp = contractinfoService.queryContractPaySituation(projectInfo); - projectInfo.setTimeOutPaySituation(tmp.getTimeOutPaySituation()); - // 4.设置超时支付次数:超时支付次数=超时完成天数/7 - projectInfo.setTimeOutPayCount(tmp.getTimeOutPayCount()); - // 5.设置文件上传占用率 - projectInfo.setUploadFileRate(planinfofileService.getUploadFileRate(projectId)); - // 6设置变更次数 - projectInfo.setUpdateCount(fieldchangehistoryService.queryUpdateCount(projectId)); - log.info("项目:{}->超时支付次数为:{}", projectInfo.getProjectName(),projectInfo.getUpdateCount()); + long endTime = System.currentTimeMillis(); + long duration = endTime - startTime; + log.info("方法执行耗时:{} ms", duration); + return projectInfoList; + } catch (Exception e) { + // 记录错误日志 + log.error("查询时发生错误: ", e); + throw new EasyException("导出异常:"+e); } - // 按照责任工作地点排序 - projectInfoList = projectInfoList.stream() - .sorted(Comparator.comparing(HuzhouProjectinfo::getReformName)) - .collect(Collectors.toList()); - - long endTime = System.currentTimeMillis(); - long duration = endTime - startTime; - log.info("方法执行耗时:{} ms",duration); - return projectInfoList; } @Override