business/src/main/java/com/ycl/controller/ProjectInfoController.java
@@ -8,6 +8,7 @@ import com.ycl.domain.excel.ProjectExcelTemplate; import com.ycl.domain.form.DocumentInfoForm; import com.ycl.domain.form.ProjectInfoForm; import com.ycl.domain.query.ProjectExportQuery; import com.ycl.domain.query.ProjectInfoQuery; import com.ycl.service.ProjectInfoService; import io.swagger.annotations.Api; @@ -19,6 +20,7 @@ import javax.servlet.http.HttpServletResponse; import javax.validation.constraints.NotEmpty; import java.io.IOException; import java.util.ArrayList; import java.util.List; /** @@ -115,10 +117,18 @@ * @return */ @PostMapping("/export/template") public void exportTemplate(HttpServletResponse response, @RequestBody List<String> fieldList ) throws IOException { public void exportTemplate(HttpServletResponse response) throws IOException { List<String> fieldList = new ArrayList<>(); OutputExcelUtils.export(response, "导入模板", "项目信息", null, ProjectExcelTemplate.class ,fieldList); } /** * 项目导出 * @param response * @throws IOException */ @PostMapping("/export") public void export(HttpServletResponse response, ProjectExportQuery query) throws IOException { projectInfoService.export(response, query); } } business/src/main/java/com/ycl/domain/excel/ProjectExcelTemplate.java
@@ -2,6 +2,11 @@ import com.alibaba.excel.annotation.ExcelProperty; import com.fasterxml.jackson.annotation.JsonFormat; import com.ycl.common.enums.business.ImportanceTypeEnum; import com.ycl.common.enums.business.ProjectStatusEnum; import com.ycl.common.enums.business.ProjectTypeEnum; import com.ycl.common.utils.excel.annotation.ExcelEnumFormat; import com.ycl.common.utils.excel.convert.ExcelEnumConvert; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; @@ -36,13 +41,15 @@ /** * 项目类型 */ @ExcelProperty(value = "项目类型") @ExcelProperty(value = "项目类型",converter = ExcelEnumConvert.class) @ExcelEnumFormat(enumClass = ProjectTypeEnum.class,codeField = "type",textField = "desc") private String projectType; /** * 项目状态 */ @ExcelProperty(value = "项目状态") @ExcelProperty(value = "项目状态",converter = ExcelEnumConvert.class) @ExcelEnumFormat(enumClass = ProjectStatusEnum.class,codeField = "type",textField = "desc") private String projectStatus; /** @@ -60,7 +67,8 @@ /** * 重点分类 */ @ExcelProperty(value = "重点分类") @ExcelProperty(value = "重点分类",converter = ExcelEnumConvert.class) @ExcelEnumFormat(enumClass = ImportanceTypeEnum.class,codeField = "type",textField = "desc") private String importanceType; /** business/src/main/java/com/ycl/domain/query/ProjectExportQuery.java
New file @@ -0,0 +1,14 @@ package com.ycl.domain.query; import lombok.Data; import java.util.List; @Data public class ProjectExportQuery { //字段列 private List<String> fieldList; //具体的projectId private List<Long> dataIdList; //是否需要附件 private Boolean requireFile; } business/src/main/java/com/ycl/mapper/ProjectInfoMapper.java
@@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.ycl.domain.entity.ProjectInfo; import com.ycl.domain.excel.ProjectExcelTemplate; import com.ycl.domain.query.ProjectInfoQuery; import com.ycl.domain.vo.ProjectInfoVO; import com.ycl.domain.vo.ProjectVO; @@ -34,4 +35,5 @@ List<ProjectVO> homeCount(); List<ProjectVO> selectProjectDetailByIds(@Param("dataIdList") List<Long> dataIdList); } business/src/main/java/com/ycl/service/ProjectInfoService.java
@@ -5,10 +5,12 @@ import com.ycl.domain.entity.ProjectInfo; import com.ycl.domain.form.DocumentInfoForm; import com.ycl.domain.form.ProjectInfoForm; import com.ycl.domain.query.ProjectExportQuery; import com.ycl.domain.query.ProjectInfoQuery; import com.ycl.domain.vo.IndexCountVO; import com.ycl.domain.vo.IndexDTO; import javax.servlet.http.HttpServletResponse; import java.util.List; import java.util.Map; @@ -77,4 +79,6 @@ Result addDoc(DocumentInfoForm form); Result getManagerFlag(Integer recordId); void export(HttpServletResponse response, ProjectExportQuery query); } business/src/main/java/com/ycl/service/impl/ProjectInfoServiceImpl.java
@@ -1,5 +1,7 @@ package com.ycl.service.impl; import cn.hutool.core.collection.CollUtil; import com.alibaba.excel.EasyExcel; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -7,13 +9,18 @@ import com.ycl.common.enums.business.FileTypeEnum; import com.ycl.common.enums.business.ImportanceTypeEnum; import com.ycl.common.enums.business.ProjectCategoryEnum; import com.ycl.common.exception.base.BaseException; import com.ycl.common.utils.CopyUtils; import com.ycl.common.utils.DateUtils; import com.ycl.common.utils.SecurityUtils; import com.ycl.common.utils.StringUtils; import com.ycl.common.utils.bean.BeanUtils; import com.ycl.common.utils.excel.OutputExcelUtils; import com.ycl.domain.entity.*; import com.ycl.domain.excel.ProjectExcelTemplate; import com.ycl.domain.form.DocumentInfoForm; import com.ycl.domain.form.ProjectInfoForm; import com.ycl.domain.query.ProjectExportQuery; import com.ycl.domain.query.ProjectInfoQuery; import com.ycl.domain.vo.*; import com.ycl.framework.utils.PageUtil; @@ -25,8 +32,11 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.math.RoundingMode; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; @@ -163,7 +173,7 @@ } else if (ProjectCategoryEnum.PREVIOUS.getType().equals(projectCategory)) { query.setProjectStatus(ProjectCategoryEnum.PREVIOUS.getStatus()); query.setReserveOrPrevious(ProjectCategoryEnum.PREVIOUS.getCode()); } else if (ProjectCategoryEnum.FINISH.getType().equals(projectCategory)) { } else if (ProjectCategoryEnum.FINISH.getType().equals(projectCategory)) { query.setProjectStatus(ProjectCategoryEnum.FINISH.getStatus()); } else if (ProjectCategoryEnum.EXCEPTION.getType().equals(projectCategory)) { //TODO @@ -376,4 +386,30 @@ return Result.ok().data(false); } } @Override public void export(HttpServletResponse response, ProjectExportQuery query) { List<ProjectVO> data = baseMapper.selectProjectDetailByIds(query.getDataIdList()); List<ProjectExcelTemplate> excelList = new ArrayList<>(); //字典作翻译 data.forEach(item->{ ProjectExcelTemplate excel = new ProjectExcelTemplate(); BeanUtils.copyProperties(item,excel); //项目阶段 excel.setProjectPhase(ProjectCategoryEnum.getPhaseByProjectStatus(item.getProjectStatus(),item.getProcessId()!=null)); excelList.add(excel); }); //补充文件的字段 Set<Integer> indexes = OutputExcelUtils.getSelectFields(query.getFieldList(), ProjectExcelTemplate.class); //不需要附件 if(!query.getRequireFile()) { try (ServletOutputStream outputStream = response.getOutputStream()) { EasyExcel.write(outputStream, ProjectExcelTemplate.class).includeColumnIndexes(indexes).sheet("项目列表").doWrite(excelList); } catch (Exception e) { log.error(e.getMessage(), e); throw new BaseException("导出失败:" + e.getMessage()); } } //TODO:需要附件 } } business/src/main/resources/mapper/ProjectInfoMapper.xml
@@ -162,5 +162,23 @@ LEFT JOIN t_project_investment_funding TPIF ON TPI.id = TPIF.project_id and TPIF.deleted = 0 LEFT JOIN t_project_process TPP ON TPI.id = TPP.project_id and TPP.deleted = 0 WHERE TPI.deleted = 0 </select> </select> <select id="selectProjectDetailByIds" resultType="com.ycl.domain.vo.ProjectVO"> select * from t_project_info TPI left join t_project_investment_funding TPIF on TPI.id = TPIF.project_id and TPIF.deleted = 0 left join t_project_investment_info TPII on TPI.id = TPII.project_id and TPII.deleted = 0 left join t_project_unit_registration_info TPURI on TPI.id = TPURI.project_id and TPURI.deleted = 0 left join t_project_investment_policy_compliance TPIPC on TPI.id = TPIPC.project_id and TPIPC.deleted = 0 <where> TPI.deleted =0 <if test="dataIdList != null and dataIdList.size > 0"> and TPI.id in <foreach collection="dataIdList" item="id" separator="," open="(" close=")"> #{id} </foreach> </if> </where> </select> </mapper> common/src/main/java/com/ycl/common/enums/business/ProjectStatusEnum.java
New file @@ -0,0 +1,30 @@ package com.ycl.common.enums.business; import com.baomidou.mybatisplus.annotation.EnumValue; import com.fasterxml.jackson.annotation.JsonValue; import lombok.Getter; /** * 项目状态枚举 * * @author:flq * @date:2024/11/27 18:21 */ @Getter public enum ProjectStatusEnum { PENDDING("pendding", "未开工"), WORKING("working","已开工"), FINISH("finish","已竣工"), STOP("stop", "暂停"); @EnumValue // 标明该字段存入数据库 private final String type; @JsonValue // 标明在转JSON时使用该字段 private final String desc; ProjectStatusEnum(String type, String desc) { this.type = type; this.desc = desc; } } common/src/main/java/com/ycl/common/enums/business/ProjectTypeEnum.java
New file @@ -0,0 +1,32 @@ package com.ycl.common.enums.business; import com.baomidou.mybatisplus.annotation.EnumValue; import com.fasterxml.jackson.annotation.JsonValue; import lombok.Getter; /** * 项目类型枚举 * * @author:flq * @date:2024/11/27 18:21 */ @Getter public enum ProjectTypeEnum { HOUSE("house", "房屋建筑"), CITY("city","城市基础设施"), TRANSPORT("transport","交通运输"), WATER("water", "水利"), ENERGY("energy", "能源"), NON_COAL_MINE("non_coal_mine", "非煤矿山"); @EnumValue // 标明该字段存入数据库 private final String type; @JsonValue // 标明在转JSON时使用该字段 private final String desc; ProjectTypeEnum(String type, String desc) { this.type = type; this.desc = desc; } } common/src/main/java/com/ycl/common/utils/excel/OutputExcelUtils.java
@@ -5,6 +5,7 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ZipUtil; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.write.builder.ExcelWriterSheetBuilder; import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; import com.ycl.common.utils.excel.convert.ExcelBigNumberConvert; @@ -21,6 +22,7 @@ import java.lang.reflect.Field; import java.net.URLEncoder; import java.nio.file.Files; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -155,8 +157,10 @@ public static <T> @NotNull Set<Integer> getSelectFields(List<String> fieldNames, Class<T> clazz) { Set<Integer> selectedIndexes = new HashSet<>(); if (CollUtil.isNotEmpty(fieldNames)) { // 反射获取字段属性 Field[] declaredFields = clazz.getDeclaredFields(); // 反射获取字段属性,这里只获取easyExcel注解的字段 Field[] declaredFields = Arrays.stream(clazz.getDeclaredFields()) .filter(field -> field.isAnnotationPresent(ExcelProperty.class)) .toArray(Field[]::new); // // 匹配需要导入的字段 for (int i = 0; i < declaredFields.length; i++) { if (fieldNames.contains(declaredFields[i].getName())) {