From 7ea6756ea239c58c4f64d2b85f0291dc94f3c10e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AE=B5=E9=A3=9E=E5=AE=87?= <2684146481@qq.com> Date: Fri, 19 May 2023 08:36:04 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B7=A5=E4=BD=9C=E7=A5=A8=E9=A2=84=E8=A7=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ticket/constants/WorkTicketConstants.java | 3 +- .../workTicket/entity/WorkTicketInfoEntity.java | 76 ++-- .../entity/WorkTicketPrincipalChangeEntity.java | 17 + .../src/main/resources/application.yml | 1 + .../impl/HistoryAbnormalAlarmServiceImpl.java | 4 +- .../processflow/properties/TicketProperties.java | 2 +- .../controller/TicketProcessController.java | 5 +- .../twoTicket/service/TicketProcessService.java | 2 +- .../service/impl/TicketProcessServiceImpl.java | 103 ++--- .../java/com/hnac/hzims/ticket/utils/PdfUtils.java | 418 ++++++++++++--------- .../service/impl/WorkTicketInfoServiceImpl.java | 30 ++ .../新电气第一种工作票模板.xlsx | Bin 14047 -> 0 bytes .../resources/template/第一种工作票.docx | Bin 0 -> 24972 bytes 13 files changed, 375 insertions(+), 286 deletions(-) create mode 100644 hzims-service/ticket/src/main/resources/template/第一种工作票.docx diff --git a/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/constants/WorkTicketConstants.java b/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/constants/WorkTicketConstants.java index c148b86..b602dc5 100644 --- a/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/constants/WorkTicketConstants.java +++ b/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/constants/WorkTicketConstants.java @@ -18,7 +18,8 @@ public interface WorkTicketConstants { /**第二种安措**/ TWO("2","matterLibraryListTwo"), /**第三种安措**/ - THREE("3","matterLibraryListThree") + THREE("3","matterLibraryListThree"), + FOUR("4","matterLibraryListFour") ; @Getter private String type; diff --git a/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/workTicket/entity/WorkTicketInfoEntity.java b/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/workTicket/entity/WorkTicketInfoEntity.java index ab112ed..82f0992 100644 --- a/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/workTicket/entity/WorkTicketInfoEntity.java +++ b/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/workTicket/entity/WorkTicketInfoEntity.java @@ -3,6 +3,7 @@ package com.hnac.hzims.ticket.workTicket.entity; import java.time.LocalDateTime; import java.io.Serializable; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.databind.annotation.JsonSerialize; @@ -191,6 +192,11 @@ public class WorkTicketInfoEntity extends TenantEntity implements Serializable { private Long signer; + @TableField(exist = false) + @ApiModelProperty(value = "签发人名称") + private String signerName; + + /** * 签发人签发时间 */ @@ -229,6 +235,14 @@ public class WorkTicketInfoEntity extends TenantEntity implements Serializable { @JsonSerialize(nullsUsing = NullSerializer.class) private Long licensor; + + + @TableField(exist = false) + @ApiModelProperty(value = "许可人名称") + @JsonSerialize(nullsUsing = NullSerializer.class) + private String licensorName; + + /** * 许可时间 */ @@ -282,51 +296,21 @@ public class WorkTicketInfoEntity extends TenantEntity implements Serializable { /** - * 批准工作结束时间 + * 值班负责人名称 */ - @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @ApiModelProperty("批准工作结束时间") - private LocalDateTime watchPrincipalEndTime; + @TableField(exist = false) + @ApiModelProperty("值班负责人名称") + private String watchPrincipalName; /** - * 开工时间 - */ - @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @ApiModelProperty("开工时间") - private LocalDateTime startDateTime; - - - /** - * 收工时间 + * 批准工作结束时间 */ @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @ApiModelProperty("收工时间") - private LocalDateTime endDateTime; - - - /** - * 工作票结束时间 - */ - @ApiModelProperty("工作票结束时间") - private LocalDateTime workTicketEndTime; - - - /** - * 备注 - */ - @ApiModelProperty("备注") - private String content; - + @ApiModelProperty("批准工作结束时间") + private LocalDateTime watchPrincipalEndTime; - /** - * 交底内容 - */ - @ApiModelProperty("交底内容") - private String tellContent; /** @@ -361,11 +345,11 @@ public class WorkTicketInfoEntity extends TenantEntity implements Serializable { * 编号(原站点ID) */ @ApiModelProperty("编号(原站点ID)") - private String signageCode; + private String signageCode; /** - * 开票时间 + * 开票时间 */ @ApiModelProperty("开票时间") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @@ -383,7 +367,7 @@ public class WorkTicketInfoEntity extends TenantEntity implements Serializable { */ @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime confirmDateTime; + private LocalDateTime confirmDateTime; /** @@ -398,24 +382,21 @@ public class WorkTicketInfoEntity extends TenantEntity implements Serializable { * 签发人签发是否通过 */ @ApiModelProperty("签发人签发是否通过") - private Boolean signFlag; - + private Boolean signFlag; /** * 运行人员是否通过 */ @ApiModelProperty("运行人员是否通过") - private Boolean recieveFlag; - - + private Boolean recieveFlag; /** * 工作确认是否通过 (input= 延期 input=转移 input 通过 ) */ @ApiModelProperty("input= 延期 input=转移 input 通过") - private String input; + private String input; /** @@ -439,8 +420,6 @@ public class WorkTicketInfoEntity extends TenantEntity implements Serializable { private String flowTaskName; - - /** * 当前任务名 */ @@ -448,5 +427,4 @@ public class WorkTicketInfoEntity extends TenantEntity implements Serializable { private String flowTaskId; - } diff --git a/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/workTicket/entity/WorkTicketPrincipalChangeEntity.java b/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/workTicket/entity/WorkTicketPrincipalChangeEntity.java index 2373dff..cf4f7c7 100644 --- a/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/workTicket/entity/WorkTicketPrincipalChangeEntity.java +++ b/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/workTicket/entity/WorkTicketPrincipalChangeEntity.java @@ -3,6 +3,7 @@ package com.hnac.hzims.ticket.workTicket.entity; import java.time.LocalDateTime; import java.io.Serializable; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.databind.annotation.JsonSerialize; @@ -43,9 +44,25 @@ public class WorkTicketPrincipalChangeEntity extends TenantEntity implements Ser @QueryField(condition = SqlCondition.EQUAL) private Long initialPrincipal; + + @TableField(exist = false) + @ApiModelProperty("原负责人名称") + private String initialPrincipalName; + @ApiModelProperty("变更负责人") @JsonSerialize(nullsUsing = NullSerializer.class) @QueryField(condition = SqlCondition.EQUAL) private Long changePrincipal; + + @TableField(exist = false) + @ApiModelProperty("变更负责人名称") + private String changePrincipalName; + + + + @ApiModelProperty("变动时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime principalChangeTime; } diff --git a/hzims-service/hzims-middle/src/main/resources/application.yml b/hzims-service/hzims-middle/src/main/resources/application.yml index f3bb7f5..180d5d3 100644 --- a/hzims-service/hzims-middle/src/main/resources/application.yml +++ b/hzims-service/hzims-middle/src/main/resources/application.yml @@ -2,6 +2,7 @@ server: port: 8400 + #数据源配置 spring: main: diff --git a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/alert/service/impl/HistoryAbnormalAlarmServiceImpl.java b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/alert/service/impl/HistoryAbnormalAlarmServiceImpl.java index 71ba8b5..aaf8cc5 100644 --- a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/alert/service/impl/HistoryAbnormalAlarmServiceImpl.java +++ b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/alert/service/impl/HistoryAbnormalAlarmServiceImpl.java @@ -10,7 +10,9 @@ import com.hnac.hzims.operational.alert.entity.HistoryAbnormalAlarmEntity; import com.hnac.hzims.operational.alert.mapper.HistoryAbnormalAlarmMapper; import com.hnac.hzims.operational.alert.service.AlarmHandleService; import com.hnac.hzims.operational.alert.service.HistoryAbnormalAlarmService; -import com.hnac.hzims.operational.alert.vo.*; +import com.hnac.hzims.operational.alert.vo.AlarmDataVo; +import com.hnac.hzims.operational.alert.vo.AlarmParamVo; +import com.hnac.hzims.operational.alert.vo.AlarmReustVo; import com.hnac.hzims.operational.config.vo.AlarmDataPageVo; import com.hnac.hzims.operational.config.vo.AlarmVo; import com.hnac.hzims.operational.config.vo.IntelligentAlarmCountVo; diff --git a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/processflow/properties/TicketProperties.java b/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/processflow/properties/TicketProperties.java index 83ce875..ea0a088 100644 --- a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/processflow/properties/TicketProperties.java +++ b/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/processflow/properties/TicketProperties.java @@ -1,5 +1,6 @@ package com.hnac.hzims.ticket.processflow.properties; + import lombok.Data; import lombok.experimental.Accessors; import org.springframework.boot.context.properties.ConfigurationProperties; @@ -18,7 +19,6 @@ import java.util.List; @Data @Accessors(chain = true) @Component -//@NacosPropertySource(dataId = "hzims-ticket-dev.yaml", autoRefreshed = true) @ConfigurationProperties(prefix = "ticket") @RefreshScope public class TicketProperties { diff --git a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/controller/TicketProcessController.java b/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/controller/TicketProcessController.java index c929ed2..b84c076 100644 --- a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/controller/TicketProcessController.java +++ b/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/controller/TicketProcessController.java @@ -58,8 +58,9 @@ public class TicketProcessController { @GetMapping("/preview") @ApiOperation(value = "预览") @ApiOperationSupport(order = 11) - public void preview(@RequestParam @ApiParam("票据类型") String ticketType, @RequestParam @ApiParam("票据ID") Long ticketId) { - ticketProcessService.preview(ticketType,ticketId); + public R preview(@RequestParam @ApiParam("票据类型") String ticketType, @RequestParam @ApiParam("票据ID") Long ticketId) { + String preview = ticketProcessService.preview(ticketType, ticketId); + return R.data(preview); } diff --git a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/service/TicketProcessService.java b/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/service/TicketProcessService.java index c7554d3..23920a2 100644 --- a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/service/TicketProcessService.java +++ b/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/service/TicketProcessService.java @@ -30,5 +30,5 @@ public interface TicketProcessService { * @param ticketType * @param ticketId */ - void preview(String ticketType, Long ticketId); + String preview(String ticketType, Long ticketId); } diff --git a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/service/impl/TicketProcessServiceImpl.java b/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/service/impl/TicketProcessServiceImpl.java index c97b63a..af14806 100644 --- a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/service/impl/TicketProcessServiceImpl.java +++ b/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/service/impl/TicketProcessServiceImpl.java @@ -1,8 +1,7 @@ package com.hnac.hzims.ticket.twoTicket.service.impl; -import cn.afterturn.easypoi.excel.ExcelExportUtil; -import cn.afterturn.easypoi.excel.entity.TemplateExportParams; +import cn.afterturn.easypoi.word.WordExportUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -36,7 +35,7 @@ import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.math.NumberUtils; -import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.api.R; @@ -123,11 +122,9 @@ public class TicketProcessServiceImpl implements TicketProcessService { private final IWorkTicketInfoService ticketInfoService; - @Value("${hzims.ticket.path.pdf.savePath}") - private String pdfSavePath; + @Value("${hzims.ticket.path.word.templatePath}") + private String templatePath; - @Value("${hzims.ticket.path.xlsx.savePath}") - private String xlsSavePath; /** * 启动开票流程 @@ -348,17 +345,13 @@ public class TicketProcessServiceImpl implements TicketProcessService { User user = UserCache.getUser(workTicket.getStepOperator()); if (StringUtils.isNotEmpty(nextStepOperator)) { - Long taskUser = NumberUtils.createLong(nextStepOperator.startsWith("taskUser_") ? - nextStepOperator.substring(9) : null); + Long taskUser = NumberUtils.createLong(nextStepOperator.startsWith("taskUser_") ? nextStepOperator.substring(9) : null); //下一个审批人 User stepUser = UserCache.getUser(taskUser); - flowDescription = "审批中,当前环节是".concat(description) - .concat(",当前审批人是").concat(user.getName()) - .concat(",下一个审批人是").concat(stepUser.getName()).concat("待审批"); + flowDescription = "审批中,当前环节是".concat(description).concat(",当前审批人是").concat(user.getName()).concat(",下一个审批人是").concat(stepUser.getName()).concat("待审批"); workTicket.setNextStepOperator(taskUser); } else { - flowDescription = "审批中,当前环节是".concat(description) - .concat(",审批人是").concat(user.getName()); + flowDescription = "审批中,当前环节是".concat(description).concat(",审批人是").concat(user.getName()); } //如果taskId为空 或 flowStatus = 99 if (StringUtils.isEmpty(taskId) || 99 == flowStatus) { @@ -609,39 +602,32 @@ public class TicketProcessServiceImpl implements TicketProcessService { */ @SneakyThrows @Override - public void preview(String ticketType, Long ticketId) { + public String preview(String ticketType, Long ticketId) { WorkTicketVo workTicketVo = ticketInfoService.selectDetailsById(ticketId); //将查询的数据转换为map Map workTicketInfoMap = this.convertMap(workTicketVo); - workTicketInfoMap.put("name", 22); String fileName = TicketConstants.WordFileNameEnum.getFileNameByType(ticketType) + PdfUtils.XLSX_SUFFIX; log.info("工作票模板为:{}", fileName); - TemplateExportParams templateExportParams = new TemplateExportParams("template/新电气第一种工作票模板.xlsx", true); - Workbook workbook = null; - try { - workbook = ExcelExportUtil.exportExcel(templateExportParams, workTicketInfoMap); - } catch (Exception e) { - e.printStackTrace(); + XWPFDocument doc = WordExportUtil.exportWord07("template/电气第一种工作票模版.docx", workTicketInfoMap); + FileOutputStream fos = null; + String name = null; + String os = System.getProperty("os.name"); + //Windows操作系统 + if (os != null && os.toLowerCase().startsWith("windows")) { + log.info("当前系统版本是:{}", os); + name = "D:/导出excel/电气第一种工作票模版.docx"; + fos = new FileOutputStream(name); + } else { + //其它操作系统 + log.info("当前系统版本是:{}", os); + String prefix = IdWorker.get32UUID(); + name = templatePath + prefix + ".docx"; + fos = new FileOutputStream(name); } - FileOutputStream fos = new FileOutputStream("F:\\idea项目\\flowable\\demo\\src\\main\\resources\\新电气第一种工作票模板5" + - ".xlsx"); - workbook.write(fos); - // //上传xlsx至服务器 - // try { - // ExcelUtil.upload(workbook, xlsSavePath, workTicketVo.getWorkTicket().getWorkContent() + PdfUtils.XLSX_SUFFIX); - // } catch (Exception e) { - // e.printStackTrace(); - // } - // //将xlsx文件转换为pdf并保存 - // String pdfFileName = workTicketVo.getWorkTicket().getWorkContent() + PdfUtils.PDF_SUFFIX; - // String xlsFileName = workTicketVo.getWorkTicket().getWorkContent() + PdfUtils.XLSX_SUFFIX; - // PdfUtils.convertPdf(xlsSavePath, xlsFileName, pdfSavePath, pdfFileName); - // String savePath = pdfSavePath + pdfFileName; - // // 设置response参数,可以打开下载页面 - // ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); - // HttpServletResponse response = servletRequestAttributes.getResponse(); - // PdfUtils.readPdf(response, savePath); + doc.write(fos); + fos.close(); + return name; } @@ -650,7 +636,7 @@ public class TicketProcessServiceImpl implements TicketProcessService { Map result = new HashMap<>(); WorkTicketInfoEntity workTicket = workTicketVo.getWorkTicket(); //1. 工作对象 - Map workTicketInfoMap = PdfUtils.objectToMap(workTicket); + Map workTicketInfoMap = PdfUtils.objectToMap(workTicket, true); //2. 安全措施 List safetyMeasuresList = workTicketVo.getSafetyMeasuresList(); @@ -658,13 +644,25 @@ public class TicketProcessServiceImpl implements TicketProcessService { Map> measureMap = safetyMeasuresList.stream().collect(Collectors.groupingBy(WorkTicketSafetyMeasureEntity::getType)); Arrays.stream(WorkTicketConstants.WorkTicketMeasureTypeEnum.class.getEnumConstants()).forEach(measureEnum -> { if (CollectionUtil.isNotEmpty(measureMap.get(measureEnum.getType()))) { - List> mapList = measureMap.get(measureEnum.getType()).stream().map(measureVO -> { - Map map = PdfUtils.objectToMap(measureVO); + + List> mapList = new ArrayList<>(); + int tempIndex = 1, index = 1; + List workTicketSafetyMeasureEntities = measureMap.get(measureEnum.getType()); + for (WorkTicketSafetyMeasureEntity measureVO : workTicketSafetyMeasureEntities) { + String type = measureEnum.getType(); + if (tempIndex != Integer.valueOf(type)) { + index = 1; + tempIndex++; + } + Map map = PdfUtils.objectToMap(measureVO, true); + map.put("index", index); map.put("safetyMeasure", ObjectUtil.isNotEmpty(map.get("measure")) ? map.get("measure") : null); - String status = TicketConstants.SafetyMeasureStatusEnum.FINISH.getStatus().equals(measureVO.getStatus()) ? TicketConstants.SafetyMeasureStatusEnum.FINISH.getDescribe() : " "; + String status = TicketConstants.SafetyMeasureStatusEnum.FINISH.getStatus().equals(measureVO.getStatus()) ? "√" : "×"; map.put("status", status); - return map; - }).collect(Collectors.toList()); + mapList.add(map); + index++; + } + workTicketInfoMap.put(measureEnum.getConvertAttributes(), mapList); } else { workTicketInfoMap.put(measureEnum.getConvertAttributes(), new ArrayList>(1)); @@ -681,21 +679,26 @@ public class TicketProcessServiceImpl implements TicketProcessService { //4. 工作票延期 WorkTicketDelayEntity workTicketDelay = workTicketVo.getWorkTicketDelay(); if (ObjectUtils.isNotEmpty(workTicketDelay)) { - result.putAll(PdfUtils.objectToMap(workTicketDelay)); + result.putAll(PdfUtils.objectToMap(workTicketDelay, true)); + } else { + result.putAll(PdfUtils.objectToMap(new WorkTicketDelayEntity(), true)); } //5. 工作结束 WorkTicketFinish workTicketFinish = workTicketVo.getWorkTicketFinish(); if (ObjectUtils.isNotEmpty(workTicketFinish)) { - result.putAll(PdfUtils.objectToMap(workTicketFinish)); + result.putAll(PdfUtils.objectToMap(workTicketFinish, true)); + } else { + result.putAll(PdfUtils.objectToMap(new WorkTicketFinish(), true)); } //5. 工作票负责人变更 WorkTicketPrincipalChangeEntity workTicketPrincipalChange = workTicketVo.getWorkTicketPrincipalChange(); if (ObjectUtils.isNotEmpty(workTicketPrincipalChange)) { - result.putAll(PdfUtils.objectToMap(workTicketPrincipalChange)); + result.putAll(PdfUtils.objectToMap(workTicketPrincipalChange, true)); + } else { + result.putAll(PdfUtils.objectToMap(new WorkTicketPrincipalChangeEntity(), true)); } - return result; } diff --git a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/utils/PdfUtils.java b/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/utils/PdfUtils.java index 33475ee..ef57581 100644 --- a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/utils/PdfUtils.java +++ b/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/utils/PdfUtils.java @@ -32,187 +32,243 @@ import java.util.stream.Collectors; @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("."),templateFileName.length()); - InputStream inputStream = null; - OutputStream outputStream = null; - try { - try { - inputStream = new FileInputStream(templateFile); - outputStream = new FileOutputStream(saveFile); - //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) && null != obj.getClass()) { - 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 ((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; - } - - /** - * 读取本地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 (FileNotFoundException e) { - e.printStackTrace(); - } 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 (FileNotFoundException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } - finally { - try{ - fileInputStream.close(); - outputStream.close(); - - } - catch (IOException e) { - e.printStackTrace(); - } - } - } + /** 文件后缀名 **/ + 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("."), templateFileName.length()); + InputStream inputStream = null; + OutputStream outputStream = null; + try { + try { + inputStream = new FileInputStream(templateFile); + outputStream = new FileOutputStream(saveFile); + //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) && null != obj.getClass()) { + 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) && null != obj.getClass()) { + 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; + } + + /** + * 读取本地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 (FileNotFoundException e) { + e.printStackTrace(); + } 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 (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + fileInputStream.close(); + outputStream.close(); + + } catch (IOException e) { + e.printStackTrace(); + } + } + } // public static void main(String[] args) { // Runnable runnable = new Runnable() { diff --git a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/workTicket/service/impl/WorkTicketInfoServiceImpl.java b/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/workTicket/service/impl/WorkTicketInfoServiceImpl.java index 726e683..31607c8 100644 --- a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/workTicket/service/impl/WorkTicketInfoServiceImpl.java +++ b/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/workTicket/service/impl/WorkTicketInfoServiceImpl.java @@ -55,6 +55,7 @@ import org.springblade.core.tool.utils.*; import org.springblade.flow.core.entity.BladeFlow; import org.springblade.flow.core.feign.IFlowClient; import org.springblade.flow.core.vo.ComleteTask; +import org.springblade.system.user.cache.UserCache; import org.springblade.system.user.entity.User; import org.springblade.system.user.feign.IUserClient; import org.springframework.beans.BeanUtils; @@ -937,6 +938,22 @@ public class WorkTicketInfoServiceImpl extends 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 B9I5~S diff --git a/hzims-service/ticket/src/main/resources/template/第一种工作票.docx b/hzims-service/ticket/src/main/resources/template/第一种工作票.docx new file mode 100644 index 0000000000000000000000000000000000000000..62a9571c952cd5d8712ba8b861a63fe9f1bfcc27 GIT binary patch literal 24972 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 I;m@Q00Nf_x(*OVf literal 0 HcmV?d00001