feat: 征求意见流程结束后生成征求意见稿

This commit is contained in:
2024-10-08 17:14:13 +08:00
parent 9e6431824a
commit 80fa1b61f0
2 changed files with 164 additions and 5 deletions
@@ -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<String, Object> 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<String, Object> transMap(ProcessEsRevision data) {
Map<String, Object> 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<String, Object> 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<XWPFTable> 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<EsRevisionAdvice> opinions = revisionAdviceService.list(new LambdaQueryWrapper<EsRevisionAdvice>()
.eq(EsRevisionAdvice::getProcessInstanceId, data.getProcessInstanceId()));
List<String> termNo = opinions.stream().map(EsRevisionAdvice::getTermNum).collect(Collectors.toList());
List<String> adviceList = opinions.stream().map(EsRevisionAdvice::getEditAdvice).collect(Collectors.toList());
// 获取一个1-5的List
List<String> noList = IntStream.rangeClosed(1, termNo.size()).mapToObj(String::valueOf).collect(Collectors.toList());
// 获取表格的行列表
List<XWPFTableRow> 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<XWPFTableRow> rows, int rowNum, int cellNum, List<String> contentList) {
for (String content : contentList) {
if (StrUtil.isBlank(content)) {
continue;
}
setContent(rows, rowNum, cellNum, content, true, false, false);
}
}
private void setContent(List<XWPFTableRow> rows, int rowNum, int cellNum, String content,
boolean newLine, boolean alignCenter, boolean verCenter) {
if (StrUtil.isBlank(content)) {
return;
}
XWPFTableRow row = rows.get(rowNum);
List<XWPFTableCell> 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);
}
}
}
}