diff --git a/urbanops-framework/urbanops-spring-boot-starter-excel/src/main/java/com/zteits/urbanops/framework/excel/core/handler/CellVerticalCenterStyleStrategy.java b/urbanops-framework/urbanops-spring-boot-starter-excel/src/main/java/com/zteits/urbanops/framework/excel/core/handler/CellVerticalCenterStyleStrategy.java new file mode 100644 index 0000000..8411ab2 --- /dev/null +++ b/urbanops-framework/urbanops-spring-boot-starter-excel/src/main/java/com/zteits/urbanops/framework/excel/core/handler/CellVerticalCenterStyleStrategy.java @@ -0,0 +1,36 @@ +package com.zteits.urbanops.framework.excel.core.handler; + +import cn.idev.excel.write.handler.context.CellWriteHandlerContext; +import cn.idev.excel.write.style.AbstractCellStyleStrategy; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.VerticalAlignment; + +/** + * Excel 单元格垂直居中样式策略 + * + * 所有单元格内容上下居中 + * + * @author hmb + */ +public class CellVerticalCenterStyleStrategy extends AbstractCellStyleStrategy { + + @Override + protected void setHeadCellStyle(CellWriteHandlerContext context) { + setVerticalCenter(context.getCell()); + } + + @Override + protected void setContentCellStyle(CellWriteHandlerContext context) { + setVerticalCenter(context.getCell()); + } + + /** + * 设置单元格垂直居中 + */ + private void setVerticalCenter(Cell cell) { + CellStyle cellStyle = cell.getCellStyle(); + cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); + cell.setCellStyle(cellStyle); + } +} diff --git a/urbanops-framework/urbanops-spring-boot-starter-excel/src/main/java/com/zteits/urbanops/framework/excel/core/util/ExcelUtils.java b/urbanops-framework/urbanops-spring-boot-starter-excel/src/main/java/com/zteits/urbanops/framework/excel/core/util/ExcelUtils.java index 0ac7d43..6c26e79 100644 --- a/urbanops-framework/urbanops-spring-boot-starter-excel/src/main/java/com/zteits/urbanops/framework/excel/core/util/ExcelUtils.java +++ b/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; import cn.idev.excel.converters.longconverter.LongStringConverter; import cn.idev.excel.write.builder.ExcelWriterBuilder; import com.zteits.urbanops.framework.common.util.http.HttpUtils; +import com.zteits.urbanops.framework.excel.core.handler.CellVerticalCenterStyleStrategy; import com.zteits.urbanops.framework.excel.core.handler.ColumnWidthMatchStyleStrategy; import com.zteits.urbanops.framework.excel.core.handler.HeadMergeHandler; import com.zteits.urbanops.framework.excel.core.handler.SelectSheetWriteHandler; @@ -139,6 +140,7 @@ public class ExcelUtils { .head(headList) //动态自定义3行表头 .autoCloseStream(true) // 自动关闭 .registerWriteHandler(new ColumnWidthMatchStyleStrategy()) // 基于 column 长度,自动适配。最大 255 宽度 + //.registerWriteHandler(new CellVerticalCenterStyleStrategy()) //垂直居中 .registerWriteHandler(new SelectSheetWriteHandler(head)) // 基于固定 sheet 实现下拉框 .registerConverter(new LongStringConverter()) // 避免 Long 类型丢失精度 .registerWriteHandler(new HeadMergeHandler(mergeList.toArray(new CellRangeAddress[0]))); @@ -146,6 +148,7 @@ public class ExcelUtils { writeBuilder = FastExcelFactory.write(fos, head) .autoCloseStream(true) // 自动关闭 .registerWriteHandler(new ColumnWidthMatchStyleStrategy()) // 基于 column 长度,自动适配。最大 255 宽度 + //.registerWriteHandler(new CellVerticalCenterStyleStrategy()) //垂直居中 .registerWriteHandler(new SelectSheetWriteHandler(head)) // 基于固定 sheet 实现下拉框 .registerConverter(new LongStringConverter()); // 避免 Long 类型丢失精度 } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/emergencytask/vo/EmergencyTaskExcleRespVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/emergencytask/vo/EmergencyTaskExcleRespVO.java index 9671a01..cd996e9 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/emergencytask/vo/EmergencyTaskExcleRespVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/emergencytask/vo/EmergencyTaskExcleRespVO.java @@ -64,11 +64,11 @@ public class EmergencyTaskExcleRespVO { @ExcelProperty("抢险开始时间") private LocalDateTime rescueStartTime; - @Schema(description = "抢险中照片", requiredMode = Schema.RequiredMode.REQUIRED) + //@Schema(description = "抢险中照片", requiredMode = Schema.RequiredMode.REQUIRED) //@ExcelProperty(value="抢险中照片", converter = ListToStringConverter.class) - @ExcelProperty(value = "抢险中照片", converter = ImageListConverter.class) - @ColumnWidth(70) - private List emergencyImg; + //@ExcelProperty(value = "抢险中照片", converter = ImageListConverter.class) + //@ColumnWidth(70) + //private List emergencyImg; @Schema(description = "树种(如:国槐)") @ExcelProperty("树种") @@ -86,11 +86,11 @@ public class EmergencyTaskExcleRespVO { @ExcelProperty("出动人员数量") private Integer personnelCount; - @Schema(description = "抢险结束照片", requiredMode = Schema.RequiredMode.REQUIRED) + //@Schema(description = "抢险结束照片", requiredMode = Schema.RequiredMode.REQUIRED) //@ExcelProperty(value="抢险结束照片", converter = ListToStringConverter.class) - @ExcelProperty(value = "抢险结束照片", converter = ImageListConverter.class) - @ColumnWidth(70) - private List emergencyEndImg; + //@ExcelProperty(value = "抢险结束照片", converter = ImageListConverter.class) + //@ColumnWidth(70) + //private List emergencyEndImg; @Schema(description = "备注") @ExcelProperty("备注") diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/emergencytask/vo/EmergencyTaskSaveReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/emergencytask/vo/EmergencyTaskSaveReqVO.java index 6068f76..e725470 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/emergencytask/vo/EmergencyTaskSaveReqVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/emergencytask/vo/EmergencyTaskSaveReqVO.java @@ -38,6 +38,7 @@ public class EmergencyTaskSaveReqVO { private String emergencyLocation; @Schema(description = "上报人", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "上报人不能为空") private String reporter; @Schema(description = "联系电话", requiredMode = Schema.RequiredMode.REQUIRED) @@ -56,10 +57,12 @@ public class EmergencyTaskSaveReqVO { @Schema(description = "树种(如:国槐)") @Size(max = 100, message = "险情地点长度不能超过 255 个字符") + @NotEmpty(message = "树种不能为空") private String treeSpecies; @Schema(description = "树木规格(如:胸径20厘米)") @Size(max = 100, message = "树木规格100个字符") + @NotEmpty(message = "树木规格不能为空") private String treeSpec; @Schema(description = "抢险完成时间", requiredMode = Schema.RequiredMode.REQUIRED) @@ -71,6 +74,7 @@ public class EmergencyTaskSaveReqVO { private Integer personnelCount; @Schema(description = "抢险结束照片", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "抢险后照片不能为空") private List emergencyEndImg; @Schema(description = "备注") @@ -96,6 +100,7 @@ public class EmergencyTaskSaveReqVO { private String approvalUserName; @Schema(description = "使用机械", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六") + @NotEmpty(message = "抢险后照片不能为空") private List emergencyMachineryList; @Schema(description = "险情类型数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/emergencytask/EmergencyExportHandler.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/emergencytask/EmergencyExportHandler.java index 4684b6f..7e3b4f7 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/emergencytask/EmergencyExportHandler.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/emergencytask/EmergencyExportHandler.java @@ -19,8 +19,6 @@ import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; -import static com.zteits.urbanops.module.garden.service.filedownload.ExcelExportAsyncService.BATCH_SIZE; - /** * 应急任务导出处理器 * 实现 ExcelExportHandler 接口,替代原抽象类继承 @@ -36,7 +34,7 @@ public class EmergencyExportHandler implements ExcelExportHandler mechanicalTypeDict = getDictMap(DICT_MECHANICAL_TYPE); Map rescueStatusDict = getDictMap(DICT_RESCUE_STATUS); // 初始化文件客户端 - FileClient fileClient = fileConfigService.getMasterFileClient(); + //FileClient fileClient = fileConfigService.getMasterFileClient(); for (EmergencyTaskRespVO task : batchList) { EmergencyTaskExcleRespVO vo = new EmergencyTaskExcleRespVO(); @@ -88,8 +86,8 @@ public class EmergencyExportHandler implements ExcelExportHandler machineryInfoList = new ArrayList<>(); diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/emergencytask/EmergencyExportNewHandler.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/emergencytask/EmergencyExportNewHandler.java index 4b478d6..be36967 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/emergencytask/EmergencyExportNewHandler.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/emergencytask/EmergencyExportNewHandler.java @@ -15,11 +15,8 @@ import org.springframework.util.CollectionUtils; import java.util.*; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; -import static com.zteits.urbanops.module.garden.service.filedownload.ExcelExportAsyncService.BATCH_SIZE; - /** * 新版应急任务导出处理器 * 实现 ExcelExportHandler 接口 diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/filedownload/ExcelExportAsyncService.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/filedownload/ExcelExportAsyncService.java index 771200f..991a59f 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/filedownload/ExcelExportAsyncService.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/filedownload/ExcelExportAsyncService.java @@ -15,6 +15,7 @@ import org.springframework.util.CollectionUtils; import java.io.File; import java.io.IOException; +import java.nio.charset.StandardCharsets; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; @@ -28,8 +29,8 @@ public class ExcelExportAsyncService { @Value("${file.upload-local.expire-days}") private Integer expireDay; - - public static final int BATCH_SIZE = 50; + //分页大小 + private int BATCH_SIZE = 1000; private final FileDownloadMapper fileDownloadMapper; @@ -109,6 +110,10 @@ public class ExcelExportAsyncService { log.info("导出数据为空,业务编码:{}", downloadDO.getBusiCode()); return; } + //存在大量图片,设置较小值防止内存溢出 + if ("EmergencyTaskExcleNew".equals(downloadDO.getBusiCode())) { + BATCH_SIZE = 50; + } WriteSheet writeSheet = EasyExcel.writerSheet(sheetName).build(); int total = sourceList.size(); @@ -126,7 +131,15 @@ public class ExcelExportAsyncService { } private String buildFilePath(FileDownloadDO downloadDO) { - return new File(localExcelPath, downloadDO.getFileName()).getAbsolutePath(); + //return new File(localExcelPath, downloadDO.getFileName()).getAbsolutePath(); + String fileName = downloadDO.getFileName(); + // 统一UTF-8转码,解决Linux中文文件名乱码 + byte[] nameBytes = fileName.getBytes(StandardCharsets.UTF_8); + String safeFileName = new String(nameBytes, StandardCharsets.UTF_8); + // 剔除操作系统非法字符 + safeFileName = safeFileName.replaceAll("[\\\\/:*?\"<>|]", "_"); + File targetFile = new File(localExcelPath, safeFileName); + return targetFile.getAbsolutePath(); } private void updateSuccess(FileDownloadDO downloadDO) {