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 00000000..d9fd6655 Binary files /dev/null and b/laws-modules/src/main/resources/wordTemplate/征求意见反馈单.docx differ