Ver código fonte

导出调整

JiangPengLi 2 meses atrás
pai
commit
968abc9b32

+ 6 - 3
projects-service/src/main/java/com/rtrh/projects/modules/projects/service/impl/SubInfoServiceImpl.java

@@ -4880,9 +4880,10 @@ public class SubInfoServiceImpl implements SubInfoService {
         subInduService.queryAll(null).stream()
                 .filter(e -> e.getCode().equals(subInfo.getIndusKind()))
                 .findFirst().ifPresent(e-> subInfo.setIndusName(e.getTitle()));
-        sysTableService.getByKind(SysTableKind.JSXZ).stream()
-                .filter(e -> e.getCode().equals(subInfo.getStatus()))
-                .findFirst().ifPresent(e-> subInfo.setStatusName(e.getTitle()));
+        subInfo.setStatusName(SubInfoStatusEnum.getDesc(subInfo.getStatus()));
+        // sysTableService.getByKind(SysTableKind.JSXZ).stream()
+        //         .filter(e -> e.getCode().equals(subInfo.getStatus()))
+        //         .findFirst().ifPresent(e-> subInfo.setStatusName(e.getTitle()));
         sysTableService.getByKind(SysTableKind.JSDD).stream()
                 .filter(e -> e.getCode().equals(subInfo.getSubjectId()))
                 .findFirst().ifPresent(e-> subInfo.setSubjectName(e.getTitle()));
@@ -5436,6 +5437,8 @@ public class SubInfoServiceImpl implements SubInfoService {
                     e.setStatus("在建");
                 } else if (status.equals("9")) {
                     e.setStatus("投产");
+                }else if (status.equals("5")) {
+                    e.setStatus("移除项目");
                 }else {
                     e.setStatus("");
                 }

+ 3 - 1
projects-service/src/main/java/com/rtrh/projects/modules/projects/vo/export/SmzkDetailVo.java

@@ -1,5 +1,6 @@
 package com.rtrh.projects.modules.projects.vo.export;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 
 import java.math.BigDecimal;
@@ -26,8 +27,9 @@ public class SmzkDetailVo {
 
     private String cbStatus;  //项目库
 
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
     private Date beginDate; //计划开始日期
-
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
     private Date endDate;   //计划投产日期
 
     private String progress;    //进展情况

+ 279 - 201
projects/src/main/java/com/rtrh/projects/web/controller/subject/SubInfoExportController.java

@@ -8,6 +8,7 @@ import java.math.RoundingMode;
 import java.net.URLEncoder;
 import java.text.SimpleDateFormat;
 import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 import javax.servlet.ServletOutputStream;
@@ -1511,15 +1512,6 @@ public class SubInfoExportController extends BaseController {
         }
     }
 
-    private String buildZhData(Map<String, List<LogOperate>> collect) {
-        StringBuilder zhStrBuilder = new StringBuilder();
-        collect.forEach((key, value) -> {
-            zhStrBuilder.append(key).append(value.size()).append("个、");
-        });
-        return zhStrBuilder.toString().replaceAll("、$", "。");
-    }
-
-
     /**
      * 导出重点项目储备明细表
      *
@@ -1555,7 +1547,7 @@ public class SubInfoExportController extends BaseController {
             writer.addHeaderAlias("content", "项目建设内容");
             writer.addHeaderAlias("amtTotal", "计划总投资(万元)");
             writer.addHeaderAlias("indusKind", "行业分类");
-            writer.addHeaderAlias("cbStatus", "状态[正在谋划,正在洽谈,已签约,已备案/已核准]");
+            writer.addHeaderAlias("cbStatus", "状态[正在谋划,正在洽谈,\n已签约,已备案/已核准]");
             writer.addHeaderAlias("beginDate", "计划开始日期");
             writer.addHeaderAlias("endDate", "计划投产日期");
             writer.addHeaderAlias("progress", "项目进展情况");
@@ -1570,15 +1562,28 @@ public class SubInfoExportController extends BaseController {
             cellStyle.setAlignment(HorizontalAlignment.LEFT);
 
             // 设置每列的默认宽度
-            int defaultColumnWidth = 40; // 默认宽度为20个字符
-            for (int i = 0; i < 11; i++) {
-                if (i == 0) {
-                    sheet.setColumnWidth(i, 4 * 256); // 序号列宽度为20个字符
-                    continue;
-                }
-                sheet.setColumnWidth(i, defaultColumnWidth * 256); // 其他列保持默认宽度
-            }
+            // int defaultColumnWidth = 40; // 默认宽度为20个字符
+            // for (int i = 0; i < 11; i++) {
+            //     if (i == 0) {
+            //         sheet.setColumnWidth(i, 4 * 256); // 序号列宽度为20个字符
+            //         continue;
+            //     }
+            //     sheet.setColumnWidth(i, defaultColumnWidth * 256); // 其他列保持默认宽度
+            // }
 
+            sheet.setColumnWidth(0, 4 * 256);
+            sheet.setColumnWidth(1, 40 * 256);
+            sheet.setColumnWidth(2, 14 * 256);
+            sheet.setColumnWidth(3, 40 * 256);
+            sheet.setColumnWidth(4, 12 * 256);
+            sheet.setColumnWidth(5, 40 * 256);
+            sheet.setColumnWidth(6, 20 * 256);
+            sheet.setColumnWidth(7, 12 * 256);
+            sheet.setColumnWidth(8, 20 * 256);
+            sheet.setColumnWidth(9, 14 * 256);
+            sheet.setColumnWidth(10, 14 * 256);
+            sheet.setColumnWidth(11, 14 * 256);
+            sheet.setColumnWidth(12, 14 * 256);
 
 
             //根据合并行进行合并
@@ -1586,8 +1591,19 @@ public class SubInfoExportController extends BaseController {
                 subInfoTotalExcel.get(i).setNumber(i);
             }
 
+            List<Map<String, Object>> list = subInfoTotalExcel.stream().map(item -> {
+                Map<String, Object> map = BeanUtil.beanToMap(item);
+                if (map.get("beginDate") != null) {
+                    map.put("beginDate", DateUtil.format(item.getBeginDate(), "yyyy-MM-dd"));
+                }
+                if (map.get("endDate") != null) {
+                    map.put("endDate", DateUtil.format(item.getBeginDate(), "yyyy-MM-dd"));
+                }
+                return map;
+            }).collect(Collectors.toList());
+
             //写入行业明细行
-            writer.write(subInfoTotalExcel, true);
+            writer.write(list, true);
             // 输出到客户端
             writer.flush(out, true);
 
@@ -1710,13 +1726,10 @@ public class SubInfoExportController extends BaseController {
     }
 
     /**
-     * 4库导出总表
-     *
-     * @param response
-     * @param vo
+     * 四库、总库导出总表
      */
     @PostMapping("/exportTotalExcelByStatus")
-    @Log("4库导出总表")
+    @Log("导出总表")
     public void exportTotalExcelByStatus(@RequestBody SubInfoQueryTzVO vo) {
         WebLogAspect.content.set(String.format("页面:【项目四库管理-%s库】,执行操作:导出汇总",
                 StringUtils.isBlank(vo.getStatus()) ? "项目总" : SubInfoStatusEnum.getDesc(vo.getStatus())));
@@ -1727,193 +1740,258 @@ public class SubInfoExportController extends BaseController {
         Map<String, String> jsddMap = jsddDict.stream().collect(Collectors.toMap(TSystable::getCode, TSystable::getTitle));
         Map<String, String> jsddTitleMap = jsddDict.stream().collect(Collectors.toMap(TSystable::getTitle, TSystable::getCode));
         Map<String, String> hyflMap = subInduService.queryParentAll().stream().collect(Collectors.toMap(SubIndu::getCode, SubIndu::getTitle));
-        // 0.项目总库导出总表
-        if (StringUtils.isBlank(vo.getStatus())){
-            // 0.1 按区域构建表头
-            List<String> subjectIds = list.stream().map(SubInfoTotalExcel::getSubjectId).distinct().collect(Collectors.toList());
-            // 创建主表头
-            List<ExcelExportEntity> entityList = new ArrayList<>();
-            // 添加表头
-            ExcelExportEntity lbEntity = new ExcelExportEntity("项目类别", "subjectName");
-            entityList.add(lbEntity);
-
-            ExcelExportEntity hj = new ExcelExportEntity("合计", "hj");
-            List<ExcelExportEntity> subHeadEntities = new ArrayList<>();
-            subHeadEntities.add(getExcelExportEntity("项目个数", "count", 12));
-            subHeadEntities.add(getExcelExportEntity("计划总投资(亿元)", "amt", 20));
-            hj.setList(subHeadEntities);
-            entityList.add(hj);
-
-            // 创建for循环,循环5次
-            List<String> newSubjectIds = new ArrayList<>();
-            if (subjectIds.contains(jsddTitleMap.get("伊州区"))){
-                newSubjectIds.add(jsddTitleMap.get("伊州区"));
-            }
-            if (subjectIds.contains(jsddTitleMap.get("巴里坤县"))){
-                newSubjectIds.add(jsddTitleMap.get("巴里坤县"));
-            }
-            if (subjectIds.contains(jsddTitleMap.get("伊吾县"))){
-                newSubjectIds.add(jsddTitleMap.get("伊吾县"));
-            }
-            if (subjectIds.contains(jsddTitleMap.get("高新区"))){
-                newSubjectIds.add(jsddTitleMap.get("高新区"));
-            }
-            if (subjectIds.contains(jsddTitleMap.get("市本级"))){
-                newSubjectIds.add(jsddTitleMap.get("市本级"));
-            }
-
-
-            for (String subjectId : newSubjectIds) {
-                ExcelExportEntity jsdd = null;
-                if (jsddMap.get(subjectId).equals("市本级")) {
-                    jsdd = new ExcelExportEntity("其他", subjectId);
-                }else {
-                    jsdd = new ExcelExportEntity(jsddMap.get(subjectId), subjectId);
+        if (StringUtils.isBlank(vo.getStatus())) {
+            // 项目总库导出总表
+            exportZkTotal(list, jsddMap, jsddTitleMap);
+        } else {
+            // 四库导出总表
+            exportFourDbTotal(vo, list, jsddMap, hyflMap);
+        }
+    }
+
+    /**
+     * 项目总库导出总表
+     */
+    private void exportFourDbTotal(SubInfoQueryTzVO vo, List<SubInfoTotalExcel> list, Map<String, String> jsddMap, Map<String, String> hyflMap) {
+        // 处理数据
+        List<SubInfoTotalInfoVO> exportData = new ArrayList<>();
+        if (CollectionUtil.isNotEmpty(list)) {
+            // 1.按属地划分
+            List<SubInfoTotalInfoVO> ddList = new ArrayList<SubInfoTotalInfoVO>() {{
+                jsddMap.forEach((k, v) -> {
+                    add(new SubInfoTotalInfoVO("按属地划分", v, 0, BigDecimal.ZERO));
+                });
+            }};
+            Map<String, SubInfoTotalInfoVO> ddGroup = list.stream()
+                    .collect(Collectors.groupingBy(SubInfoTotalExcel::getSubjectId))
+                    .entrySet().stream()
+                    .map(entry -> new SubInfoTotalInfoVO(
+                            "按属地划分",
+                            jsddMap.getOrDefault(entry.getKey(), entry.getKey()),
+                            entry.getValue().size(),
+                            entry.getValue().stream()
+                                    .map(SubInfoTotalExcel::getAmtTotal)
+                                    .reduce(BigDecimal.ZERO, BigDecimal::add)
+                                    .divide(new BigDecimal("10000"), 2, RoundingMode.HALF_UP)
+                    ))
+                    .collect(Collectors.toMap(SubInfoTotalInfoVO::getTypeItem, Function.identity()));
+            ddList = ddList.stream().map(e -> {
+                if (ddGroup.get(e.getTypeItem()) != null) {
+                    return ddGroup.get(e.getTypeItem());
+                } else {
+                    return e;
                 }
-                List<ExcelExportEntity> ddHead = new ArrayList<>();
-                ddHead.add(getExcelExportEntity("项目个数", "count", 12));
-                ddHead.add(getExcelExportEntity("计划总投资(亿元)", "amt", 20));
-                jsdd.setList(ddHead);
-                entityList.add(jsdd);
-            }
-            // 0.2 构建数据
-            Map<String, List<SubInfoTotalExcel>> statusGroup = list.stream().collect(Collectors.groupingBy(SubInfoTotalExcel::getStatus));
-            List<Map<String,Object>> dataList = new ArrayList<>();
-            // 0.2.1 储备项目
-            List<SubInfoTotalExcel> cb = statusGroup.getOrDefault(SubInfoStatusEnum.CB.getCode(),new ArrayList<>());
-            List<SubInfoTotalExcel> xj = statusGroup.getOrDefault(SubInfoStatusEnum.XJ.getCode(),new ArrayList<>());
-            List<SubInfoTotalExcel> zj = statusGroup.getOrDefault(SubInfoStatusEnum.ZJ.getCode(),new ArrayList<>());
-            List<SubInfoTotalExcel> tc = statusGroup.getOrDefault(SubInfoStatusEnum.TC.getCode(),new ArrayList<>());
-
-            fillRowData(subjectIds, dataList, cb, SubInfoStatusEnum.CB.getDesc() + "项目");
-            fillRowData(subjectIds, dataList, xj, SubInfoStatusEnum.XJ.getDesc() + "项目");
-            fillRowData(subjectIds, dataList, zj, SubInfoStatusEnum.ZJ.getDesc() + "项目");
-            fillRowData(subjectIds, dataList, tc, SubInfoStatusEnum.TC.getDesc() + "项目");
-            fillRowData(subjectIds, dataList, list, "合计");
-
-
-            // 3.导出
-            ExportParams exportParams = new ExportParams("哈密市“四个一批”工业项目库总体情况", "项目库总体情况", ExcelType.XSSF);
+            }).collect(Collectors.toList());
+
+            // 2.按金额划分 定义分组边界
+            Map<String, BigDecimal> groupBoundaries = new LinkedHashMap<>();
+            groupBoundaries.put("10亿元以下", new BigDecimal("100000"));
+            groupBoundaries.put("10-50亿元", new BigDecimal("500000"));
+            groupBoundaries.put("50-100亿元", new BigDecimal("1000000"));
+            // 默认
+            List<SubInfoTotalInfoVO> amtList = new ArrayList<SubInfoTotalInfoVO>() {{
+                add(new SubInfoTotalInfoVO("按金额划分", "10亿元以下", 0, BigDecimal.ZERO));
+                add(new SubInfoTotalInfoVO("按金额划分", "10-50亿元", 0, BigDecimal.ZERO));
+                add(new SubInfoTotalInfoVO("按金额划分", "50-100亿元", 0, BigDecimal.ZERO));
+                add(new SubInfoTotalInfoVO("按金额划分", "100亿元以上", 0, BigDecimal.ZERO));
+            }};
+            Map<String, SubInfoTotalInfoVO> amtGroup = list.stream()
+                    .collect(Collectors.groupingBy(transaction -> {
+                        for (Map.Entry<String, BigDecimal> entry : groupBoundaries.entrySet()) {
+                            if (transaction.getAmtTotal().compareTo(entry.getValue()) < 0) {
+                                return entry.getKey();
+                            }
+                        }
+                        return "100亿元以上"; // 超过最高范围的默认分组
+                    }))
+                    .entrySet().stream()
+                    .map(entry -> new SubInfoTotalInfoVO(
+                            "按金额划分",
+                            entry.getKey(),
+                            entry.getValue().size(),
+                            entry.getValue().stream()
+                                    .map(SubInfoTotalExcel::getAmtTotal)
+                                    .reduce(BigDecimal.ZERO, BigDecimal::add)
+                                    .divide(new BigDecimal("10000"), 2, RoundingMode.HALF_UP)
+                    ))
+                    .collect(Collectors.toMap(SubInfoTotalInfoVO::getTypeItem, Function.identity()));
+            amtList = amtList.stream().map(e -> {
+                if (amtGroup.get(e.getTypeItem()) != null) {
+                    return amtGroup.get(e.getTypeItem());
+                } else {
+                    return e;
+                }
+            }).collect(Collectors.toList());
+
+            // 3.按行业划分
+            List<SubInfoTotalInfoVO> hyList = new ArrayList<SubInfoTotalInfoVO>() {{
+                hyflMap.forEach((k, v) -> {
+                    add(new SubInfoTotalInfoVO("按行业划分", v, 0, BigDecimal.ZERO));
+                });
+            }};
+            Map<String, SubInfoTotalInfoVO> hyGroup = list.stream()
+                    .collect(Collectors.groupingBy(transaction -> {
+                        String code = transaction.getInduskind();
+                        // 确保code不为空且长度至少为2
+                        if (code == null || code.length() < 2) {
+                            return "未知行业";  // 默认未知行业
+                        }
+                        return code.substring(0, 2);
+                    }))
+                    .entrySet().stream()
+                    .map(entry -> new SubInfoTotalInfoVO(
+                                    "按行业划分",
+                                    hyflMap.getOrDefault(entry.getKey(), entry.getKey()),
+                                    entry.getValue().size(),
+                                    entry.getValue().stream()
+                                            .map(SubInfoTotalExcel::getAmtTotal)
+                                            .reduce(BigDecimal.ZERO, BigDecimal::add)
+                                            .divide(new BigDecimal("10000"), 2, RoundingMode.HALF_UP)
+                            )
+                    )
+                    .collect(Collectors.toMap(SubInfoTotalInfoVO::getTypeItem, Function.identity()));
+            hyList = hyList.stream().map(e -> {
+                if (hyGroup.get(e.getTypeItem()) != null) {
+                    return hyGroup.get(e.getTypeItem());
+                } else {
+                    return e;
+                }
+            }).collect(Collectors.toList());
+            if (hyGroup.get("未知行业") != null) {
+                hyList.add(hyGroup.get("未知行业"));
+            }
+
+            exportData.addAll(ddList);
+            exportData.addAll(amtList);
+            exportData.addAll(hyList);
+            BigDecimal reduce = list.stream().map(SubInfoTotalExcel::getAmtTotal).reduce(BigDecimal.ZERO, BigDecimal::add);
+            exportData.add(new SubInfoTotalInfoVO("合计", "合计", list.size(), reduce.divide(new BigDecimal("10000"), 2, RoundingMode.HALF_UP)));
+            // 4.导出
+            ExportParams exportParams = null;
+            if (vo.getStatus().equals("1")){
+                exportParams = new ExportParams("“四个一批”储备项目库基本情况","“四个一批”储备项目库基本情况", ExcelType.XSSF);
+            }else if (vo.getStatus().equals("2")){
+                exportParams = new ExportParams("“四个一批”新建项目库基本情况","“四个一批”新建项目库基本情况", ExcelType.XSSF);
+            }else if (vo.getStatus().equals("3")){
+                exportParams = new ExportParams("“四个一批”在建项目库基本情况","“四个一批”在建项目库基本情况", ExcelType.XSSF);
+            }else if (vo.getStatus().equals("9")){
+                exportParams = new ExportParams("“四个一批”投产库基本情况","“四个一批”投产库基本情况", ExcelType.XSSF);
+            }else {
+                exportParams = new ExportParams("“四个一批”项目库基本情况","“四个一批”项目库基本情况", ExcelType.XSSF);
+            }
             exportParams.setStyle(ExcelStyleUtil.class);
-            Workbook workbook = ExcelExportUtil.exportExcel(exportParams, entityList, dataList);
+            int mergeTotalStartRow = exportData.size() + 1;
+            Workbook workbook = ExcelExportUtil.exportExcel(exportParams, SubInfoTotalInfoVO.class, exportData);
             response.setContentType("application/xlsx;charset=utf-8");
-            response.setHeader("Content-Disposition", "attachment; filename=" + URLEncodeUtil.encode("项目库总体情况") + System.currentTimeMillis() + ".xlsx");
+            response.setHeader("Content-Disposition", "attachment; filename=" + URLEncodeUtil.encode("项目明细表") + System.currentTimeMillis() + ".xlsx");
+            Sheet sheet = workbook.getSheetAt(0);
+            // 合并单元格
+            sheet.addMergedRegion(new CellRangeAddress(1, 1, 0, 1));
+
+            if (ddList.size() > 1){
+                sheet.addMergedRegion(new CellRangeAddress(2, ddList.size() + 1, 0, 0));
+            }
+            if (amtList.size() > 1){
+                sheet.addMergedRegion(new CellRangeAddress(ddList.size() + 2, ddList.size() + amtList.size() + 1, 0, 0));
+            }
+            if (hyList.size() > 1) {
+                sheet.addMergedRegion(new CellRangeAddress(ddList.size() + amtList.size() + 2, ddList.size() + amtList.size() + hyList.size() + 1, 0, 0));
+            }
+
+            sheet.addMergedRegion(new CellRangeAddress(mergeTotalStartRow, mergeTotalStartRow, 0, 1));
 
             try (OutputStream outputStream = response.getOutputStream()) {
                 workbook.write(outputStream);
+                workbook.close();
             } catch (IOException e) {
                 e.printStackTrace();
-            }finally {
-                try {
-                    workbook.close();
-                } catch (IOException e) {
-                    e.printStackTrace();
-                }
             }
-        }else {
-            // 处理数据
-            List<SubInfoTotalInfoVO> exportData = new ArrayList<>();
-            if (CollectionUtil.isNotEmpty(list)) {
-                // 1.按属地分
-                List<SubInfoTotalInfoVO> ddList = list.stream()
-                        .collect(Collectors.groupingBy(SubInfoTotalExcel::getSubjectId))
-                        .entrySet().stream()
-                        .map(entry -> new SubInfoTotalInfoVO(
-                                "按属地分",
-                                jsddMap.getOrDefault(entry.getKey(), entry.getKey()),
-                                entry.getValue().size(),
-                                entry.getValue().stream()
-                                        .map(SubInfoTotalExcel::getAmtTotal)
-                                        .reduce(BigDecimal.ZERO, BigDecimal::add)
-                                        .divide(new BigDecimal("10000"), 2, RoundingMode.HALF_UP)
-                        ))
-                        .collect(Collectors.toList());
-
-                // 2.按金额分 定义分组边界
-                Map<String, BigDecimal> groupBoundaries = new LinkedHashMap<>();
-                groupBoundaries.put("10亿元以下", new BigDecimal("100000"));
-                groupBoundaries.put("10-50亿元", new BigDecimal("500000"));
-                groupBoundaries.put("50-100亿元", new BigDecimal("1000000"));
-                List<SubInfoTotalInfoVO> amtList = list.stream()
-                        .collect(Collectors.groupingBy(transaction -> {
-                            for (Map.Entry<String, BigDecimal> entry : groupBoundaries.entrySet()) {
-                                if (transaction.getAmtTotal().compareTo(entry.getValue()) < 0) {
-                                    return entry.getKey();
-                                }
-                            }
-                            return "100亿元以上"; // 超过最高范围的默认分组
-                        }))
-                        .entrySet().stream()
-                        .map(entry -> new SubInfoTotalInfoVO(
-                                "按金额分",
-                                entry.getKey(),
-                                entry.getValue().size(),
-                                entry.getValue().stream()
-                                        .map(SubInfoTotalExcel::getAmtTotal)
-                                        .reduce(BigDecimal.ZERO, BigDecimal::add)
-                                        .divide(new BigDecimal("10000"), 2, RoundingMode.HALF_UP)
-                        ))
-                        .collect(Collectors.toList());
-
-                // 3.按行业分
-                List<SubInfoTotalInfoVO> hyList = list.stream()
-                        .collect(Collectors.groupingBy(transaction ->{
-                            String code = transaction.getInduskind();
-                            // 确保code不为空且长度至少为2
-                            if (code == null || code.length() < 2) {
-                                return "未知行业";  // 默认未知行业
-                            }
-                            return code.substring(0, 2);
-                        }))
-                        .entrySet().stream()
-                        .map(entry -> new SubInfoTotalInfoVO(
-                                        "按行业分",
-                                        hyflMap.getOrDefault(entry.getKey(),entry.getKey()),
-                                        entry.getValue().size(),
-                                        entry.getValue().stream()
-                                                .map(SubInfoTotalExcel::getAmtTotal)
-                                                .reduce(BigDecimal.ZERO, BigDecimal::add)
-                                                .divide(new BigDecimal("10000"), 2, RoundingMode.HALF_UP)
-                                )
-                        )
-                        .collect(Collectors.toList());
-                exportData.addAll(ddList);
-                exportData.addAll(amtList);
-                exportData.addAll(hyList);
-                BigDecimal reduce = list.stream().map(SubInfoTotalExcel::getAmtTotal).reduce(BigDecimal.ZERO, BigDecimal::add);
-                exportData.add(new SubInfoTotalInfoVO("合计", "合计", list.size(), reduce.divide(new BigDecimal("10000"), 2, RoundingMode.HALF_UP)));
-                // 4.导出
-                ExportParams exportParams = null;
-                if (vo.getStatus().equals("1")){
-                    exportParams = new ExportParams("“四个一批”储备项目库基本情况","“四个一批”储备项目库基本情况", ExcelType.XSSF);
-                }else if (vo.getStatus().equals("2")){
-                    exportParams = new ExportParams("“四个一批”新建项目库基本情况","“四个一批”新建项目库基本情况", ExcelType.XSSF);
-                }else if (vo.getStatus().equals("3")){
-                    exportParams = new ExportParams("“四个一批”在建项目库基本情况","“四个一批”在建项目库基本情况", ExcelType.XSSF);
-                }else if (vo.getStatus().equals("9")){
-                    exportParams = new ExportParams("“四个一批”投产库基本情况","“四个一批”投产库基本情况", ExcelType.XSSF);
-                }else {
-                    exportParams = new ExportParams("“四个一批”项目库基本情况","“四个一批”项目库基本情况", ExcelType.XSSF);
-                }
-                exportParams.setStyle(ExcelStyleUtil.class);
-                int mergeTotalStartRow = exportData.size() + 1;
-                Workbook workbook = ExcelExportUtil.exportExcel(exportParams, SubInfoTotalInfoVO.class, exportData);
-                response.setContentType("application/xlsx;charset=utf-8");
-                response.setHeader("Content-Disposition", "attachment; filename=" + URLEncodeUtil.encode("项目明细表") + System.currentTimeMillis() + ".xlsx");
-                Sheet sheet = workbook.getSheetAt(0);
-                // 合并单元格
-                sheet.addMergedRegion(new CellRangeAddress(1, 1, 0, 1));
-                sheet.addMergedRegion(new CellRangeAddress(2, ddList.size() + 1, 0, 0));
-                sheet.addMergedRegion(new CellRangeAddress(ddList.size() + 2, ddList.size() + amtList.size() + 1, 0, 0));
-                sheet.addMergedRegion(new CellRangeAddress(ddList.size() + amtList.size() + 2, ddList.size() + amtList.size() + hyList.size() + 1, 0, 0));
-                sheet.addMergedRegion(new CellRangeAddress(mergeTotalStartRow, mergeTotalStartRow, 0, 1));
+        }
+    }
 
-                try (OutputStream outputStream = response.getOutputStream()) {
-                    workbook.write(outputStream);
-                    workbook.close();
-                } catch (IOException e) {
-                    e.printStackTrace();
-                }
+    /**
+     * 四库导出总表
+     */
+    private void exportZkTotal(List<SubInfoTotalExcel> list, Map<String, String> jsddMap, Map<String, String> jsddTitleMap) {
+        // 0.1 按区域构建表头
+        List<String> subjectIds = list.stream().map(SubInfoTotalExcel::getSubjectId).distinct().collect(Collectors.toList());
+        // 创建主表头
+        List<ExcelExportEntity> entityList = new ArrayList<>();
+        // 添加表头
+        ExcelExportEntity lbEntity = new ExcelExportEntity("项目类别", "subjectName");
+        entityList.add(lbEntity);
+
+        ExcelExportEntity hj = new ExcelExportEntity("合计", "hj");
+        List<ExcelExportEntity> subHeadEntities = new ArrayList<>();
+        subHeadEntities.add(getExcelExportEntity("项目个数", "count", 12));
+        subHeadEntities.add(getExcelExportEntity("计划总投资(亿元)", "amt", 20));
+        hj.setList(subHeadEntities);
+        entityList.add(hj);
+
+        // 创建for循环,循环5次
+        List<String> newSubjectIds = new ArrayList<>();
+        if (subjectIds.contains(jsddTitleMap.get("伊州区"))){
+            newSubjectIds.add(jsddTitleMap.get("伊州区"));
+        }
+        if (subjectIds.contains(jsddTitleMap.get("巴里坤县"))){
+            newSubjectIds.add(jsddTitleMap.get("巴里坤县"));
+        }
+        if (subjectIds.contains(jsddTitleMap.get("伊吾县"))){
+            newSubjectIds.add(jsddTitleMap.get("伊吾县"));
+        }
+        if (subjectIds.contains(jsddTitleMap.get("高新区"))){
+            newSubjectIds.add(jsddTitleMap.get("高新区"));
+        }
+        if (subjectIds.contains(jsddTitleMap.get("市本级"))){
+            newSubjectIds.add(jsddTitleMap.get("市本级"));
+        }
+
+
+        for (String subjectId : newSubjectIds) {
+            ExcelExportEntity jsdd = null;
+            if (jsddMap.get(subjectId).equals("市本级")) {
+                jsdd = new ExcelExportEntity("其他", subjectId);
+            }else {
+                jsdd = new ExcelExportEntity(jsddMap.get(subjectId), subjectId);
+            }
+            List<ExcelExportEntity> ddHead = new ArrayList<>();
+            ddHead.add(getExcelExportEntity("项目个数", "count", 12));
+            ddHead.add(getExcelExportEntity("计划总投资(亿元)", "amt", 20));
+            jsdd.setList(ddHead);
+            entityList.add(jsdd);
+        }
+        // 0.2 构建数据
+        Map<String, List<SubInfoTotalExcel>> statusGroup = list.stream().collect(Collectors.groupingBy(SubInfoTotalExcel::getStatus));
+        List<Map<String,Object>> dataList = new ArrayList<>();
+        // 0.2.1 储备项目
+        List<SubInfoTotalExcel> cb = statusGroup.getOrDefault(SubInfoStatusEnum.CB.getCode(),new ArrayList<>());
+        List<SubInfoTotalExcel> xj = statusGroup.getOrDefault(SubInfoStatusEnum.XJ.getCode(),new ArrayList<>());
+        List<SubInfoTotalExcel> zj = statusGroup.getOrDefault(SubInfoStatusEnum.ZJ.getCode(),new ArrayList<>());
+        List<SubInfoTotalExcel> tc = statusGroup.getOrDefault(SubInfoStatusEnum.TC.getCode(),new ArrayList<>());
+
+        fillRowData(subjectIds, dataList, cb, SubInfoStatusEnum.CB.getDesc() + "项目");
+        fillRowData(subjectIds, dataList, xj, SubInfoStatusEnum.XJ.getDesc() + "项目");
+        fillRowData(subjectIds, dataList, zj, SubInfoStatusEnum.ZJ.getDesc() + "项目");
+        fillRowData(subjectIds, dataList, tc, SubInfoStatusEnum.TC.getDesc() + "项目");
+        fillRowData(subjectIds, dataList, list, "合计");
+
+
+        // 3.导出
+        ExportParams exportParams = new ExportParams("哈密市“四个一批”工业项目库总体情况", "项目库总体情况", ExcelType.XSSF);
+        exportParams.setStyle(ExcelStyleUtil.class);
+        Workbook workbook = ExcelExportUtil.exportExcel(exportParams, entityList, dataList);
+        response.setContentType("application/xlsx;charset=utf-8");
+        response.setHeader("Content-Disposition", "attachment; filename=" + URLEncodeUtil.encode("项目库总体情况") + System.currentTimeMillis() + ".xlsx");
+
+        try (OutputStream outputStream = response.getOutputStream()) {
+            workbook.write(outputStream);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }finally {
+            try {
+                workbook.close();
+            } catch (IOException e) {
+                e.printStackTrace();
             }
         }
     }

+ 37 - 36
projects/src/main/webapp/vmodules/leftMenu.jsp

@@ -12,42 +12,6 @@
     </div>
     <div class="expand_collapse_btn" @click="changeSide"></div>
     <div class="layui-side-scroll">
-<%--        <ul class="layui-nav layui-nav-tree" lay-filter="test">--%>
-<%--            <li :class="['layui-nav-item', {'layui-nav-itemed layui-nav-itemed-hand': Number(active) === index}]"--%>
-<%--                v-for="(item, index) in navLs" :key="index" v-if="menuCode.indexOf(item.code) >= 0"--%>
-<%--            >--%>
-<%--                <a :title="item.txt" @click="onSelectItem(index)" href="javascript:;">--%>
-<%--                    <div class="left">--%>
-<%--                        <i class='icon'--%>
-<%--                           :class="Number(active) === index ? item.activeIcon : item.icon"--%>
-<%--                        ></i>{{item.txt}}--%>
-<%--                    </div>--%>
-<%--                    <i class="layui-icon layui-icon-down"></i>--%>
-<%--                </a>--%>
-
-<%--                <!-- 二级菜单 -->--%>
-<%--                <dl class="layui-nav-child" v-if="item.child != null">--%>
-<%--                    <dd v-if="menuCode.indexOf(it.code) >= 0"--%>
-<%--                        v-for="(it, ind) in item.child" :key="'inner_' + ind"--%>
-<%--                        :class="{'layui-this': it.code === curSelectedMenu}"--%>
-<%--                    >--%>
-<%--                        <a :title="it.txt" href="javascript:;"--%>
-<%--                           @click="onSelectItem(index, ind)"--%>
-<%--                        >{{it.txt}}</a>--%>
-
-<%--                        <!-- 三级菜单 -->--%>
-<%--                        <dl class="layui-nav-child" v-if="it.child != null">--%>
-<%--                            <dd v-for="(third, thirdInd) in it.child" :key="'third_' + thirdInd"--%>
-<%--                            >--%>
-<%--                                <a :title="third.txt" href="javascript:;"--%>
-<%--                                   @click="onSelectItem(ind, thirdInd)"--%>
-<%--                                >{{third.txt}}</a>--%>
-<%--                            </dd>--%>
-<%--                        </dl>--%>
-<%--                    </dd>--%>
-<%--                </dl>--%>
-<%--            </li>--%>
-<%--        </ul>--%>
         <ul class="layui-nav layui-nav-tree" lay-filter="test">
             <li :class="['layui-nav-item', {'layui-nav-itemed layui-nav-itemed-hand': Number(active) === index}]"
                 v-for="(item, index) in navLs" :key="index" v-if="menuCode.indexOf(item.code) >= 0"
@@ -70,6 +34,16 @@
                         <a :title="it.txt" href="javascript:;"
                            @click="onSelectItem(index,ind)"
                         >{{it.txt}}</a>
+
+                        <!-- 三级菜单 -->
+                        <dl class="layui-nav-child" v-if="it.child != null">
+                            <dd v-for="(third, thirdInd) in it.child" :key="'third_' + thirdInd"
+                            >
+                                <a :title="third.txt" href="javascript:;"
+                                   @click="onSelectItem2(index, ind, thirdInd)"
+                                >{{third.txt}}</a>
+                            </dd>
+                        </dl>
                     </dd>
                 </dl>
             </li>
@@ -533,6 +507,33 @@
                     this.topBreadcrumb = this.navLs[index].txt
                 }
             },
+            onSelectItem2: function (index, ind,thirdInd) {
+                this.active = index;
+                if (thirdInd != undefined) {
+                    var chooseNode = this.navLs[index]["child"][ind]["child"][thirdInd];
+                    if (chooseNode.url) {
+                        if (chooseNode.before && typeof (chooseNode.before) == 'function') {
+                            chooseNode.before();
+                        }
+                        window.location.hash = index + "_" + ind;
+                        var parentNodeText = this.navLs[index]["child"][ind].txt;
+                        this.curSelectedMenu = this.navLs[index]["child"][ind].child?.[thirdInd].code ?? ''
+                        $("#rightContent").attr("src", App.getUrl(chooseNode.url));
+                        const htmlStr = '<span style="margin-right: 5px; color: #dde1e6;">' + parentNodeText + ' /</span>' + chooseNode.txt
+                        this.topBreadcrumb = htmlStr
+                    } else {
+                        App.msg.warn("正在建设中");
+                    }
+                } else if (this.navLs[index]["child"][ind].url) {
+                    var chooseNode = this.navLs[index]["child"][ind];
+                    if (chooseNode.before && typeof (chooseNode.before) == 'function') {
+                        chooseNode.before();
+                    }
+                    window.location.hash = ind;
+                    $("#rightContent").attr("src", App.getUrl(this.navLs[index]["child"][ind].url));
+                    this.topBreadcrumb = this.navLs[index]["child"][ind].txt
+                }
+            },
             onChangeActive: function (index) {
                 this.tabActive = index
             },

+ 1 - 1
projects/src/main/webapp/vmodules/project/projectInfo.jsp

@@ -133,7 +133,7 @@
                     <td style="width: 40%">${sunInfo.subName }</td>
                 </tr>
                 <tr>
-                    <td class="label" style="width: 10%">建设性质</td>
+                    <td class="label" style="width: 10%">4库状态</td>
                     <td style="width: 40%">${sunInfo.statusName }</td>
                     <td class="label" style="width: 10%">所属行业</td>
                     <td style="width: 40%">${sunInfo.indusName }</td>

+ 2 - 2
projects/src/main/webapp/vmodules/subject/subInfo/tz/cb.jsp

@@ -284,10 +284,10 @@
                         <img src="${WebSite.asset}/css/images/left/export.svg"/>
                         <span>导出</span>
                     </div>
-                    <div class="export-item" v-if="showExport" :style="{ top: '-93px' }">
+                    <div class="export-item" v-if="showExport" :style="{ top: '-62px' }">
                         <button type="button" class="" @click="exportDetailExcel">导出明细</button>
                         <button type="button" class="" @click="exportTotalExcel">导出总表</button>
-                        <button type="button" class="" @click="exportMoreExcel">自定义导出</button>
+<%--                        <button type="button" class="" @click="exportMoreExcel">自定义导出</button>--%>
                     </div>
                 </div>
                 <table id="table1" lay-filter="test"></table>

+ 2 - 2
projects/src/main/webapp/vmodules/subject/subInfo/tz/end.jsp

@@ -313,10 +313,10 @@
                         <img src="${WebSite.asset}/css/images/left/export.svg"/>
                         <span>导出</span>
                     </div>
-                    <div class="export-item" v-if="showExport" :style="{ top: '-93px' }">
+                    <div class="export-item" v-if="showExport" :style="{ top: '-62px' }">
                         <button type="button" class="" @click="exportDetailExcel">导出明细</button>
                         <button type="button" class="" @click="exportTotalExcel">导出总表</button>
-                        <button type="button" class="" @click="exportMoreExcel">自定义导出</button>
+<%--                        <button type="button" class="" @click="exportMoreExcel">自定义导出</button>--%>
                     </div>
                 </div>
 

+ 2 - 2
projects/src/main/webapp/vmodules/subject/subInfo/tz/main.jsp

@@ -374,10 +374,10 @@
                         <img src="${WebSite.asset}/css/images/left/export.svg"/>
                         <span>导出</span>
                     </div>
-                    <div class="export-item" v-if="showExport" :style="{ top: '-93px' }">
+                    <div class="export-item" v-if="showExport" :style="{ top: '-62px' }">
                         <button type="button" class="" @click="exportDetailExcel">导出明细</button>
                         <button type="button" class="" @click="exportTotalExcel">导出总表</button>
-                        <button type="button" class="" @click="exportMoreExcel">自定义导出</button>
+<%--                        <button type="button" class="" @click="exportMoreExcel">自定义导出</button>--%>
                     </div>
                 </div>
                 <table id="table1" lay-filter="test" style="position: relative;"></table>

+ 2 - 2
projects/src/main/webapp/vmodules/subject/subInfo/tz/new.jsp

@@ -276,10 +276,10 @@
                         <img src="${WebSite.asset}/css/images/left/export.svg"/>
                         <span>导出</span>
                     </div>
-                    <div class="export-item" v-if="showExport" :style="{ top: '-93px' }">
+                    <div class="export-item" v-if="showExport" :style="{ top: '-62px' }">
                         <button type="button" class="" @click="exportDetailExcel">导出明细</button>
                         <button type="button" class="" @click="exportTotalExcel">导出总表</button>
-                        <button type="button" class="" @click="exportMoreExcel">自定义导出</button>
+<%--                        <button type="button" class="" @click="exportMoreExcel">自定义导出</button>--%>
                     </div>
                 </div>
                 <table id="table1" lay-filter="test"></table>

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

@@ -284,7 +284,7 @@
                         <img src="${WebSite.asset}/css/images/left/export.svg"/>
                         <span>导出</span>
                     </div>
-                    <div class="export-item" v-if="showExport" :style="{ top: '-93px' }">
+                    <div class="export-item" v-if="showExport" :style="{ top: '-62px' }">
                         <button type="button" class="" @click="exportFixDetailExcel">项目明细导出</button>
                         <button type="button" class="" @click="exportFixTotalExcel">项目汇总导出</button>
                     </div>

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

@@ -281,7 +281,7 @@
                         <img src="${WebSite.asset}/css/images/left/export.svg"/>
                         <span>导出</span>
                     </div>
-                    <div class="export-item" v-if="showExport" :style="{ top: '-93px' }">
+                    <div class="export-item" v-if="showExport" :style="{ top: '-62px' }">
                         <button type="button" class="" @click="exportFixDetailExcel">项目明细导出</button>
                         <button type="button" class="" @click="exportFixTotalExcel">项目汇总导出</button>
                     </div>

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

@@ -345,7 +345,7 @@
                         <img src="${WebSite.asset}/css/images/left/export.svg"/>
                         <span>导出</span>
                     </div>
-                    <div class="export-item" v-if="showExport" :style="{ top: '-93px' }">
+                    <div class="export-item" v-if="showExport" :style="{ top: '-62px' }">
                         <button type="button" class="" @click="exportFixDetailExcel">项目明细导出</button>
                         <button type="button" class="" @click="exportFixTotalExcel">项目汇总导出</button>
                     </div>

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

@@ -298,7 +298,7 @@
                         <img src="${WebSite.asset}/css/images/left/export.svg"/>
                         <span>导出</span>
                     </div>
-                    <div class="export-item" v-if="showExport" :style="{ top: '-93px' }">
+                    <div class="export-item" v-if="showExport" :style="{ top: '-62px' }">
                         <button type="button" class="" @click="exportFixDetailExcel">项目明细导出</button>
                         <button type="button" class="" @click="exportFixTotalExcel">项目汇总导出</button>
                     </div>