Commit 30ada1c3398f68687cf2ce4a5be597b76a24d440

Authored by wangqian
1 parent e8e13752

1、批量导出模板中,去掉抢险中照片、抢险结束照片,这两个字段,以便用户导出全量数据做数据分析。

2、批量导出模板中,机械信息字段展示数据不正确。
urbanops-framework/urbanops-spring-boot-starter-excel/src/main/java/com/zteits/urbanops/framework/excel/core/handler/CellVerticalCenterStyleStrategy.java 0 → 100644
  1 +package com.zteits.urbanops.framework.excel.core.handler;
  2 +
  3 +import cn.idev.excel.write.handler.context.CellWriteHandlerContext;
  4 +import cn.idev.excel.write.style.AbstractCellStyleStrategy;
  5 +import org.apache.poi.ss.usermodel.Cell;
  6 +import org.apache.poi.ss.usermodel.CellStyle;
  7 +import org.apache.poi.ss.usermodel.VerticalAlignment;
  8 +
  9 +/**
  10 + * Excel 单元格垂直居中样式策略
  11 + *
  12 + * 所有单元格内容上下居中
  13 + *
  14 + * @author hmb
  15 + */
  16 +public class CellVerticalCenterStyleStrategy extends AbstractCellStyleStrategy {
  17 +
  18 + @Override
  19 + protected void setHeadCellStyle(CellWriteHandlerContext context) {
  20 + setVerticalCenter(context.getCell());
  21 + }
  22 +
  23 + @Override
  24 + protected void setContentCellStyle(CellWriteHandlerContext context) {
  25 + setVerticalCenter(context.getCell());
  26 + }
  27 +
  28 + /**
  29 + * 设置单元格垂直居中
  30 + */
  31 + private void setVerticalCenter(Cell cell) {
  32 + CellStyle cellStyle = cell.getCellStyle();
  33 + cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
  34 + cell.setCellStyle(cellStyle);
  35 + }
  36 +}
urbanops-framework/urbanops-spring-boot-starter-excel/src/main/java/com/zteits/urbanops/framework/excel/core/util/ExcelUtils.java
@@ -6,6 +6,7 @@ import cn.idev.excel.FastExcelFactory; @@ -6,6 +6,7 @@ import cn.idev.excel.FastExcelFactory;
6 import cn.idev.excel.converters.longconverter.LongStringConverter; 6 import cn.idev.excel.converters.longconverter.LongStringConverter;
7 import cn.idev.excel.write.builder.ExcelWriterBuilder; 7 import cn.idev.excel.write.builder.ExcelWriterBuilder;
8 import com.zteits.urbanops.framework.common.util.http.HttpUtils; 8 import com.zteits.urbanops.framework.common.util.http.HttpUtils;
  9 +import com.zteits.urbanops.framework.excel.core.handler.CellVerticalCenterStyleStrategy;
9 import com.zteits.urbanops.framework.excel.core.handler.ColumnWidthMatchStyleStrategy; 10 import com.zteits.urbanops.framework.excel.core.handler.ColumnWidthMatchStyleStrategy;
10 import com.zteits.urbanops.framework.excel.core.handler.HeadMergeHandler; 11 import com.zteits.urbanops.framework.excel.core.handler.HeadMergeHandler;
11 import com.zteits.urbanops.framework.excel.core.handler.SelectSheetWriteHandler; 12 import com.zteits.urbanops.framework.excel.core.handler.SelectSheetWriteHandler;
@@ -139,6 +140,7 @@ public class ExcelUtils { @@ -139,6 +140,7 @@ public class ExcelUtils {
139 .head(headList) //动态自定义3行表头 140 .head(headList) //动态自定义3行表头
140 .autoCloseStream(true) // 自动关闭 141 .autoCloseStream(true) // 自动关闭
141 .registerWriteHandler(new ColumnWidthMatchStyleStrategy()) // 基于 column 长度,自动适配。最大 255 宽度 142 .registerWriteHandler(new ColumnWidthMatchStyleStrategy()) // 基于 column 长度,自动适配。最大 255 宽度
  143 + //.registerWriteHandler(new CellVerticalCenterStyleStrategy()) //垂直居中
142 .registerWriteHandler(new SelectSheetWriteHandler(head)) // 基于固定 sheet 实现下拉框 144 .registerWriteHandler(new SelectSheetWriteHandler(head)) // 基于固定 sheet 实现下拉框
143 .registerConverter(new LongStringConverter()) // 避免 Long 类型丢失精度 145 .registerConverter(new LongStringConverter()) // 避免 Long 类型丢失精度
144 .registerWriteHandler(new HeadMergeHandler(mergeList.toArray(new CellRangeAddress[0]))); 146 .registerWriteHandler(new HeadMergeHandler(mergeList.toArray(new CellRangeAddress[0])));
@@ -146,6 +148,7 @@ public class ExcelUtils { @@ -146,6 +148,7 @@ public class ExcelUtils {
146 writeBuilder = FastExcelFactory.write(fos, head) 148 writeBuilder = FastExcelFactory.write(fos, head)
147 .autoCloseStream(true) // 自动关闭 149 .autoCloseStream(true) // 自动关闭
148 .registerWriteHandler(new ColumnWidthMatchStyleStrategy()) // 基于 column 长度,自动适配。最大 255 宽度 150 .registerWriteHandler(new ColumnWidthMatchStyleStrategy()) // 基于 column 长度,自动适配。最大 255 宽度
  151 + //.registerWriteHandler(new CellVerticalCenterStyleStrategy()) //垂直居中
149 .registerWriteHandler(new SelectSheetWriteHandler(head)) // 基于固定 sheet 实现下拉框 152 .registerWriteHandler(new SelectSheetWriteHandler(head)) // 基于固定 sheet 实现下拉框
150 .registerConverter(new LongStringConverter()); // 避免 Long 类型丢失精度 153 .registerConverter(new LongStringConverter()); // 避免 Long 类型丢失精度
151 } 154 }
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/emergencytask/vo/EmergencyTaskExcleRespVO.java
@@ -64,11 +64,11 @@ public class EmergencyTaskExcleRespVO { @@ -64,11 +64,11 @@ public class EmergencyTaskExcleRespVO {
64 @ExcelProperty("抢险开始时间") 64 @ExcelProperty("抢险开始时间")
65 private LocalDateTime rescueStartTime; 65 private LocalDateTime rescueStartTime;
66 66
67 - @Schema(description = "抢险中照片", requiredMode = Schema.RequiredMode.REQUIRED) 67 + //@Schema(description = "抢险中照片", requiredMode = Schema.RequiredMode.REQUIRED)
68 //@ExcelProperty(value="抢险中照片", converter = ListToStringConverter.class) 68 //@ExcelProperty(value="抢险中照片", converter = ListToStringConverter.class)
69 - @ExcelProperty(value = "抢险中照片", converter = ImageListConverter.class)  
70 - @ColumnWidth(70)  
71 - private List<byte[]> emergencyImg; 69 + //@ExcelProperty(value = "抢险中照片", converter = ImageListConverter.class)
  70 + //@ColumnWidth(70)
  71 + //private List<byte[]> emergencyImg;
72 72
73 @Schema(description = "树种(如:国槐)") 73 @Schema(description = "树种(如:国槐)")
74 @ExcelProperty("树种") 74 @ExcelProperty("树种")
@@ -86,11 +86,11 @@ public class EmergencyTaskExcleRespVO { @@ -86,11 +86,11 @@ public class EmergencyTaskExcleRespVO {
86 @ExcelProperty("出动人员数量") 86 @ExcelProperty("出动人员数量")
87 private Integer personnelCount; 87 private Integer personnelCount;
88 88
89 - @Schema(description = "抢险结束照片", requiredMode = Schema.RequiredMode.REQUIRED) 89 + //@Schema(description = "抢险结束照片", requiredMode = Schema.RequiredMode.REQUIRED)
90 //@ExcelProperty(value="抢险结束照片", converter = ListToStringConverter.class) 90 //@ExcelProperty(value="抢险结束照片", converter = ListToStringConverter.class)
91 - @ExcelProperty(value = "抢险结束照片", converter = ImageListConverter.class)  
92 - @ColumnWidth(70)  
93 - private List<byte[]> emergencyEndImg; 91 + //@ExcelProperty(value = "抢险结束照片", converter = ImageListConverter.class)
  92 + //@ColumnWidth(70)
  93 + //private List<byte[]> emergencyEndImg;
94 94
95 @Schema(description = "备注") 95 @Schema(description = "备注")
96 @ExcelProperty("备注") 96 @ExcelProperty("备注")
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/emergencytask/vo/EmergencyTaskSaveReqVO.java
@@ -38,6 +38,7 @@ public class EmergencyTaskSaveReqVO { @@ -38,6 +38,7 @@ public class EmergencyTaskSaveReqVO {
38 private String emergencyLocation; 38 private String emergencyLocation;
39 39
40 @Schema(description = "上报人", requiredMode = Schema.RequiredMode.REQUIRED) 40 @Schema(description = "上报人", requiredMode = Schema.RequiredMode.REQUIRED)
  41 + @NotEmpty(message = "上报人不能为空")
41 private String reporter; 42 private String reporter;
42 43
43 @Schema(description = "联系电话", requiredMode = Schema.RequiredMode.REQUIRED) 44 @Schema(description = "联系电话", requiredMode = Schema.RequiredMode.REQUIRED)
@@ -56,10 +57,12 @@ public class EmergencyTaskSaveReqVO { @@ -56,10 +57,12 @@ public class EmergencyTaskSaveReqVO {
56 57
57 @Schema(description = "树种(如:国槐)") 58 @Schema(description = "树种(如:国槐)")
58 @Size(max = 100, message = "险情地点长度不能超过 255 个字符") 59 @Size(max = 100, message = "险情地点长度不能超过 255 个字符")
  60 + @NotEmpty(message = "树种不能为空")
59 private String treeSpecies; 61 private String treeSpecies;
60 62
61 @Schema(description = "树木规格(如:胸径20厘米)") 63 @Schema(description = "树木规格(如:胸径20厘米)")
62 @Size(max = 100, message = "树木规格100个字符") 64 @Size(max = 100, message = "树木规格100个字符")
  65 + @NotEmpty(message = "树木规格不能为空")
63 private String treeSpec; 66 private String treeSpec;
64 67
65 @Schema(description = "抢险完成时间", requiredMode = Schema.RequiredMode.REQUIRED) 68 @Schema(description = "抢险完成时间", requiredMode = Schema.RequiredMode.REQUIRED)
@@ -71,6 +74,7 @@ public class EmergencyTaskSaveReqVO { @@ -71,6 +74,7 @@ public class EmergencyTaskSaveReqVO {
71 private Integer personnelCount; 74 private Integer personnelCount;
72 75
73 @Schema(description = "抢险结束照片", requiredMode = Schema.RequiredMode.REQUIRED) 76 @Schema(description = "抢险结束照片", requiredMode = Schema.RequiredMode.REQUIRED)
  77 + @NotEmpty(message = "抢险后照片不能为空")
74 private List<String> emergencyEndImg; 78 private List<String> emergencyEndImg;
75 79
76 @Schema(description = "备注") 80 @Schema(description = "备注")
@@ -96,6 +100,7 @@ public class EmergencyTaskSaveReqVO { @@ -96,6 +100,7 @@ public class EmergencyTaskSaveReqVO {
96 private String approvalUserName; 100 private String approvalUserName;
97 101
98 @Schema(description = "使用机械", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六") 102 @Schema(description = "使用机械", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六")
  103 + @NotEmpty(message = "抢险后照片不能为空")
99 private List<EmergencyMachinerySaveReqVO> emergencyMachineryList; 104 private List<EmergencyMachinerySaveReqVO> emergencyMachineryList;
100 105
101 @Schema(description = "险情类型数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") 106 @Schema(description = "险情类型数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/emergencytask/EmergencyExportHandler.java
@@ -19,8 +19,6 @@ import java.util.*; @@ -19,8 +19,6 @@ import java.util.*;
19 import java.util.concurrent.ConcurrentHashMap; 19 import java.util.concurrent.ConcurrentHashMap;
20 import java.util.stream.Collectors; 20 import java.util.stream.Collectors;
21 21
22 -import static com.zteits.urbanops.module.garden.service.filedownload.ExcelExportAsyncService.BATCH_SIZE;  
23 -  
24 /** 22 /**
25 * 应急任务导出处理器 23 * 应急任务导出处理器
26 * 实现 ExcelExportHandler 接口,替代原抽象类继承 24 * 实现 ExcelExportHandler 接口,替代原抽象类继承
@@ -36,7 +34,7 @@ public class EmergencyExportHandler implements ExcelExportHandler&lt;EmergencyTaskR @@ -36,7 +34,7 @@ public class EmergencyExportHandler implements ExcelExportHandler&lt;EmergencyTaskR
36 private static final String DICT_HAZARD_TYPE = "hazard_type"; 34 private static final String DICT_HAZARD_TYPE = "hazard_type";
37 private static final String DICT_HAZARD_RISK = "hazard_risk"; 35 private static final String DICT_HAZARD_RISK = "hazard_risk";
38 private static final String DICT_TREE_PERMISSIONS = "tree_permissions"; 36 private static final String DICT_TREE_PERMISSIONS = "tree_permissions";
39 - private static final String DICT_MECHANICAL_TYPE = "mechanical_type"; 37 + private static final String DICT_MECHANICAL_TYPE = "mechanical_type_name";
40 private static final String DICT_RESCUE_STATUS = "rescue_status"; 38 private static final String DICT_RESCUE_STATUS = "rescue_status";
41 39
42 @Resource 40 @Resource
@@ -56,7 +54,7 @@ public class EmergencyExportHandler implements ExcelExportHandler&lt;EmergencyTaskR @@ -56,7 +54,7 @@ public class EmergencyExportHandler implements ExcelExportHandler&lt;EmergencyTaskR
56 Map<String, String> mechanicalTypeDict = getDictMap(DICT_MECHANICAL_TYPE); 54 Map<String, String> mechanicalTypeDict = getDictMap(DICT_MECHANICAL_TYPE);
57 Map<String, String> rescueStatusDict = getDictMap(DICT_RESCUE_STATUS); 55 Map<String, String> rescueStatusDict = getDictMap(DICT_RESCUE_STATUS);
58 // 初始化文件客户端 56 // 初始化文件客户端
59 - FileClient fileClient = fileConfigService.getMasterFileClient(); 57 + //FileClient fileClient = fileConfigService.getMasterFileClient();
60 58
61 for (EmergencyTaskRespVO task : batchList) { 59 for (EmergencyTaskRespVO task : batchList) {
62 EmergencyTaskExcleRespVO vo = new EmergencyTaskExcleRespVO(); 60 EmergencyTaskExcleRespVO vo = new EmergencyTaskExcleRespVO();
@@ -88,8 +86,8 @@ public class EmergencyExportHandler implements ExcelExportHandler&lt;EmergencyTaskR @@ -88,8 +86,8 @@ public class EmergencyExportHandler implements ExcelExportHandler&lt;EmergencyTaskR
88 vo.setBusiStatus(getLabel(rescueStatusDict, task.getBusiStatus())); 86 vo.setBusiStatus(getLabel(rescueStatusDict, task.getBusiStatus()));
89 87
90 // 图片下载处理 88 // 图片下载处理
91 - vo.setEmergencyImg(ImgDownUtils.batchDownloadImages(task.getEmergencyImg(), fileClient));  
92 - vo.setEmergencyEndImg(ImgDownUtils.batchDownloadImages(task.getEmergencyEndImg(), fileClient)); 89 + //vo.setEmergencyImg(ImgDownUtils.batchDownloadImages(task.getEmergencyImg(), fileClient));
  90 + //vo.setEmergencyEndImg(ImgDownUtils.batchDownloadImages(task.getEmergencyEndImg(), fileClient));
93 91
94 // 机械设备信息拼接 92 // 机械设备信息拼接
95 List<String> machineryInfoList = new ArrayList<>(); 93 List<String> machineryInfoList = new ArrayList<>();
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/emergencytask/EmergencyExportNewHandler.java
@@ -15,11 +15,8 @@ import org.springframework.util.CollectionUtils; @@ -15,11 +15,8 @@ import org.springframework.util.CollectionUtils;
15 15
16 import java.util.*; 16 import java.util.*;
17 import java.util.concurrent.ConcurrentHashMap; 17 import java.util.concurrent.ConcurrentHashMap;
18 -import java.util.concurrent.atomic.AtomicInteger;  
19 import java.util.stream.Collectors; 18 import java.util.stream.Collectors;
20 19
21 -import static com.zteits.urbanops.module.garden.service.filedownload.ExcelExportAsyncService.BATCH_SIZE;  
22 -  
23 /** 20 /**
24 * 新版应急任务导出处理器 21 * 新版应急任务导出处理器
25 * 实现 ExcelExportHandler 接口 22 * 实现 ExcelExportHandler 接口
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/filedownload/ExcelExportAsyncService.java
@@ -15,6 +15,7 @@ import org.springframework.util.CollectionUtils; @@ -15,6 +15,7 @@ import org.springframework.util.CollectionUtils;
15 15
16 import java.io.File; 16 import java.io.File;
17 import java.io.IOException; 17 import java.io.IOException;
  18 +import java.nio.charset.StandardCharsets;
18 import java.time.LocalDateTime; 19 import java.time.LocalDateTime;
19 import java.util.ArrayList; 20 import java.util.ArrayList;
20 import java.util.List; 21 import java.util.List;
@@ -28,8 +29,8 @@ public class ExcelExportAsyncService { @@ -28,8 +29,8 @@ public class ExcelExportAsyncService {
28 29
29 @Value("${file.upload-local.expire-days}") 30 @Value("${file.upload-local.expire-days}")
30 private Integer expireDay; 31 private Integer expireDay;
31 -  
32 - public static final int BATCH_SIZE = 50; 32 + //分页大小
  33 + private int BATCH_SIZE = 1000;
33 34
34 private final FileDownloadMapper fileDownloadMapper; 35 private final FileDownloadMapper fileDownloadMapper;
35 36
@@ -109,6 +110,10 @@ public class ExcelExportAsyncService { @@ -109,6 +110,10 @@ public class ExcelExportAsyncService {
109 log.info("导出数据为空,业务编码:{}", downloadDO.getBusiCode()); 110 log.info("导出数据为空,业务编码:{}", downloadDO.getBusiCode());
110 return; 111 return;
111 } 112 }
  113 + //存在大量图片,设置较小值防止内存溢出
  114 + if ("EmergencyTaskExcleNew".equals(downloadDO.getBusiCode())) {
  115 + BATCH_SIZE = 50;
  116 + }
112 WriteSheet writeSheet 117 WriteSheet writeSheet
113 = EasyExcel.writerSheet(sheetName).build(); 118 = EasyExcel.writerSheet(sheetName).build();
114 int total = sourceList.size(); 119 int total = sourceList.size();
@@ -126,7 +131,15 @@ public class ExcelExportAsyncService { @@ -126,7 +131,15 @@ public class ExcelExportAsyncService {
126 } 131 }
127 132
128 private String buildFilePath(FileDownloadDO downloadDO) { 133 private String buildFilePath(FileDownloadDO downloadDO) {
129 - return new File(localExcelPath, downloadDO.getFileName()).getAbsolutePath(); 134 + //return new File(localExcelPath, downloadDO.getFileName()).getAbsolutePath();
  135 + String fileName = downloadDO.getFileName();
  136 + // 统一UTF-8转码,解决Linux中文文件名乱码
  137 + byte[] nameBytes = fileName.getBytes(StandardCharsets.UTF_8);
  138 + String safeFileName = new String(nameBytes, StandardCharsets.UTF_8);
  139 + // 剔除操作系统非法字符
  140 + safeFileName = safeFileName.replaceAll("[\\\\/:*?\"<>|]", "_");
  141 + File targetFile = new File(localExcelPath, safeFileName);
  142 + return targetFile.getAbsolutePath();
130 } 143 }
131 144
132 private void updateSuccess(FileDownloadDO downloadDO) { 145 private void updateSuccess(FileDownloadDO downloadDO) {