Browse Source

晾晒看板多个导出

master
gjh 3 days ago
parent
commit
7024d6bf90
  1. 26
      huzhou/src/main/java/com/easy/admin/common/enums/ProjectStage.java
  2. 30
      huzhou/src/main/java/com/easy/admin/modules/huzhou/controller/ProjectManagerController.java
  3. 6
      huzhou/src/main/java/com/easy/admin/modules/huzhou/dao/HuzhouPlaninfoMapper.java
  4. 21
      huzhou/src/main/java/com/easy/admin/modules/huzhou/dto/HuzhouProjectinfoExportDTO.java
  5. 19
      huzhou/src/main/java/com/easy/admin/modules/huzhou/entity/HuzhouProjectinfo.java
  6. 83
      huzhou/src/main/java/com/easy/admin/modules/huzhou/handler/CustomMergeStrategy.java
  7. 49
      huzhou/src/main/java/com/easy/admin/modules/huzhou/service/impl/HuzhouProjectinfoServiceImpl.java

26
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);
}
}

30
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<HuzhouProjectinfo> projectInfoList = projectinfoService.queryProjectWithFundPay();
List<HuzhouProjectinfoExportDTO> 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);
}

6
huzhou/src/main/java/com/easy/admin/modules/huzhou/dao/HuzhouPlaninfoMapper.java

@ -36,4 +36,10 @@ public interface HuzhouPlaninfoMapper extends BaseMapper<HuzhouPlaninfo> {
*/
@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);
}

21
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;
}
}

19
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);
}
}

83
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<String> mergeColumnNames;
/**
* 构造函数
*
* @param mergeColumnNames 合并列名
*/
public CustomMergeStrategy(List<String> mergeColumnNames) {
this.mergeColumnNames = mergeColumnNames;
}
@Override
public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<WriteCellData<?>> 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<CellRangeAddress> 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);
}
}
}

49
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<HuzhouProjectinfoM
public List<HuzhouProjectinfo> queryProjectWithFundPay() {
List<HuzhouProjectinfo> 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<HuzhouProjectinfoExportDTO> dtoList = projectInfoList.stream()
.map(projectInfo -> new HuzhouProjectinfoExportDTO(projectInfo.getProjectName(), projectInfo.getSuperiorFundPayRate() ))
.collect(Collectors.toList());
for (HuzhouProjectinfoExportDTO huzhouProjectinfoExportDTO : dtoList) {
log.info("项目名称:{}--->上级资金执行率为:{}", huzhouProjectinfoExportDTO.getProjectName(),String.format("%.0f%%", huzhouProjectinfoExportDTO.getSuperiorFundPayRate()));
}
projectInfoList =projectInfoList.stream()
.sorted(Comparator.comparing(HuzhouProjectinfo::getDutyWorkplace))
.collect(Collectors.toList());
// List<HuzhouProjectinfoExportDTO> 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;
}

Loading…
Cancel
Save