From 80fa1b61f0c67a8d57dfe5bf6f93ebe2751b17f9 Mon Sep 17 00:00:00 2001 From: caihaohan Date: Tue, 8 Oct 2024 17:13:59 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=BE=81=E6=B1=82=E6=84=8F=E8=A7=81?= =?UTF-8?q?=E6=B5=81=E7=A8=8B=E7=BB=93=E6=9D=9F=E5=90=8E=E7=94=9F=E6=88=90?= =?UTF-8?q?=E5=BE=81=E6=B1=82=E6=84=8F=E8=A7=81=E7=A8=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProcessESRevisionEndListener.java | 169 +++++++++++++++++- .../wordTemplate/征求意见反馈单.docx | Bin 0 -> 17946 bytes 2 files changed, 164 insertions(+), 5 deletions(-) create mode 100644 laws-modules/src/main/resources/wordTemplate/征求意见反馈单.docx diff --git a/laws-modules/src/main/java/com/jero/modules/activiti/process/esRevisionAdvice/listener/ProcessESRevisionEndListener.java b/laws-modules/src/main/java/com/jero/modules/activiti/process/esRevisionAdvice/listener/ProcessESRevisionEndListener.java index cb059993..0bb085a6 100644 --- a/laws-modules/src/main/java/com/jero/modules/activiti/process/esRevisionAdvice/listener/ProcessESRevisionEndListener.java +++ b/laws-modules/src/main/java/com/jero/modules/activiti/process/esRevisionAdvice/listener/ProcessESRevisionEndListener.java @@ -1,8 +1,10 @@ package com.jero.modules.activiti.process.esRevisionAdvice.listener; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.IdWorker; +import com.jero.common.util.CommonUtils; import com.jero.modules.activiti.process.common.enums.StandardStateEnum; import com.jero.modules.activiti.process.esRevisionAdvice.entity.EsRevisionAdvice; import com.jero.modules.activiti.process.esRevisionAdvice.entity.ProcessEsRevision; @@ -10,16 +12,30 @@ import com.jero.modules.activiti.process.esRevisionAdvice.service.EsRevisionAdvi import com.jero.modules.activiti.process.esRevisionAdvice.service.EsRevisionService; import com.jero.modules.laws.common.constant.FieldCommon; import com.jero.modules.laws.common.service.ILawsCommonService; +import com.jero.modules.oss.entity.OSSFile; +import com.jero.modules.oss.service.IOSSFileService; import com.jero.modules.tag.enums.TableNameEnum; +import lombok.SneakyThrows; import org.activiti.engine.delegate.DelegateExecution; import org.activiti.engine.delegate.ExecutionListener; +import org.apache.poi.xwpf.usermodel.*; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.io.ClassPathResource; +import org.springframework.mock.web.MockMultipartFile; +import org.springframework.mock.web.MockMultipartHttpServletRequest; import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; +import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.nio.file.Files; +import java.util.Date; import java.util.List; import java.util.Map; - -import static com.jero.modules.laws.common.constant.FieldCommon.MAIN_DRAFT_USER; +import java.util.stream.Collectors; +import java.util.stream.IntStream; /** * @author: Mzaxd @@ -37,6 +53,16 @@ public class ProcessESRevisionEndListener implements ExecutionListener { @Resource private ILawsCommonService lawsCommonService; + @Resource + private IOSSFileService ossFileService; + + @Resource + private EsRevisionAdviceService revisionAdviceService; + + @Value(value = "${jero.uploadType}") + private String uploadType; + + @SneakyThrows @Override public void notify(DelegateExecution delegateExecution) { // 获取流程实例Id @@ -48,6 +74,12 @@ public class ProcessESRevisionEndListener implements ExecutionListener { ProcessEsRevision data = esRevisionService.getOne(revisionWrapper); // 将数据转换为Map Map variables = transMap(data); + Date adviceDeadline = data.getAdviceDeadline(); + if (adviceDeadline != null) { + // 制作征求意见稿 + String draftFileId = this.makeDraftFile(data); + variables.put(FieldCommon.FILE_DRAFT_FOR_COMMENT, draftFileId); + } // 发布企标 String esId = lawsCommonService.commonAdd(variables); // 所有意见设置标准Id @@ -58,14 +90,12 @@ public class ProcessESRevisionEndListener implements ExecutionListener { list.forEach(item -> item.setStandardId(esId)); esAdviceService.updateBatchById(list); } + // 更改企标计划状态 } private Map transMap(ProcessEsRevision data) { Map variables = JSON.parseObject(data.getBusinessJson(), Map.class); variables.put(FieldCommon.MODULE, TableNameEnum.ENTERPRISE_STANDARDS.getValue()); - // 主起草人 - String mainDraftUser = (String) variables.get(MAIN_DRAFT_USER); - variables.put(FieldCommon.MAIN_DRAFTING_USER, mainDraftUser); // 标准状态 variables.put(FieldCommon.STANDARD_STATE, StandardStateEnum.SEEK_FOR_OPINIONS.getStateValue()); String standardId = IdWorker.getIdStr(); @@ -75,4 +105,133 @@ public class ProcessESRevisionEndListener implements ExecutionListener { variables.put(FieldCommon.FILE_PUBLISH_OF_ORIGINAL, onEditFile); return variables; } + + private String makeDraftFile(ProcessEsRevision data) throws Exception { + Map variables = JSON.parseObject(data.getBusinessJson(), Map.class); + String standardNo = (String) variables.get(FieldCommon.STANDARD_NUMBER); + String standardName = (String) variables.get(FieldCommon.STANDARD_NAME); + ClassPathResource resource = new ClassPathResource("wordTemplate/征求意见反馈单.docx"); + // 使用ClassPathResource来读取模板文件 + try (InputStream fis = resource.getInputStream()) { + XWPFDocument document = new XWPFDocument(fis); + + // Iterate through paragraphs to find "标准名称:" + for (XWPFParagraph paragraph : document.getParagraphs()) { + for (XWPFRun run : paragraph.getRuns()) { + String text = run.getText(0); + if (text != null && text.contains("标准名称:")) { + // Append the new text right after "标准名称:" + text = text + standardName; + run.setText(text, 0); // Update the text in the current run + } + } + } + + // 获取并修改文档中的表格 + List tables = document.getTables(); + if (!tables.isEmpty()) { + XWPFTable firstTable = tables.get(0); + setFirstTableContents(firstTable, data); + } + + // 创建临时文件 + String fileName = standardNo + "征求意见回函意见表"; + fileName = fileName.replaceAll("/", ""); + File tempFile = Files.createTempFile(fileName, ".docx").toFile(); + + // 将更改写入临时文件 + try (FileOutputStream fos = new FileOutputStream(tempFile)) { + document.write(fos); + } + + // 将文件作为MultipartFile封装 + MultipartFile multipartFile = new MockMultipartFile( + "file", // 表单字段名称 + tempFile.getName(), // 文件名 + "application/vnd.openxmlformats-officedocument.wordprocessingml.document", // 内容类型 + Files.newInputStream(tempFile.toPath()) // 文件内容 + ); + + // 创建模拟的MultipartHttpServletRequest + MockMultipartHttpServletRequest mockRequest = new MockMultipartHttpServletRequest(); + mockRequest.addFile(multipartFile); // 添加文件 + mockRequest.addParameter("biz", "temp"); // 添加其他表单字段 + + // 调用上传接口 + String bizPath = "esDraft"; + CommonUtils.upload(multipartFile, bizPath, uploadType); + String savePath = CommonUtils.upload(multipartFile, bizPath, uploadType); + + //上传成功 进行数据库存储 + OSSFile ossFile = new OSSFile(); + // 文件名 + ossFile.setStandardFileType(FieldCommon.FILE_DRAFT_FOR_COMMENT); + ossFile.setStandardNumber(standardNo); + ossFile.setFileName(fileName.substring(0, fileName.lastIndexOf("征求意见反馈单") + 7) + ".docx"); + ossFile.setUrl(savePath); + ossFileService.save(ossFile); + // 删除临时文件 + boolean delete = tempFile.delete(); + return ossFile.getId(); + } + } + + private void setFirstTableContents(XWPFTable table, ProcessEsRevision data) { + List opinions = revisionAdviceService.list(new LambdaQueryWrapper() + .eq(EsRevisionAdvice::getProcessInstanceId, data.getProcessInstanceId())); + + List termNo = opinions.stream().map(EsRevisionAdvice::getTermNum).collect(Collectors.toList()); + List adviceList = opinions.stream().map(EsRevisionAdvice::getEditAdvice).collect(Collectors.toList()); + // 获取一个1-5的List + List noList = IntStream.rangeClosed(1, termNo.size()).mapToObj(String::valueOf).collect(Collectors.toList()); + // 获取表格的行列表 + List rows = table.getRows(); + if (!rows.isEmpty()) { + // 序号 + setContentList(rows, 1, 0, noList); + // 章节编号 + setContentList(rows, 1, 1, termNo); + // 修改意见内容 + setContentList(rows, 1, 2, adviceList); + } + } + + private void setContentList(List rows, int rowNum, int cellNum, List contentList) { + for (String content : contentList) { + if (StrUtil.isBlank(content)) { + continue; + } + setContent(rows, rowNum, cellNum, content, true, false, false); + } + } + + private void setContent(List rows, int rowNum, int cellNum, String content, + boolean newLine, boolean alignCenter, boolean verCenter) { + if (StrUtil.isBlank(content)) { + return; + } + XWPFTableRow row = rows.get(rowNum); + List cells = row.getTableCells(); + if (!cells.isEmpty()) { + XWPFTableCell cell = cells.get(cellNum); + XWPFParagraph paragraph; + if (newLine) { + paragraph = cell.addParagraph(); + } else { + paragraph = cell.getParagraphs().get(0); + } + XWPFRun run = paragraph.createRun(); + // 设置段落居中(水平) + if (alignCenter) { + paragraph.setAlignment(ParagraphAlignment.CENTER); + } + run.setText(content); + run.setFontSize(12); + run.setFontFamily("新宋体"); + // 设置单元格垂直居中 + if (verCenter) { + cell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER); + } + } + } } diff --git a/laws-modules/src/main/resources/wordTemplate/征求意见反馈单.docx b/laws-modules/src/main/resources/wordTemplate/征求意见反馈单.docx new file mode 100644 index 0000000000000000000000000000000000000000..d9fd66555562129f66927120e1d09c878d07c7f2 GIT binary patch literal 17946 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 literal 0 HcmV?d00001