diff --git a/securitycontrol-commons/securitycontrol-commons-core/pom.xml b/securitycontrol-commons/securitycontrol-commons-core/pom.xml index b90c113..7539e82 100644 --- a/securitycontrol-commons/securitycontrol-commons-core/pom.xml +++ b/securitycontrol-commons/securitycontrol-commons-core/pom.xml @@ -136,6 +136,7 @@ hibernate-validator 6.0.18.Final + \ No newline at end of file diff --git a/securitycontrol-commons/securitycontrol-commons-core/src/main/java/com/securitycontrol/common/core/constant/Constant.java b/securitycontrol-commons/securitycontrol-commons-core/src/main/java/com/securitycontrol/common/core/constant/Constant.java index 670086f..7437e70 100644 --- a/securitycontrol-commons/securitycontrol-commons-core/src/main/java/com/securitycontrol/common/core/constant/Constant.java +++ b/securitycontrol-commons/securitycontrol-commons-core/src/main/java/com/securitycontrol/common/core/constant/Constant.java @@ -17,5 +17,46 @@ public class Constant { public final static Integer SUCCESS = 200; public final static String MSG = "msg"; + public final static String CODE = "code"; + + public final static String XLSX = ".xlsx"; + + public final static String XLS = ".xls"; + + public final static String PRO_IMPORT_VO = "ProImportVo"; + + public final static Integer CELL_1 = 1; + public final static Integer CELL_2 = 2; + public final static Integer CELL_3 = 3; + public final static Integer CELL_4 = 4; + public final static Integer CELL_5 = 5; + public final static Integer CELL_6 = 6; + public final static Integer CELL_7 = 7; + public final static Integer CELL_8 = 8; + public final static Integer CELL_9 = 9; + public final static Integer CELL_10 = 10; + public final static Integer CELL_11 = 11; + public final static Integer CELL_12 = 12; + public final static Integer CELL_13 = 13; + public final static Integer CELL_14 = 14; + public final static Integer CELL_15 = 15; + public final static Integer CELL_16 = 16; + public final static Integer CELL_17 = 17; + public final static Integer CELL_18 = 18; + public final static Integer CELL_19 = 19; + public final static Integer CELL_20 = 20; + public final static Integer CELL_21 = 21; + public final static Integer CELL_22 = 22; + public final static Integer CELL_23 = 23; + public final static Integer CELL_24 = 24; + public final static Integer CELL_25 = 25; + + public final static String FILE_2 = "file2"; + public final static String FILE_3 = "file3"; + public final static String FILE_4 = "file4"; + public final static String FILE_5 = "file5"; + public final static String FILE_6 = "file6"; + public final static String FILE_7 = "file7"; + } diff --git a/securitycontrol-commons/securitycontrol-commons-core/src/main/java/com/securitycontrol/common/core/utils/BytesToMultipartFileUtil.java b/securitycontrol-commons/securitycontrol-commons-core/src/main/java/com/securitycontrol/common/core/utils/BytesToMultipartFileUtil.java new file mode 100644 index 0000000..8f40fd2 --- /dev/null +++ b/securitycontrol-commons/securitycontrol-commons-core/src/main/java/com/securitycontrol/common/core/utils/BytesToMultipartFileUtil.java @@ -0,0 +1,105 @@ +package com.securitycontrol.common.core.utils; + +import org.apache.commons.fileupload.FileItem; +import org.apache.commons.fileupload.disk.DiskFileItem; +import org.apache.poi.util.IOUtils; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.commons.CommonsMultipartFile; + +import java.io.*; +import java.nio.file.Files; + +/** + * @author:cwchen + * @date:2024-03-12-17:53 + * @version:1.0 + * @description:字节数组转文件 + */ +public class BytesToMultipartFileUtil { + /** + * byte 转换为 MultipartFile + * + * @param bytes + * @return + */ + public static MultipartFile encodeToMultipartFile(byte[] bytes, String path) { + MultipartFile multipartFile = null; + InputStream input = null; + OutputStream outputStream = null; + File tempFile = null; + try { + File file = new File(path); + if (!file.exists()) { + file.mkdirs(); + } + path = path + File.separator + System.currentTimeMillis() + ".png"; + tempFile = new File(path); + tempFile.createNewFile(); + // 把 byte 转换为 File 文件 + getFileByBytes(bytes, path); + // 第一个参数 fieldName 就是文件上传的 name, 这里我写的是 uploadFile + FileItem fileItem = new DiskFileItem("uploadFile", Files.probeContentType(tempFile.toPath()), false, tempFile.getName(), (int) tempFile.length(), tempFile.getParentFile()); + input = new FileInputStream(tempFile); + outputStream = fileItem.getOutputStream(); + IOUtils.copy(input, outputStream); + multipartFile = new CommonsMultipartFile(fileItem); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + input.close(); + outputStream.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + // 删除这个 File + if (tempFile.exists()) { + tempFile.delete(); + } + return multipartFile; + } + + /** + * byte [] 转换为 File + * + * @param bytes + * @param filePath + */ + public static void getFileByBytes(byte[] bytes, String filePath) { + BufferedOutputStream bos = null; + FileOutputStream fos = null; + File file = null; + try { + File dir = new File(filePath); + // 判断文件目录是否存在 + if (!dir.exists() && dir.isDirectory()) { + dir.mkdirs(); + } + file = new File(filePath); + //输出流 + fos = new FileOutputStream(file); + //缓冲流 + bos = new BufferedOutputStream(fos); + //将字节数组写出 + bos.write(bytes); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (bos != null) { + try { + bos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fos != null) { + try { + fos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } +} diff --git a/securitycontrol-commons/securitycontrol-commons-core/src/main/java/com/securitycontrol/common/core/utils/ImportExcelUtils.java b/securitycontrol-commons/securitycontrol-commons-core/src/main/java/com/securitycontrol/common/core/utils/ImportExcelUtils.java new file mode 100644 index 0000000..c20ede1 --- /dev/null +++ b/securitycontrol-commons/securitycontrol-commons-core/src/main/java/com/securitycontrol/common/core/utils/ImportExcelUtils.java @@ -0,0 +1,449 @@ +package com.securitycontrol.common.core.utils; + +import com.alibaba.fastjson2.JSONObject; +import com.securitycontrol.common.core.constant.Constant; +import com.securitycontrol.common.core.exception.ServiceException; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.hssf.usermodel.*; +import org.apache.poi.ooxml.POIXMLDocumentPart; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.xssf.usermodel.*; +import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTMarker; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.io.InputStream; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * @author 10488 + * excel文件导入-包含图片 + */ +@Slf4j +public class ImportExcelUtils { + + private static final List PRONAME_LIST = new LinkedList<>(); + + public static List readExcel(MultipartFile file, Class mClass, String uploadPath) throws Exception { + String fileName = file.getOriginalFilename(); + log.info("OriginalFilename:{}", fileName); + if (!StringUtils.endsWithAny(fileName, Constant.XLS, Constant.XLSX)) { + throw new ServiceException("不支持excel以外的文件导入!"); + } + List list = new ArrayList<>(); + InputStream inputStream = file.getInputStream(); + String className = mClass.getSimpleName(); + log.info("className:{}", className); + //根据指定的文件输入流导入Excel从而产生Workbook对象 + Workbook workbook = null; + Sheet sheet = null; + Map mapData = null; + if (null != fileName && fileName.endsWith(Constant.XLS)) { + workbook = new HSSFWorkbook(inputStream); + //获取Excel文档中的第一个表单 + sheet = workbook.getSheetAt(0); + if (!checkModal(sheet, className)) { + throw new ServiceException("模板错误,请重新选择模板!"); + } + mapData = getPicturesXls((HSSFSheet) sheet, className); + } + if (null != fileName && fileName.endsWith(Constant.XLSX)) { + workbook = new XSSFWorkbook(inputStream); + //获取Excel文档中的第一个表单 + sheet = workbook.getSheetAt(0); + if (!checkModal(sheet, className)) { + throw new ServiceException("模板错误,请重新选择模板!"); + } + mapData = getPicturesXlsx((XSSFSheet) sheet, className); + } + List> filenames = new ArrayList<>(); + if (Objects.equals(className, Constant.PRO_IMPORT_VO)) { + log.info("开始读取并写入图片"); + filenames = writeImg(mapData, className, uploadPath); + log.info("图片:{},写入完成!", filenames); + } + int sheetCount = 0; + if (workbook != null) { + workbook.getNumberOfSheets(); + } + log.info("Sheet(表单)数量:{}", sheetCount); + log.info("filenames:{}", filenames); + //获得最后一条记录得的行号,从0开始 + int totalRowNum = 0; + if (sheet != null) { + totalRowNum = sheet.getLastRowNum(); + } + log.info("总记录数:{}", (totalRowNum + 1)); + list = createBean(sheet, mClass, filenames); + inputStream.close(); + return list; + } + + private static boolean checkModal(Sheet sheet, String className) { + int colNum = sheet.getRow(0).getLastCellNum(); + if (Objects.equals(className, Constant.PRO_IMPORT_VO)) { + return colNum == 25; + } + return false; + } + + private static List createBean(Sheet sheet, Class mClass, List> filename) throws Exception { + if (sheet == null || sheet.getLastRowNum() < 0) { + return null; + } + List list = new ArrayList<>(); + // 总列数 + int last = sheet.getRow(0).getLastCellNum(); + log.info("列数:{}", last); + try { + for (Row row : sheet) { + if (row == null) { + continue; + } + // 第一行是标题栏 + if (Objects.equals(mClass.getSimpleName(), Constant.PRO_IMPORT_VO)) { + if (row.getRowNum() < 2) { + continue; + } + } + boolean isBlankRow = true; + for (Cell c : row) { + if (c.getCellType() != CellType.BLANK) { + isBlankRow = false; + break; + } + } + if (isBlankRow) { + continue; + } + JSONObject obj = new JSONObject(); + obj.put("rowNo", row.getRowNum() + 1); + if (Objects.equals(mClass.getSimpleName(), Constant.PRO_IMPORT_VO)) { + setExcelToString(18, row); + obj = setProObjData(row, obj, filename); + } + list.add(obj); + } + } catch (IllegalStateException e) { + e.printStackTrace(); + throw new ServiceException("模板中含有单元格数据格式不正确"); + } + return list; + } + + /** + * 工程数据赋值 + * + * @param row + * @param obj + * @return JSONObject + * @description + * @author cwchen + * @date 2024/3/12 15:09 + */ + public static JSONObject setProObjData(Row row, JSONObject obj, List> files) { + if (row.getCell(Constant.CELL_1) != null) { + // 建管单位 + obj.put("org", row.getCell(Constant.CELL_1).getStringCellValue()); + } + if (row.getCell(Constant.CELL_2) != null) { + // 工程名称 + obj.put("proName", row.getCell(Constant.CELL_2).getStringCellValue()); + } + if (row.getCell(Constant.CELL_3) != null) { + // 工程类型 + obj.put("proType", row.getCell(Constant.CELL_3).getStringCellValue()); + } + if (row.getCell(Constant.CELL_4) != null) { + // 工程编码 + obj.put("proCode", row.getCell(Constant.CELL_4).getStringCellValue()); + } + if (row.getCell(Constant.CELL_5) != null) { + // 工程状态 + obj.put("status", row.getCell(Constant.CELL_5).getStringCellValue()); + } + if (row.getCell(Constant.CELL_6) != null) { + // 单项编码 + obj.put("signCode", row.getCell(Constant.CELL_6).getStringCellValue()); + } + if (row.getCell(Constant.CELL_7) != null) { + // 标段编码 + obj.put("bidCode", row.getCell(Constant.CELL_7).getStringCellValue()); + } + if (row.getCell(Constant.CELL_8) != null) { + // 规模 + obj.put("proScale", row.getCell(Constant.CELL_8).getStringCellValue()); + } + if (row.getCell(Constant.CELL_9) != null) { + // 监理单位 + obj.put("jlUnit", row.getCell(Constant.CELL_9).getStringCellValue()); + } + if (row.getCell(Constant.CELL_10) != null) { + // 施工单位 + obj.put("sgUnit", row.getCell(Constant.CELL_10).getStringCellValue()); + } + if (row.getCell(Constant.CELL_11) != null) { + // 项目经理 + obj.put("manager", row.getCell(Constant.CELL_11).getStringCellValue()); + } + if (row.getCell(Constant.CELL_12) != null) { + // 计划开始时间 + obj.put("planStartTime", row.getCell(Constant.CELL_12).getStringCellValue()); + } + if (row.getCell(Constant.CELL_13) != null) { + // 计划结束时间 + obj.put("planEndTime", row.getCell(Constant.CELL_13).getStringCellValue()); + } + if (row.getCell(Constant.CELL_14) != null) { + // 实际开始时间 + obj.put("startTime", row.getCell(Constant.CELL_14).getStringCellValue()); + } + if (row.getCell(Constant.CELL_15) != null) { + // 实际结束时间 + obj.put("endTime", row.getCell(Constant.CELL_15).getStringCellValue()); + } + if (row.getCell(Constant.CELL_16) != null) { + // 项目总成本(万) + obj.put("proCost", row.getCell(Constant.CELL_16).getStringCellValue()); + } + if (row.getCell(Constant.CELL_17) != null) { + // 工程简介 + obj.put("proBrief", row.getCell(Constant.CELL_17).getStringCellValue()); + } + obj = setFileObj(row, obj, files); + return obj; + } + + public static JSONObject setFileObj(Row row, JSONObject obj, List> files) { + // 平面图 + String fileName = "file" + "_" + row.getRowNum() + "_1"; + for (Map map : files) { + for (String keyName : map.keySet()) { + if (Objects.equals(fileName, keyName)) { + obj.put("file", map.get(keyName)); + } + } + } + // 图片1 + String fileName2 = "file" + "_" + row.getRowNum() + "_2"; + for (Map map : files) { + for (String keyName : map.keySet()) { + if (Objects.equals(fileName2, keyName)) { + obj.put("file2", map.get(keyName)); + } + } + } + // 图片2 + String fileName3 = "file" + "_" + row.getRowNum() + "_3"; + for (Map map : files) { + for (String keyName : map.keySet()) { + if (Objects.equals(fileName3, keyName)) { + obj.put("file3", map.get(keyName)); + } + } + } + // 图片3 + String fileName4 = "file" + "_" + row.getRowNum() + "_4"; + for (Map map : files) { + for (String keyName : map.keySet()) { + if (Objects.equals(fileName4, keyName)) { + obj.put("file4", map.get(keyName)); + } + } + } + // 图片4 + String fileName5 = "file" + "_" + row.getRowNum() + "_5"; + for (Map map : files) { + for (String keyName : map.keySet()) { + if (Objects.equals(fileName5, keyName)) { + obj.put("file5", map.get(keyName)); + } + } + } + // 图片3 + String fileName6 = "file" + "_" + row.getRowNum() + "_6"; + for (Map map : files) { + for (String keyName : map.keySet()) { + if (Objects.equals(fileName6, keyName)) { + obj.put("file6", map.get(keyName)); + } + } + } + // 图片3 + String fileName7 = "file" + "_" + row.getRowNum() + "_7"; + for (Map map : files) { + for (String keyName : map.keySet()) { + if (Objects.equals(fileName7, keyName)) { + obj.put("file7", map.get(keyName)); + } + } + } + return obj; + } + + /** + * 获取图片和位置 (xlsx) + * + * @param sheet + * @return + * @throws IOException + */ + public static Map getPicturesXlsx(XSSFSheet sheet, String className) throws IOException { + Map map = new HashMap<>(16); + List list = sheet.getRelations(); + for (POIXMLDocumentPart part : list) { + if (part instanceof XSSFDrawing) { + XSSFDrawing drawing = (XSSFDrawing) part; + List shapes = drawing.getShapes(); + + for (XSSFShape shape : shapes) { + XSSFPicture picture = (XSSFPicture) shape; + XSSFClientAnchor anchor = picture.getPreferredSize(); + CTMarker marker = anchor.getFrom(); + Row row = sheet.getRow(marker.getRow()); + if (row == null) { + continue; + } + String keyName = null; + if (Objects.equals(className, Constant.PRO_IMPORT_VO)) { + keyName = setKey(picture, row, Constant.PRO_IMPORT_VO); + } else { + keyName = ""; + } + map.put(keyName, picture.getPictureData()); + } + } + } + return map; + } + + /** + * 获取图片和位置 (xls) + * + * @param sheet + * @return + * @throws IOException + */ + public static Map getPicturesXls(HSSFSheet sheet, String className) throws IOException { + int i = 0; + Map map = new HashMap(16); + if (sheet.getDrawingPatriarch() != null) { + List list = sheet.getDrawingPatriarch().getChildren(); + for (HSSFShape shape : list) { + if (shape instanceof HSSFPicture) { + HSSFPicture picture = (HSSFPicture) shape; + int pictureIndex = ((HSSFPicture) shape).getPictureIndex(); + if (pictureIndex != -1) { + HSSFClientAnchor cAnchor = picture.getClientAnchor(); + Row row = sheet.getRow(cAnchor.getRow1()); + if (row == null) { + continue; + } + String keyName = null; + if (cAnchor.getCol1() == 18) { + PRONAME_LIST.add(row.getCell(1).getStringCellValue()); + keyName = "file" + "_" + cAnchor.getRow1() + "_1"; + } else if (cAnchor.getCol1() == 19) { + PRONAME_LIST.add(row.getCell(1).getStringCellValue()); + keyName = "file" + "_" + cAnchor.getRow1() + "_2"; + } else if (cAnchor.getCol1() == 20) { + PRONAME_LIST.add(row.getCell(1).getStringCellValue()); + keyName = "file" + "_" + cAnchor.getRow1() + "_3"; + } else if (cAnchor.getCol1() == 21) { + PRONAME_LIST.add(row.getCell(1).getStringCellValue()); + keyName = "file" + "_" + cAnchor.getRow1() + "_4"; + } else if (cAnchor.getCol1() == 22) { + PRONAME_LIST.add(row.getCell(1).getStringCellValue()); + keyName = "file" + "_" + cAnchor.getRow1() + "_5"; + } else if (cAnchor.getCol1() == 23) { + PRONAME_LIST.add(row.getCell(1).getStringCellValue()); + keyName = "file" + "_" + cAnchor.getRow1() + "_6"; + } else if (cAnchor.getCol1() == 24) { + PRONAME_LIST.add(row.getCell(1).getStringCellValue()); + keyName = "file" + "_" + cAnchor.getRow1() + "_7"; + } + map.put(keyName, picture.getPictureData()); + } + } + } + } + return map; + } + + /** + * 图片写出 + */ + public static List> writeImg(Map mapData, String className, String uploadPath) throws IOException { + if (mapData == null || mapData.size() == 0) { + return new ArrayList<>(); + } + Object[] keyArr = mapData.keySet().toArray(); + ArrayList> filename = new ArrayList<>(); + for (int i = 0; i < mapData.size(); i++) { + Map map = new HashMap<>(16); + // 获取图片流 + PictureData pic = mapData.get(keyArr[i]); + // 获取图片索引 + String picName = keyArr[i].toString(); + byte[] data = pic.getData(); + MultipartFile multipartFile = BytesToMultipartFileUtil.encodeToMultipartFile(data, uploadPath); + map.put(picName + "", multipartFile); + filename.add(map); + } + return filename; + } + + + private static String setKey(XSSFPicture picture, Row row, String className) { + if (row == null) { + return null; + } + ; + String result = picture.getPreferredSize().toString(); + String pattern = "\\[1-9]\\d*\\<\\/xdr\\:col\\>"; + Pattern r = Pattern.compile(pattern); + String col = ""; + Matcher m = r.matcher(result); + if (m.find()) { + col = m.group(0); + } else { + System.out.println("NO MATCH"); + } + + if (Objects.equals(className, Constant.PRO_IMPORT_VO)) { + switch (col) { + case "18": + return "file" + "_" + row.getRowNum() + "_1"; + case "19": + return "file" + "_" + row.getRowNum() + "_2"; + case "20": + return "file" + "_" + row.getRowNum() + "_3"; + case "21": + return "file" + "_" + row.getRowNum() + "_4"; + case "22": + return "file" + "_" + row.getRowNum() + "_5"; + case "23": + return "file" + "_" + row.getRowNum() + "_6"; + case "24": + return "file" + "_" + row.getRowNum() + "_7"; + default: + return null; + } + } else { + return ""; + } + + } + + private static void setExcelToString(int j, Row row) { + + for (int i = 0; i < j; i++) { + if (row.getCell(i) != null) { + row.getCell(i).setCellType(CellType.STRING); + } + } + } +} diff --git a/securitycontrol-commons/securitycontrol-commons-entity/src/main/java/com/securitycontrol/entity/system/base/dto/ProDto.java b/securitycontrol-commons/securitycontrol-commons-entity/src/main/java/com/securitycontrol/entity/system/base/dto/ProDto.java index 9fa97a7..c0305e7 100644 --- a/securitycontrol-commons/securitycontrol-commons-entity/src/main/java/com/securitycontrol/entity/system/base/dto/ProDto.java +++ b/securitycontrol-commons/securitycontrol-commons-entity/src/main/java/com/securitycontrol/entity/system/base/dto/ProDto.java @@ -17,4 +17,7 @@ public class ProDto { @ApiModelProperty(value = "1.图片 2.平面图") private String fileType; + + @ApiModelProperty(value = "关键字") + private String keyWord; } diff --git a/securitycontrol-commons/securitycontrol-commons-entity/src/main/java/com/securitycontrol/entity/system/base/vo/ProImportVo.java b/securitycontrol-commons/securitycontrol-commons-entity/src/main/java/com/securitycontrol/entity/system/base/vo/ProImportVo.java new file mode 100644 index 0000000..7420f49 --- /dev/null +++ b/securitycontrol-commons/securitycontrol-commons-entity/src/main/java/com/securitycontrol/entity/system/base/vo/ProImportVo.java @@ -0,0 +1,99 @@ +package com.securitycontrol.entity.system.base.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * @author:cwchen + * @date:2024-03-12-14:21 + * @version:1.0 + * @description:工程导入-vo + */ +@Data +public class ProImportVo { + + @ApiModelProperty(value = "工程ID") + private String proId; + + @ApiModelProperty(value = "建管单位") + private String org; + + @ApiModelProperty(value = "标段工程编码") + private String bidCode; + + @ApiModelProperty(value = "单项工程编码") + private String signCode; + + @ApiModelProperty(value = "工程编码") + private String proCode; + + @ApiModelProperty(value = "工程名称") + private String proName; + + @ApiModelProperty(value = "工程成本") + private String proCost; + + @ApiModelProperty(value = "施工单位") + private String sgUnit; + + @ApiModelProperty(value = "监理单位") + private String jlUnit; + + @ApiModelProperty(value = "工程类型") + private String proType; + + @ApiModelProperty(value = "工程规模") + private String proScale; + + @ApiModelProperty(value = "项目经理") + private String manager; + + @ApiModelProperty(value = "工程简介") + private String proBrief; + + @ApiModelProperty(value = "工程状态") + private String status; + + @ApiModelProperty(value = "计划开始时间") + private String planStartTime; + + @ApiModelProperty(value = "计划结束时间") + private String planEndTime; + + @ApiModelProperty(value = "实际开始时间") + private String startTime; + + @ApiModelProperty(value = "实际竣工时间") + private String endTime; + + @ApiModelProperty(value = "工程平面图") + private MultipartFile file; + + @ApiModelProperty(value = "工程图片1") + private MultipartFile file2; + + @ApiModelProperty(value = "工程图片2") + private MultipartFile file3; + + @ApiModelProperty(value = "工程图片3") + private MultipartFile file4; + + @ApiModelProperty(value = "工程图片4") + private MultipartFile file5; + + @ApiModelProperty(value = "工程图片5") + private MultipartFile file6; + + @ApiModelProperty(value = "工程图片6") + private MultipartFile file7; + + @ApiModelProperty(value = "工程图片集合") + private List files; + + @ApiModelProperty(value = "1.新增 2.修改") + private int type; + +} diff --git a/securitycontrol-commons/securitycontrol-commons-log/src/main/java/com/securitycontrol/common/log/aspect/OperLogAspect.java b/securitycontrol-commons/securitycontrol-commons-log/src/main/java/com/securitycontrol/common/log/aspect/OperLogAspect.java index d27d431..e747a6f 100644 --- a/securitycontrol-commons/securitycontrol-commons-log/src/main/java/com/securitycontrol/common/log/aspect/OperLogAspect.java +++ b/securitycontrol-commons/securitycontrol-commons-log/src/main/java/com/securitycontrol/common/log/aspect/OperLogAspect.java @@ -17,7 +17,10 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; -import org.aspectj.lang.annotation.*; +import org.aspectj.lang.annotation.AfterThrowing; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -130,14 +133,11 @@ public class OperLogAspect { //利用是否有异常定性记录失败信息 String result = JSON.toJSONString(jsonResult); JSONObject jsonObject = JSON.parseObject(result); - System.err.println(result); if (e != null) { //失败 sysLog.setResult(BusinessStatus.FAIL.ordinal()); System.err.println(e.getClass().getName()); sysLog.setFailureReason(StringUtils.substring(e.getMessage(), 0, 2000)); - - log.error("耗时:{} 用户id:{} 用户名username: {} 请求ip:{} User-Agent:{} 方法路径:{} 方法参数:{}", sysLog.getTimes(), sysLog.getUserId(), @@ -148,7 +148,7 @@ public class OperLogAspect { sysLog.getParams()); log.error("==控制层方法通知异常=="); log.error("异常信息:{}", e.getMessage()); - }else if(e == null && !Objects.equals(Integer.parseInt(jsonObject.getString(Constant.CODE)), Constant.SUCCESS)){ + } else if (e == null && jsonObject != null && !Objects.equals(Integer.parseInt(jsonObject.getString(Constant.CODE)), Constant.SUCCESS)) { sysLog.setResult(BusinessStatus.FAIL.ordinal()); sysLog.setFailureReason(StringUtils.substring(jsonObject.getString("msg"), 0, 2000)); log.error("耗时:{} 用户id:{} 用户名username: {} 请求ip:{} User-Agent:{} 方法路径:{} 方法参数:{}", @@ -246,7 +246,7 @@ public class OperLogAspect { params.append(jsonObj.toString()).append(" "); } } else { - if(value != null){ + if (value != null) { Object jsonObj = JSON.toJSON(value); params.append(jsonObj.toString()).append(" "); } diff --git a/securitycontrol-commons/securitycontrol-commons-security/src/main/java/com/securitycontrol/common/security/interceptor/MyFilter.java b/securitycontrol-commons/securitycontrol-commons-security/src/main/java/com/securitycontrol/common/security/interceptor/MyFilter.java index db2a6b2..ac1a24c 100644 --- a/securitycontrol-commons/securitycontrol-commons-security/src/main/java/com/securitycontrol/common/security/interceptor/MyFilter.java +++ b/securitycontrol-commons/securitycontrol-commons-security/src/main/java/com/securitycontrol/common/security/interceptor/MyFilter.java @@ -32,7 +32,7 @@ public class MyFilter implements Filter { } } - public static final String[] EXCLUDE_URLS = {"/sys/pro/addPro","/sys/pro/editPro"}; + public static final String[] EXCLUDE_URLS = {"/sys/pro/addPro","/sys/pro/editPro","/sys/pro/importProData"}; public boolean isFileUpload(HttpServletRequest request) { for (String excludeUrl : EXCLUDE_URLS) { diff --git a/securitycontrol-commons/securitycontrol-commons-security/src/main/java/com/securitycontrol/common/security/interceptor/ParamSecureHandler.java b/securitycontrol-commons/securitycontrol-commons-security/src/main/java/com/securitycontrol/common/security/interceptor/ParamSecureHandler.java index 9466e91..04f40e9 100644 --- a/securitycontrol-commons/securitycontrol-commons-security/src/main/java/com/securitycontrol/common/security/interceptor/ParamSecureHandler.java +++ b/securitycontrol-commons/securitycontrol-commons-security/src/main/java/com/securitycontrol/common/security/interceptor/ParamSecureHandler.java @@ -61,7 +61,7 @@ public class ParamSecureHandler implements AsyncHandlerInterceptor { // IResourceService resourceService = (IResourceService) AdapterFactory.getInstance(Constants.CLASS_RESOURCE); - public static final String[] EXCLUDE_URLS = {"/sys/pro/addPro","/sys/pro/editPro"}; + public static final String[] EXCLUDE_URLS = {"/sys/pro/addPro","/sys/pro/editPro","/sys/pro/importProData"}; public boolean isFileUpload(HttpServletRequest request) { for (String excludeUrl : EXCLUDE_URLS) { diff --git a/securitycontrol-model/securitycontrol-system/pom.xml b/securitycontrol-model/securitycontrol-system/pom.xml index 12baf7c..6dca87a 100644 --- a/securitycontrol-model/securitycontrol-system/pom.xml +++ b/securitycontrol-model/securitycontrol-system/pom.xml @@ -119,6 +119,44 @@ org.springframework.boot spring-boot-starter-data-mongodb + + + cn.afterturn + easypoi-base + 4.2.0 + + + com.google.guava + guava + + + + + cn.afterturn + easypoi-web + 4.2.0 + + + cn.afterturn + easypoi-annotation + 4.2.0 + + + com.google.guava + guava + 20.0 + + + org.apache.poi + poi + 4.1.2 + + + org.freemarker + freemarker + 2.3.30 + + diff --git a/securitycontrol-model/securitycontrol-system/src/main/java/com/securitycontrol/system/base/controller/ExportFileController.java b/securitycontrol-model/securitycontrol-system/src/main/java/com/securitycontrol/system/base/controller/ExportFileController.java index 624361d..f7536b4 100644 --- a/securitycontrol-model/securitycontrol-system/src/main/java/com/securitycontrol/system/base/controller/ExportFileController.java +++ b/securitycontrol-model/securitycontrol-system/src/main/java/com/securitycontrol/system/base/controller/ExportFileController.java @@ -1,8 +1,31 @@ package com.securitycontrol.system.base.controller; +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.entity.ExportParams; +import cn.afterturn.easypoi.excel.entity.enmus.ExcelType; +import com.securitycontrol.common.log.annotation.Log; +import com.securitycontrol.common.log.enums.OperationType; +import com.securitycontrol.entity.system.base.dto.ProDto; +import com.securitycontrol.system.export.entity.ProExportVo; +import com.securitycontrol.entity.system.base.vo.ProVo; +import com.securitycontrol.system.base.service.IProService; +import com.securitycontrol.system.export.util.ExcelStyleUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.ss.usermodel.Workbook; +import org.springframework.beans.BeanUtils; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import javax.annotation.Resource; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.List; + + /** * @author:cwchen * @date:2024-03-11-14:55 @@ -11,6 +34,35 @@ import org.springframework.web.bind.annotation.RestController; */ @RestController @RequestMapping("/sys/export/") +@Slf4j public class ExportFileController { + @Resource(name = "IProService") + private IProService service; + + @GetMapping("exportProData") + @Log(title = "基础管理", menu = "基础管理->工程管理", grade = OperationType.EXPORT_BUSINESS, details = "导出工程", type = "业务日志") + public void exportData(HttpServletRequest request, HttpServletResponse response, ProDto dto) { + try { + List proExportVoList = new ArrayList<>(); + List proLists = service.getProLists(dto); + for (int i = 0; i < proLists.size(); i++) { + proLists.get(i).setProId((i + 1) + ""); + ProExportVo exportVo = new ProExportVo(); + BeanUtils.copyProperties(proLists.get(i), exportVo); + proExportVoList.add(exportVo); + } + ExportParams exportParams = new ExportParams("工程列表", "工程列表", ExcelType.XSSF); + exportParams.setStyle(ExcelStyleUtil.class); + Workbook workbook = ExcelExportUtil.exportExcel(exportParams,ProExportVo.class,proExportVoList); + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setHeader("content-disposition", "attachment;fileName=" + URLEncoder.encode("工程列表" + ".xlsx", "UTF-8")); + ServletOutputStream outputStream = response.getOutputStream(); + workbook.write(outputStream); + outputStream.close(); + workbook.close(); + } catch (Exception e) { + log.error("导出工程", e); + } + } } diff --git a/securitycontrol-model/securitycontrol-system/src/main/java/com/securitycontrol/system/base/controller/ProController.java b/securitycontrol-model/securitycontrol-system/src/main/java/com/securitycontrol/system/base/controller/ProController.java index 54edc8e..012d5f8 100644 --- a/securitycontrol-model/securitycontrol-system/src/main/java/com/securitycontrol/system/base/controller/ProController.java +++ b/securitycontrol-model/securitycontrol-system/src/main/java/com/securitycontrol/system/base/controller/ProController.java @@ -1,5 +1,6 @@ package com.securitycontrol.system.base.controller; +import com.alibaba.fastjson2.JSONObject; import com.securitycontrol.common.core.web.controller.BaseController; import com.securitycontrol.common.core.web.domain.AjaxResult; import com.securitycontrol.common.core.web.page.TableDataInfo; @@ -15,6 +16,7 @@ import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import java.util.List; /** @@ -32,7 +34,7 @@ public class ProController extends BaseController { @ApiOperation(value = "获取工程列表") @GetMapping("getProLists") - @Log(title = "基础管理", menu = "基础管理->工程管理", grade = OperationType.QUERY_BUSINESS, details = "查询功能", type = "业务日志") + @Log(title = "基础管理", menu = "基础管理->工程管理", grade = OperationType.QUERY_BUSINESS, details = "查询工程", type = "业务日志") public TableDataInfo getProLists(ProDto dto) { startPage(); List list = service.getProLists(dto); @@ -78,4 +80,11 @@ public class ProController extends BaseController { public AjaxResult viewProFile(ProDto dto) { return service.viewProFile(dto); } + + @ApiOperation(value = "工程信息导入") + @PostMapping("importProData") + @Log(title = "基础管理", menu = "基础管理->工程管理", grade = OperationType.IMPORT_BUSINESS, details = "工程信息导入") + public AjaxResult importProData(MultipartFile file, HttpServletRequest request, HttpServletResponse response) { + return service.importProData(file,request,response); + } } diff --git a/securitycontrol-model/securitycontrol-system/src/main/java/com/securitycontrol/system/base/service/IProService.java b/securitycontrol-model/securitycontrol-system/src/main/java/com/securitycontrol/system/base/service/IProService.java index 1c7229c..1913553 100644 --- a/securitycontrol-model/securitycontrol-system/src/main/java/com/securitycontrol/system/base/service/IProService.java +++ b/securitycontrol-model/securitycontrol-system/src/main/java/com/securitycontrol/system/base/service/IProService.java @@ -6,6 +6,8 @@ import com.securitycontrol.entity.system.base.dto.ProGxPlanDto; import com.securitycontrol.entity.system.base.vo.ProVo; import org.springframework.web.multipart.MultipartFile; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import java.util.List; /** @@ -74,6 +76,8 @@ public interface IProService { AjaxResult delProGxPlan(ProGxPlanDto dto); /** + * 工程图片/平面图预览 + * * @param dto * @return AjaxResult * @description @@ -81,4 +85,16 @@ public interface IProService { * @date 2024/3/12 13:11 */ AjaxResult viewProFile(ProDto dto); + + /** + * 工程信息导入 + * @param file + * @param request + * @param response + * @return AjaxResult + * @description + * @author cwchen + * @date 2024/3/13 9:10 + */ + AjaxResult importProData(MultipartFile file, HttpServletRequest request, HttpServletResponse response); } diff --git a/securitycontrol-model/securitycontrol-system/src/main/java/com/securitycontrol/system/base/service/impl/ProServiceImpl.java b/securitycontrol-model/securitycontrol-system/src/main/java/com/securitycontrol/system/base/service/impl/ProServiceImpl.java index c4b9e96..a26b41e 100644 --- a/securitycontrol-model/securitycontrol-system/src/main/java/com/securitycontrol/system/base/service/impl/ProServiceImpl.java +++ b/securitycontrol-model/securitycontrol-system/src/main/java/com/securitycontrol/system/base/service/impl/ProServiceImpl.java @@ -1,12 +1,16 @@ package com.securitycontrol.system.base.service.impl; import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.securitycontrol.common.core.constant.Constant; +import com.securitycontrol.common.core.utils.ImportExcelUtils; import com.securitycontrol.common.core.utils.StringUtils; import com.securitycontrol.common.core.utils.aes.DateTimeHelper; import com.securitycontrol.common.core.web.domain.AjaxResult; import com.securitycontrol.common.security.utils.ValidatorsUtils; import com.securitycontrol.entity.system.base.dto.ProDto; import com.securitycontrol.entity.system.base.dto.ProGxPlanDto; +import com.securitycontrol.entity.system.base.vo.ProImportVo; import com.securitycontrol.entity.system.base.vo.ProVo; import com.securitycontrol.entity.system.vo.ResourceFileVo; import com.securitycontrol.system.base.mapper.IProMapper; @@ -16,12 +20,16 @@ import com.securitycontrol.system.mongodb.util.MongodbFileUtil; import com.securitycontrol.system.mongodb.vo.FileExportVo; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.interceptor.TransactionAspectSupport; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import java.util.*; /** @@ -43,6 +51,9 @@ public class ProServiceImpl implements IProService { @Resource(name = "fileMongoServiceImpl") private FileUploadService mongoService; + @Value("${file.temp_file_path}") + private String temp_file_path; + @Override public List getProLists(ProDto dto) { @@ -129,7 +140,7 @@ public class ProServiceImpl implements IProService { ProVo vo = new ProVo(); vo = mapper.getProById(dto); List resourceFileVos = mapper.getFiles(vo.getProId()); - if(CollectionUtils.isNotEmpty(resourceFileVos)){ + if (CollectionUtils.isNotEmpty(resourceFileVos)) { List list = new ArrayList<>(); for (ResourceFileVo fileVo : resourceFileVos) { FileExportVo fileExportVo = mongoService.downloadFile(fileVo.getFileId()); @@ -175,9 +186,9 @@ public class ProServiceImpl implements IProService { public AjaxResult viewProFile(ProDto dto) { List list = new ArrayList<>(); List resourceFileVos = mapper.getFiles(dto.getProId()); - if(CollectionUtils.isNotEmpty(resourceFileVos)){ + if (CollectionUtils.isNotEmpty(resourceFileVos)) { for (ResourceFileVo fileVo : resourceFileVos) { - if(Objects.equals(dto.getFileType(),fileVo.getSourceType())){ + if (Objects.equals(dto.getFileType(), fileVo.getSourceType())) { FileExportVo fileExportVo = mongoService.downloadFile(fileVo.getFileId()); String base64 = MongodbFileUtil.getBase64(fileExportVo); ProVo.FileData fileData = new ProVo.FileData(); @@ -190,4 +201,118 @@ public class ProServiceImpl implements IProService { } return AjaxResult.success(list); } + + + @Override + @Transactional(rollbackFor = Exception.class) + public AjaxResult importProData(MultipartFile file, HttpServletRequest request, HttpServletResponse response) { + List errorList = new ArrayList<>(); + try { + List lstObj = (List) ImportExcelUtils.readExcel(file, ProImportVo.class, temp_file_path); + List lstError = new ArrayList<>(); + List list = new ArrayList<>(); + if (lstObj != null && lstObj.size() > 0) { + list = new ArrayList<>(); + lstError = new ArrayList<>(); + for (JSONObject obj : lstObj) { + ProImportVo vo = new ProImportVo(); + ProVo proVo = new ProVo(); + vo = setProData(vo, obj); + BeanUtils.copyProperties(vo, proVo); + if (vo.getFile() != null) { + FileExportVo item = mongoService.uploadFile(vo.getFile()); + if (item != null) { + errorList.add(item.getFileId()); + ResourceFileVo fileVo = setResourceData(item,vo.getProId(),2); + mapper.addFiles(fileVo); + } + } + List files = vo.getFiles(); + if(CollectionUtils.isNotEmpty(files)){ + for (MultipartFile multipartFile : files) { + FileExportVo item = mongoService.uploadFile(multipartFile); + if (item != null) { + errorList.add(item.getFileId()); + ResourceFileVo fileVo = setResourceData(item,vo.getProId(),1); + mapper.addFiles(fileVo); + } + } + } + mapper.addOrUpdatePro(proVo); + } + } + } catch (Exception e) { + log.error("工程文件导入", e); + // 删除文件 + if (CollectionUtils.isNotEmpty(errorList)) { + errorList.forEach(item -> { + mongoService.removeFile(item); + }); + } + //手动回滚异常 + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return AjaxResult.error(); + } + return AjaxResult.success(); + } + + public ProImportVo setProData(ProImportVo vo, JSONObject obj) { + String proId = UUID.randomUUID().toString().replace("-", ""); + vo.setProId(proId); + vo.setOrg(obj.getString("org")); + vo.setBidCode(obj.getString("bidCode")); + vo.setSignCode(obj.getString("signCode")); + vo.setProCode(obj.getString("proCode")); + vo.setProName(obj.getString("proName")); + vo.setProCost(obj.getString("proCost")); + vo.setSgUnit(obj.getString("sgUnit")); + vo.setJlUnit(obj.getString("jlUnit")); + vo.setProType(obj.getString("proType")); + vo.setProScale(obj.getString("proScale")); + vo.setManager(obj.getString("manager")); + vo.setProBrief(obj.getString("proBrief")); + vo.setStatus(obj.getString("status")); + vo.setPlanStartTime(obj.getString("planStartTime")); + vo.setPlanEndTime(obj.getString("planEndTime")); + vo.setStartTime(obj.getString("startTime")); + vo.setEndTime(obj.getString("endTime")); + vo.setFile(obj.get("file") != null ? (MultipartFile) obj.get("file") : null); + List files = new ArrayList(); + if(obj.get(Constant.FILE_2) != null){ + files.add((MultipartFile) obj.get(Constant.FILE_2)); + } + if(obj.get(Constant.FILE_3) != null){ + files.add((MultipartFile) obj.get(Constant.FILE_3)); + } + if(obj.get(Constant.FILE_4) != null){ + files.add((MultipartFile) obj.get(Constant.FILE_4)); + } + if(obj.get(Constant.FILE_5) != null){ + files.add((MultipartFile) obj.get(Constant.FILE_5)); + } + if(obj.get(Constant.FILE_6) != null){ + files.add((MultipartFile) obj.get(Constant.FILE_6)); + } + if(obj.get(Constant.FILE_7) != null){ + files.add((MultipartFile) obj.get(Constant.FILE_7)); + } + vo.setFiles(files); + vo.setType(1); + return vo; + } + + public ResourceFileVo setResourceData(FileExportVo item, String proId, int type) { + ResourceFileVo fileVo = new ResourceFileVo(); + String resourceId = UUID.randomUUID().toString().replace("-", ""); + fileVo.setResourceId(resourceId); + fileVo.setFileType(1); + fileVo.setFileId(item.getFileId()); + fileVo.setFileSuffix(item.getSuffix()); + fileVo.setFileName(item.getFileName()); + fileVo.setSourceId(proId); + fileVo.setUpdateTime(DateTimeHelper.getNowTime()); + fileVo.setSourceType(type == 1 ? "工程图片" : "工程平面图"); + return fileVo; + } + } diff --git a/securitycontrol-model/securitycontrol-system/src/main/java/com/securitycontrol/system/export/entity/ProExportVo.java b/securitycontrol-model/securitycontrol-system/src/main/java/com/securitycontrol/system/export/entity/ProExportVo.java new file mode 100644 index 0000000..6824c64 --- /dev/null +++ b/securitycontrol-model/securitycontrol-system/src/main/java/com/securitycontrol/system/export/entity/ProExportVo.java @@ -0,0 +1,89 @@ +package com.securitycontrol.system.export.entity; + +import cn.afterturn.easypoi.excel.annotation.Excel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +/** + * @author:cwchen + * @date:2024-03-12-14:21 + * @version:1.0 + * @description:工程导入-vo + */ +@Data +public class ProExportVo { + + @ApiModelProperty(value = "工程ID") + @Excel(name = "序号", width = 10.0, orderNum = "0") + private String proId; + + @Excel(name = "建管单位", width = 10.0, orderNum = "1") + @ApiModelProperty(value = "建管单位") + private String org; + + @ApiModelProperty(value = "工程名称") + @Excel(name = "工程名称", width = 10.0, orderNum = "2") + private String proName; + + @ApiModelProperty(value = "标段工程编码") + @Excel(name = "标段工程编码", width = 20.0, orderNum = "3") + private String bidCode; + + @ApiModelProperty(value = "单项工程编码") + @Excel(name = "单项工程编码", width = 20.0, orderNum = "4") + private String signCode; + + @ApiModelProperty(value = "工程编码") + @Excel(name = "工程编码", width = 20.0, orderNum = "5") + private String proCode; + + @ApiModelProperty(value = "工程类型") + @Excel(name = "工程类型", width = 20.0, orderNum = "6") + private String proType; + + @ApiModelProperty(value = "工程规模") + @Excel(name = "工程规模", width = 20.0, orderNum = "7") + private String proScale; + + @ApiModelProperty(value = "监理单位") + @Excel(name = "监理单位", width = 20.0, orderNum = "8") + private String jlUnit; + + @ApiModelProperty(value = "施工单位") + @Excel(name = "施工单位", width = 20.0, orderNum = "9") + private String sgUnit; + + @ApiModelProperty(value = "项目经理") + @Excel(name = "施工单位", width = 20.0, orderNum = "10") + private String manager; + + @ApiModelProperty(value = "计划开始时间") + @Excel(name = "计划开始时间", width = 20.0, orderNum = "11") + private String planStartTime; + + @ApiModelProperty(value = "计划结束时间") + @Excel(name = "计划结束时间", width = 20.0, orderNum = "12") + private String planEndTime; + + @ApiModelProperty(value = "实际开始时间") + @Excel(name = "实际开始时间", width = 20.0, orderNum = "13") + private String startTime; + + @ApiModelProperty(value = "实际竣工时间") + @Excel(name = "实际竣工时间", width = 20.0, orderNum = "14") + private String endTime; + + @ApiModelProperty(value = "项目总成本") + @Excel(name = "项目总成本", width = 20.0, orderNum = "15") + private String proCost; + + @ApiModelProperty(value = "工程简介") + @Excel(name = "工程简介", width = 20.0, orderNum = "16") + private String proBrief; + + @ApiModelProperty(value = "工程状态") + @Excel(name = "工程状态", width = 10.0, orderNum = "17") + private String status; + +} diff --git a/securitycontrol-model/securitycontrol-system/src/main/java/com/securitycontrol/system/export/util/ExcelStyleUtil.java b/securitycontrol-model/securitycontrol-system/src/main/java/com/securitycontrol/system/export/util/ExcelStyleUtil.java new file mode 100644 index 0000000..e2b117c --- /dev/null +++ b/securitycontrol-model/securitycontrol-system/src/main/java/com/securitycontrol/system/export/util/ExcelStyleUtil.java @@ -0,0 +1,196 @@ +package com.securitycontrol.system.export.util; + +import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity; +import cn.afterturn.easypoi.excel.entity.params.ExcelForEachParams; +import cn.afterturn.easypoi.excel.export.styler.IExcelExportStyler; +import org.apache.poi.ss.usermodel.*; + +/** + * @Auther: ccw + * @Date: 2022/05/12/16:22 + * @description: easypoi 导出表格样式 + */ +public class ExcelStyleUtil implements IExcelExportStyler { + private static final short STRING_FORMAT = (short) BuiltinFormats.getBuiltinFormat("TEXT"); + private static final short FONT_SIZE_TEN = 10; + private static final short FONT_SIZE_ELEVEN = 11; + private static final short FONT_SIZE_TWELVE = 12; + + /** + * 大标题样式 + */ + private CellStyle headerStyle; + + /** + * 每列标题样式 + */ + private CellStyle titleStyle; + + /** + * 数据行样式 + */ + private CellStyle styles; + public ExcelStyleUtil(Workbook workbook) { + this.init(workbook); + } + + /** + * 初始化样式 + * + * @param workbook + */ + private void init(Workbook workbook) { + this.headerStyle = initHeaderStyle(workbook); + this.titleStyle = initTitleStyle(workbook); + this.styles = initStyles(workbook); + } + + /** + * 大标题样式 + * + * @param color + * @return + */ + + @Override + public CellStyle getHeaderStyle(short color) { + return headerStyle; + } + + /** + * 每列标题样式 + * + * @param color + * @return + */ + + @Override + public CellStyle getTitleStyle(short color) { + return titleStyle; + } + + /** + * 数据行样式 + * + * @param parity 可以用来表示奇偶行 + * @param entity 数据内容 + * @return 样式 + */ + + @Override + + public CellStyle getStyles(boolean parity, ExcelExportEntity entity) { + return styles; + } + + /** + * 获取样式方法 + * + * @param dataRow 数据行 + * @param obj 对象 + * @param data 数据 + */ + + @Override + + public CellStyle getStyles(Cell cell, int dataRow, ExcelExportEntity entity, Object obj, Object data) { + return getStyles(true, entity); + } + + /** + * 模板使用的样式设置 + */ + + @Override + public CellStyle getTemplateStyles(boolean isSingle, ExcelForEachParams excelForEachParams) { + return null; + } + + /** + * 初始化--大标题样式 + * + * @param workbook + * @return + */ + + private CellStyle initHeaderStyle(Workbook workbook) { + CellStyle style = getBaseCellStyle(workbook); + style.setFont(getFont(workbook, FONT_SIZE_TWELVE, true)); + return style; + } + + /** + * 初始化--每列标题样式 + * + * @param workbook + * @return + */ + + private CellStyle initTitleStyle(Workbook workbook) { + CellStyle style = getBaseCellStyle(workbook); + style.setFont(getFont(workbook, FONT_SIZE_ELEVEN, false)); + //背景色 + style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); + style.setFillPattern(FillPatternType.SOLID_FOREGROUND); + return style; + + } + + /** + * 初始化--数据行样式 + * + * @param workbook + * @return + */ + private CellStyle initStyles(Workbook workbook) { + CellStyle style = getBaseCellStyle(workbook); + style.setFont(getFont(workbook, FONT_SIZE_TEN, false)); + style.setDataFormat(STRING_FORMAT); + return style; + } + + /** + * 基础样式 + * + * @return + */ + + private CellStyle getBaseCellStyle(Workbook workbook) { + CellStyle style = workbook.createCellStyle(); + //下边框 + style.setBorderBottom(BorderStyle.THIN); + //左边框 + style.setBorderLeft(BorderStyle.THIN); + //上边框 + style.setBorderTop(BorderStyle.THIN); + //右边框 + style.setBorderRight(BorderStyle.THIN); + //水平居中 + style.setAlignment(HorizontalAlignment.CENTER); + //上下居中 + style.setVerticalAlignment(VerticalAlignment.CENTER); + //设置自动换行 + style.setWrapText(true); + return style; + } + + /** + * 字体样式 + * + * @param size 字体大小 + * @param isBold 是否加粗 + * @return + */ + + private Font getFont(Workbook workbook, short size, boolean isBold) { + Font font = workbook.createFont(); + //字体样式 + font.setFontName("宋体"); + //是否加粗 + font.setBold(isBold); + //字体大小 + font.setFontHeightInPoints(size); + return font; + } +} + diff --git a/securitycontrol-model/securitycontrol-system/src/main/resources/download/pro_model.xlsx b/securitycontrol-model/securitycontrol-system/src/main/resources/download/pro_model.xlsx index 97149ab..72a4504 100644 Binary files a/securitycontrol-model/securitycontrol-system/src/main/resources/download/pro_model.xlsx and b/securitycontrol-model/securitycontrol-system/src/main/resources/download/pro_model.xlsx differ diff --git a/securitycontrol-model/securitycontrol-system/src/main/resources/mapper/base/ProMapper.xml b/securitycontrol-model/securitycontrol-system/src/main/resources/mapper/base/ProMapper.xml index 3aba212..473b0d3 100644 --- a/securitycontrol-model/securitycontrol-system/src/main/resources/mapper/base/ProMapper.xml +++ b/securitycontrol-model/securitycontrol-system/src/main/resources/mapper/base/ProMapper.xml @@ -130,9 +130,22 @@ tp.end_time AS endTime, tp.pro_cost AS proCost, tp.pro_brief AS proBrief, - tp.status + tp.status, + tp.bid_code AS bidCode, + tp.sign_code AS signCode, + tp.pro_code AS proCode FROM tb_project tp LEFT JOIN sys_build sb ON tp.org = sb.org_id + + + AND ( + INSTR(tp.pro_name,#{keyWord}) > 0 OR + INSTR(tp.jl_unit,#{keyWord}) > 0 OR + INSTR(tp.sg_unit,#{keyWord}) > 0 OR + INSTR(tp.manager,#{keyWord}) > 0 OR + ) + +