diff --git a/laws-modules/src/main/java/com/jero/modules/activiti/process/esChange/controller/ESChangeController.java b/laws-modules/src/main/java/com/jero/modules/activiti/process/esChange/controller/ESChangeController.java index 4704be35..76280eb8 100644 --- a/laws-modules/src/main/java/com/jero/modules/activiti/process/esChange/controller/ESChangeController.java +++ b/laws-modules/src/main/java/com/jero/modules/activiti/process/esChange/controller/ESChangeController.java @@ -8,7 +8,9 @@ import com.jero.modules.activiti.process.common.entity.ProcessDraft; import com.jero.modules.activiti.process.common.entity.TransferVO; import com.jero.modules.activiti.process.common.service.ActFlowCommonService; import com.jero.modules.activiti.process.esArchive.entity.vo.ESArchiveDataVO; +import com.jero.modules.activiti.process.esChange.entity.ProcessEsChange; import com.jero.modules.activiti.process.esChange.entity.vo.ESChangeDataVO; +import com.jero.modules.activiti.process.esChange.listener.ProcessESChangeEndListener; import com.jero.modules.activiti.process.esChange.service.ProcessEsChangeService; import com.jero.modules.activiti.process.fb.service.IProcessHandleService; import com.jero.modules.activiti.process.fb.vo.ProcessInfoVO; @@ -20,6 +22,7 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; /** @@ -47,7 +50,7 @@ public class ESChangeController { * @param changeData */ @AutoLog(value = "企标更改流程-发起流程") - @ApiOperation(value="企标更改流程-发起流程", notes="企标更改流程-发起流程") + @ApiOperation(value = "企标更改流程-发起流程", notes = "企标更改流程-发起流程") @PostMapping("/start") public Result startProcess(@RequestBody ESChangeDataVO changeData) { changeService.startProcess(changeData); @@ -56,10 +59,11 @@ public class ESChangeController { /** * 保存到待办 + * * @param processInfoVO */ @AutoLog(value = "企标更改流程-保存") - @ApiOperation(value="企标更改流程-保存", notes="企标更改流程-保存") + @ApiOperation(value = "企标更改流程-保存", notes = "企标更改流程-保存") @PostMapping("/save") public Result save(@Validated @RequestBody ProcessInfoVO processInfoVO) { changeService.saveToDraft(processInfoVO); @@ -68,10 +72,11 @@ public class ESChangeController { /** * 保存到待办 + * * @param taskId */ @AutoLog(value = "企标更改流程-办理") - @ApiOperation(value="企标更改流程-办理", notes="企标更改流程-办理") + @ApiOperation(value = "企标更改流程-办理", notes = "企标更改流程-办理") @GetMapping("/handle/{taskId}") @Translation public Result handle(@PathVariable("taskId") String taskId) { @@ -88,20 +93,28 @@ public class ESChangeController { * @param changeData */ @AutoLog(value = "企标更改流程-同意") - @ApiOperation(value="企标更改流程-同意", notes="企标更改流程-同意") + @ApiOperation(value = "企标更改流程-同意", notes = "企标更改流程-同意") @PostMapping("/agree") public Result agree(@RequestBody ESChangeDataVO changeData) { changeService.approval(changeData, true); return Result.OK(); } + @AutoLog(value = "企标更改流程-测试修改单生成") + @ApiOperation(value = "企标更改流程-测试修改单生成", notes = "企标更改流程-测试修改单生成", produces = "application/octet-stream") + @PostMapping("/test") + public Result testModifyGen(HttpServletResponse response) throws Exception { +// processESChangeEndListener.genModificationOrder(new ProcessEsChange(), response); + return Result.OK(); + } + /** * 驳回 * * @param changeData */ @AutoLog(value = "企标更改流程-驳回") - @ApiOperation(value="企标更改流程-驳回", notes="企标更改流程-驳回") + @ApiOperation(value = "企标更改流程-驳回", notes = "企标更改流程-驳回") @PostMapping("/reject") public Result reject(@RequestBody ESChangeDataVO changeData) { changeService.approval(changeData, false); @@ -110,10 +123,9 @@ public class ESChangeController { /** * 转办 - * */ @AutoLog(value = "企标更改流程-转办") - @ApiOperation(value="企标更改流程-转办", notes="企标更改流程-转办") + @ApiOperation(value = "企标更改流程-转办", notes = "企标更改流程-转办") @PostMapping(value = "/transfer") public Result transfer(@RequestBody TransferVO transferVO) { processHandleService.transfer(transferVO.getTaskId(), transferVO.getUserId()); @@ -122,11 +134,12 @@ public class ESChangeController { /** * 草稿办理 + * * @param draftId * @param projectId */ @AutoLog(value = "企标更改流程-草稿办理") - @ApiOperation(value="企标更改流程-草稿办理", notes="企标更改流程-草稿办理") + @ApiOperation(value = "企标更改流程-草稿办理", notes = "企标更改流程-草稿办理") @GetMapping("/draftHandle") @Translation public Result draftHandle(@RequestParam("draftId") @ApiParam("草稿Id") String draftId) { diff --git a/laws-modules/src/main/java/com/jero/modules/activiti/process/esChange/entity/EsChangeTaskNameConstant.java b/laws-modules/src/main/java/com/jero/modules/activiti/process/esChange/entity/EsChangeTaskNameConstant.java new file mode 100644 index 00000000..31fac64b --- /dev/null +++ b/laws-modules/src/main/java/com/jero/modules/activiti/process/esChange/entity/EsChangeTaskNameConstant.java @@ -0,0 +1,15 @@ +package com.jero.modules.activiti.process.esChange.entity; + +/** + * @author: Mzaxd + * @Date: 2023/10/27 7:32 + */ +public class EsChangeTaskNameConstant { + + public static final String MAIN_DRAFTER_INIT = "主起草人发起"; + public static final String RELATED_USER_CHECK = "相关人员校对"; + public static final String MAIN_DRAFTER_LEADER_APPROVAL = "主起草人主管级领导审批"; + public static final String STANDARDIZATION_APPROVAL = "标准化审批"; + public static final String MAIN_DRAFTER_LEADER_LEADER_APPROVAL = "起草人主管级上一级领导审批"; + +} diff --git a/laws-modules/src/main/java/com/jero/modules/activiti/process/esChange/listener/ProcessESChangeEndListener.java b/laws-modules/src/main/java/com/jero/modules/activiti/process/esChange/listener/ProcessESChangeEndListener.java index 13b36687..b9c0e74e 100644 --- a/laws-modules/src/main/java/com/jero/modules/activiti/process/esChange/listener/ProcessESChangeEndListener.java +++ b/laws-modules/src/main/java/com/jero/modules/activiti/process/esChange/listener/ProcessESChangeEndListener.java @@ -1,24 +1,51 @@ package com.jero.modules.activiti.process.esChange.listener; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.jero.common.api.vo.Result; +import com.jero.common.exception.JeroBootException; +import com.jero.common.system.vo.DictModel; +import com.jero.modules.activiti.entity.ProcessApprovalRecord; +import com.jero.modules.activiti.enums.CommitFlagEnum; import com.jero.modules.activiti.process.common.enums.StandardStateEnum; +import com.jero.modules.activiti.process.esChange.entity.EsChangeOpinion; +import com.jero.modules.activiti.process.esChange.entity.EsChangeTaskNameConstant; import com.jero.modules.activiti.process.esChange.entity.ProcessEsChange; +import com.jero.modules.activiti.process.esChange.service.EsChangeOpinionService; import com.jero.modules.activiti.process.esChange.service.ProcessEsChangeService; +import com.jero.modules.activiti.service.ProcessApprovalRecordService; import com.jero.modules.laws.common.constant.FieldCommon; import com.jero.modules.laws.common.service.ILawsCommonService; import com.jero.modules.laws.standard.entity.LawsEnterpriseStandard; import com.jero.modules.laws.standard.service.ILawsEnterpriseStandardService; +import com.jero.modules.oss.entity.OSSFile; +import com.jero.modules.oss.service.IOSSFileService; +import com.jero.modules.system.controller.CommonController; +import com.jero.modules.system.entity.SysDepart; +import com.jero.modules.system.entity.SysUser; +import com.jero.modules.system.service.*; import com.jero.modules.tag.enums.TableNameEnum; import lombok.extern.slf4j.Slf4j; import org.activiti.engine.delegate.DelegateExecution; import org.activiti.engine.delegate.ExecutionListener; +import org.apache.poi.xwpf.usermodel.*; +import org.springframework.core.io.ClassPathResource; +import org.springframework.mock.web.MockHttpServletResponse; +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 javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.nio.file.Files; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; +import java.util.List; import java.util.Map; +import java.util.stream.Collectors; /** * @author: Mzaxd @@ -42,6 +69,30 @@ public class ProcessESChangeEndListener implements ExecutionListener { @Resource private ILawsCommonService commonService; + @Resource + private ISysUserService sysUserService; + + @Resource + private ISysUserDepartService sysUserDepartService; + + @Resource + private ISysDepartService sysDepartService; + + @Resource + private ISysDictService dictService; + + @Resource + private ProcessApprovalRecordService approvalRecordService; + + @Resource + private CommonController commonController; + + @Resource + private IOSSFileService ossFileService; + + @Resource + private EsChangeOpinionService changeOpinionService; + @Override public void notify(DelegateExecution delegateExecution) { log.info("企标更改流程结束 监听执行器开始执行"); @@ -55,27 +106,271 @@ public class ProcessESChangeEndListener implements ExecutionListener { // 根据标准编号找到标准Id LawsEnterpriseStandard es = esService.getOne(new LambdaQueryWrapper() .eq(LawsEnterpriseStandard::getStandardNumber, standNo)); - change.setId(es.getId()); // 转换成Map 然后走commonEdit接口 Map parameterMap = new HashMap<>(); this.buildMap(parameterMap, change); commonService.commonEdit(parameterMap); + // 生成修改单号 + this.genModificationOrderNumber(change); + esChangeService.updateById(change); // 生成修改单 - this.genModificationOrder(change); + try { + this.genModificationOrder(change); + } catch (Exception e) { + log.error("生成企标编号为{}的更改单失败", es.getStandardNumber()); + log.error(e.getMessage()); + throw new JeroBootException("生成企标编号为" + es.getStandardNumber() + "的更改单失败"); + } log.info("企标更改流程监听执行器执行结束"); } - private void genModificationOrder(ProcessEsChange change) { + public void genModificationOrder(ProcessEsChange change) throws Exception { String esNo = change.getStandardNumber(); + ClassPathResource resource = new ClassPathResource("wordTemplate/企标更改单模板.docx"); + // 使用ClassPathResource来读取模板文件 + try (InputStream fis = resource.getInputStream()) { + XWPFDocument document = new XWPFDocument(fis); + // 获取并修改文档中的表格 + List tables = document.getTables(); + if (!tables.isEmpty()) { + XWPFTable firstTable = tables.get(0); + setFirstTableContents(firstTable, change); + } + // 循环遍历所有页脚 + for (XWPFFooter footer : document.getFooterList()) { + // 获取页脚中的所有表格 + List footerTables = footer.getTables(); + // 假设您想要修改第一个表格 + if (!footerTables.isEmpty()) { + XWPFTable footerTable = footerTables.get(0); + // 在这里调用您的方法来修改页脚中的表格 + setSecondTableContents(footerTable, change); + } + } + // 创建临时文件 + String fileName = change.getModifyOrderNum() + "-" + esNo + "标准更改单"; + 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"); // 添加其他表单字段 + + // 调用上传接口 + Result result = commonController.upload(mockRequest, new MockHttpServletResponse()); + OSSFile file = result.getResult(); + file.setStandardFileType(FieldCommon.FILE_MODIFICATION_LIST); + file.setStandardNumber(esNo); + file.setStandardId(change.getStandardId()); + file.setFileName(fileName.substring(0, fileName.lastIndexOf("标准更改单") + 5) + ".docx"); + ossFileService.updateById(file); + // 删除临时文件 + boolean delete = tempFile.delete(); + } + } + + private void writeToResponse(HttpServletResponse response, File file) throws IOException { + response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document"); + response.setHeader("Content-Disposition", "attachment; filename=" + file.getName()); + + try (OutputStream out = response.getOutputStream(); FileInputStream fis = new FileInputStream(file)) { + byte[] buffer = new byte[1024]; + int bytesRead; + while ((bytesRead = fis.read(buffer)) != -1) { + out.write(buffer, 0, bytesRead); + } + } + } + + private void setFirstTableContents(XWPFTable table, ProcessEsChange change) { + List opinions = changeOpinionService.list(new LambdaQueryWrapper() + .eq(EsChangeOpinion::getBusinessId, change.getId())); + + List changeReasonList = opinions.stream().map(EsChangeOpinion::getUpdateReason).collect(Collectors.toList()); + List beforeUpdateList = opinions.stream().map(EsChangeOpinion::getBeforeUpdate).collect(Collectors.toList()); + List afterUpdateList = opinions.stream().map(EsChangeOpinion::getAfterUpdate).collect(Collectors.toList()); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + // 获取表格的行列表 + List rows = table.getRows(); + if (!rows.isEmpty()) { + // 图样文件代号 + setContent(rows, 1, 0, change.getStandardNumber(), false, false, false); + // 图样(文件)更改通知单号 + setContent(rows, 1, 1, change.getModifyOrderNum(), false, false, false); + // 名称 + setContent(rows, 2, 0, change.getStandardName(), false, false, false); + // 更改级别代号 + setContent(rows, 2, 1, change.getLevelCode(), false, false, false); + // 有无二维或三维图 + setContent(rows, 3, 1, change.getHas2d3dGraph(), false, false, false); + // 更改理由(依据) + setContentList(rows, 4, 0, changeReasonList); + // 更改前 + setContentList(rows, 5, 0, beforeUpdateList); + // 更改后 + setContentList(rows, 5, 1, afterUpdateList); + // 顾客确认(适用军品) + setContent(rows, 6, 0, change.getCustomerConfirmation(), true, false, false); + // 刷新文件号(三维) + setContent(rows, 6, 1, change.getRefreshFileNumber(), true, false, false); + // 关联更改项 + setContent(rows, 7, 1, change.getRelatedChanges(), true, false, false); + // 库存 + setContent(rows, 8, 1, change.getInventory(), false, true, true); + // 在制品 + setContent(rows, 9, 1, change.getWorkInProgress(), false, true, true); + // 备件 + setContent(rows, 10, 1, change.getSpareParts(), false, true, true); + // 更改标记 + setContent(rows, 11, 1, change.getChangeTag(), false, true, true); + // 处数 + setContent(rows, 11, 3, change.getTreatmentCount(), false, true, true); + // 生效日期 + setContent(rows, 11, 5, formatter.format(change.getEffectiveDate()), false, true, true); + } + } + + private void setContentList(List rows, int rowNum, int cellNum, List contentList) { + for (String content : contentList) { + setContent(rows, rowNum, cellNum, content, true, false, false); + } + } + + private void genModificationOrderNumber(ProcessEsChange change) { + String deptCode = "U"; + // 找到单位代号 + String createBy = change.getCreateBy(); + SysUser createUser = sysUserService.getUserByName(createBy); + String deptId = sysUserDepartService.getFirstDeptIdByUserId(createUser.getId()); + SysDepart dept = sysDepartService.getById(deptId); + if (dept != null) { + String deptName = dept.getDepartName(); + List dictItems = dictService.getDictItems("es_modify_order_dept_code"); + for (DictModel dictItem : dictItems) { + if (dictItem.getText().equals(deptName)) { + deptCode = dictItem.getValue(); + break; + } + } + } + // 找到年份 + Date effectiveDate = new Date(); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy"); + String year = formatter.format(effectiveDate); + // 找到月份 + formatter = new SimpleDateFormat("MM"); + String month = formatter.format(effectiveDate); + // 获取顺序号 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.like(ProcessEsChange::getModifyOrderNum, "B" + deptCode + year + month); + queryWrapper.orderByDesc(ProcessEsChange::getModifyOrderNum); + List changes = esChangeService.list(queryWrapper); + String modifyOrderNum; + if (changes.isEmpty()) { + modifyOrderNum = "B" + deptCode + year + month + "001"; + change.setModifyOrderNum(modifyOrderNum); + return; + } + String lastModifyOrderNum = changes.get(0).getModifyOrderNum().substring(9); + String newModifyOrderNum = String.format("%03d", Integer.parseInt(lastModifyOrderNum) + 1); + modifyOrderNum = "B" + deptCode + year + month + newModifyOrderNum; + change.setModifyOrderNum(modifyOrderNum); + } + + private void setSecondTableContents(XWPFTable table, ProcessEsChange change) { + // 找到所有节点审批记录 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ProcessApprovalRecord::getProcessInstanceId, change.getProcessInstanceId()); + queryWrapper.eq(ProcessApprovalRecord::getCommitFlag, CommitFlagEnum.PASS.getValue()); + queryWrapper.orderByAsc(ProcessApprovalRecord::getCreateTime); + List records = approvalRecordService.list(queryWrapper); + Map userMap = records.stream() + .collect(Collectors.toMap(ProcessApprovalRecord::getTaskName, e -> { + SysUser user; + if (StrUtil.isNotBlank(e.getTransferBy())) { + user = sysUserService.getById(e.getTransferBy()); + } else { + user = sysUserService.getById(e.getUserId()); + } + e.setUserId(user.getRealname()); + return e; + })); + // 获取表格的行列表 + List rows = table.getRows(); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + if (!rows.isEmpty()) { + ProcessApprovalRecord recordOne = userMap.get(EsChangeTaskNameConstant.MAIN_DRAFTER_INIT); + ProcessApprovalRecord recordTwo = userMap.get(EsChangeTaskNameConstant.RELATED_USER_CHECK); + ProcessApprovalRecord recordThree = userMap.get(EsChangeTaskNameConstant.MAIN_DRAFTER_LEADER_APPROVAL); + ProcessApprovalRecord recordFour = userMap.get(EsChangeTaskNameConstant.STANDARDIZATION_APPROVAL); + ProcessApprovalRecord recordFive = userMap.get(EsChangeTaskNameConstant.MAIN_DRAFTER_LEADER_LEADER_APPROVAL); + + // 设计 + setContent(rows, 0, 1, recordOne.getUserId(), false, true, true); + setContent(rows, 1, 1, formatter.format(recordOne.getEndTime()), false, true, true); + // 校对 + setContent(rows, 0, 3, recordTwo.getUserId(), false, true, true); + setContent(rows, 1, 3, formatter.format(recordTwo.getEndTime()), false, true, true); + // 审核 + setContent(rows, 0, 5, recordThree.getUserId(), false, true, true); + setContent(rows, 1, 5, formatter.format(recordThree.getEndTime()), false, true, true); + // 标准化 + setContent(rows, 0, 7, recordFour.getUserId(), false, true, true); + setContent(rows, 1, 7, formatter.format(recordFour.getEndTime()), false, true, true); + // 批准 + setContent(rows, 0, 11, recordFive.getUserId(), false, true, true); + setContent(rows, 1, 11, formatter.format(recordFive.getEndTime()), false, true, true); + } + } + + private void setContent(List rows, int rowNum, int cellNum, String content, + boolean newLine, boolean alignCenter, boolean verCenter) { + 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); + } + } } private void buildMap(Map parameterMap, ProcessEsChange change) { SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); parameterMap.put(FieldCommon.MODULE, TableNameEnum.ENTERPRISE_STANDARDS.getValue()); - parameterMap.put(FieldCommon.ID, change.getId()); + parameterMap.put(FieldCommon.ID, change.getStandardId()); parameterMap.put(FieldCommon.STANDARD_NUMBER, change.getStandardNumber()); parameterMap.put(FieldCommon.STANDARD_NAME, change.getStandardName()); parameterMap.put(FieldCommon.GRADE_CLASSIFICATION, change.getGradeClassification()); diff --git a/laws-modules/src/main/java/com/jero/modules/projectLibrary/service/impl/LawsAssessResultsServiceImpl.java b/laws-modules/src/main/java/com/jero/modules/projectLibrary/service/impl/LawsAssessResultsServiceImpl.java index 7206efc7..167e787c 100644 --- a/laws-modules/src/main/java/com/jero/modules/projectLibrary/service/impl/LawsAssessResultsServiceImpl.java +++ b/laws-modules/src/main/java/com/jero/modules/projectLibrary/service/impl/LawsAssessResultsServiceImpl.java @@ -195,6 +195,18 @@ public class LawsAssessResultsServiceImpl extends ServiceImpl wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(LawsAssessResults::getProjectId,assess.getProjectId()) + .eq(LawsAssessResults::getStandardId,assess.getStandardId()) + .groupBy(LawsAssessResults::getTermNumber) + .groupBy(LawsAssessResults::getAssessorId); + wrapper.orderByDesc(LawsAssessResults::getCreateTime); + wrapper.last("limit 1"); + assessResults = this.getOne(wrapper); + } + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper .eq(LawsAssessResults::getProjectId,assessResults.getProjectId()) diff --git a/laws-modules/src/main/resources/wordTemplate/企标更改单模板.docx b/laws-modules/src/main/resources/wordTemplate/企标更改单模板.docx new file mode 100644 index 00000000..28ab4d88 Binary files /dev/null and b/laws-modules/src/main/resources/wordTemplate/企标更改单模板.docx differ diff --git a/pom.xml b/pom.xml index d27f82a2..bdf485bc 100644 --- a/pom.xml +++ b/pom.xml @@ -355,6 +355,8 @@ svg xlsx xls + docx + doc @@ -362,7 +364,6 @@ src/main/resources - true src/main/java