Forráskód Böngészése

新增接口改造巡检记录导出代码,导出数据添加巡检上报图片

fuyuhchuan 1 éve
szülő
commit
0b585ca19c

+ 19 - 0
service-fire/service-fire-biz/pom.xml

@@ -94,6 +94,25 @@
             <version>0.0.1</version>
             <scope>compile</scope>
         </dependency>
+
+        <!--图片处理依赖-->
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi</artifactId>
+            <version>4.1.2</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>4.1.2</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-collections4</artifactId>
+            <version>4.4</version>
+        </dependency>
+
+
     </dependencies>
 
     <build>

+ 35 - 2
service-fire/service-fire-biz/src/main/java/com/usky/fire/controller/web/PatrolInspectionRecordController.java

@@ -1,6 +1,5 @@
 package com.usky.fire.controller.web;
 
-
 import com.ruoyi.common.core.utils.poi.ExcelUtil;
 import com.usky.common.core.bean.ApiResult;
 import com.usky.common.core.bean.CommonPage;
@@ -9,11 +8,19 @@ import com.usky.fire.service.PatrolInspectionRecordService;
 import com.usky.fire.service.vo.PatrolInspectionRecordExportVo;
 import com.usky.fire.service.vo.PatrolInspectionRecordVo;
 import com.usky.fire.service.vo.RecordStatisticsVo;
+import org.apache.commons.io.IOUtils;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.xssf.usermodel.XSSFSheet;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import javax.imageio.ImageIO;
 import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
+import java.awt.image.BufferedImage;
+import java.io.*;
+import java.net.URL;
 import java.util.List;
 
 /**
@@ -105,5 +112,31 @@ public class PatrolInspectionRecordController {
         ExcelUtil<PatrolInspectionRecordExportVo> util = new ExcelUtil<PatrolInspectionRecordExportVo>(PatrolInspectionRecordExportVo.class);
         util.exportExcel(response, list, "巡检记录", "巡检记录");
     }
+
+
+    /**
+     * 巡查自检-巡检记录-导出(添加多媒体数据)
+     *
+     * @param response
+     * @param areaName      区域名称
+     * @param siteName      地点名称
+     * @param name          人员名称
+     * @param planType      计划类型
+     * @param startDateTime 开始时间
+     * @param endDateTime   结束时间
+     * @param idList        记录ID
+     * @throws IOException
+     */
+    @PostMapping("/recordLsitExportMultimedia")
+    public void exportMultimedia(HttpServletResponse response,
+                                 @RequestParam(value = "areaName", required = false) String areaName,
+                                 @RequestParam(value = "siteName", required = false) String siteName,
+                                 @RequestParam(value = "name", required = false) String name,
+                                 @RequestParam(value = "planType", required = false) Integer planType,
+                                 @RequestParam(value = "startDateTime", required = false) String startDateTime,
+                                 @RequestParam(value = "endDateTime", required = false) String endDateTime,
+                                 @RequestParam(value = "idList", required = false) String idList) throws IOException {
+        patrolInspectionRecordService.exportImage(response,areaName, siteName, name, planType, startDateTime, endDateTime, idList);
+    }
 }
 

+ 2 - 0
service-fire/service-fire-biz/src/main/java/com/usky/fire/mapper/PatrolInspectionRecordPictureMapper.java

@@ -2,6 +2,7 @@ package com.usky.fire.mapper;
 
 import com.usky.fire.domain.PatrolInspectionRecordPicture;
 import com.usky.common.mybatis.core.CrudMapper;
+import org.springframework.stereotype.Repository;
 
 /**
  * <p>
@@ -11,6 +12,7 @@ import com.usky.common.mybatis.core.CrudMapper;
  * @author JCB
  * @since 2022-07-21
  */
+@Repository
 public interface PatrolInspectionRecordPictureMapper extends CrudMapper<PatrolInspectionRecordPicture> {
 
 }

+ 5 - 0
service-fire/service-fire-biz/src/main/java/com/usky/fire/service/PatrolInspectionRecordService.java

@@ -7,6 +7,9 @@ import com.usky.fire.service.vo.PatrolInspectionRecordExportVo;
 import com.usky.fire.service.vo.PatrolInspectionRecordVo;
 import com.usky.fire.service.vo.RecordStatisticsVo;
 
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.net.MalformedURLException;
 import java.util.List;
 
 /**
@@ -40,4 +43,6 @@ public interface PatrolInspectionRecordService extends CrudService<PatrolInspect
     List<PatrolInspectionRecordExportVo> recordLsitExport(String areaName, String siteName, String name,
                                                           Integer planType, String startDateTime,
                                                           String endDateTime,String idList);
+    void exportImage(HttpServletResponse response, String areaName, String siteName, String name, Integer planType,
+                            String startDateTime, String endDateTime, String idList) throws IOException;
 }

+ 299 - 0
service-fire/service-fire-biz/src/main/java/com/usky/fire/service/impl/PatrolInspectionRecordServiceImpl.java

@@ -1,5 +1,6 @@
 package com.usky.fire.service.impl;
 
+import com.ruoyi.common.core.utils.file.ImageUtils;
 import cn.hutool.core.collection.CollectionUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -13,12 +14,25 @@ import com.usky.common.security.utils.SecurityUtils;
 import com.usky.fire.domain.*;
 import com.usky.fire.mapper.PatrolInspectionPlanMapper;
 import com.usky.fire.mapper.PatrolInspectionRecordMapper;
+import com.usky.fire.mapper.PatrolInspectionRecordPictureMapper;
 import com.usky.fire.service.*;
 import com.usky.fire.service.vo.*;
 import com.usky.system.model.LoginUser;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.xssf.usermodel.XSSFSheet;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+
+import javax.imageio.ImageIO;
+import javax.servlet.http.HttpServletResponse;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
 import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.List;
@@ -58,6 +72,9 @@ public class PatrolInspectionRecordServiceImpl extends AbstractCrudService<Patro
     @Autowired
     private PatrolInspectionPlanMapper patrolInspectionPlanMapper;
 
+    @Autowired
+    private PatrolInspectionRecordPictureMapper orphansInspectionRecordPictureMapper;
+
     @Override
     public CommonPage<PatrolInspectionRecord> patrolInspectionRecordLsit(String areaName, String siteName, String name,
                                                                          Integer planType, String startDateTime, String endDateTime,
@@ -399,4 +416,286 @@ public class PatrolInspectionRecordServiceImpl extends AbstractCrudService<Patro
         }
         return list;
     }
+
+    @Override
+    public void exportImage(HttpServletResponse response, String areaName, String siteName, String name, Integer planType,
+                            String startDateTime, String endDateTime, String idList) throws IOException {
+        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        String userType = null;
+        if (loginUser != null && !"".equals(loginUser)) {
+            userType = loginUser.getUserType();
+        }
+        LambdaQueryWrapper<PatrolInspectionRecord> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(PatrolInspectionRecord::getTenantId, SecurityUtils.getTenantId())
+                .like(StringUtils.isNotBlank(areaName), PatrolInspectionRecord::getAreaName, areaName)
+                .like(StringUtils.isNotBlank(siteName), PatrolInspectionRecord::getSiteName, siteName)
+                .like(StringUtils.isNotBlank(name), PatrolInspectionRecord::getName, name)
+                .eq(planType != null && planType != 0, PatrolInspectionRecord::getPlanType, planType)
+                .between(StringUtils.isNotBlank(startDateTime) && StringUtils.isNotBlank(endDateTime), PatrolInspectionRecord::getCreateTime, startDateTime, endDateTime)
+                .eq("00".equals(userType), PatrolInspectionRecord::getCreator, SecurityUtils.getUsername());
+        if (StringUtils.isNotBlank(idList)) {
+            List<Integer> listId = new ArrayList<>();
+            String[] idArray = idList.split(",");
+            for (int i = 0; i < idArray.length; i++) {
+                listId.add(Integer.parseInt(idArray[i]));
+            }
+            queryWrapper.in(PatrolInspectionRecord::getId, listId);
+        }
+        queryWrapper.orderByDesc(PatrolInspectionRecord::getId);
+        List<PatrolInspectionRecord> patrolInspectionRecordList = this.list(queryWrapper);
+        List<PatrolInspectionRecordExportVo> list = new ArrayList<>();
+        for (int i = 0; i < patrolInspectionRecordList.size(); i++) {
+            PatrolInspectionRecordExportVo patrolInspectionRecordExportVo = new PatrolInspectionRecordExportVo();
+            patrolInspectionRecordExportVo.setXh(i + 1);
+            patrolInspectionRecordExportVo.setId(patrolInspectionRecordList.get(i).getId());
+            patrolInspectionRecordExportVo.setSiteNubmber(patrolInspectionRecordList.get(i).getSiteNubmber());
+            patrolInspectionRecordExportVo.setSiteType(patrolInspectionRecordList.get(i).getSiteType());
+            patrolInspectionRecordExportVo.setAreaName(patrolInspectionRecordList.get(i).getAreaName());
+            patrolInspectionRecordExportVo.setSiteName(patrolInspectionRecordList.get(i).getSiteName());
+            patrolInspectionRecordExportVo.setName(patrolInspectionRecordList.get(i).getName());
+            patrolInspectionRecordExportVo.setPhone(patrolInspectionRecordList.get(i).getPhone());
+            patrolInspectionRecordExportVo.setPlanType(patrolInspectionRecordList.get(i).getPlanType());
+            patrolInspectionRecordExportVo.setLongitude(patrolInspectionRecordList.get(i).getLongitude());
+            patrolInspectionRecordExportVo.setLatitude(patrolInspectionRecordList.get(i).getLatitude());
+            patrolInspectionRecordExportVo.setStartDate(patrolInspectionRecordList.get(i).getStartDate().format(df));
+            patrolInspectionRecordExportVo.setEndDate(patrolInspectionRecordList.get(i).getEndDate().format(df));
+            patrolInspectionRecordExportVo.setCreateTime(patrolInspectionRecordList.get(i).getCreateTime().format(df));
+            LambdaQueryWrapper<PatrolInspectionRecordPicture> queryWrapperJpg = Wrappers.lambdaQuery();//导出图片
+            queryWrapperJpg.select(PatrolInspectionRecordPicture::getPictureUrl)
+                    .eq(PatrolInspectionRecordPicture::getRecordId, patrolInspectionRecordList.get(i).getId());
+            List<PatrolInspectionRecordPicture> pictures = orphansInspectionRecordPictureMapper.selectList(queryWrapperJpg);
+            if (pictures.size() > 0) {
+                for (int j = 0; j < pictures.size() && j < 5; j++) {
+                    String pictureUrl = pictures.get(j).getPictureUrl();
+                    switch (j) {
+                        case 0:
+                            patrolInspectionRecordExportVo.setImagePath1(pictureUrl);
+                            break;
+                        case 1:
+                            patrolInspectionRecordExportVo.setImagePath2(pictureUrl);
+                            break;
+                        case 2:
+                            patrolInspectionRecordExportVo.setImagePath3(pictureUrl);
+                            break;
+                        case 3:
+                            patrolInspectionRecordExportVo.setImagePath4(pictureUrl);
+                            break;
+                        case 4:
+                            patrolInspectionRecordExportVo.setImagePath5(pictureUrl);
+                            break;
+                        default:
+                            break;
+                    }
+                }
+            }
+            list.add(patrolInspectionRecordExportVo);
+        }
+        XSSFWorkbook workbook = new XSSFWorkbook();
+        XSSFSheet sheet = workbook.createSheet("巡检记录");
+        // 添加列标题行
+        Row headerRow = sheet.createRow(1);
+        String[] headers = {
+                "序号", "地点号码", "地点类型", "区域名称", "地点名称", "巡检人员", "联系电话",
+                "计划类型", "经度", "纬度", "开始时间", "结束时间", "巡检时间", "巡检照片1",
+                "巡检照片2", "巡检照片3", "巡检照片4", "巡检照片5"
+        };
+        // 添加总标题行
+        Row titleRow = sheet.createRow(0);
+        Cell titleCell = titleRow.createCell(0);
+        titleCell.setCellValue("巡检记录");
+        CellStyle titleCellStyle = workbook.createCellStyle();
+        // 设置字体为黑色加粗
+        Font titleFont = workbook.createFont();
+        titleFont.setFontName("宋体");
+        titleFont.setFontHeightInPoints((short) 16);
+        titleFont.setColor(IndexedColors.BLACK.getIndex());
+        titleFont.setBold(true);
+        titleCellStyle.setFont(titleFont);
+        // 设置水平居中和垂直居中
+        titleCellStyle.setAlignment(HorizontalAlignment.CENTER);
+        titleCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
+        titleCell.setCellStyle(titleCellStyle);
+        titleRow.setHeightInPoints(30);
+        // 合并标题单元格以横跨所有列
+        int totalColumns = headers.length;
+        sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, totalColumns - 1));
+        //设置列标题
+        for (int i = 0; i < headers.length; i++) {
+            Cell cell = headerRow.createCell(i);
+            cell.setCellValue(headers[i]);
+            CellStyle headerCellStyle = workbook.createCellStyle();
+            headerCellStyle.setAlignment(HorizontalAlignment.CENTER);
+            headerCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
+            headerCellStyle.setBorderBottom(BorderStyle.THIN);
+            headerCellStyle.setBorderTop(BorderStyle.THIN);
+            headerCellStyle.setBorderLeft(BorderStyle.THIN);
+            headerCellStyle.setBorderRight(BorderStyle.THIN);
+            // 设置背景颜色为灰色
+            headerCellStyle.setFillForegroundColor(IndexedColors.GREY_50_PERCENT.getIndex());
+            headerCellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
+            // 设置字体为白色
+            Font headerFont = workbook.createFont();
+            headerFont.setFontName("宋体");
+            headerFont.setFontHeightInPoints((short) 10);
+            headerFont.setColor(IndexedColors.WHITE.getIndex());
+            headerFont.setBold(true);
+            headerRow.setHeightInPoints(13.5f);
+            headerCellStyle.setFont(headerFont);
+            cell.setCellStyle(headerCellStyle);
+        }
+
+        Row fixedRow = sheet.createRow(list.size() + 3); // 数据行数 + 标题行数(1) + 固定行(1) + 空一行
+        CellStyle fixedCellStyle = workbook.createCellStyle();
+
+        // 创建字体样式
+        Font fixedFont = workbook.createFont();
+        fixedFont.setFontName("宋体");
+        fixedFont.setBold(true);
+        fixedFont.setFontHeightInPoints((short) 12);
+        fixedCellStyle.setFont(fixedFont);
+
+        // 创建“负责人签名”单元格
+        Cell cellSign = fixedRow.createCell(0);
+        cellSign.setCellValue("负责人签名:");
+        cellSign.setCellStyle(fixedCellStyle);
+
+        // 创建“日期”单元格
+        Cell cellDate = fixedRow.createCell(4); // 假设日期单元格在第五列
+        cellDate.setCellValue("日期:");
+        cellDate.setCellStyle(fixedCellStyle);
+
+        // 合并单元格
+//        sheet.addMergedRegion(new CellRangeAddress(list.size() + 2, list.size() + 2, 0, 0)); // 负责人签名
+//        sheet.addMergedRegion(new CellRangeAddress(list.size() + 2, list.size() + 2, 4, 4)); // 日期
+
+        // 设置固定行的高度
+        fixedRow.setHeightInPoints(20);
+
+        // 设置数据行样式
+        CellStyle dataCellStyle = workbook.createCellStyle();
+        Font dataFont = workbook.createFont();
+        dataFont.setFontName("Arial");
+        dataFont.setFontHeightInPoints((short) 10);
+        dataCellStyle.setFont(dataFont);
+        dataCellStyle.setAlignment(HorizontalAlignment.CENTER);
+        dataCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
+        dataCellStyle.setBorderBottom(BorderStyle.THIN);
+        dataCellStyle.setBorderTop(BorderStyle.THIN);
+        dataCellStyle.setBorderLeft(BorderStyle.THIN);
+        dataCellStyle.setBorderRight(BorderStyle.THIN);
+        // 添加数据
+        for (int i = 0; i < list.size(); i++) {
+            PatrolInspectionRecordExportVo record = list.get(i);
+            Row row = sheet.createRow(i + 2);
+
+            for (int j = 0; j < headers.length; j++) {
+                Cell cell = row.createCell(j);
+                cell.setCellStyle(dataCellStyle);
+
+                // 根据 j 变量来确定应该填充数据的单元格索引
+                switch (j) {
+                    case 0:
+                        cell.setCellValue(record.getXh());
+                        break;
+                    case 1:
+                        cell.setCellValue(record.getSiteNubmber());
+                        break;
+                    case 2:
+                        cell.setCellValue(record.getSiteType() == 1 ? "二维码" : "NFC");
+                        break;
+                    case 3:
+                        cell.setCellValue(record.getAreaName());
+                        break;
+                    case 4:
+                        cell.setCellValue(record.getSiteName());
+                        break;
+                    case 5:
+                        cell.setCellValue(record.getName());
+                        break;
+                    case 6:
+                        cell.setCellValue(record.getPhone());
+                        break;
+                    case 7:
+                        cell.setCellValue(record.getPlanType() == 1 ? "普通计划" : "按次计划");
+                        break;
+                    case 8:
+                        cell.setCellValue(record.getLongitude());
+                        break;
+                    case 9:
+                        cell.setCellValue(record.getLatitude());
+                        break;
+                    case 10:
+                        cell.setCellValue(record.getStartDate());
+                        break;
+                    case 11:
+                        cell.setCellValue(record.getEndDate());
+                        break;
+                    case 12:
+                        cell.setCellValue(record.getCreateTime());
+                        break;
+                    default:
+                        break;
+                }
+                CreationHelper helper = workbook.getCreationHelper();
+                Drawing<?> drawing = sheet.createDrawingPatriarch();
+                ClientAnchor anchor;
+                if (record.getImagePath1() != null || record.getImagePath2() != null
+                        || record.getImagePath3() != null || record.getImagePath4() != null || record.getImagePath5() != null) {
+                    for (int k = 0; k < 5; k++) {
+                        String imagePath = null;
+                        switch (k) {
+                            case 0:
+                                imagePath = record.getImagePath1();
+                                break;
+                            case 1:
+                                imagePath = record.getImagePath2();
+                                break;
+                            case 2:
+                                imagePath = record.getImagePath3();
+                                break;
+                            case 3:
+                                imagePath = record.getImagePath4();
+                                break;
+                            case 4:
+                                imagePath = record.getImagePath5();
+                                break;
+                        }
+
+                        if (imagePath != null) {
+                            byte[] imageBytes = getImageBytes(imagePath);
+                            int pictureIdx = workbook.addPicture(imageBytes, Workbook.PICTURE_TYPE_JPEG);
+
+                            anchor = helper.createClientAnchor();
+                            anchor.setCol1(headers.length - 5 + k);
+                            anchor.setRow1(i + 2);
+
+                            Picture pict = drawing.createPicture(anchor, pictureIdx);
+                            pict.resize(1, 1);
+                        }
+                    }
+                }
+            }
+
+        }
+
+        for (int i = 0; i < headers.length; i++) {
+            sheet.setColumnWidth(i, (int) (16.09 * 256));
+        }
+
+        // 输出Excel文件
+        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+        response.setHeader("Content-Disposition", "attachment; filename=巡检记录.xlsx");
+        workbook.write(response.getOutputStream());
+        workbook.close();
+    }
+
+    public byte[] getImageBytes(String imageUrl) throws IOException {
+        URL url = new URL(imageUrl);
+        BufferedImage image = ImageIO.read(url);
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        ImageIO.write(image, "jpg", baos);
+        return baos.toByteArray();
+    }
+
 }

+ 25 - 1
service-fire/service-fire-biz/src/main/java/com/usky/fire/service/vo/PatrolInspectionRecordExportVo.java

@@ -143,5 +143,29 @@ public class PatrolInspectionRecordExportVo implements Serializable {
      */
     private String creator;
 
-
+    /**
+     * 图片数据
+     */
+    @Excel(name = "巡检照片1")
+    private String imagePath1;
+    /**
+     * 图片数据
+     */
+    @Excel(name = "巡检照片2")
+    private String imagePath2;
+    /**
+     * 图片数据
+     */
+    @Excel(name = "巡检照片3")
+    private String imagePath3;
+    /**
+     * 图片数据
+     */
+    @Excel(name = "巡检照片4")
+    private String imagePath4;
+    /**
+     * 图片数据
+     */
+    @Excel(name = "巡检照片5")
+    private String imagePath5;
 }