From 57fdc64842e295ad0bf356307fc37c199a1805c4 Mon Sep 17 00:00:00 2001
From: yang_shj <1069818635@QQ.com>
Date: Wed, 10 Jan 2024 19:30:18 +0800
Subject: [PATCH 1/2] =?UTF-8?q?#=E6=96=BD=E5=B7=A5=E6=97=A5=E5=BF=97word?=
=?UTF-8?q?=E6=96=87=E6=A1=A3=E5=AF=BC=E5=87=BA?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
hzims-service-api/hzims-operational-api/pom.xml | 6 +
.../access/entity/OperConstructionEntity.java | 6 +-
.../operational/access/vo/ConstructionVo.java | 20 ++
.../access/controller/ConstructionController.java | 2 +-
.../service/impl/ConstructionServiceImpl.java | 155 ++++++++--
.../com/hnac/hzims/operational/util/PdfUtils.java | 320 +++++++++++++++++++++
.../com/hnac/hzims/operational/util/WordUtils.java | 15 +-
.../src/main/resources/log/logback-dev.xml | 127 --------
.../src/main/resources/log/logback-prod.xml | 127 --------
.../src/main/resources/log/logback-test.xml | 127 --------
.../template/excel/constructio_template.xlsx | Bin 17960 -> 0 bytes
.../template/word/constructio_template.docx | Bin 0 -> 18910 bytes
12 files changed, 481 insertions(+), 424 deletions(-)
create mode 100644 hzims-service/operational/src/main/java/com/hnac/hzims/operational/util/PdfUtils.java
delete mode 100644 hzims-service/operational/src/main/resources/log/logback-dev.xml
delete mode 100644 hzims-service/operational/src/main/resources/log/logback-prod.xml
delete mode 100644 hzims-service/operational/src/main/resources/log/logback-test.xml
delete mode 100644 hzims-service/operational/src/main/resources/template/excel/constructio_template.xlsx
create mode 100644 hzims-service/operational/src/main/resources/template/word/constructio_template.docx
diff --git a/hzims-service-api/hzims-operational-api/pom.xml b/hzims-service-api/hzims-operational-api/pom.xml
index 4d40f42..4dc32e8 100644
--- a/hzims-service-api/hzims-operational-api/pom.xml
+++ b/hzims-service-api/hzims-operational-api/pom.xml
@@ -67,6 +67,12 @@
com.hnac.hzims
middle-api
+
+ cn.afterturn
+ easypoi-base
+ 4.4.0
+ compile
+
diff --git a/hzims-service-api/hzims-operational-api/src/main/java/com/hnac/hzims/operational/access/entity/OperConstructionEntity.java b/hzims-service-api/hzims-operational-api/src/main/java/com/hnac/hzims/operational/access/entity/OperConstructionEntity.java
index b164315..8c138e0 100644
--- a/hzims-service-api/hzims-operational-api/src/main/java/com/hnac/hzims/operational/access/entity/OperConstructionEntity.java
+++ b/hzims-service-api/hzims-operational-api/src/main/java/com/hnac/hzims/operational/access/entity/OperConstructionEntity.java
@@ -28,14 +28,14 @@ public class OperConstructionEntity extends TenantEntity {
private String code;
@ApiModelProperty(value = "检修名称")
- private String constructionTime;
-
- @ApiModelProperty(value = "检修名称")
private String overhaulName;
@ApiModelProperty(value = "施工地点")
private String constructionLocation;
+ @ApiModelProperty(value = "施工时间")
+ private Date constructionTime;
+
@ApiModelProperty(value = "检修负责人")
@JsonSerialize(nullsUsing = NullSerializer.class)
private Long overhaulHead;
diff --git a/hzims-service-api/hzims-operational-api/src/main/java/com/hnac/hzims/operational/access/vo/ConstructionVo.java b/hzims-service-api/hzims-operational-api/src/main/java/com/hnac/hzims/operational/access/vo/ConstructionVo.java
index e7244ad..8c1ee5c 100644
--- a/hzims-service-api/hzims-operational-api/src/main/java/com/hnac/hzims/operational/access/vo/ConstructionVo.java
+++ b/hzims-service-api/hzims-operational-api/src/main/java/com/hnac/hzims/operational/access/vo/ConstructionVo.java
@@ -1,10 +1,14 @@
package com.hnac.hzims.operational.access.vo;
+import cn.afterturn.easypoi.entity.ImageEntity;
import com.hnac.hzims.operational.access.entity.OperConstructionEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
+import java.awt.image.BufferedImage;
+import java.io.File;
+
/**
* @author ysj
*/
@@ -17,4 +21,20 @@ public class ConstructionVo extends OperConstructionEntity {
@ApiModelProperty(value = "结束时间")
private String endTime;
+
+ @ApiModelProperty(value = "年")
+ private String year;
+
+ @ApiModelProperty(value = "月")
+ private String mon;
+
+ @ApiModelProperty(value = "日")
+ private String day;
+
+ @ApiModelProperty(value = "图片1")
+ private ImageEntity constructionImg1;
+
+ @ApiModelProperty(value = "图片2")
+ private ImageEntity constructionImg2;
+
}
diff --git a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/access/controller/ConstructionController.java b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/access/controller/ConstructionController.java
index a27bce0..1653362 100644
--- a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/access/controller/ConstructionController.java
+++ b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/access/controller/ConstructionController.java
@@ -49,7 +49,7 @@ public class ConstructionController extends BladeController {
@ApiOperation(value = "新增")
public R save(@RequestBody OperConstructionEntity entity) {
entity.setCode("SGRZ" + DateUtil.format(new Date(),DateUtil.PATTERN_DATETIME_MINI));
- entity.setConstructionTime(DateUtil.format(new Date(),DateUtil.PATTERN_DATETIME));
+ entity.setConstructionTime(entity.getOverhaulTime());
return R.status(service.save(entity));
}
diff --git a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/access/service/impl/ConstructionServiceImpl.java b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/access/service/impl/ConstructionServiceImpl.java
index dddf426..3eea192 100644
--- a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/access/service/impl/ConstructionServiceImpl.java
+++ b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/access/service/impl/ConstructionServiceImpl.java
@@ -1,19 +1,24 @@
package com.hnac.hzims.operational.access.service.impl;
-import cn.afterturn.easypoi.excel.entity.TemplateExportParams;
+import cn.afterturn.easypoi.entity.ImageEntity;
+import cn.afterturn.easypoi.word.WordExportUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.hnac.hzims.operational.access.entity.OperConstructionEntity;
import com.hnac.hzims.operational.access.mapper.ConstructionMapper;
import com.hnac.hzims.operational.access.service.ConstructionService;
import com.hnac.hzims.operational.access.vo.ConstructionVo;
-import com.hnac.hzims.operational.util.ExcelUtil;
+import com.hnac.hzims.operational.util.PdfUtils;
+import com.hnac.hzims.operational.util.WordUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
-import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.commons.io.IOUtils;
+import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.mp.support.Condition;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.core.tool.utils.DateUtil;
import org.springblade.core.tool.utils.ObjectUtil;
import org.springblade.core.tool.utils.StringUtil;
import org.springframework.beans.factory.annotation.Value;
@@ -21,7 +26,12 @@ import org.springframework.stereotype.Service;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
+import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
+import java.io.*;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
@@ -33,12 +43,8 @@ import java.util.Map;
@RequiredArgsConstructor
public class ConstructionServiceImpl extends BaseServiceImpl implements ConstructionService {
-
- @Value("${hzims.operational.construction.save.xlsx}")
- private String constructionSaveXlsxPath;
-
- @Value("${hzims.operational.construction.save.pdf}")
- private String constructionSavePdfPath;
+ @Value("${hzims.operation.construction.save.img}")
+ private String constructionSaveImgPath;
/**
* 施工日志记录分页查询
@@ -67,34 +73,36 @@ public class ConstructionServiceImpl extends BaseServiceImpl params = new HashMap<>();
- /*try {
+ try {
params = PdfUtils.objectToMap(construction);
}catch (Exception e) {
log.error("转换对象失败!");
- }*/
- TemplateExportParams templateExportParams = new TemplateExportParams("template/constructio_template.xlsx", true);
- Workbook workbook = null;
+ }
+ String fileName = construction.getCode() + "_" + construction.getOverhaulName() + "_施工日志" + PdfUtils.DOCX_SUFFIX;
+ XWPFDocument document;
try {
- workbook = ExcelUtil.getWorkbook(templateExportParams,params);
+ document = WordExportUtil.exportWord07("template/word/constructio_template.docx",params);
} catch (Exception e) {
- e.printStackTrace();
+ throw new ServiceException("文件创建失败!");
}
- //上传xlsx至服务器
- //String fileName = DateUtil.format(construction.getConstructionTime(),DateUtil.PATTERN_DATETIME) + "_" + construction.getOverhaulName() + "_施工日志" + PdfUtils.XLSX_SUFFIX;
- /* try {
- ExcelUtil.upload(workbook,constructionSaveXlsxPath,fileName);
- } catch (Exception e) {
+ response.setCharacterEncoding("UTF-8");
+ response.setContentType("application/vnd.ms-excel");
+ ServletOutputStream outputStream;
+ try {
+ //设置docx格式
+ response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName + ".docx", "UTF-8"));
+ //创建一个输出流
+ outputStream = response.getOutputStream();
+ //写入数据
+ document.write(outputStream);
+ // 关闭
+ outputStream.close();
+ document.close();
+ } catch (IOException e) {
e.printStackTrace();
- }*/
- //将docx文件转换为pdf并保存
- //String pdfFileName = DateUtil.format(construction.getConstructionTime(),DateUtil.PATTERN_DATETIME) + "_" + construction.getOverhaulName() + "_施工日志" + PdfUtils.PDF_SUFFIX;
- //String xlsxFileName = DateUtil.format(construction.getConstructionTime(),DateUtil.PATTERN_DATETIME) + "_" + construction.getOverhaulName() + "_施工日志" + PdfUtils.XLSX_SUFFIX;
- //PdfUtils.convertPdf(constructionSaveXlsxPath, xlsxFileName, constructionSavePdfPath, pdfFileName);
- //String savePath = constructionSavePdfPath + pdfFileName;
- // 设置response参数,可以打开下载页面
- //PdfUtils.readPdf(response,savePath);
+ }
}
/**
@@ -102,11 +110,96 @@ public class ConstructionServiceImpl extends BaseServiceImpl 1){
+ construction.setConstructionImg1(new ImageEntity(imgToByte(constructionSaveImgPath + downloadFileByUrl(imgArr[0],constructionSaveImgPath)), 225, 163));
+ construction.setConstructionImg2(new ImageEntity(imgToByte(constructionSaveImgPath + downloadFileByUrl(imgArr[1],constructionSaveImgPath)), 225, 163));
+ }else{
+ construction.setConstructionImg1(new ImageEntity(imgToByte(constructionSaveImgPath + downloadFileByUrl(imgArr[0],constructionSaveImgPath)), 225, 163));
+ }
+ }
+ if(StringUtil.isEmpty(construction.getConstructionAttachment())){
+ construction.setConstructionAttachment(" ");
+ }
+ construction.setYear(DateUtil.format(construction.getConstructionTime(),"yyyy"));
+ construction.setMon(DateUtil.format(construction.getConstructionTime(),"MM"));
+ construction.setDay(DateUtil.format(construction.getConstructionTime(),"dd"));
+ return construction;
+ }
+
+ /**
+ * 将图片转化为字节数组
+ *
+ * @return 字节数组
+ */
+ private byte[] imgToByte(String tempImgPath) {
+ File file = new File(tempImgPath);
+ byte[] buffer = null;
+ try {
+ FileInputStream fis = new FileInputStream(file);
+ ByteArrayOutputStream bos = new ByteArrayOutputStream(1000);
+ byte[] b = new byte[1000];
+ int n;
+ while ((n = fis.read(b)) != -1) {
+ bos.write(b, 0, n);
+ }
+ fis.close();
+ bos.close();
+ buffer = bos.toByteArray();
+ } catch (IOException e) {
+ log.error(e.getMessage());
+ }
+ //删除临时文件
+ file.delete();
+ return buffer;
+ }
+
+ /**
+ * 下载文件
+ * @param fileUrl
+ * @param downloadFileDir
+ * @return
+ */
+ private String downloadFileByUrl(String fileUrl, String downloadFileDir){
+ URL url = null;
+ String fileName = null;
+ try {
+ url = new URL(fileUrl);
+ HttpURLConnection connection = (HttpURLConnection)url.openConnection();
+ connection.setConnectTimeout(5000);
+ connection.setReadTimeout(5000);
+ connection.connect();
+
+ int responseCode = connection.getResponseCode();
+ if (responseCode == 200) {
+
+ InputStream inputStream = connection.getInputStream();
+
+ int lastSlashIndex = fileUrl.lastIndexOf("/");
+ if (lastSlashIndex > 0){
+ fileName = fileUrl.substring(lastSlashIndex+1);
+ String filePath = downloadFileDir + fileName;
+ File file = new File(filePath);
+ if (file.exists()){
+ file.delete();
+ }
+ OutputStream outputStream = new FileOutputStream(file);
+ // 将文件流拷贝到本地处理
+ IOUtils.copy(inputStream, outputStream);
+ }else {
+ throw new ServiceException("下载文件路径异常:" + downloadFileDir);
+ }
+ }
+ } catch (Exception e) {
+ throw new ServiceException("文件图片下载失败!");
+ }
+ return fileName;
}
}
\ No newline at end of file
diff --git a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/util/PdfUtils.java b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/util/PdfUtils.java
new file mode 100644
index 0000000..d12e30b
--- /dev/null
+++ b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/util/PdfUtils.java
@@ -0,0 +1,320 @@
+package com.hnac.hzims.operational.util;
+
+import com.documents4j.api.DocumentType;
+import com.documents4j.api.IConverter;
+import com.documents4j.job.LocalConverter;
+import com.hnac.hzims.operational.annotation.DefaultValue;
+import com.hnac.hzims.ticket.constants.TicketConstants;
+import com.spire.xls.FileFormat;
+import com.spire.xls.Workbook;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.io.IOUtils;
+import org.springblade.core.log.exception.ServiceException;
+import org.springblade.core.tool.utils.DateUtil;
+import org.springblade.core.tool.utils.ObjectUtil;
+import org.springblade.core.tool.utils.StringUtil;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.*;
+import java.lang.reflect.Field;
+import java.net.URLEncoder;
+import java.nio.file.Files;
+import java.time.LocalDateTime;
+import java.util.*;
+
+/**
+ * @author hx
+ */
+@Slf4j
+public class PdfUtils {
+
+ /** 文件后缀名 **/
+ public static String DOC_SUFFIX = ".doc";
+ public static String DOCX_SUFFIX = ".docx";
+ public static String XLS_SUFFIX = ".xls";
+ public static String XLSX_SUFFIX = ".xlsx";
+ public static String PDF_SUFFIX = ".pdf";
+
+ /***
+ * 各文件转换为pdf
+ * @param templatePath 待转换的文件路径
+ * @param templateFileName 待转换的文件名
+ * @param savePath 转换为pdf后的文件路径
+ * @param saveFileName 转换为pdf后的文件名称
+ * @return
+ */
+ public static void convertPdf(String templatePath, String templateFileName, String savePath, String saveFileName) {
+ String templateFilePath = templatePath + templateFileName;
+ String saveFilePath = savePath + saveFileName;
+ log.info("转换前的文件为:{};转换后的路径为:{}", templateFilePath, saveFilePath);
+ File templateFile = new File(templateFilePath);
+ File saveFile = new File(saveFilePath);
+ //获取文件类型
+ String fileType = templateFileName.substring(templateFileName.lastIndexOf("."));
+ InputStream inputStream = null;
+ OutputStream outputStream = null;
+ try {
+ try {
+ inputStream = Files.newInputStream(templateFile.toPath());
+ outputStream = Files.newOutputStream(saveFile.toPath());
+ //document4j 转换 pdf linux环境下不支持
+ if (DOCX_SUFFIX.equals(fileType)) {
+ IConverter converter = LocalConverter.builder().build();
+ converter.convert(inputStream).as(DocumentType.DOCX).to(outputStream).as(DocumentType.PDF).execute();
+ converter.shutDown();
+ } else if (DOC_SUFFIX.equals(fileType)) {
+ IConverter converter = LocalConverter.builder().build();
+ converter.convert(inputStream).as(DocumentType.DOC).to(outputStream).as(DocumentType.PDF).execute();
+ converter.shutDown();
+ } else if (XLS_SUFFIX.equals(fileType)) {
+ IConverter converter = LocalConverter.builder().build();
+ converter.convert(inputStream).as(DocumentType.XLS).to(outputStream).as(DocumentType.PDF).execute();
+ converter.shutDown();
+ } else if (XLSX_SUFFIX.equals(fileType)) {
+ //此方式行不通
+ //converter.convert(inputStream).as(DocumentType.XLSX).to(outputStream).as(DocumentType.PDF).execute();
+ Workbook wb = new Workbook();
+ wb.loadFromFile(templateFilePath);
+ wb.saveToFile(saveFilePath, FileFormat.PDF);
+ }
+ } catch (Exception e) {
+ log.error("转换失败,错误信息为:{}", e.getMessage());
+ throw new ServiceException(e.getMessage());
+ } finally {
+ inputStream.close();
+ outputStream.close();
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+
+ /**
+ * 对象转化为Map 并设置默认值
+ *
+ * @param obj
+ * @return
+ * @throws Exception
+ */
+ public static Map objectToMap(Object obj) {
+ Map result = new HashMap<>();
+ if (ObjectUtil.isNotEmpty(obj)) {
+ Class clazz = obj.getClass();
+ List fieldList = new ArrayList<>();
+ while (clazz != null) {
+ fieldList.addAll(Arrays.asList(clazz.getDeclaredFields()));
+ clazz = clazz.getSuperclass();
+ }
+ fieldList.forEach(field -> {
+ field.setAccessible(true);
+ DefaultValue defaultValue = field.getAnnotation(DefaultValue.class);
+ Object value;
+ try {
+ value = field.get(obj);
+ } catch (IllegalAccessException e) {
+ throw new ServiceException("获取属性性出错");
+ }
+ //若为list则不处理
+ if (value instanceof List) {
+ return;
+ }
+ //若为时间格式则进行格式化
+ if (value instanceof LocalDateTime) {
+ value = DateUtil.format((LocalDateTime) value, TicketConstants.TICKET_DATE_PATTERN);
+ }
+ if (value instanceof Date) {
+ value = DateUtil.format((Date) value, TicketConstants.TICKET_DATE_PATTERN);
+ }
+
+ //如果value为空直接跳出
+ // if ((ObjectUtils.isEmpty(value) || value == "") && StringUtil.isNoneBlank(field.getName())){
+ // return;
+ // }
+
+ //属性上是否加入DefaultValue注解 若加入 则判断是否定义属性名以及值 若未定义则取原属性名及值
+ if (ObjectUtil.isNotEmpty(defaultValue)) {
+ result.put(StringUtil.isNoneBlank(defaultValue.name()) ? defaultValue.name() : field.getName(),
+ ObjectUtil.isNotEmpty(defaultValue.value()) ? defaultValue.value() : value);
+ } else {
+ result.put(field.getName(), Optional.ofNullable(value).orElse(" "));
+
+ }
+ });
+ }
+ return result;
+ }
+
+
+ /**
+ * 对象转化为Map 并设置默认值
+ *
+ * @param obj
+ * @return
+ * @throws Exception
+ */
+ public static Map objectToMap(Object obj, boolean isWordFlag) {
+ Map result = new HashMap<>();
+ if (ObjectUtil.isNotEmpty(obj)) {
+ Class clazz = obj.getClass();
+ List fieldList = new ArrayList<>();
+ while (clazz != null) {
+ fieldList.addAll(Arrays.asList(clazz.getDeclaredFields()));
+ clazz = clazz.getSuperclass();
+ }
+ fieldList.forEach(field -> {
+ field.setAccessible(true);
+ DefaultValue defaultValue = field.getAnnotation(DefaultValue.class);
+ Object value;
+ try {
+ value = field.get(obj);
+ } catch (IllegalAccessException e) {
+ throw new ServiceException("获取属性性出错");
+ }
+ //若为list则不处理
+ if (value instanceof List) {
+ return;
+ }
+ //若为时间格式则进行格式化
+ if (value instanceof LocalDateTime) {
+ value = DateUtil.format((LocalDateTime) value, TicketConstants.TICKET_DATE_PATTERN);
+ }
+ if (value instanceof Date) {
+ value = DateUtil.format((Date) value, TicketConstants.TICKET_DATE_PATTERN);
+ }
+
+ //如果value为空直接跳出
+ // if ((ObjectUtils.isEmpty(value) || value == "") && StringUtil.isNoneBlank(field.getName())){
+ // return;
+ // }
+
+ //属性上是否加入DefaultValue注解 若加入 则判断是否定义属性名以及值 若未定义则取原属性名及值
+ if (ObjectUtil.isNotEmpty(defaultValue)) {
+ result.put(StringUtil.isNoneBlank(defaultValue.name()) ? defaultValue.name() : field.getName(),
+ ObjectUtil.isNotEmpty(defaultValue.value()) ? defaultValue.value() : value);
+ } else {
+ if (isWordFlag) {
+ //如果导出word为null会出现{{ ,value设置"\u00A0"
+ result.put(field.getName(), Optional.ofNullable(value).orElse("\u00A0"));
+ } else {
+ result.put(field.getName(), Optional.ofNullable(value).orElse(" "));
+ }
+ }
+ });
+ }
+ return result;
+ }
+
+
+ /**
+ * 对象转化为Map 并设置默认值
+ *
+ * @param obj
+ * @return
+ * @throws Exception
+ */
+ public static Map objectToMapResult(Object obj, Map map) {
+ Map result = new HashMap<>();
+ if (ObjectUtil.isNotEmpty(obj)) {
+ Class clazz = obj.getClass();
+ List fieldList = new ArrayList<>();
+ while (clazz != null) {
+ fieldList.addAll(Arrays.asList(clazz.getDeclaredFields()));
+ clazz = clazz.getSuperclass();
+ }
+ fieldList.forEach(field -> {
+ field.setAccessible(true);
+ DefaultValue defaultValue = field.getAnnotation(DefaultValue.class);
+ Object value;
+ try {
+ value = field.get(obj);
+ } catch (IllegalAccessException e) {
+ throw new ServiceException("获取属性性出错");
+ }
+ //若为list则不处理
+ if (value instanceof List) {
+ return;
+ }
+ //若为时间格式则进行格式化
+ if (value instanceof LocalDateTime) {
+ value = DateUtil.format((LocalDateTime) value, TicketConstants.TICKET_DATE_PATTERN);
+ }
+ if (value instanceof Date) {
+ value = DateUtil.format((Date) value, TicketConstants.TICKET_DATE_PATTERN);
+ }
+
+ if (map.containsKey(field.getName())) {
+ return;
+ }
+
+ //属性上是否加入DefaultValue注解 若加入 则判断是否定义属性名以及值 若未定义则取原属性名及值
+ if (ObjectUtil.isNotEmpty(defaultValue)) {
+ result.put(StringUtil.isNoneBlank(defaultValue.name()) ? defaultValue.name() : field.getName(),
+ ObjectUtil.isNotEmpty(defaultValue.value()) ? defaultValue.value() : value);
+ } else {
+ //如果导出word为null会出现{{ ,value设置"\u00A0"
+ result.put(field.getName(), Optional.ofNullable(value).orElse(""));
+ }
+ });
+ }
+ return result;
+ }
+
+
+ /**
+ * 读取本地pdf,这里设置的是预览
+ */
+ public static void readPdf(HttpServletResponse response, String filePath) {
+ response.reset();
+ response.setContentType("application/pdf");
+ FileInputStream fileInputStream = null;
+ OutputStream outputStream = null;
+ try {
+ File file = new File(filePath);
+ fileInputStream = new FileInputStream(file);
+ outputStream = response.getOutputStream();
+ IOUtils.write(IOUtils.toByteArray(fileInputStream), outputStream);
+ response.setHeader("Content-Disposition",
+ "inline; filename= " + URLEncoder.encode(file.getName(), "UTF-8"));
+ outputStream.flush();
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ try {
+ fileInputStream.close();
+ outputStream.close();
+
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ /**
+ * 读取本地pdf,这里设置的是导出
+ */
+ public static void exportPdf(HttpServletResponse response, String filePath) {
+ response.reset();
+ response.setContentType("application/pdf");
+ FileInputStream fileInputStream = null;
+ OutputStream outputStream = null;
+ try {
+ File file = new File(filePath);
+ fileInputStream = new FileInputStream(file);
+ outputStream = response.getOutputStream();
+ IOUtils.write(IOUtils.toByteArray(fileInputStream), outputStream);
+ response.setHeader("Content-Disposition", "inline; filename= " + URLEncoder.encode(file.getName(), "UTF-8"));
+ outputStream.flush();
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ try {
+ fileInputStream.close();
+ outputStream.close();
+
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+}
diff --git a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/util/WordUtils.java b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/util/WordUtils.java
index 5b28ec5..eafafad 100644
--- a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/util/WordUtils.java
+++ b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/util/WordUtils.java
@@ -6,17 +6,16 @@ import cn.hutool.core.lang.Assert;
import com.hnac.hzims.operational.util.pojo.HttpResponse;
import freemarker.cache.StringTemplateLoader;
import freemarker.template.Configuration;
-import org.apache.poi.xwpf.usermodel.XWPFDocument;
-import org.apache.poi.xwpf.usermodel.XWPFTable;
-import org.apache.poi.xwpf.usermodel.XWPFTableCell;
-import org.apache.poi.xwpf.usermodel.XWPFTableRow;
+import org.apache.poi.xwpf.usermodel.*;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge;
+import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletResponse;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.UnsupportedEncodingException;
+import java.awt.image.BufferedImage;
+import java.io.*;
import java.net.URLEncoder;
+import java.nio.file.Files;
+import java.nio.file.Paths;
import java.util.List;
import java.util.Map;
@@ -91,7 +90,7 @@ public abstract class WordUtils {
public static XWPFDocument exportWordV2(String templatePath, Map params) {
try {
XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params);
-// 合并第一列相同行的数据
+ //合并第一列相同行的数据
tableIfSame(doc);
return doc;
} catch (Exception e) {
diff --git a/hzims-service/operational/src/main/resources/log/logback-dev.xml b/hzims-service/operational/src/main/resources/log/logback-dev.xml
deleted file mode 100644
index c67cdd9..0000000
--- a/hzims-service/operational/src/main/resources/log/logback-dev.xml
+++ /dev/null
@@ -1,127 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ${CONSOLE_LOG_PATTERN}
- utf8
-
-
-
-
-
-
-
-
- log/info.log
-
-
- log/info/info-%d{yyyy-MM-dd_HH}.%i.log
-
- 240
-
- 20MB
- 10GB
- true
-
-
- ${log.pattern}
-
-
-
- INFO
- ACCEPT
- DENY
-
-
-
-
-
- log/error.log
-
-
- log/error/error-%d{yyyy-MM-dd_HH}.%i.log
-
- 360
-
- 20MB
- 10GB
- true
-
-
- ${log.pattern}
-
-
-
- ERROR
- ACCEPT
- DENY
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/hzims-service/operational/src/main/resources/log/logback-prod.xml b/hzims-service/operational/src/main/resources/log/logback-prod.xml
deleted file mode 100644
index 3083e23..0000000
--- a/hzims-service/operational/src/main/resources/log/logback-prod.xml
+++ /dev/null
@@ -1,127 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ${CONSOLE_LOG_PATTERN}
- utf8
-
-
-
-
-
-
-
-
- log/info.log
-
-
- log/info/info-%d{yyyy-MM-dd_HH}.%i.log
-
- 240
-
- 20MB
- 10GB
- true
-
-
- ${log.pattern}
-
-
-
- INFO
- ACCEPT
- DENY
-
-
-
-
-
- log/error.log
-
-
- log/error/error-%d{yyyy-MM-dd_HH}.%i.log
-
- 360
-
- 20MB
- 10GB
- true
-
-
- ${log.pattern}
-
-
-
- ERROR
- ACCEPT
- DENY
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/hzims-service/operational/src/main/resources/log/logback-test.xml b/hzims-service/operational/src/main/resources/log/logback-test.xml
deleted file mode 100644
index fb3de3c..0000000
--- a/hzims-service/operational/src/main/resources/log/logback-test.xml
+++ /dev/null
@@ -1,127 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ${CONSOLE_LOG_PATTERN}
- utf8
-
-
-
-
-
-
-
-
-
-
- log/error.log
-
-
- log/error/error-%d{yyyy-MM-dd_HH}.%i.log
-
- 360
-
- 20MB
- 10GB
- true
-
-
- ${log.pattern}
-
-
-
- ERROR
- ACCEPT
- DENY
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/hzims-service/operational/src/main/resources/template/excel/constructio_template.xlsx b/hzims-service/operational/src/main/resources/template/excel/constructio_template.xlsx
deleted file mode 100644
index 201df42805f492e2385a2649a8550ffb620fe490..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 17960
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