|
|
|
@ -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(); |
|
|
|
} |
|
|
|
|