From 037171508a0d4ebdb2ddf0d631772014e54c033c Mon Sep 17 00:00:00 2001 From: wangguangyuan Date: Mon, 7 Jul 2025 18:51:42 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E8=AF=A6=E6=83=85=E5=AF=BC?= =?UTF-8?q?=E5=87=BA=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../task/controller/PatrolTaskController.java | 174 ++++++++++++++++-- 1 file changed, 158 insertions(+), 16 deletions(-) diff --git a/inspect-main/inspect-main-task/src/main/java/com/inspect/task/controller/PatrolTaskController.java b/inspect-main/inspect-main-task/src/main/java/com/inspect/task/controller/PatrolTaskController.java index 3326056..b17e031 100644 --- a/inspect-main/inspect-main-task/src/main/java/com/inspect/task/controller/PatrolTaskController.java +++ b/inspect-main/inspect-main-task/src/main/java/com/inspect/task/controller/PatrolTaskController.java @@ -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 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 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 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 dataList, Map 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 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 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(); }