diff --git a/huzhou/src/main/java/com/easy/admin/modules/huzhou/controller/HuzhouContractinfoController.java b/huzhou/src/main/java/com/easy/admin/modules/huzhou/controller/HuzhouContractinfoController.java index bcbe8c5..e1224f6 100644 --- a/huzhou/src/main/java/com/easy/admin/modules/huzhou/controller/HuzhouContractinfoController.java +++ b/huzhou/src/main/java/com/easy/admin/modules/huzhou/controller/HuzhouContractinfoController.java @@ -92,7 +92,7 @@ public class HuzhouContractinfoController { // 获取合同信息(计划) @GetMapping("/getContractinfoByProjectId") public Result getContractinfoByProjectId(String projectid){ - List contractinfoByprojectId = contractinfoService.getContractinfoByprojectId(projectid); + List contractinfoByprojectId = contractinfoService.getPlanContractinfoByprojectId(projectid); return Result.ok(contractinfoByprojectId); } diff --git a/huzhou/src/main/java/com/easy/admin/modules/huzhou/controller/HuzhouPlanController.java b/huzhou/src/main/java/com/easy/admin/modules/huzhou/controller/HuzhouPlanController.java index e96f190..a6c03d0 100644 --- a/huzhou/src/main/java/com/easy/admin/modules/huzhou/controller/HuzhouPlanController.java +++ b/huzhou/src/main/java/com/easy/admin/modules/huzhou/controller/HuzhouPlanController.java @@ -130,6 +130,10 @@ public class HuzhouPlanController { return Result.ok(planInfoMainTimelineList); } + + + + /** * 根据计划id获取当前计划阶段的数据 * @param planinfoid 计划id diff --git a/huzhou/src/main/java/com/easy/admin/modules/huzhou/controller/HuzhouProjectController.java b/huzhou/src/main/java/com/easy/admin/modules/huzhou/controller/HuzhouProjectController.java index 4e5c171..9952d5b 100644 --- a/huzhou/src/main/java/com/easy/admin/modules/huzhou/controller/HuzhouProjectController.java +++ b/huzhou/src/main/java/com/easy/admin/modules/huzhou/controller/HuzhouProjectController.java @@ -135,6 +135,13 @@ public class HuzhouProjectController { } + @GetMapping("/queryProjectTimeOutInfo") + public Result queryProjectTimeOutInfo(){ + //获取项目入库数据 + List rs = projectinfoService.queryProjectTimeOutInfo(); + return Result.OK(rs); + } + /** * 根据项目id获取项目信息 diff --git a/huzhou/src/main/java/com/easy/admin/modules/huzhou/controller/ProjectManagerController.java b/huzhou/src/main/java/com/easy/admin/modules/huzhou/controller/ProjectManagerController.java index 183c268..a2b04e7 100644 --- a/huzhou/src/main/java/com/easy/admin/modules/huzhou/controller/ProjectManagerController.java +++ b/huzhou/src/main/java/com/easy/admin/modules/huzhou/controller/ProjectManagerController.java @@ -6,10 +6,9 @@ import com.alibaba.excel.write.metadata.style.WriteCellStyle; import com.alibaba.excel.write.style.HorizontalCellStyleStrategy; import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; import com.easy.admin.common.api.vo.Result; -import com.easy.admin.modules.huzhou.dto.HuzhouProjectinfoExportDTO; +import com.easy.admin.modules.huzhou.dto.ProjectTimeOutInfoExportDTO; +import com.easy.admin.modules.huzhou.dto.ProjectinfoExportDTO; import com.easy.admin.modules.huzhou.entity.HuzhouProjectinfo; -import com.easy.admin.modules.huzhou.entity.HuzhouProjectinfoMoney; -import com.easy.admin.modules.huzhou.entity.HuzhouSubProjectinfo; import com.easy.admin.modules.huzhou.entity.ProjectManager; import com.easy.admin.modules.huzhou.handler.CustomMergeStrategy; import com.easy.admin.modules.huzhou.listener.ProjectManagerListener; @@ -29,7 +28,6 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Arrays; -import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; @@ -100,13 +98,14 @@ public class ProjectManagerController { WriteCellStyle bodyStyle = new WriteCellStyle(); bodyStyle.setHorizontalAlignment(HorizontalAlignment.CENTER); ; bodyStyle.setVerticalAlignment(VerticalAlignment.CENTER); + // 封装数据 List projectInfoList = projectinfoService.queryProjectWithFundPay(); - List dtoList = projectInfoList.stream() - .map(projectInfo -> new HuzhouProjectinfoExportDTO(projectInfo.getProjectName(), + List dtoList = projectInfoList.stream() + .map(projectInfo -> new ProjectinfoExportDTO(projectInfo.getProjectName(), projectInfo.getSuperiorFundPayRate(), projectInfo.getCurrentStage(), projectInfo.getTotalPercent(), - projectInfo.getDutyWorkplace(), + projectInfo.getSuperLeader(), projectInfo.getReformName())) .collect(Collectors.toList()); @@ -116,22 +115,66 @@ public class ProjectManagerController { // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setCharacterEncoding("utf-8"); - String flag = "上级资金执行率汇总"; + String preFileName = "项目看板"; // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系 LocalDateTime currentDateTime = LocalDateTime.now(); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); String formattedDateTime = currentDateTime.format(formatter); System.out.println("当前日期: " + formattedDateTime); - String fileName = URLEncoder.encode( flag+formattedDateTime, "UTF-8") + String fileName = URLEncoder.encode( preFileName+formattedDateTime, "UTF-8") .replaceAll("\\+", "%20"); response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx"); - EasyExcel.write(response.getOutputStream(), HuzhouProjectinfoExportDTO.class) + EasyExcel.write(response.getOutputStream(), ProjectinfoExportDTO.class) .registerWriteHandler(new HorizontalCellStyleStrategy(headStyle, bodyStyle)) .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) - .registerWriteHandler(new CustomMergeStrategy(Arrays.asList("dutyWorkplace","reformName"))) - .sheet("上级资金执行率汇总") + .registerWriteHandler(new CustomMergeStrategy(Arrays.asList("superLeader","reformName"))) + .sheet("项目看板") .doWrite(dtoList); } + + + @GetMapping("/timeOutInfoExport") + public void timeOutInfoExport(HttpServletResponse response) throws IOException { + // 设置表头样式 + WriteCellStyle headStyle = new WriteCellStyle(); + headStyle.setHorizontalAlignment(HorizontalAlignment.CENTER); + // 设置表格内容 + WriteCellStyle bodyStyle = new WriteCellStyle(); + bodyStyle.setHorizontalAlignment(HorizontalAlignment.CENTER); ; + bodyStyle.setVerticalAlignment(VerticalAlignment.CENTER); + // 封装数据 + List projectInfoList = projectinfoService.queryProjectTimeOutInfo(); + List dtoList = projectInfoList.stream() + .map(projectInfo -> new ProjectTimeOutInfoExportDTO(projectInfo.getProjectName(), + projectInfo.getDutyWorkplace(), + projectInfo.getReformName(), + projectInfo.getSuperLeader(), + projectInfo.getCurrentPointName(), + projectInfo.getSuperiorFundPayRate(), + projectInfo.getTimeOutPayCount(), + projectInfo.getTimeOutPaySituation())) + .collect(Collectors.toList()); + + // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("utf-8"); + String preFileName = "超时情况"; + // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系 + LocalDateTime currentDateTime = LocalDateTime.now(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + String formattedDateTime = currentDateTime.format(formatter); + System.out.println("当前日期: " + formattedDateTime); + String fileName = URLEncoder.encode( preFileName+formattedDateTime, "UTF-8") + .replaceAll("\\+", "%20"); + response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx"); + + EasyExcel.write(response.getOutputStream(), ProjectTimeOutInfoExportDTO.class) + .registerWriteHandler(new HorizontalCellStyleStrategy(headStyle, bodyStyle)) + .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) + //.registerWriteHandler(new CustomMergeStrategy(Arrays.asList("superLeader","reformName"))) + .sheet("超时情况") + .doWrite(dtoList); + } } diff --git a/huzhou/src/main/java/com/easy/admin/modules/huzhou/converter/SuperLeaderConverter.java b/huzhou/src/main/java/com/easy/admin/modules/huzhou/converter/SuperLeaderConverter.java new file mode 100644 index 0000000..589dbff --- /dev/null +++ b/huzhou/src/main/java/com/easy/admin/modules/huzhou/converter/SuperLeaderConverter.java @@ -0,0 +1,49 @@ +package com.easy.admin.modules.huzhou.converter; + +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.metadata.GlobalConfiguration; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.metadata.property.ExcelContentProperty; + +/** + * 所属改革任务,转换器。 + * + * @author gjh + */ +public class SuperLeaderConverter implements Converter { + /** + * Convert Java objects to excel objects + * + * @param value Java Data.NotNull. + * @param contentProperty Content property.Nullable. + * @param globalConfiguration Global configuration.NotNull. + * @return Data to put into a Excel + */ + + @Override + public WriteCellData convertToExcelData(String value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { + switch (value) { + case "1": + return new WriteCellData<>("医政处"); + case "2": + return new WriteCellData<>("妇幼处"); + case "3": + return new WriteCellData<>("科教处"); + case "4": + return new WriteCellData<>("体改处"); + case "5": + return new WriteCellData<>("规信处"); + case "6": + return new WriteCellData<>("中医处"); + case "7": + return new WriteCellData<>("财审处"); + case "8": + return new WriteCellData<>("机关党委"); + case "9": + return new WriteCellData<>("组织人事处"); + case "10": + default: + return new WriteCellData<>("未知"); + } + } +} diff --git a/huzhou/src/main/java/com/easy/admin/modules/huzhou/dao/HuzhouPlaninfoMapper.java b/huzhou/src/main/java/com/easy/admin/modules/huzhou/dao/HuzhouPlaninfoMapper.java index 47a1b1d..629cead 100644 --- a/huzhou/src/main/java/com/easy/admin/modules/huzhou/dao/HuzhouPlaninfoMapper.java +++ b/huzhou/src/main/java/com/easy/admin/modules/huzhou/dao/HuzhouPlaninfoMapper.java @@ -42,4 +42,15 @@ public interface HuzhouPlaninfoMapper extends BaseMapper { "FROM huzhou_planinfo " + "WHERE project_id = #{projectId} AND isfinish IN ('1', '2')") Integer getMaxTaskLevelPart(String projectId); + + @Select("SELECT task_name " + + "FROM (" + + " SELECT task_name, " + + " ROW_NUMBER() OVER (ORDER BY CAST(task_level AS DECIMAL(10, 2)) DESC) AS rn " + + " FROM huzhou_planinfo " + + " WHERE project_id = #{projectId} " + + " AND isfinish IN ('1', '2')" + + ") t " + + "WHERE rn = 1") + String getCurrentPointName(@Param("projectId") String projectId); } diff --git a/huzhou/src/main/java/com/easy/admin/modules/huzhou/dto/ContractPayInfoDTO.java b/huzhou/src/main/java/com/easy/admin/modules/huzhou/dto/ContractPayInfoDTO.java new file mode 100644 index 0000000..a0d3575 --- /dev/null +++ b/huzhou/src/main/java/com/easy/admin/modules/huzhou/dto/ContractPayInfoDTO.java @@ -0,0 +1,18 @@ +package com.easy.admin.modules.huzhou.dto; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +@Data +public class ContractPayInfoDTO { + + + /** + * 超时支付次数 (超时7天以上为超时1次) + */ + private int timeOutPayCount; + /** + * 超时支付情况 + */ + private String timeOutPaySituation; +} diff --git a/huzhou/src/main/java/com/easy/admin/modules/huzhou/dto/ProjectTimeOutInfoExportDTO.java b/huzhou/src/main/java/com/easy/admin/modules/huzhou/dto/ProjectTimeOutInfoExportDTO.java new file mode 100644 index 0000000..1041626 --- /dev/null +++ b/huzhou/src/main/java/com/easy/admin/modules/huzhou/dto/ProjectTimeOutInfoExportDTO.java @@ -0,0 +1,58 @@ +package com.easy.admin.modules.huzhou.dto; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.HeadStyle; +import com.easy.admin.modules.huzhou.converter.ReformNameConverter; +import com.easy.admin.modules.huzhou.converter.SuperLeaderConverter; +import lombok.Data; + +@HeadStyle(fillForegroundColor = 44) +@Data +public class ProjectTimeOutInfoExportDTO { + @ExcelProperty("项目名称") + private String projectName; + + @ExcelProperty("建设单位") + private String dutyWorkplace; + + @ExcelProperty(value = {"任务改革任务"}, converter = ReformNameConverter.class) + private String reformName; + + @ExcelProperty(value = {"上级指导处室"}, converter = SuperLeaderConverter.class) + private String superLeader; + + @ExcelProperty("当且所处节点") + private String currentPointName; + + //@NumberFormat("0.00%") + @ExcelProperty("整体资金支付情况(%)") + private Double superiorFundPayRate; + + //超时7天以上为超时1次 + @ExcelProperty("超时支付次数") + private int timeOutPayCount; + + @ExcelProperty("超时支付情况") + private String timeOutPaySituation; + + public ProjectTimeOutInfoExportDTO(String projectName, + String dutyWorkplace, + String reformName, + String superLeader, + String currentPointName, + Double superiorFundPayRate, + int timeOutPayCount, + String timeOutPaySituation + ) { + this.projectName = projectName; + this.superiorFundPayRate = superiorFundPayRate; + this.currentPointName = currentPointName; + this.timeOutPayCount = timeOutPayCount; + this.dutyWorkplace = dutyWorkplace; + this.reformName = reformName; + this.superLeader = superLeader; + this.timeOutPaySituation = timeOutPaySituation; + } + + +} \ No newline at end of file diff --git a/huzhou/src/main/java/com/easy/admin/modules/huzhou/dto/HuzhouProjectinfoExportDTO.java b/huzhou/src/main/java/com/easy/admin/modules/huzhou/dto/ProjectinfoExportDTO.java similarity index 62% rename from huzhou/src/main/java/com/easy/admin/modules/huzhou/dto/HuzhouProjectinfoExportDTO.java rename to huzhou/src/main/java/com/easy/admin/modules/huzhou/dto/ProjectinfoExportDTO.java index 1bea5d6..39837b3 100644 --- a/huzhou/src/main/java/com/easy/admin/modules/huzhou/dto/HuzhouProjectinfoExportDTO.java +++ b/huzhou/src/main/java/com/easy/admin/modules/huzhou/dto/ProjectinfoExportDTO.java @@ -6,16 +6,19 @@ import com.alibaba.excel.annotation.format.NumberFormat; import com.alibaba.excel.annotation.write.style.HeadStyle; import com.baomidou.mybatisplus.annotation.TableField; import com.easy.admin.modules.huzhou.converter.ReformNameConverter; +import com.easy.admin.modules.huzhou.converter.SuperLeaderConverter; import lombok.Data; @HeadStyle(fillForegroundColor = 44) @Data -public class HuzhouProjectinfoExportDTO { +public class ProjectinfoExportDTO { @ExcelProperty(value = {"任务名称"}, converter = ReformNameConverter.class) private String reformName; - - @ExcelProperty("指导处室") - private String dutyWorkplace; + @ExcelProperty(value = {"指导处室"}, converter = SuperLeaderConverter.class) + private String superLeader; +// +// @ExcelProperty("责任单位") +// private String dutyWorkplace; @ExcelProperty("项目名称") private String projectName; @@ -30,17 +33,17 @@ public class HuzhouProjectinfoExportDTO { @ExcelProperty("项目整体进度(%)") private String totalPercent; - public HuzhouProjectinfoExportDTO(String projectName, - Double superiorFundPayRate, - String currentStage, - String totalPercent, - String dutyWorkplace, - String reformName) { + public ProjectinfoExportDTO(String projectName, + Double superiorFundPayRate, + String currentStage, + String totalPercent, + String superLeader, + String reformName) { this.projectName = projectName; this.superiorFundPayRate = superiorFundPayRate; this.currentStage = currentStage; this.totalPercent = totalPercent; - this.dutyWorkplace = dutyWorkplace; + this.superLeader = superLeader; this.reformName = reformName; } } \ No newline at end of file diff --git a/huzhou/src/main/java/com/easy/admin/modules/huzhou/entity/HuzhouProjectinfo.java b/huzhou/src/main/java/com/easy/admin/modules/huzhou/entity/HuzhouProjectinfo.java index 9370145..3f816db 100644 --- a/huzhou/src/main/java/com/easy/admin/modules/huzhou/entity/HuzhouProjectinfo.java +++ b/huzhou/src/main/java/com/easy/admin/modules/huzhou/entity/HuzhouProjectinfo.java @@ -2,7 +2,7 @@ package com.easy.admin.modules.huzhou.entity; import com.alibaba.excel.annotation.ExcelProperty; import com.baomidou.mybatisplus.annotation.TableField; -import com.easy.admin.modules.huzhou.dto.HuzhouProjectinfoExportDTO; +import com.easy.admin.modules.huzhou.dto.ProjectinfoExportDTO; import lombok.Data; /** @@ -197,15 +197,31 @@ public class HuzhouProjectinfo extends BaseEntity { */ private String updatePlanFlag; + /** + * 项目当且所处节点 + */ + @TableField(exist = false) + private String currentPointName; + + /** + * 超时支付次数 (超时7天以上为超时1次) + */ + @TableField(exist = false) + private int timeOutPayCount; - public HuzhouProjectinfoExportDTO toDTO() { - return new HuzhouProjectinfoExportDTO( - this.projectName, - this.superiorFundPayRate, - this.currentStage, - this.totalPercent, - this.dutyWorkplace, - this.reformName); - } + /** + * 项目超时情况(天数) + */ + @TableField(exist = false) + private String timeOutPaySituation; +// public ProjectinfoExportDTO toDTO() { +// return new ProjectinfoExportDTO( +// this.projectName, +// this.superiorFundPayRate, +// this.currentStage, +// this.totalPercent, +// this.superLeader, +// this.reformName); +// } } diff --git a/huzhou/src/main/java/com/easy/admin/modules/huzhou/service/IHuzhouContractinfoService.java b/huzhou/src/main/java/com/easy/admin/modules/huzhou/service/IHuzhouContractinfoService.java index 1e0e890..90c1022 100644 --- a/huzhou/src/main/java/com/easy/admin/modules/huzhou/service/IHuzhouContractinfoService.java +++ b/huzhou/src/main/java/com/easy/admin/modules/huzhou/service/IHuzhouContractinfoService.java @@ -2,6 +2,7 @@ package com.easy.admin.modules.huzhou.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; +import com.easy.admin.modules.huzhou.dto.ContractPayInfoDTO; import com.easy.admin.modules.huzhou.entity.HuzhouContractinfo; import com.easy.admin.modules.huzhou.entity.HuzhouProjectinfo; import com.easy.admin.modules.huzhou.entity.HuzhouRegulationlab; @@ -30,7 +31,7 @@ public interface IHuzhouContractinfoService extends IService Boolean deleteContractinfo(HuzhouContractinfo contractinfo); - List getContractinfoByprojectId(String projectid); + List getPlanContractinfoByprojectId(String projectid); List getContractinfoByprojectIdAndTaskName(String projectid, String taskName); @@ -53,4 +54,6 @@ public interface IHuzhouContractinfoService extends IService * @throws JsonProcessingException */ Boolean checkContractAmount(List contractList, String contractMoneyFieldsValue, String taskName) throws JsonProcessingException; + + ContractPayInfoDTO queryContractPaySituation(HuzhouProjectinfo projectInfo); } diff --git a/huzhou/src/main/java/com/easy/admin/modules/huzhou/service/IHuzhouPlaninfoService.java b/huzhou/src/main/java/com/easy/admin/modules/huzhou/service/IHuzhouPlaninfoService.java index 767b748..6280c7f 100644 --- a/huzhou/src/main/java/com/easy/admin/modules/huzhou/service/IHuzhouPlaninfoService.java +++ b/huzhou/src/main/java/com/easy/admin/modules/huzhou/service/IHuzhouPlaninfoService.java @@ -30,6 +30,9 @@ import java.util.Map; public interface IHuzhouPlaninfoService extends IService { HashMap getPlanInfoListFromFile(MultipartFile multipartFile,String projectid) throws Exception; ArrayList getPlanInfoMainTimelineList(String projectid); + + ArrayList getPlanInfoMainTimelineListWithExecutor(String projectid); + Page getPlanInfoMainTimelineListOK(String projectid,Integer pageNo, Integer pageSize); /** * 保存或修改任务计划期间上传的文化 diff --git a/huzhou/src/main/java/com/easy/admin/modules/huzhou/service/IHuzhouProjectinfoService.java b/huzhou/src/main/java/com/easy/admin/modules/huzhou/service/IHuzhouProjectinfoService.java index 3b75e23..e99da86 100644 --- a/huzhou/src/main/java/com/easy/admin/modules/huzhou/service/IHuzhouProjectinfoService.java +++ b/huzhou/src/main/java/com/easy/admin/modules/huzhou/service/IHuzhouProjectinfoService.java @@ -238,5 +238,7 @@ public interface IHuzhouProjectinfoService extends IService { HuzhouProjectinfoOV queryProjectFundPayRateById(String projectId); List queryProjectWithFundPay(); + + List queryProjectTimeOutInfo(); } 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 24e7855..b5d5679 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 @@ -12,6 +12,7 @@ import com.easy.admin.modules.huzhou.dao.HuzhouContractinfoHistoryMapper; import com.easy.admin.modules.huzhou.dao.HuzhouContractinfoMapper; import com.easy.admin.modules.huzhou.dao.HuzhouProjectinfoMoneyMapper; import com.easy.admin.modules.huzhou.dao.HuzhouSubProjectinfoMapper; +import com.easy.admin.modules.huzhou.dto.ContractPayInfoDTO; import com.easy.admin.modules.huzhou.entity.*; import com.easy.admin.modules.huzhou.service.*; import com.easy.admin.modules.huzhou.vo.ContractInfoVo; @@ -36,6 +37,9 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; +import java.time.LocalDate; +import java.time.ZoneId; +import java.time.temporal.ChronoUnit; import java.util.*; import java.util.stream.Collectors; @@ -278,7 +282,7 @@ public class HuzhouContractinfoServiceImpl extends ServiceImpl getContractinfoByprojectId(String projectid) { + public List getPlanContractinfoByprojectId(String projectid) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(HuzhouContractinfo::getProjectId, projectid); queryWrapper.eq(HuzhouContractinfo::getFlag,"计划"); @@ -371,7 +375,7 @@ public class HuzhouContractinfoServiceImpl extends ServiceImpl planList = this.getContractinfoByprojectId(projectId); + List planList = this.getPlanContractinfoByprojectId(projectId); contractInfoVo.setHasInfo(true); contractInfoVo.setPlanList(planList); return contractInfoVo; @@ -395,7 +399,7 @@ public class HuzhouContractinfoServiceImpl extends ServiceImpl planList = this.getContractinfoByprojectId(projectId); + List planList = this.getPlanContractinfoByprojectId(projectId); planList= planList.stream() .filter(item -> item.getTaskName().equals(taskName)) @@ -407,7 +411,7 @@ public class HuzhouContractinfoServiceImpl extends ServiceImpl1){ // 返回合同信息(计划 + 实际) ContractInfoVo contractInfoVo = new ContractInfoVo(); - List planList = this.getContractinfoByprojectId(projectId); + List planList = this.getPlanContractinfoByprojectId(projectId); planList= planList.stream() .filter(item -> item.getTaskName().equals(taskName)) .collect(Collectors.toList()); @@ -486,7 +490,7 @@ public class HuzhouContractinfoServiceImpl extends ServiceImpl planContractInfoList = contractinfoService.getContractinfoByprojectId(contractInfo.getProjectId()); + List 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){ @@ -511,5 +515,54 @@ public class HuzhouContractinfoServiceImpl extends ServiceImpl planList = this.getPlanContractinfoByprojectId(projectId); + List realList = this.getRealContractinfoByprojectId(projectId); + + // 假设两个列表长度相同并且一一对应 + for (int i = 0; i < Math.min(planList.size(), realList.size()); i++) { // 确保不超出任一列表的范围 + HuzhouContractinfo planContract = planList.get(i); + LocalDate planPayDate = planContract.getPayDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); + + HuzhouContractinfo realContract = realList.get(i); + LocalDate realPayDate = realContract.getPayDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); + + long daysDifference = ChronoUnit.DAYS.between(planPayDate, realPayDate); + if (daysDifference > 0) { // 实际支付日期晚于计划支付日期 + if (resultDesc.length() > 0) { + resultDesc.append("---"); // 在除了第一个之外的所有记录前添加分隔符 + } + resultDesc.append(String.format("第%d笔属性:%s-超时: %d 天", + paymentIndex, planContract.getTaskName(), daysDifference)); + // 如果超时超过7天,则增加超时次数 + if (daysDifference >= 7) { + timeOutPayCount++; + } + } + + paymentIndex++; + } + + // 如果没有任何超时情况,则添加相应的提示信息 + if (resultDesc.length() == 0) { + resultDesc.append("未签订合同"); + } + payInfoDTO.setTimeOutPaySituation(resultDesc.toString()); + payInfoDTO.setTimeOutPayCount(timeOutPayCount); + return payInfoDTO; + } + + } diff --git a/huzhou/src/main/java/com/easy/admin/modules/huzhou/service/impl/HuzhouMergesplitinfoServiceImpl.java b/huzhou/src/main/java/com/easy/admin/modules/huzhou/service/impl/HuzhouMergesplitinfoServiceImpl.java index 1bb9c03..11f975c 100644 --- a/huzhou/src/main/java/com/easy/admin/modules/huzhou/service/impl/HuzhouMergesplitinfoServiceImpl.java +++ b/huzhou/src/main/java/com/easy/admin/modules/huzhou/service/impl/HuzhouMergesplitinfoServiceImpl.java @@ -162,7 +162,7 @@ public class HuzhouMergesplitinfoServiceImpl extends ServiceImpl { - item.getChildren().forEach(childItem -> { - // 判断子阶段是否需要填写实际合同金额,如果存在则支持重新上传 - if (childItem.getTaskName().equals("合同签订")) { - LambdaQueryWrapper qw = new LambdaQueryWrapper<>(); - qw.eq(HuzhouPlaninfo::getProjectId, projectId) - .eq(HuzhouPlaninfo::getTaskName, "合同签订").eq(HuzhouPlaninfo::getIsfinish, "2"); - if (planInfoMapper.selectCount(qw) > 0 && contractinfoService.getContractinfoByprojectId(projectId).size() < 1) { - childItem.setIsmodify(true); - log.info("----开启补偿接口重新上传合同金额-----"); - } else { - childItem.setIsmodify(false); - } + determineIsModify(projectId, item); + }); + return resultList; + } + + @Override + public ArrayList getPlanInfoMainTimelineListWithExecutor(String projectId) { + //查询父计划 + LambdaQueryWrapper planinfoLambdaQueryWrapper = new LambdaQueryWrapper<>(); + planinfoLambdaQueryWrapper.eq(HuzhouPlaninfo::getProjectId, projectId); + planinfoLambdaQueryWrapper.eq(HuzhouPlaninfo::getSuperior, "0"); + planinfoLambdaQueryWrapper.orderByAsc(HuzhouPlaninfo::getTaskLevel); + // 查询 huzhou_planinfo 项目计划表 查询本级任务进度的信息 + List superPlanInfoList = this.list(planinfoLambdaQueryWrapper); + + // 1.判断该项目是否存在子项目 + List subProjectIds = getSubProjectIds(projectId); + log.info("子项目集合为:{}", subProjectIds); + if (CollectionUtil.isNotEmpty(subProjectIds)) { + log.info("存在子项目需重新计算主项目进度"); + // 2.获取所有子项目对应的任务级别 (不考虑任务本级) + List taskLevelList = planInfoMapper.selectDistinctLowerTaskLevels(projectId); + log.info("下级任务级别集合为:{}", taskLevelList); + + // 3.获取子项目的计划进度 (huzhou_planinfo) + LambdaQueryWrapper subPlanInfoWrapper = new LambdaQueryWrapper<>(); + subPlanInfoWrapper.in(HuzhouPlaninfo::getProjectId, subProjectIds); + List subPlanInfoList = this.list(subPlanInfoWrapper); + + // 4.获取主任务各阶段计划表 + LambdaQueryWrapper mainInfoWrapper = new LambdaQueryWrapper<>(); + mainInfoWrapper.eq(HuzhouPlaninfo::getProjectId, projectId); + mainInfoWrapper.orderByAsc(HuzhouPlaninfo::getTaskLevel); + List mainPlanInfoList = planInfoMapper.selectList(mainInfoWrapper); + + // 5.遍历子项目的各子级别,所有子完成则主完成 + dealMainTaskLevelIsFinish(projectId, taskLevelList, subPlanInfoList, mainPlanInfoList); + } + + // 创建一个固定大小的线程池,大小可以根据你的实际需要调整 + int poolSize = Runtime.getRuntime().availableProcessors(); // 根据处理器数量设置线程池大小 + ExecutorService executor = Executors.newFixedThreadPool(poolSize); + List> futures = new CopyOnWriteArrayList<>(); + + final long[] totalCount = {0}; // 使用数组来允许在lambda表达式中修改其值 + final long[] totalFinishCount = {0}; + + for (final HuzhouPlaninfo info : superPlanInfoList) { + futures.add(executor.submit(() -> { + HuzhouPlaninfoOV huzhouPlaninfoOV = new HuzhouPlaninfoOV(); + BeanUtils.copyProperties(info, huzhouPlaninfoOV); + + HuzhouPlaninfoOV setChildData = setchild(huzhouPlaninfoOV); + + // 当前计划如果在流程中,判断是否可编辑 isfinish字段值含义:0未开始 1审批中 2已完成 + if (CommonConstant.PRO_PLAN_APPLY.equals(setChildData.getIsfinish())) { + String isEdit = getPlanFileApprovalInfoByPlaninfoId(setChildData.getId()).get("isEdit"); + setChildData.setIsEdit(isEdit); + } + String taskLevel = info.getTaskLevel(); + // 查询主任务整体进度情况 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.likeRight(HuzhouPlaninfo::getTaskLevel, taskLevel + "."); + queryWrapper.eq(HuzhouPlaninfo::getProjectId, projectId); + long lowerCount = this.count(queryWrapper) + 1; + + // 查询完成的数量 + queryWrapper.eq(HuzhouPlaninfo::getIsfinish, CommonConstant.PRO_PLAN_FINISHED); + long lowerFinishiCount = this.count(queryWrapper); + if (CommonConstant.PRO_PLAN_FINISHED.equals(info.getIsfinish())) { + lowerFinishiCount++; + } + + // 计算子阶段的百分比 + BigDecimal a = new BigDecimal(lowerCount); + BigDecimal b = new BigDecimal(lowerFinishiCount); + String percent = b.divide(a, 2, RoundingMode.HALF_UP) + .multiply(BigDecimal.valueOf(100)) + .toString(); + percent = percent.substring(0, percent.indexOf(".")); + setChildData.setPercent(percent); + + synchronized (totalCount) { + totalCount[0] += lowerCount; + totalFinishCount[0] += lowerFinishiCount; + } + + return setChildData; + })); + } + + ArrayList resultList = new ArrayList<>(); + + for (Future future : futures) { + try { + resultList.add(future.get()); + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + } + } + + // 设置整体百分比 + String totalPercent = "0"; + if (totalCount[0] > 0) { + totalPercent = new BigDecimal(totalFinishCount[0]) + .divide(new BigDecimal(totalCount[0]), 2, RoundingMode.HALF_UP) + .multiply(BigDecimal.valueOf(100)) + .toString(); + totalPercent = totalPercent.substring(0, totalPercent.indexOf(".")); + resultList.get(0).setTotalPercent(totalPercent); + } + + // 关闭线程池 + executor.shutdown(); + return resultList; + } + + private void determineIsModify(String projectId, HuzhouPlaninfoOV item) { + item.getChildren().forEach(childItem -> { + // 判断子阶段是否需要填写实际合同金额,如果存在则支持重新上传 + if (childItem.getTaskName().equals("合同签订")) { + LambdaQueryWrapper qw = new LambdaQueryWrapper<>(); + qw.eq(HuzhouPlaninfo::getProjectId, projectId) + .eq(HuzhouPlaninfo::getTaskName, "合同签订").eq(HuzhouPlaninfo::getIsfinish, "2"); + if (planInfoMapper.selectCount(qw) > 0 && contractinfoService.getPlanContractinfoByprojectId(projectId).size() < 1) { + childItem.setIsmodify(true); + log.info("----开启补偿接口重新上传合同金额-----"); } else { - Boolean flag = contractinfoService.hasContractinfoByTaskName(projectId, childItem.getTaskName()); - if (flag) { - childItem.setIsmodify(true); - } else { - childItem.setIsmodify(false); - } + childItem.setIsmodify(false); } - }); + } else { + Boolean flag = contractinfoService.hasContractinfoByTaskName(projectId, childItem.getTaskName()); + if (flag) { + childItem.setIsmodify(true); + } else { + childItem.setIsmodify(false); + } + } }); - return resultList; } private void dealMainTaskLevelIsFinish(String projectId, List taskLevelList, List subPlanInfoList, List mainPlanInfoList) { @@ -1093,7 +1210,7 @@ public class HuzhouPlaninfoServiceImpl extends ServiceImpl childTaskBySuperior = planInfoMapper.getChildTaskBySuperior(planInfo); - log.info("本级任务级别为{},该任务的下级任务数量为{}",taskLevel,childTaskBySuperior.size()); + //log.info("本级任务级别为{},该任务的下级任务数量为{}",taskLevel,childTaskBySuperior.size()); if(childTaskBySuperior.size()!=0){ for(HuzhouPlaninfo childInfo:childTaskBySuperior){ @@ -1114,7 +1231,7 @@ public class HuzhouPlaninfoServiceImpl extends ServiceImpl queryProjectWithFundPay() { + // 记录开始时间 + long startTime = System.currentTimeMillis(); + // 获取所有项目信息 + List projectInfoList = this.list(); + + // 创建线程池 + int poolSize = Runtime.getRuntime().availableProcessors(); // 根据处理器数量设置线程池大小 + ExecutorService executorService = Executors.newFixedThreadPool(poolSize); + + // 创建一个存放Future对象的列表 + List> futures = new ArrayList<>(); + + // 提交任务给线程池 + for (final HuzhouProjectinfo projectInfo : projectInfoList) { + futures.add(executorService.submit(() -> { + String projectId = projectInfo.getId(); + + // 1.填充上级资金执行率 + fillSuperiorFundPayRate(projectInfo); + + // 2.填充项目所处阶段 + Integer result = planinfoMapper.getMaxTaskLevelPart(projectId); + if (result != null) { + String stageDescription = ProjectStage.getDescriptionByStageNumber(result); + projectInfo.setCurrentStage(stageDescription); + } else { + projectInfo.setCurrentStage("未执行"); + } + + // 3.填充项目整体进度 + if (CollectionUtils.isNotEmpty(planinfoService.getPlanInfoMainTimelineListWithExecutor(projectId))) { + String totalPercent = planinfoService.getPlanInfoMainTimelineList(projectId).get(0).getTotalPercent(); + projectInfo.setTotalPercent(totalPercent); + } else { + projectInfo.setTotalPercent("0"); + } + + return projectInfo; + })); + } + + // 收集结果 + for (int i = 0; i < futures.size(); i++) { + try { + projectInfoList.set(i, futures.get(i).get()); + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + // 处理异常情况 + } + } + + // 关闭线程池 + executorService.shutdown(); + + // 按照责任工作地点排序 + projectInfoList = projectInfoList.stream() + .sorted(Comparator.comparing(HuzhouProjectinfo::getReformName) + .thenComparing(HuzhouProjectinfo::getCurrentStage)) + .collect(Collectors.toList()); + + // 记录结束时间并计算耗时 + long endTime = System.currentTimeMillis(); + long duration = endTime - startTime; + log.info("方法执行耗时:{} ms",duration); + return projectInfoList; + } + + @Override + public List queryProjectTimeOutInfo() { + // 记录开始时间 + long startTime = System.currentTimeMillis(); + // 获取所有项目信息 List projectInfoList = this.list(); for (HuzhouProjectinfo projectInfo : projectInfoList) { - // 1.填充上级资金支付率 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.setTimeOutPaySituation(String.valueOf(daysBetween)); + log.info("项目:{}->当且节点:{}->超时完成天数为:{}", projectInfo.getProjectName(),currentPointName, daysBetween); + log.info("计划结束时间为:{}->实际开始提交时间为:{}", scheduledEndDate,realUpFileDate); + }else { + projectInfo.setTimeOutPaySituation("未超时"); + } + } + } else { + projectInfo.setCurrentPointName("未执行"); + } + + // 2.设置整体资金支付情况:上级资金支付比例=(实际支付上级资金/计划支付上级资金)*100% fillSuperiorFundPayRate(projectInfo); - // TODO 2.填充项目所处阶段 - Integer result = planinfoMapper.getMaxTaskLevelPart(projectId); - if (result != null){ - String stageDescription = ProjectStage.getDescriptionByStageNumber(result); - projectInfo.setCurrentStage(stageDescription); - //log.info("项目名称:{}--->项目所处阶段为:{}", projectInfo.getProjectName(),stageDescription); - }else { - String stageDescription ="未执行"; - projectInfo.setCurrentStage(stageDescription); - //log.info("项目名称:{}--->项目所处阶段为:项目不在执行计划中", projectInfo.getProjectName()); - } - // TODO 3.填充项目整体进度 - if (CollectionUtils.isNotEmpty(planinfoService.getPlanInfoMainTimelineList(projectId))){ - String totalPercent = planinfoService.getPlanInfoMainTimelineList(projectId).get(0).getTotalPercent(); - projectInfo.setTotalPercent(totalPercent); - }else { - projectInfo.setTotalPercent("0"); - } + // 3.设置节点资金支付情况:资金支付超时时间=实际支付时间-计划支付时间 + ContractPayInfoDTO tmp = contractinfoService.queryContractPaySituation(projectInfo); + projectInfo.setTimeOutPaySituation(tmp.getTimeOutPaySituation()); + // 4.设置超时支付次数:超时支付次数=超时完成天数/7 + projectInfo.setTimeOutPayCount(tmp.getTimeOutPayCount()); } - projectInfoList =projectInfoList.stream() - .sorted(Comparator.comparing(HuzhouProjectinfo::getDutyWorkplace)) + // 按照责任工作地点排序 + projectInfoList = projectInfoList.stream() + .sorted(Comparator.comparing(HuzhouProjectinfo::getReformName)) .collect(Collectors.toList()); -// List dtoList = projectInfoList.stream() -// .map(projectInfo -> new HuzhouProjectinfoExportDTO( -// projectInfo.getProjectName(), -// projectInfo.getSuperiorFundPayRate(), -// projectInfo.getCurrentStage() )) -// .collect(Collectors.toList()); -// for (HuzhouProjectinfoExportDTO huzhouProjectinfoExportDTO : dtoList) { -// log.info("项目名称:{}--->上级资金执行率为:{}", huzhouProjectinfoExportDTO.getProjectName(),String.format("%.0f%%", huzhouProjectinfoExportDTO.getSuperiorFundPayRate())); -// } - + long endTime = System.currentTimeMillis(); + long duration = endTime - startTime; + log.info("方法执行耗时:{} ms",duration); return projectInfoList; } + + + private void fillSuperiorFundPayRate(HuzhouProjectinfo projectInfo) { String projectId = projectInfo.getId(); HuzhouProjectinfoMoney huzhouProjectinfoMoney = projectinfoMoneyMapper.selectById(projectId); @@ -2741,6 +2831,7 @@ public class HuzhouProjectinfoServiceImpl extends ServiceImpl actualFunds = calculateActualFunds(projectId); + Double centralMoney = actualFunds.get("centralMoney"); Double provincialMoney = actualFunds.get("provincialMoney"); // 计算并设置上级资金支付率 @@ -2752,6 +2843,7 @@ public class HuzhouProjectinfoServiceImpl extends ServiceImpl