fuliqi
2024-11-29 3adc66dee9660cf10e40abfdf52113306c7d34f3
项目库导出之导出目标列表内容
7个文件已修改
3个文件已添加
178 ■■■■■ 已修改文件
business/src/main/java/com/ycl/controller/ProjectInfoController.java 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/domain/excel/ProjectExcelTemplate.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/domain/query/ProjectExportQuery.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/mapper/ProjectInfoMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/service/ProjectInfoService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/service/impl/ProjectInfoServiceImpl.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/resources/mapper/ProjectInfoMapper.xml 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
common/src/main/java/com/ycl/common/enums/business/ProjectStatusEnum.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
common/src/main/java/com/ycl/common/enums/business/ProjectTypeEnum.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
common/src/main/java/com/ycl/common/utils/excel/OutputExcelUtils.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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())) {