From b21549bfd07dd43525d453d9a0282e25260c092c Mon Sep 17 00:00:00 2001 From: huliguo <2023611923@qq.com> Date: 星期三, 13 八月 2025 14:04:58 +0800 Subject: [PATCH] 导出增加筛选条件 导出根据任务名称分sheet 添加索引 --- guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TaskDetailServiceImpl.java | 251 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 243 insertions(+), 8 deletions(-) diff --git a/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TaskDetailServiceImpl.java b/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TaskDetailServiceImpl.java index 5ac589e..99c08c9 100644 --- a/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TaskDetailServiceImpl.java +++ b/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TaskDetailServiceImpl.java @@ -28,6 +28,7 @@ import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.io.FileInputStream; +import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.net.URLConnection; @@ -164,11 +165,12 @@ if(null != vo.getSysStatus() && !vo.getSysStatus().isEmpty()){ Wrapper<TaskDetailVehiclesChannel> channelWrapper = new EntityWrapper<TaskDetailVehiclesChannel>() + .eq("task_detail_id", vo.getId()) .in("sys_status", vo.getSysStatus()); if (null != vo.getHavePic()){ - if(vo.getHavePic()==0){ + if(vo.getHavePic().equals("0")){ channelWrapper.isNull("image_url"); - }else if(vo.getHavePic()==1){ + }else if(vo.getHavePic().equals("1")){ channelWrapper.isNotNull("image_url"); } } @@ -181,11 +183,12 @@ } if(null != vo.getArtificialStatus()&& !vo.getArtificialStatus().isEmpty()){ Wrapper<TaskDetailVehiclesChannel> channelWrapper = new EntityWrapper<TaskDetailVehiclesChannel>() + .eq("task_detail_id", vo.getId()) .in("artificial_status", vo.getArtificialStatus()); if (null != vo.getHavePic()){ - if(vo.getHavePic()==0){ + if(vo.getHavePic().equals("0")){ channelWrapper.isNull("image_url"); - }else if(vo.getHavePic()==1){ + }else if(vo.getHavePic().equals("1")){ channelWrapper.isNotNull("image_url"); } } @@ -246,7 +249,7 @@ if(collect.size() > 0){ collect.add(-1); } - List<PictureDetails> pictureDetails = taskDetailVehiclesChannelService.getPictureDetails(pageInfo, collect, vo.getSysStatus(), vo.getArtificialStatus(),vo.getHavePic()); + List<PictureDetails> pictureDetails = taskDetailVehiclesChannelService.getPictureDetails(pageInfo, collect, vo.getSysStatus(), vo.getArtificialStatus(), vo.getHavePic() != null ? Integer.valueOf(vo.getHavePic()) : null); List<Icon> icons = iconService.selectList(null); for (PictureDetails pictureDetail : pictureDetails) { String videoChannel = pictureDetail.getVideoChannel(); @@ -298,9 +301,9 @@ * @param status * @param response */ - @Override - public void downloadTaskRecord(List<String> ids, String code, List<Integer> status,Integer sysStatus, HttpServletResponse response) { - List<Map<String, Object>> mapList = this.baseMapper.getDownloadTaskRecord(ids, code, status,sysStatus); + /*@Override + public void downloadTaskRecord(List<String> ids, String code, List<Integer> status,Integer sysStatus, Integer type,String typeName,HttpServletResponse response) { + List<Map<String, Object>> mapList = this.baseMapper.getDownloadTaskRecord(ids, code, status,sysStatus,type,typeName); try { HSSFWorkbook hssfWorkbook = new HSSFWorkbook(); HSSFSheet hssfSheet = hssfWorkbook.createSheet(); @@ -526,4 +529,236 @@ e.printStackTrace(); } } + */ + @Override + public void downloadTaskRecord(List<String> ids, String code, List<Integer> status,Integer sysStatus, Integer type,String typeName,HttpServletResponse response){ + List<Map<String, Object>> mapList = this.baseMapper.getDownloadTaskRecord(ids, code, status, sysStatus, type, typeName); + try { + HSSFWorkbook hssfWorkbook = new HSSFWorkbook(); + // 1. 按 name 分组(先获取所有唯一 name) + Set<Object> nameSet = new HashSet<>(); + for (Map<String, Object> map : mapList) { + nameSet.add(map.get("name")); // 收集所有不重复的 name + } + + // 2. 创建单元格样式(提取为公共方法,避免重复代码) + HSSFCellStyle titleStyle = createTitleStyle(hssfWorkbook); + HSSFCellStyle contentStyle = createContentStyle(hssfWorkbook); + List<Icon> icons = iconService.selectList(null); + + // 3. 为每个 name 创建一个 Sheet + for (Object name : nameSet) { + if (name == null) continue; // 跳过 name 为 null 的情况 + + // 创建 Sheet(以 name 为 Sheet 名称,可根据需求自定义) + HSSFSheet sheet = hssfWorkbook.createSheet(name.toString()); + sheet.setDefaultColumnWidth(20); + sheet.setDefaultRowHeight((short) 800); + + // 设置表头(与原逻辑一致) + initSheetHeader(sheet, hssfWorkbook, titleStyle); + + // 筛选当前 name 的数据 + List<Map<String, Object>> groupData = mapList.stream() + .filter(map -> name.equals(map.get("name"))) + .collect(Collectors.toList()); + + // 填充当前 Sheet 的数据 + fillSheetData(sheet, hssfWorkbook, groupData, contentStyle, icons); + } + + // 4. 输出 Excel 到响应 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("任务记录(" + sdf.format(new Date()) + ").xls", "utf-8")); + response.setContentType("application/vnd.ms-excel"); + ServletOutputStream out = response.getOutputStream(); + hssfWorkbook.write(out); + out.flush(); + out.close(); + + } catch (Exception e) { + e.printStackTrace(); + } + } + // -------------------- 以下是抽取的工具方法 -------------------- + + /** + * 创建标题样式(加粗、居中) + */ + private HSSFCellStyle createTitleStyle(HSSFWorkbook workbook) { + HSSFCellStyle style = workbook.createCellStyle(); + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setAlignment(HorizontalAlignment.CENTER); + HSSFFont font = workbook.createFont(); + font.setBold(true); + style.setFont(font); + return style; + } + + /** + * 创建内容样式(居中,不加粗) + */ + private HSSFCellStyle createContentStyle(HSSFWorkbook workbook) { + HSSFCellStyle style = workbook.createCellStyle(); + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setAlignment(HorizontalAlignment.CENTER); + return style; + } + + /** + * 初始化 Sheet 表头(合并单元格 + 标题) + */ + private void initSheetHeader(HSSFSheet sheet, HSSFWorkbook workbook, HSSFCellStyle titleStyle) { + // 合并单元格 + for (int i = 0; i < 10; i++) { + CellRangeAddress cellRangeAddress = new CellRangeAddress(0, 1, i, i); + sheet.addMergedRegion(cellRangeAddress); + } + CellRangeAddress cellRangeAddress = new CellRangeAddress(0, 0, 10, 16); + sheet.addMergedRegion(cellRangeAddress); + + // 第一行标题 + HSSFRow row0 = sheet.createRow(0); + List<String> titles0 = Arrays.asList("序号", "任务名称", "任务类型", "执行时间", "执行状态", "车牌号", "运输公司", "年审有效期", "巡检状态", "车辆轨迹图片", "货箱通道"); + for (int i = 0; i < titles0.size(); i++) { + HSSFCell cell = row0.createCell(i); + cell.setCellType(CellType.STRING); + cell.setCellStyle(titleStyle); + cell.setCellValue(titles0.get(i)); + } + + // 第二行标题 + HSSFRow row1 = sheet.createRow(1); + List<String> titles1 = Arrays.asList("图片", "系统审核", "系统审核时间", "人工审核", "审核意见", "审核人", "审核时间"); + for (int i = 0; i < titles1.size(); i++) { + HSSFCell cell = row1.createCell(i + 10); + cell.setCellType(CellType.STRING); + cell.setCellStyle(titleStyle); + cell.setCellValue(titles1.get(i)); + } + } + + /** + * 填充 Sheet 数据(根据分组数据填充行) + */ + private void fillSheetData(HSSFSheet sheet, HSSFWorkbook workbook, List<Map<String, Object>> dataList, HSSFCellStyle contentStyle, List<Icon> icons) { + HSSFPatriarch patriarch = sheet.createDrawingPatriarch(); // 用于插入图片 + + for (int i = 0; i < dataList.size(); i++) { + HSSFRow row = sheet.createRow(i + 2); // 从第3行开始(索引2) + Map<String, Object> map = dataList.get(i); + + // 1. 序号 + setCellValue(row, 0, (i + 1) + "", contentStyle); + + // 2. 任务名称 + setCellValue(row, 1, map.get("name"), contentStyle); + + // 3. 任务类型 + setCellValue(row, 2, map.get("taskType"), contentStyle); + + // 4. 执行时间 + setCellValue(row, 3, map.get("executionTime"), contentStyle); + + // 5. 执行状态(带状态转换逻辑) + Object statusObj = map.get("status"); + String statusValue = ""; + if (statusObj != null) { + Integer status = Integer.valueOf(statusObj.toString()); + statusValue = status == 1 ? "待执行" : status == 2 ? "进行中" : status == 3 ? "成功" : "失败"; + + // 处理图片逻辑(根据状态设置默认图片) + if (status == 5) { + map.put("imageUrl", icons.stream().filter(s -> s.getType() == 2).findFirst().orElse(null).getUrl()); + } else if (ToolUtil.isEmpty(map.get("imageUrl"))) { + map.put("imageUrl", icons.stream().filter(s -> s.getType() == 3).findFirst().orElse(null).getUrl()); + } + if (status == 4) { + map.put("imageUrl", icons.stream().filter(s -> s.getType() == 1).findFirst().orElse(null).getUrl()); + } + } + setCellValue(row, 4, statusValue, contentStyle); + + // 6. 车牌号 + setCellValue(row, 5, map.get("vehicleNum"), contentStyle); + + // 7. 运输公司 + setCellValue(row, 6, map.get("companyName"), contentStyle); + + // 8. 年审有效期 + setCellValue(row, 7, map.get("inspectPeriodEnd"), contentStyle); + + // 9. 巡检状态 + Object vehiclesStatusObj = map.get("vehiclesStatus"); + String vehiclesStatusValue = ""; + if (vehiclesStatusObj != null) { + Integer vehiclesStatus = Integer.valueOf(vehiclesStatusObj.toString()); + vehiclesStatusValue = vehiclesStatus == 1 ? "未执行" : vehiclesStatus == 2 ? "正常" : "异常"; + } + setCellValue(row, 8, vehiclesStatusValue, contentStyle); + + // 10. 车辆轨迹图片(占位,实际图片在第10列插入) + setCellValue(row, 9, "", contentStyle); + + // 11. 图片(插入图片到第10列) + Object imageUrlObj = map.get("imageUrl"); + if (imageUrlObj != null) { + try { + URL url = new URL(imageUrlObj.toString()); + URLConnection conn = url.openConnection(); + conn.connect(); + InputStream is = conn.getInputStream(); + byte[] bytes = IOUtils.toByteArray(is); + int pictureIdx = workbook.addPicture(bytes, Workbook.PICTURE_TYPE_PNG); + is.close(); + + // 图片位置:第10列(索引10),当前行(i+2) + HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0, (short) 10, i + 2, (short) 11, i + 3); + patriarch.createPicture(anchor, pictureIdx); + } catch (Exception e) { + e.printStackTrace(); + } + } + + // 12. 系统审核 + Object sysStatusObj = map.get("sysStatus"); + String sysStatusValue = ""; + if (sysStatusObj != null) { + Integer sysStatus = Integer.valueOf(sysStatusObj.toString()); + sysStatusValue = sysStatus == 1 ? "未执行" : sysStatus == 2 ? "正常" : "异常"; + } + setCellValue(row, 11, sysStatusValue, contentStyle); + + // 13. 系统审核时间 + setCellValue(row, 12, map.get("sysCreateTime"), contentStyle); + + // 14. 人工审核 + Object artificialStatusObj = map.get("artificialStatus"); + String artificialStatusValue = ""; + if (artificialStatusObj != null) { + Integer artificialStatus = Integer.valueOf(artificialStatusObj.toString()); + artificialStatusValue = artificialStatus == 1 ? "未执行" : artificialStatus == 2 ? "正常" : "异常"; + } + setCellValue(row, 13, artificialStatusValue, contentStyle); + + // 15. 审核意见 + setCellValue(row, 14, map.get("remark"), contentStyle); + + // 16. 审核人 + setCellValue(row, 15, map.get("artificialUser"), contentStyle); + + // 17. 审核时间 + setCellValue(row, 16, map.get("artificialCreateTime"), contentStyle); + } + } + + /** + * 通用单元格赋值方法(处理 null 情况) + */ + private void setCellValue(HSSFRow row, int cellIndex, Object value, HSSFCellStyle style) { + HSSFCell cell = row.createCell(cellIndex); + cell.setCellType(CellType.STRING); + cell.setCellStyle(style); + cell.setCellValue(value != null ? value.toString() : ""); + } } -- Gitblit v1.7.1