From 7024d6bf908ed7d4d94af35e5d410addf76443be Mon Sep 17 00:00:00 2001 From: gjh <1421wake> Date: Tue, 11 Mar 2025 17:32:20 +0800 Subject: [PATCH] =?UTF-8?q?=E6=99=BE=E6=99=92=E7=9C=8B=E6=9D=BF=E5=A4=9A?= =?UTF-8?q?=E4=B8=AA=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../easy/admin/common/enums/ProjectStage.java | 26 ++++++ .../controller/ProjectManagerController.java | 30 +++++-- .../huzhou/dao/HuzhouPlaninfoMapper.java | 6 ++ .../dto/HuzhouProjectinfoExportDTO.java | 21 ++++- .../huzhou/entity/HuzhouProjectinfo.java | 19 ++++- .../huzhou/handler/CustomMergeStrategy.java | 83 +++++++++++++++++++ .../impl/HuzhouProjectinfoServiceImpl.java | 49 ++++++++--- 7 files changed, 210 insertions(+), 24 deletions(-) create mode 100644 huzhou/src/main/java/com/easy/admin/common/enums/ProjectStage.java create mode 100644 huzhou/src/main/java/com/easy/admin/modules/huzhou/handler/CustomMergeStrategy.java diff --git a/huzhou/src/main/java/com/easy/admin/common/enums/ProjectStage.java b/huzhou/src/main/java/com/easy/admin/common/enums/ProjectStage.java new file mode 100644 index 0000000..32e083a --- /dev/null +++ b/huzhou/src/main/java/com/easy/admin/common/enums/ProjectStage.java @@ -0,0 +1,26 @@ +package com.easy.admin.common.enums; + +public enum ProjectStage { + STAGE_1(1, "项目立项阶段"), + STAGE_2(2, "项目采购阶段"), + STAGE_3(3, "项目建设阶段"), // 注意这里应该是"项目建设阶段"而非"项目建设极端" + STAGE_4(4, "绩效评估阶段"), + STAGE_5(5, "项目验收阶段"); + + private final int stageNumber; + private final String description; + + ProjectStage(int stageNumber, String description) { + this.stageNumber = stageNumber; + this.description = description; + } + + public static String getDescriptionByStageNumber(int stageNumber) { + for (ProjectStage ps : ProjectStage.values()) { + if (ps.stageNumber == stageNumber) { + return ps.description; + } + } + throw new IllegalArgumentException("No matching stage found for number: " + stageNumber); + } +} \ No newline at end of file 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 90b59bf..a559111 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 @@ -11,6 +11,7 @@ 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; import com.easy.admin.modules.huzhou.service.IHuzhouProjectinfoService; import com.easy.admin.modules.huzhou.service.ProjectManagerService; @@ -25,6 +26,10 @@ import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.net.URLEncoder; 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; @@ -97,25 +102,34 @@ public class ProjectManagerController { bodyStyle.setVerticalAlignment(VerticalAlignment.CENTER); List projectInfoList = projectinfoService.queryProjectWithFundPay(); List dtoList = projectInfoList.stream() - .map(projectInfo -> new HuzhouProjectinfoExportDTO(projectInfo.getProjectName(), projectInfo.getSuperiorFundPayRate() )) + .map(projectInfo -> new HuzhouProjectinfoExportDTO(projectInfo.getProjectName(), + projectInfo.getSuperiorFundPayRate(), + projectInfo.getCurrentStage(), + projectInfo.getTotalPercent(), + projectInfo.getDutyWorkplace())) .collect(Collectors.toList()); - for (HuzhouProjectinfoExportDTO huzhouProjectinfoExportDTO : dtoList) { - log.info("项目名称:{}--->上级资金执行率为:{}", huzhouProjectinfoExportDTO.getProjectName(),huzhouProjectinfoExportDTO.getSuperiorFundPayRate()); - } + +// for (HuzhouProjectinfoExportDTO huzhouProjectinfoExportDTO : dtoList) { +// log.info("项目名称:{}--->上级资金执行率为:{}", huzhouProjectinfoExportDTO.getProjectName(),huzhouProjectinfoExportDTO.getSuperiorFundPayRate()); +// } // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setCharacterEncoding("utf-8"); String flag = "上级资金执行率汇总"; // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系 - LocalDate currentDate = LocalDate.now(); - System.out.println("当前日期: " + currentDate); - String fileName = URLEncoder.encode( flag+currentDate, "UTF-8") + 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") .replaceAll("\\+", "%20"); response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx"); + EasyExcel.write(response.getOutputStream(), HuzhouProjectinfoExportDTO.class) .registerWriteHandler(new HorizontalCellStyleStrategy(headStyle, bodyStyle)) .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) - .sheet("上级资金执行率汇总"+currentDate) + .registerWriteHandler(new CustomMergeStrategy(Arrays.asList("dutyWorkplace"))) + .sheet("上级资金执行率汇总") .doWrite(dtoList); } 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 106a1b6..47a1b1d 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 @@ -36,4 +36,10 @@ public interface HuzhouPlaninfoMapper extends BaseMapper { */ @Select("SELECT isfinish FROM huzhou_planinfo WHERE project_id = #{mainProjectId} AND `task_level` = '2.1' ") String getIsFinishWithTaskLevel(String mainProjectId); + + + @Select("SELECT FLOOR(MAX(CAST(task_level AS DECIMAL(10, 2)))) AS integer_part " + + "FROM huzhou_planinfo " + + "WHERE project_id = #{projectId} AND isfinish IN ('1', '2')") + Integer getMaxTaskLevelPart(String projectId); } 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/HuzhouProjectinfoExportDTO.java index e14fb1d..e5c910d 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/HuzhouProjectinfoExportDTO.java @@ -4,20 +4,37 @@ import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.format.NumberFormat; import com.alibaba.excel.annotation.write.style.HeadStyle; +import com.baomidou.mybatisplus.annotation.TableField; import lombok.Data; @HeadStyle(fillForegroundColor = 44) @Data public class HuzhouProjectinfoExportDTO { + @ExcelProperty("指导处室") + private String dutyWorkplace; + @ExcelProperty("项目名称") private String projectName; //@NumberFormat("0.00%") - @ExcelProperty("上级资金执行率%") + @ExcelProperty("上级资金执行率(%)") private Double superiorFundPayRate; - public HuzhouProjectinfoExportDTO(String projectName, Double superiorFundPayRate) { + @ExcelProperty("项目所处阶段") + private String currentStage; + + @ExcelProperty("项目整体进度(%)") + private String totalPercent; + + public HuzhouProjectinfoExportDTO(String projectName, + Double superiorFundPayRate, + String currentStage, + String totalPercent, + String dutyWorkplace) { this.projectName = projectName; this.superiorFundPayRate = superiorFundPayRate; + this.currentStage = currentStage; + this.totalPercent = totalPercent; + this.dutyWorkplace = dutyWorkplace; } } \ 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 663fd98..30957d2 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 @@ -180,7 +180,17 @@ public class HuzhouProjectinfo extends BaseEntity { * 上级资金(中央资金+省级资金)使用率 */ @TableField(exist = false) - Double superiorFundPayRate; + private Double superiorFundPayRate; + /** + * 项目当且所处阶段 + */ + @TableField(exist = false) + private String currentStage; + /** + * 项目整体进度(%) + */ + @TableField(exist = false) + private String totalPercent; /** * 项目计划修改表示: 只允许修改一次 @@ -189,7 +199,12 @@ public class HuzhouProjectinfo extends BaseEntity { public HuzhouProjectinfoExportDTO toDTO() { - return new HuzhouProjectinfoExportDTO(this.projectName, this.superiorFundPayRate); + return new HuzhouProjectinfoExportDTO( + this.projectName, + this.superiorFundPayRate, + this.currentStage, + this.totalPercent, + this.dutyWorkplace); } } diff --git a/huzhou/src/main/java/com/easy/admin/modules/huzhou/handler/CustomMergeStrategy.java b/huzhou/src/main/java/com/easy/admin/modules/huzhou/handler/CustomMergeStrategy.java new file mode 100644 index 0000000..085bcbe --- /dev/null +++ b/huzhou/src/main/java/com/easy/admin/modules/huzhou/handler/CustomMergeStrategy.java @@ -0,0 +1,83 @@ +package com.easy.admin.modules.huzhou.handler; + +import com.alibaba.excel.metadata.Head; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.write.handler.CellWriteHandler; +import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; +import com.alibaba.excel.write.metadata.holder.WriteTableHolder; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellType; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.util.CellRangeAddress; + +import java.util.List; + +public class CustomMergeStrategy implements CellWriteHandler { + + /** + * 合并列名。 + */ + private final List mergeColumnNames; + + /** + * 构造函数。 + * + * @param mergeColumnNames 合并列名。 + */ + public CustomMergeStrategy(List mergeColumnNames) { + this.mergeColumnNames = mergeColumnNames; + } + + @Override + public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) { + // 校验:如果当前是表头,则不处理。 + if (isHead) { + return; + } + + // 校验:如果当前是第一行,则不处理。 + if (relativeRowIndex == 0) { + return; + } + + // 校验:如果当前列名不在合并列名列表中,则不处理。 + if (!this.mergeColumnNames.contains(head.getFieldName())) { + return; + } + + // 获取:当前表格、当前行下标、上一行下标、上一行对象、上一列对象。 + Sheet sheet = cell.getSheet(); + int rowIndexCurrent = cell.getRowIndex(); + int rowIndexPrev = rowIndexCurrent - 1; + Row rowPrev = sheet.getRow(rowIndexPrev); + Cell cellPrev = rowPrev.getCell(cell.getColumnIndex()); + + // 获取:当前单元格值、上一单元格值。 + Object cellValueCurrent = cell.getCellType() == CellType.STRING ? cell.getStringCellValue() : cell.getNumericCellValue(); + Object cellValuePrev = cellPrev.getCellType() == CellType.STRING ? cellPrev.getStringCellValue() : cellPrev.getNumericCellValue(); + + // 校验:如果当前单元格值与上一单元格值不相等,则不处理。 + if (!cellValueCurrent.equals(cellValuePrev)) { + return; + } + + List mergedRegions = sheet.getMergedRegions(); + boolean merged = false; + for (int i = 0; i < mergedRegions.size(); i++) { + CellRangeAddress cellRangeAddress = mergedRegions.get(i); + if (cellRangeAddress.isInRange(rowIndexPrev, cell.getColumnIndex())) { + sheet.removeMergedRegion(i); // 移除合并单元格。 + cellRangeAddress.setLastRow(rowIndexCurrent); // 设置合并单元格的结束行。 + sheet.addMergedRegion(cellRangeAddress); // 重新添加合并单元格。 + merged = true; + break; + } + } + if (!merged) { + CellRangeAddress cellRangeAddress = new CellRangeAddress(rowIndexPrev, rowIndexCurrent, cell.getColumnIndex(), cell.getColumnIndex()); + sheet.addMergedRegion(cellRangeAddress); + } + } + +} 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 22592ce..6cb12be 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 @@ -3,20 +3,19 @@ package com.easy.admin.modules.huzhou.service.impl; import cn.afterturn.easypoi.excel.ExcelImportUtil; import cn.afterturn.easypoi.excel.entity.ImportParams; import cn.afterturn.easypoi.excel.entity.result.ExcelImportResult; -import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.easy.admin.auth.model.SysRole; import com.easy.admin.auth.model.SysUser; import com.easy.admin.auth.service.SysUserService; import com.easy.admin.common.constant.CommonConstant; import com.easy.admin.common.core.common.select.Select; import com.easy.admin.common.core.exception.EasyException; + +import com.easy.admin.common.enums.ProjectStage; import com.easy.admin.common.util.CommonUtils; import com.easy.admin.modules.huzhou.common.HuzhouCommonUtils; import com.easy.admin.modules.huzhou.common.TemplateExcelUtils; @@ -51,11 +50,8 @@ import java.io.InputStream; import java.lang.reflect.Method; import java.math.BigDecimal; import java.math.RoundingMode; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; -import java.util.stream.DoubleStream; -import java.util.stream.Stream; @Service @Transactional @@ -2692,15 +2688,44 @@ public class HuzhouProjectinfoServiceImpl extends ServiceImpl queryProjectWithFundPay() { List projectInfoList = this.list(); for (HuzhouProjectinfo projectInfo : projectInfoList) { - // 填充上级资金支付率 + // 1.填充上级资金支付率 + String projectId = projectInfo.getId(); 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"); + } + } - List dtoList = projectInfoList.stream() - .map(projectInfo -> new HuzhouProjectinfoExportDTO(projectInfo.getProjectName(), projectInfo.getSuperiorFundPayRate() )) + projectInfoList =projectInfoList.stream() + .sorted(Comparator.comparing(HuzhouProjectinfo::getDutyWorkplace)) .collect(Collectors.toList()); - for (HuzhouProjectinfoExportDTO huzhouProjectinfoExportDTO : dtoList) { - log.info("项目名称:{}--->上级资金执行率为:{}", huzhouProjectinfoExportDTO.getProjectName(),String.format("%.0f%%", huzhouProjectinfoExportDTO.getSuperiorFundPayRate())); - } + +// 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())); +// } + return projectInfoList; }