Browse Source

任务详情导出优化

master
wangguangyuan 5 months ago
parent
commit
037171508a
1 changed files with 158 additions and 16 deletions
  1. +158
    -16
      inspect-main/inspect-main-task/src/main/java/com/inspect/task/controller/PatrolTaskController.java

+ 158
- 16
inspect-main/inspect-main-task/src/main/java/com/inspect/task/controller/PatrolTaskController.java View File

@ -55,6 +55,7 @@ import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
@ -63,9 +64,7 @@ import javax.servlet.http.HttpServletResponse;
import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
import org.apache.poi.hssf.usermodel.HSSFPatriarch;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.*;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
@ -2439,19 +2438,162 @@ public class PatrolTaskController extends BaseController {
newList = newList.stream().filter((element) -> resultAnalysis.getFilterDesc().equals(element.getFilterDesc())).collect(Collectors.toList());
}
PageDomain pageDomain = TableSupport.buildPageRequest();
int pageNum = pageDomain.getPageNum();
int pageSize = pageDomain.getPageSize();
int toNum = Math.min(newList.size(), pageNum * pageSize);
List<PatrolData> pageList = newList.subList((pageNum - 1) * pageSize, toNum);
if (pageList.size() > maxNum) {
if (newList.size() > maxNum) {
return ResponseEntity.ok("超过最大导出数量:" + maxNum + "条,请结合查询条件减少导出的数量!");
} else {
exportExcel(response, pageList);
logger.info("任务详情导出耗时: {} ms", (System.currentTimeMillis() - start));
return ResponseEntity.ok("数据导出成功!");
}
Set<String> uniqueImages = new HashSet<>();
for (PatrolData data : newList) {
if (StringUtils.isNotEmpty(data.getImg())) {
Collections.addAll(uniqueImages, data.getImg().split(StringUtils.COMMA));
}
if (StringUtils.isNotEmpty(data.getImgAnalyse())) {
Collections.addAll(uniqueImages, data.getImgAnalyse().split(StringUtils.COMMA));
}
}
logger.info("图片总数: {}", uniqueImages.size());
// 并行下载图片
Map<String, byte[]> streamHashMap = new ConcurrentHashMap<>();
uniqueImages.parallelStream().forEach(imagePath -> {
try {
sftpClient.downLoad(imagePath, (inputStream) -> {
byte[] shm = streamHashMap.get(imagePath);
byte[] bytes = getStringByInputStream(inputStream);
if (shm == null) {
streamHashMap.put(imagePath, bytes);
}
});
} catch (Exception e) {
logger.warn("图片下载失败: {}", imagePath, e);
}
});
// exportExcel(response, newList);
exportExcelStream(response, newList, streamHashMap);
logger.info("任务详情导出耗时: {} ms", (System.currentTimeMillis() - start));
return ResponseEntity.ok("数据导出成功!");
}
private void exportExcelStream(HttpServletResponse response, List<PatrolData> dataList, Map<String, byte[]> imageCache)
throws IOException {
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setHeader("Content-Disposition", "attachment; filename=\"task_export_" + System.currentTimeMillis() + ".xlsx\"");
try (HSSFWorkbook workbook = new HSSFWorkbook();
ServletOutputStream out = response.getOutputStream()) {
Sheet sheet = workbook.createSheet(MessageUtils.get("任务详情"));
// 创建标题行
createHeaderRow(sheet);
// 创建绘图控制器
Drawing<?> drawing = sheet.createDrawingPatriarch();
// 写入数据
for (int i = 0; i < dataList.size(); i++) {
PatrolData item = dataList.get(i);
Row row = sheet.createRow(i + 1);
// 创建数据单元格
createDataCells(row, item);
// 插入图片
insertImages(workbook, drawing, sheet, row, item, imageCache);
}
workbook.write(out);
}
}
private void createHeaderRow(Sheet sheet) {
String[] headers = {
"编号", "设备", "相机名", "系统", "点位名称", "状态",
"算法名称", "读数", "初筛图片", "初筛结果", "分析图片", "分析结果"
};
Row headerRow = sheet.createRow(0);
for (int i = 0; i < headers.length; i++) {
Cell cell = headerRow.createCell(i);
cell.setCellValue(MessageUtils.get(headers[i]));
}
// 设置列宽
for (int i = 0; i < headers.length; i++) {
sheet.setColumnWidth(i, 20 * 256); // 20字符宽
}
}
private void createDataCells(Row row, PatrolData item) {
int col = 0;
// 编号
row.createCell(col++).setCellValue(row.getRowNum());
// 设备信息
row.createCell(col++).setCellValue(item.getDeviceName());
row.createCell(col++).setCellValue(item.getChannelName());
row.createCell(col++).setCellValue(item.getDeviceSource());
row.createCell(col++).setCellValue(item.getPointName());
// 状态
String status = "1".equals(item.getPointStatus()) ? MessageUtils.get("正常") :
"0".equals(item.getPointStatus()) ? MessageUtils.get("异常") :
MessageUtils.get("待人工确认");
row.createCell(col++).setCellValue(status);
// 算法信息
row.createCell(col++).setCellValue(item.getAlgName());
row.createCell(col++).setCellValue(item.getResValue());
// 文本信息
row.createCell(9).setCellValue(item.getFilterDesc()); // 筛选结果
row.createCell(11).setCellValue(item.getDesc()); // 分析结果
}
private void insertImages(HSSFWorkbook workbook, Drawing<?> drawing, Sheet sheet,
Row row, PatrolData item, Map<String, byte[]> imageCache) {
try {
// 获取第一张初筛图片如果有
String firstImage = getFirstImage(item.getImg());
if (firstImage != null && imageCache.containsKey(firstImage)) {
byte[] imageData = imageCache.get(firstImage);
// 插入筛选图片第8列
insertImage(workbook, drawing, row, 8, imageData);
}
// 获取第一张分析图片如果有
String firstImgAnalyse = getFirstImage(item.getImgAnalyse());
if (firstImgAnalyse != null && imageCache.containsKey(firstImgAnalyse)) {
byte[] imageData = imageCache.get(firstImgAnalyse);
// 插入分析图片第10列
insertImage(workbook, drawing, row, 10, imageData);
}
} catch (Exception e) {
logger.warn("图片插入失败", e);
}
}
private String getFirstImage(String imgPaths) {
if (StringUtils.isEmpty(imgPaths)) {
return null;
}
String[] images = imgPaths.split(StringUtils.COMMA);
return (images.length > 0) ? images[0] : null;
}
private void insertImage(HSSFWorkbook workbook, Drawing<?> drawing, Row row,
int colIndex, byte[] imageData) {
// 计算图片位置
ClientAnchor anchor = workbook.getCreationHelper().createClientAnchor();
anchor.setCol1((short) colIndex);
anchor.setRow1(row.getRowNum());
anchor.setCol2((short) (colIndex + 1));
anchor.setRow2(row.getRowNum() + 1);
// 添加图片到工作簿
int pictureIdx = workbook.addPicture(imageData, Workbook.PICTURE_TYPE_JPEG);
drawing.createPicture(anchor, pictureIdx);
}
private void exportExcel(HttpServletResponse response, List<PatrolData> newList) throws IOException {
@ -2498,7 +2640,7 @@ public class PatrolTaskController extends BaseController {
Cell cell16 = row1.createCell(4);
cell16.setCellValue(newList.get(i).getPointName());
Cell cell17 = row1.createCell(5);
cell17.setCellValue(newList.get(i).getPointStatus());
cell17.setCellValue("1".equals(newList.get(i).getPointStatus()) ? MessageUtils.get("正常") : "0".equals(newList.get(i).getPointStatus()) ? MessageUtils.get("异常") : MessageUtils.get("待人工确认"));
Cell cell18 = row1.createCell(6);
cell18.setCellValue(newList.get(i).getAlgName());
Cell cell19 = row1.createCell(7);
@ -2512,7 +2654,7 @@ public class PatrolTaskController extends BaseController {
Cell cell21 = row1.createCell(9);
cell21.setCellValue(newList.get(i).getFilterDesc());
try {
insertImage(workbook, patriarch, this.images(newList.get(i).getImg(), this.inputStreamMap(newList.get(i).getImg())), 10, i + 1, 10);
insertImage(workbook, patriarch, this.images(newList.get(i).getImgAnalyse(), this.inputStreamMap(newList.get(i).getImgAnalyse())), 10, i + 1, 10);
} catch (Exception e) {
e.printStackTrace();
}


Loading…
Cancel
Save