|
@@ -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,
|
|
@@ -148,7 +165,9 @@ public class PatrolInspectionRecordServiceImpl extends AbstractCrudService<Patro
|
|
|
contentOptionVo.setCreateTime(contentOptionList.get(i).getCreateTime());
|
|
|
contentOptionVo.setSelectStatus(false);
|
|
|
for (int j = 0; j < patrolInspectionRecordOptionList.size(); j++) {
|
|
|
- contentOptionVo.setRemarks(patrolInspectionRecordOptionList.get(j).getRemarks());
|
|
|
+ if(contentOptionList.get(i).getContentId()==patrolInspectionContentList.get(j).getId()){
|
|
|
+ contentOptionVo.setRemarks(patrolInspectionRecordOptionList.get(j).getRemarks());
|
|
|
+ }
|
|
|
if (contentOptionList.get(i).getId() == patrolInspectionRecordOptionList.get(j).getContentOptionId()) {
|
|
|
contentOptionVo.setSelectStatus(true);
|
|
|
}
|
|
@@ -399,4 +418,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();
|
|
|
+ }
|
|
|
+
|
|
|
}
|