浏览代码

项目四库-项目总库新增项目汇总明细导出功能

Wayne 3 月之前
父节点
当前提交
75086e4133

+ 1 - 0
projects-service/src/main/java/com/rtrh/projects/modules/projects/mapper/SubInfoMapper.java

@@ -106,4 +106,5 @@ public interface SubInfoMapper {
     @Update("update sub_info set amt_comp = #{sub.amtComp}, yb_content = #{sub.ybContent} where id = #{sub.id}")
     void update(@Param("sub") SubInfo subInfo);
 
+    List<SmzkDetailVo> exportSmzkDetailExcel(@Param("subName") String subName,@Param("subjectId") String subjectId,@Param("indusKinds") List<String> indusKinds,@Param("startAmt") String startAmt,@Param("endAmt") String endAmt, @Param("sbdw") String sbdw, @Param("subjectIds") List<String> subjectIds);
 }

+ 40 - 0
projects-service/src/main/java/com/rtrh/projects/modules/projects/mapper/SubInfoMapper.xml

@@ -8,6 +8,46 @@
             (#{item.id}, #{item.subId}, #{item.year}, #{item.cat}, #{item.createTime}, #{item.createUserId})
         </foreach>
     </insert>
+    <select id="exportSmzkDetailExcel" resultType="com.rtrh.projects.modules.projects.vo.export.SmzkDetailVo">
+        SELECT sub_info.id as id,
+        sub_info.status as status,
+        sub_info.sub_code as subCode,
+        sub_info.sub_name as subName,
+        sub_info.amt_total as amtTotal,
+        sub_info.begin_date as beginDate,
+        sub_info.end_date as endDate,
+        sub_info.indus_kind as indusKind,
+        sub_info.cb_status as cbStatus
+        FROM sub_info
+        WHERE sub_info.logic_delete_flag = 0
+        <if test="subName != null and subName != ''">
+            AND sub_info.sub_name LIKE CONCAT('%', #{subName}, '%')
+        </if>
+        <if test="subjectId != null and subjectId != ''">
+            AND sub_info.subject_id = #{subjectId}
+        </if>
+        <if test="subjectIds != null and subjectIds.size() &gt; 0">
+            AND sub_info.subject_id IN
+            <foreach collection="subjectIds" item="item" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="indusKinds != null and indusKinds.size() &gt; 0">
+            AND sub_info.indus_kind IN
+            <foreach collection="indusKinds" item="item" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="sbdw != null and sbdw != ''">
+            AND sub_info.unit_desc LIKE CONCAT('%', #{sbdw}, '%')
+        </if>
+        <if test="startAmt != null and startAmt !=''">
+            AND sub_info.amt_total &gt;= #{startAmt}
+        </if>
+        <if test="endAmt != null and endAmt != ''">
+            AND sub_info.amt_total &lt;= #{endAmt}
+        </if>
+    </select>
 
 
     <select id="smartSiteQuery" resultType="com.rtrh.projects.modules.projects.vo.SubSmartVO"  >

+ 2 - 0
projects-service/src/main/java/com/rtrh/projects/modules/projects/service/SubInfoService.java

@@ -449,4 +449,6 @@ public interface SubInfoService {
 	Long queryExceedWithin();
 
 	Long queryExceedOutside();
+
+	List<SmzkDetailVo> exportSmzkDetailExcel(SubInfoQueryTzVO vo, List<String> subjectIds);
 }

+ 73 - 0
projects-service/src/main/java/com/rtrh/projects/modules/projects/service/impl/SubInfoServiceImpl.java

@@ -5382,6 +5382,79 @@ public class SubInfoServiceImpl implements SubInfoService {
         return subInfoMapper.queryExceedOutside();
     }
 
+    @Override
+    public List<SmzkDetailVo> exportSmzkDetailExcel(SubInfoQueryTzVO vo, List<String> subjectIds) {
+
+        // 获取行业
+        List<SubIndu> subInduList = Optional.ofNullable(
+                subInduService.selectAllSubIndu()
+        ).orElse(Collections.emptyList());
+
+        //保存行业code
+        List<String> indusKinds = new ArrayList<>();
+        //判断搜索条件中是否有行业分类条件
+        if (StringUtils.isNotBlank(vo.getIndusKind())) {
+            //在subInduList中找到code=queryVO.getIndusKinds()的数据
+            SubIndu subIndu = subInduList.stream().filter(item -> item.getCode().equals(vo.getIndusKind())).findFirst().orElse(null);
+
+            if (subIndu != null){
+                //判断这个行业是不是上级行业
+                if (StringUtils.isBlank(subIndu.getLastId())){
+                    // 这个行业是上级行业,需要找到所有下级行业的code
+                    indusKinds = subInduList.stream().filter(item -> item.getLastId() != null && item.getLastId().equals(subIndu.getId())).map(SubIndu::getCode).collect(Collectors.toList());
+                }else {
+                    indusKinds.add(subIndu.getCode());
+                }
+            }
+        }
+
+
+        // 查询所有的重点项目信息,若结果为空则初始化为一个空列表
+        List<SmzkDetailVo> dataList = Optional.ofNullable(
+                subInfoMapper.exportSmzkDetailExcel(vo.getSubName(),vo.getSubjectId(),indusKinds,vo.getStartAmt(),vo.getEndAmt(),vo.getSbdw(),subjectIds)
+        ).orElse(Collections.emptyList());
+
+        Map<String, String> statusMap = new HashMap<>();
+        statusMap.put("1", "储备");
+        statusMap.put("2", "新建");
+        statusMap.put("3", "在建");
+        statusMap.put("9", "投产");
+
+
+        // 遍历重点项目信息,找到对应的前期手续信息,然后拼接手续完成情况为字符串,拼接到对应的重点项目信息中
+        dataList.forEach(e->{
+
+            e.setStatus(statusMap.get(e.getStatus()));
+
+            e.setCbStatus(SubInfoCbStatusEnum.getMessage(e.getCbStatus()));
+
+            //设置行业
+            if (StringUtil.isNotEmpty(e.getIndusKind())) {
+                String induskind = e.getIndusKind();
+                //这是新的行业列表subInduList,subInduList中有children里面装的子行业,我需要将induskind替换为subInduList中的一级行业title
+                Optional<SubIndu> first = subInduList.stream().filter(item -> item.getCode().equals(induskind)).findFirst();
+                if (first.isPresent()) {
+                    //判断上级名称是否存在,如果存在将induskind替换为上级名称,否则将induskind替换为名称
+                    if (StringUtil.isNotEmpty(first.get().getParentTitle())) {
+                        e.setIndusKind(first.get().getParentTitle());
+                    } else {
+                        e.setIndusKind(first.get().getTitle());
+                    }
+                }else {
+                    e.setIndusKind("");
+                }
+            }else {
+                e.setIndusKind("");
+            }
+
+            //将万元转换为亿元
+            e.setAmtTotal(e.getAmtTotal().divide(new BigDecimal("10000"), 2, RoundingMode.HALF_UP));
+        });
+
+        return dataList;
+
+    }
+
     private Map<String, Object> getStringObjectMap(List<WorkBenchVO> list) {
         Map<String, Object> resultMap = new HashMap<>();
         if (CollectionUtil.isNotEmpty(list)){

+ 31 - 0
projects-service/src/main/java/com/rtrh/projects/modules/projects/vo/export/SmzkDetailVo.java

@@ -0,0 +1,31 @@
+package com.rtrh.projects.modules.projects.vo.export;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+public class SmzkDetailVo {
+
+    private Integer number;
+
+    private String id;
+
+    private String status;
+
+    private String subCode;
+
+    private String subName;
+
+    private BigDecimal amtTotal;
+
+    private Date beginDate;
+
+    private Date endDate;
+
+    private String indusKind;
+
+    private String cbStatus;
+
+}

+ 65 - 1
projects/src/main/java/com/rtrh/projects/web/controller/subject/SubInfoExportController.java

@@ -875,7 +875,6 @@ public class SubInfoExportController extends BaseController {
     /**
      * 4库/总库 导出明细
      *
-     * @param response
      */
     @PostMapping("/exportDetailExcel")
     public void exportDetailExcel(@RequestBody SubInfoQueryTzVO queryVO) {
@@ -1003,6 +1002,71 @@ public class SubInfoExportController extends BaseController {
         }
     }
 
+    /**
+     * 导出重点项目储备明细表
+     *
+     * @param vo
+     */
+    @Log("页面:【项目四库管理-项目总库】,执行操作:导出明细")
+    @PostMapping("/exportXmzkDetailExcel")
+    public void exportXmzkDetailExcel(@RequestBody SubInfoQueryTzVO vo) throws IOException {
+
+        // 设置响应头
+        response.setContentType("application/vnd.ms-excel;charset=utf-8");
+        response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("项目总库-明细数据.xlsx", "UTF-8"));
+
+        try (cn.hutool.poi.excel.ExcelWriter writer = ExcelUtil.getBigWriter();
+             ServletOutputStream out = response.getOutputStream()) {
+
+            // 获取数据
+            List<String> subjectIds = getSubjectIds();
+            List<SmzkDetailVo> subInfoTotalExcel = subInfoService.exportSmzkDetailExcel(vo,subjectIds);
+
+            // 写入标题行
+            writer.writeHeadRow(CollUtil.newArrayList("“四个一批”工业项目表(项目总库)"));
+            writer.merge(0, 0, 0, 9, "“四个一批”工业项目表(项目总库)", true);
+
+            // 写入子标题行
+//            writer.writeHeadRow(CollUtil.newArrayList("序号", "项目id", "项目库", "项目代码", "项目名称", "总金额(亿元)", "计划开始日期", "计划投产日期", "行业名称", "状态"));
+
+            writer.addHeaderAlias("number", "序号");
+            writer.addHeaderAlias("id", "项目id");
+            writer.addHeaderAlias("status", "项目库");
+            writer.addHeaderAlias("subCode", "项目代码");
+            writer.addHeaderAlias("subName", "项目名称");
+            writer.addHeaderAlias("amtTotal", "总金额(亿元)");
+            writer.addHeaderAlias("beginDate", "计划开始日期");
+            writer.addHeaderAlias("endDate", "计划投产日期");
+            writer.addHeaderAlias("indusKind", "行业名称");
+            writer.addHeaderAlias("cbStatus", "状态");
+
+
+            // 设置每列的默认宽度
+            SXSSFSheet sheet = ((SXSSFWorkbook) writer.getWorkbook()).getSheetAt(0);
+            int defaultColumnWidth = 40; // 默认宽度为20个字符
+            for (int i = 0; i < 9; i++) {
+                sheet.setColumnWidth(i, defaultColumnWidth * 256); // 其他列保持默认宽度
+            }
+
+            //根据合并行进行合并
+            for (int i = 0; i < subInfoTotalExcel.size(); i++) {
+                subInfoTotalExcel.get(i).setNumber(i);
+            }
+
+            //写入行业明细行
+            writer.write(subInfoTotalExcel, true);
+            // 输出到客户端
+            writer.flush(out, true);
+
+        } catch (IOException e) {
+            // 处理 IO 异常
+            handleErrorResponse(response, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "导出 Excel 文件时出现错误:" + e.getMessage());
+        } catch (Exception e) {
+            // 处理其他异常
+            handleErrorResponse(response, HttpServletResponse.SC_BAD_REQUEST, "请求参数错误或发生其他错误:" + e.getMessage());
+        }
+    }
+
     private <K extends SubInfoBaseDetailVo> void exportDetail(HttpServletResponse response,ExportParams exportParams,Class<K> clazz, List<SubInfoGxj> list, Map<String, String> hyDictMap, Map<String, List<SubInfoGxj>> groupMap) {
         List<K> exportList = new ArrayList<>();
         // 合计行

+ 6 - 1
projects/src/main/webapp/vmodules/subject/subInfo/tz/xmzk.jsp

@@ -213,8 +213,9 @@
                         <img src="${WebSite.asset}/css/images/left/export.svg"/>
                         <span>导出</span>
                     </div>
-                    <div class="export-item" v-if="showExport" :style="{ top: '-62px' }">
+                    <div class="export-item" v-if="showExport" :style="{ top: '-93px' }">
                         <button type="button" class="" @click="exportTotalExcel">汇总导出</button>
+                        <button type="button" class="" @click="exportFixDetailExcel">项目明细导出</button>
                         <button type="button" class="" @click="exportMoreExcel">自定义导出</button>
                     </div>
                 </div>
@@ -1064,6 +1065,10 @@
                 var param = this.getSearchParams();
                 App.common.utils.downFile(App.getUrl("subInfoExport/exportTotalExcelByStatus"), "POST", param, "项目情况表(总库).xlsx", "导出失败");
             },
+            exportFixDetailExcel: function () {
+                var param = this.getSearchParams();
+                App.common.utils.downFile(App.getUrl("/subInfoExport/exportXmzkDetailExcel"), "POST", param, "项目明细表(总库).xlsx", "导出失败");
+            },
             exportDetailExcel: function () {
                 var param = this.getSearchParams();
                 App.common.utils.downFile(App.getUrl("subInfoExport/exportDetailExcel"), "POST", param, "项目明细表(总库).xlsx", "导出失败");