package com.hotent.project.service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.hotent.base.util.StringUtil; import com.hotent.project.manager.*; import com.hotent.project.model.*; import com.hotent.surveyinfo.manager.CostSurveyTemplateUploadManager; import com.hotent.surveyinfo.model.CostSurveyTemplateUpload; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFParagraph; import org.apache.poi.xwpf.usermodel.XWPFRun; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import java.io.FileOutputStream; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; /** * 异步资料归纳服务 * * @company 山西清众科技股份有限公司 * @author 超级管理员 * @since 2025-12-02 */ @Service public class AsyncMaterialSummaryService { @Autowired private CostProjectTaskMaterialSummaryManager costProjectTaskMaterialSummaryManager; @Autowired private CostProjectTaskMaterialSummaryDetailManager costProjectTaskMaterialSummaryDetailManager; @Autowired private CostProjectDocumentManager costProjectDocumentManager; @Autowired private CostProjectTaskManager costProjectTaskManager; @Autowired private CostSurveyTemplateUploadManager costSurveyTemplateUploadManager; @Autowired private CostProjectTaskMaterialManager costProjectTaskMaterialManager; @Autowired private CostProjectDeliberateManager costProjectDeliberateManager; @Autowired private CostProjectTaskAdjustmentRecordManager adjustmentRecordManager; @Autowired private CostProjectTaskEvidenceManager costProjectTaskEvidenceManager; @Autowired private CostProjectTaskPreliminaryOpinionManager preliminaryOpinionManager; /** * 生成资料归纳主表(13个基础资料类别)- 核心逻辑 * * @param mainTask 主任务 * @param childTasks 子任务列表 */ public void generateMaterialSummary(CostProjectTask mainTask, List childTasks) { try { // 定义13个基础资料类别 String[] materialNames = { "成本监审报告(含成本监审报告签发稿、送达回证)", "被监审单位申请定(调)价报告(复印件)", "成本监审通知书(含送达回证)", "经营者需提供成本资料清单", "《政府定价成本监审调查表》", "成本监审补充资料通知书(含送达回证)", "成本审核初步意见告知书(含送达回证)", "经营者书面反馈的材料", "成本审核初步意见表(集体审议用)", "成本监审集体审议记录", "成本监审工作底稿", "成本监审提取资料登记表", "提取的成本资料和会计凭证等复印件" }; // 为主任务生成13个资料归纳主表记录 for (int i = 0; i < materialNames.length; i++) { CostProjectTaskMaterialSummary summary = new CostProjectTaskMaterialSummary(); summary.setTaskId(mainTask.getId()); summary.setMaterialName(materialNames[i]); summary.setMaterialOrderNum(i + 1); summary.setIsDeleted("0"); costProjectTaskMaterialSummaryManager.createOrUpdate(summary); // 根据不同的资料类别生成对应的明细记录 generateDetailsByMaterialType(summary, mainTask, childTasks, i + 1); } } catch (Exception e) { // 记录异常日志,但不影响主流程 e.printStackTrace(); } } /** * 根据资料类别生成对应的明细记录 * * @param summary 资料归纳主表 * @param mainTask 主任务 * @param childTasks 子任务列表 * @param materialType 资料类别序号(1-13) */ private void generateDetailsByMaterialType(CostProjectTaskMaterialSummary summary, CostProjectTask mainTask, List childTasks, int materialType) { try { // 查询项目下的所有文书 List documents = costProjectDocumentManager.getListByProjectId(mainTask.getProjectId()); if (documents == null) { documents = new java.util.ArrayList<>(); } switch (materialType) { case 1: // 成本监审报告(含成本监审报告签发稿、送达回证) generateType1Details(summary, mainTask, documents); break; case 2: // 被监审单位申请定(调)价报告(复印件) generateType2Details(summary, mainTask, childTasks, documents); break; case 3: // 成本监审通知书(含送达回证) generateType3Details(summary, mainTask, childTasks, documents); break; case 4: // 经营者需提供成本资料清单 generateType4Details(summary, mainTask, childTasks, documents); break; case 5: // 《政府定价成本监审调查表》 generateType5Details(summary, mainTask, childTasks, documents); break; case 6: // 成本监审补充资料通知书(含送达回证) generateType6Details(summary, mainTask, childTasks, documents); break; case 7: // 成本审核初步意见告知书(含送达回证) generateType7Details(summary, mainTask, childTasks, documents); break; case 8: // 经营者书面反馈的材料 generateType8Details(summary, mainTask, childTasks, documents); break; case 9: // 成本审核初步意见表(集体审议用) generateType9Details(summary, mainTask, childTasks, documents); break; case 10: // 成本监审集体审议记录 generateType10Details(summary, mainTask, documents); break; case 11: // 成本监审工作底稿 generateType11Details(summary, mainTask, childTasks, documents); break; case 12: // 成本监审提取资料登记表 generateType12Details(summary, mainTask, childTasks, documents); break; case 13: // 提取的成本资料和会计凭证等复印件 generateType13Details(summary, mainTask, childTasks, documents); break; default: throw new RuntimeException("未知的资料类型"); } } catch (Exception e) { System.err.println("生成资料类型 " + materialType + " 的明细时出错:" + e.getMessage()); e.printStackTrace(); // 继续执行,不中断整个流程 } } // ==================== 类型1:成本监审报告(含成本监审报告签发稿、送达回证) ==================== private void generateType1Details(CostProjectTaskMaterialSummary summary, CostProjectTask mainTask, List documents) { int orderNum = 1; // 获取"成本监审报告"、"成本监审报告签发稿"、"送达回证" List matchedDocuments = documents.stream() .filter(doc -> "政府定价成本监审结论报告".equals(doc.getDocumentName())) .sorted(Comparator.comparing(doc -> doc.getOrderNum() != null ? doc.getOrderNum() : 0)) .collect(Collectors.toList()); for (CostProjectDocument document : matchedDocuments) { CostProjectTaskMaterialSummaryDetail detail = new CostProjectTaskMaterialSummaryDetail(); detail.setMasterId(summary.getId()); detail.setTaskId(mainTask.getId()); detail.setDocumentName(document.getDocumentName()); detail.setDocumentNumber(document.getDocumentNumber() != null ? document.getDocumentNumber() : ""); detail.setAuditedUnitName(""); detail.setFileSource("系统生成电子文书"); detail.setPageCount(0); detail.setAttachmentUrl(document.getElectronicDocumentUrl() != null ? document.getElectronicDocumentUrl() : ""); detail.setOrderNum(orderNum++); detail.setIsDeleted("0"); costProjectTaskMaterialSummaryDetailManager.save(detail); } } // ==================== 类型2:被监审单位申请定(调)价报告(复印件) ==================== private void generateType2Details(CostProjectTaskMaterialSummary summary, CostProjectTask mainTask, List childTasks, List documents) { int orderNum = 1; // 获取"申请定(调)价报告" List matchedDocuments = documents.stream() .filter(doc -> "申请定(调)价报告".equals(doc.getDocumentName())) .sorted(Comparator.comparing(doc -> doc.getOrderNum() != null ? doc.getOrderNum() : 0)) .collect(Collectors.toList()); for (CostProjectDocument document : matchedDocuments) { CostProjectTaskMaterialSummaryDetail detail = new CostProjectTaskMaterialSummaryDetail(); detail.setMasterId(summary.getId()); detail.setTaskId(mainTask.getId()); detail.setDocumentName(document.getDocumentName()); detail.setDocumentNumber(document.getDocumentNumber() != null ? document.getDocumentNumber() : ""); detail.setAuditedUnitName(""); detail.setFileSource("监审主体上传文件"); detail.setPageCount(0); detail.setAttachmentUrl(document.getScanDocumentUrl() != null ? document.getScanDocumentUrl() : ""); detail.setOrderNum(orderNum++); detail.setIsDeleted("0"); costProjectTaskMaterialSummaryDetailManager.save(detail); } } // ==================== 类型3:成本监审通知书(含送达回证) ==================== private void generateType3Details(CostProjectTaskMaterialSummary summary, CostProjectTask mainTask, List childTasks, List documents) { int orderNum = 1; // "成本监审通知书"和"送达回证" List matchedDocuments = documents.stream() .filter(doc -> "成本监审通知书".equals(doc.getDocumentName()) || "送达回证".equals(doc.getDocumentName())) .sorted(Comparator.comparing(doc -> doc.getOrderNum() != null ? doc.getOrderNum() : 0)) .collect(Collectors.toList()); for (CostProjectDocument document : matchedDocuments) { CostProjectTaskMaterialSummaryDetail detail = new CostProjectTaskMaterialSummaryDetail(); detail.setMasterId(summary.getId()); detail.setTaskId(mainTask.getId()); detail.setDocumentName(document.getDocumentName()); detail.setDocumentNumber(document.getDocumentNumber() != null ? document.getDocumentNumber() : ""); detail.setAuditedUnitName(""); detail.setFileSource("系统生成电子文书"); detail.setPageCount(0); detail.setAttachmentUrl(document.getElectronicDocumentUrl() != null ? document.getElectronicDocumentUrl() : ""); detail.setOrderNum(orderNum++); detail.setIsDeleted("0"); costProjectTaskMaterialSummaryDetailManager.save(detail); } } // ==================== 类型4:经营者需提供成本资料清单 ==================== private void generateType4Details(CostProjectTaskMaterialSummary summary, CostProjectTask mainTask, List childTasks, List documents) { int orderNum = 1; // 获取"成本资料清单" List matchedDocuments = documents.stream() .filter(doc -> "成本资料清单".equals(doc.getDocumentName())) .sorted(Comparator.comparing(doc -> doc.getOrderNum() != null ? doc.getOrderNum() : 0)) .collect(Collectors.toList()); for (CostProjectDocument document : matchedDocuments) { CostProjectTaskMaterialSummaryDetail detail = new CostProjectTaskMaterialSummaryDetail(); detail.setMasterId(summary.getId()); detail.setTaskId(mainTask.getId()); detail.setDocumentName(document.getDocumentName()); detail.setDocumentNumber(document.getDocumentNumber() != null ? document.getDocumentNumber() : ""); detail.setAuditedUnitName(""); detail.setFileSource("系统生成电子文书"); detail.setPageCount(0); detail.setAttachmentUrl(document.getElectronicDocumentUrl() != null ? document.getElectronicDocumentUrl() : ""); detail.setOrderNum(orderNum++); detail.setIsDeleted("0"); costProjectTaskMaterialSummaryDetailManager.save(detail); } } // ==================== 类型5:《政府定价成本监审调查表》 ==================== private void generateType5Details(CostProjectTaskMaterialSummary summary, CostProjectTask mainTask, List childTasks, List documents) { int orderNum = 1; for (CostProjectTask childTask : childTasks) { List costSurveyTemplateUploads = costSurveyTemplateUploadManager.listByTaskId(childTask.getId()); for (CostSurveyTemplateUpload upload : costSurveyTemplateUploads) { if ("1".equals(upload.getIsUpload()) && StringUtil.isNotEmpty(upload.getFileUrl())) { CostProjectTaskMaterialSummaryDetail detail = new CostProjectTaskMaterialSummaryDetail(); detail.setMasterId(summary.getId()); detail.setTaskId(mainTask.getId()); detail.setDocumentName(upload.getSurveyTemplateName() != null ? upload.getSurveyTemplateName() : "政府定价成本监审调查表"); detail.setDocumentNumber(""); detail.setAuditedUnitName(childTask.getAuditedUnitName() != null ? childTask.getAuditedUnitName() : ""); detail.setFileSource("监审单位反馈文件"); detail.setPageCount(0); detail.setAttachmentUrl(upload.getFileUrl()); detail.setOrderNum(orderNum++); detail.setIsDeleted("0"); costProjectTaskMaterialSummaryDetailManager.save(detail); } } } } // ==================== 类型6:成本监审补充资料通知书(含送达回证) ==================== private void generateType6Details(CostProjectTaskMaterialSummary summary, CostProjectTask mainTask, List childTasks, List documents) { int orderNum = 1; List matchedDocuments = documents.stream() .filter(doc -> "成本监审补充资料通知书".equals(doc.getDocumentName()) || "成本监审补充资料通知书-送达回证".equals(doc.getDocumentName())) .sorted(Comparator.comparing(doc -> doc.getOrderNum() != null ? doc.getOrderNum() : 0)) .collect(Collectors.toList()); for (CostProjectDocument document : matchedDocuments) { CostProjectTaskMaterialSummaryDetail detail = new CostProjectTaskMaterialSummaryDetail(); detail.setMasterId(summary.getId()); detail.setTaskId(mainTask.getId()); detail.setDocumentName(document.getDocumentName()); detail.setDocumentNumber(document.getDocumentNumber() != null ? document.getDocumentNumber() : ""); detail.setAuditedUnitName(""); detail.setFileSource("系统生成电子文书"); detail.setPageCount(0); detail.setAttachmentUrl(document.getElectronicDocumentUrl() != null ? document.getElectronicDocumentUrl() : ""); detail.setOrderNum(orderNum++); detail.setIsDeleted("0"); costProjectTaskMaterialSummaryDetailManager.save(detail); } // 获取任务的报送资料要求(被监审单位提交的补充资料) List list = costProjectTaskMaterialManager.list( new LambdaQueryWrapper<>(CostProjectTaskMaterial.class) .eq(CostProjectTaskMaterial::getTaskId, mainTask.getId()) ); for (CostProjectTaskMaterial material : list) { // 只处理已上传的资料 if ("1".equals(material.getIsUpload()) && StringUtil.isNotEmpty(material.getFileUrl())) { CostProjectTaskMaterialSummaryDetail detail = new CostProjectTaskMaterialSummaryDetail(); detail.setMasterId(summary.getId()); detail.setTaskId(mainTask.getId()); detail.setDocumentName(material.getInformationName() != null ? material.getInformationName() : "补充资料"); detail.setDocumentNumber(""); detail.setAuditedUnitName(""); detail.setFileSource("监审单位反馈文件"); detail.setPageCount(0); detail.setAttachmentUrl(material.getFileUrl()); detail.setOrderNum(orderNum++); detail.setIsDeleted("0"); costProjectTaskMaterialSummaryDetailManager.save(detail); } } } // ==================== 类型7:成本审核初步意见告知书(含送达回证) ==================== private void generateType7Details(CostProjectTaskMaterialSummary summary, CostProjectTask mainTask, List childTasks, List documents) { int orderNum = 1; // 获取"成本审核初步意见告知书"和"送达回证" List matchedDocuments = documents.stream() .filter(doc -> "成本审核初步意见告知书".equals(doc.getDocumentName()) || "送达回证".equals(doc.getDocumentName())) .sorted(Comparator.comparing(doc -> doc.getOrderNum() != null ? doc.getOrderNum() : 0)) .collect(Collectors.toList()); for (CostProjectDocument document : matchedDocuments) { CostProjectTaskMaterialSummaryDetail detail = new CostProjectTaskMaterialSummaryDetail(); detail.setMasterId(summary.getId()); detail.setTaskId(mainTask.getId()); detail.setDocumentName(document.getDocumentName()); detail.setDocumentNumber(document.getDocumentNumber() != null ? document.getDocumentNumber() : ""); detail.setAuditedUnitName(""); detail.setFileSource("系统生成电子文书"); detail.setPageCount(0); detail.setAttachmentUrl(document.getElectronicDocumentUrl() != null ? document.getElectronicDocumentUrl() : ""); detail.setOrderNum(orderNum++); detail.setIsDeleted("0"); costProjectTaskMaterialSummaryDetailManager.save(detail); } } // ==================== 类型8:经营者书面反馈的材料 ==================== private void generateType8Details(CostProjectTaskMaterialSummary summary, CostProjectTask mainTask, List childTasks, List documents) { int orderNum = 1; // 获取"书面反馈材料"(来源:监审单位反馈文件) List matchedDocuments = documents.stream() .filter(doc -> "书面反馈材料".equals(doc.getDocumentName())) .sorted(Comparator.comparing(doc -> doc.getOrderNum() != null ? doc.getOrderNum() : 0)) .collect(Collectors.toList()); for (CostProjectDocument document : matchedDocuments) { CostProjectTaskMaterialSummaryDetail detail = new CostProjectTaskMaterialSummaryDetail(); detail.setMasterId(summary.getId()); detail.setTaskId(mainTask.getId()); detail.setDocumentName(document.getDocumentName()); detail.setDocumentNumber(document.getDocumentNumber() != null ? document.getDocumentNumber() : ""); detail.setAuditedUnitName(""); detail.setFileSource("监审单位反馈文件"); detail.setPageCount(0); detail.setAttachmentUrl(document.getFeedbackDocumentUrl() != null ? document.getFeedbackDocumentUrl() : ""); detail.setOrderNum(orderNum++); detail.setIsDeleted("0"); costProjectTaskMaterialSummaryDetailManager.save(detail); } // 获取被监审单位的反馈意见和反馈资料 for (CostProjectTask childTask : childTasks) { List list = preliminaryOpinionManager.list( new LambdaQueryWrapper<>(CostProjectTaskPreliminaryOpinion.class) .eq(CostProjectTaskPreliminaryOpinion::getTaskId, childTask.getId()) ); for (CostProjectTaskPreliminaryOpinion opinion : list) { // 只处理有反馈资料的记录 if (StringUtil.isNotEmpty(opinion.getFeedbackMaterials())) { CostProjectTaskMaterialSummaryDetail detail = new CostProjectTaskMaterialSummaryDetail(); detail.setMasterId(summary.getId()); detail.setTaskId(mainTask.getId()); detail.setDocumentName("书面反馈材料"); detail.setDocumentNumber(""); detail.setAuditedUnitName(childTask.getAuditedUnitName() != null ? childTask.getAuditedUnitName() : ""); detail.setFileSource("监审单位反馈文件"); detail.setPageCount(0); detail.setAttachmentUrl(opinion.getFeedbackMaterials()); detail.setOrderNum(orderNum++); detail.setIsDeleted("0"); costProjectTaskMaterialSummaryDetailManager.save(detail); } } } } // ==================== 类型9:成本审核初步意见表(集体审议用) ==================== private void generateType9Details(CostProjectTaskMaterialSummary summary, CostProjectTask mainTask, List childTasks, List documents) { int orderNum = 1; // 获取"成本审核初步意见表" List matchedDocuments = documents.stream() .filter(doc -> "成本审核初步意见表".equals(doc.getDocumentName())) .sorted(Comparator.comparing(doc -> doc.getOrderNum() != null ? doc.getOrderNum() : 0)) .collect(Collectors.toList()); for (CostProjectDocument document : matchedDocuments) { CostProjectTaskMaterialSummaryDetail detail = new CostProjectTaskMaterialSummaryDetail(); detail.setMasterId(summary.getId()); detail.setTaskId(mainTask.getId()); detail.setDocumentName(document.getDocumentName()); detail.setDocumentNumber(document.getDocumentNumber() != null ? document.getDocumentNumber() : ""); detail.setAuditedUnitName(""); detail.setFileSource("系统生成电子文书"); detail.setPageCount(0); detail.setAttachmentUrl(document.getElectronicDocumentUrl() != null ? document.getElectronicDocumentUrl() : ""); detail.setOrderNum(orderNum++); detail.setIsDeleted("0"); costProjectTaskMaterialSummaryDetailManager.save(detail); } } // ==================== 类型10:成本监审集体审议记录 ==================== private void generateType10Details(CostProjectTaskMaterialSummary summary, CostProjectTask mainTask, List documents) { int orderNum = 1; // 获取"成本监审集体审议记录" List matchedDocuments = documents.stream() .filter(doc -> "成本监审集体审议记录".equals(doc.getDocumentName())) .sorted(Comparator.comparing(doc -> doc.getOrderNum() != null ? doc.getOrderNum() : 0)) .collect(Collectors.toList()); for (CostProjectDocument document : matchedDocuments) { CostProjectTaskMaterialSummaryDetail detail = new CostProjectTaskMaterialSummaryDetail(); detail.setMasterId(summary.getId()); detail.setTaskId(mainTask.getId()); detail.setDocumentName(document.getDocumentName()); detail.setDocumentNumber(document.getDocumentNumber() != null ? document.getDocumentNumber() : ""); detail.setAuditedUnitName(""); detail.setFileSource("系统生成电子文书"); detail.setPageCount(0); detail.setAttachmentUrl(document.getElectronicDocumentUrl() != null ? document.getElectronicDocumentUrl() : ""); detail.setOrderNum(orderNum++); detail.setIsDeleted("0"); costProjectTaskMaterialSummaryDetailManager.save(detail); } // 获取集体审议记录 List list = costProjectDeliberateManager.list( new LambdaQueryWrapper().eq(CostProjectDeliberate::getTaskId, mainTask.getId()) ); for (CostProjectDeliberate deliberate : list) { // 只处理有附件的审议记录 if (StringUtil.isNotEmpty(deliberate.getAttachmentIds())) { CostProjectTaskMaterialSummaryDetail detail = new CostProjectTaskMaterialSummaryDetail(); detail.setMasterId(summary.getId()); detail.setTaskId(mainTask.getId()); detail.setDocumentName("成本监审集体审议记录"); detail.setDocumentNumber(""); detail.setAuditedUnitName(""); detail.setFileSource("系统生成电子文书"); detail.setPageCount(0); detail.setAttachmentUrl(deliberate.getAttachmentIds()); detail.setOrderNum(orderNum++); detail.setIsDeleted("0"); costProjectTaskMaterialSummaryDetailManager.save(detail); } } } // ==================== 类型11:成本监审工作底稿 ==================== private void generateType11Details(CostProjectTaskMaterialSummary summary, CostProjectTask mainTask, List childTasks, List documents) { int orderNum = 1; // 获取"成本监审工作底稿" List matchedDocuments = documents.stream() .filter(doc -> "成本监审工作底稿".equals(doc.getDocumentName())) .sorted(Comparator.comparing(doc -> doc.getOrderNum() != null ? doc.getOrderNum() : 0)) .collect(Collectors.toList()); for (CostProjectDocument document : matchedDocuments) { CostProjectTaskMaterialSummaryDetail detail = new CostProjectTaskMaterialSummaryDetail(); detail.setMasterId(summary.getId()); detail.setTaskId(mainTask.getId()); detail.setDocumentName(document.getDocumentName()); detail.setDocumentNumber(document.getDocumentNumber() != null ? document.getDocumentNumber() : ""); detail.setAuditedUnitName(""); detail.setFileSource("系统生成电子文书"); detail.setPageCount(0); detail.setAttachmentUrl(document.getElectronicDocumentUrl() != null ? document.getElectronicDocumentUrl() : ""); detail.setOrderNum(orderNum++); detail.setIsDeleted("0"); costProjectTaskMaterialSummaryDetailManager.save(detail); } // 获取核增核减记录(工作底稿的一部分) for (CostProjectTask childTask : childTasks) { List costProjectTaskAdjustmentRecords = adjustmentRecordManager.listByTaskId(childTask.getId()); for (CostProjectTaskAdjustmentRecord record : costProjectTaskAdjustmentRecords) { // 只处理有附件的记录 if (StringUtil.isNotEmpty(record.getAttachmentUrl())) { CostProjectTaskMaterialSummaryDetail detail = new CostProjectTaskMaterialSummaryDetail(); detail.setMasterId(summary.getId()); detail.setTaskId(mainTask.getId()); detail.setDocumentName(record.getSubject() != null ? record.getSubject() + "-工作底稿" : "成本监审工作底稿"); detail.setDocumentNumber(""); detail.setAuditedUnitName(childTask.getAuditedUnitName() != null ? childTask.getAuditedUnitName() : ""); detail.setFileSource("系统生成电子文书"); detail.setPageCount(0); detail.setAttachmentUrl(record.getAttachmentUrl()); detail.setOrderNum(orderNum++); detail.setIsDeleted("0"); costProjectTaskMaterialSummaryDetailManager.save(detail); } } } } // ==================== 类型12:成本监审提取资料登记表 ==================== private void generateType12Details(CostProjectTaskMaterialSummary summary, CostProjectTask mainTask, List childTasks, List documents) { int orderNum = 1; // 获取"成本监审提取资料登记表" List matchedDocuments = documents.stream() .filter(doc -> "成本监审提取资料登记表".equals(doc.getDocumentName())) .sorted(Comparator.comparing(doc -> doc.getOrderNum() != null ? doc.getOrderNum() : 0)) .collect(Collectors.toList()); for (CostProjectDocument document : matchedDocuments) { CostProjectTaskMaterialSummaryDetail detail = new CostProjectTaskMaterialSummaryDetail(); detail.setMasterId(summary.getId()); detail.setTaskId(mainTask.getId()); detail.setDocumentName(document.getDocumentName()); detail.setDocumentNumber(document.getDocumentNumber() != null ? document.getDocumentNumber() : ""); detail.setAuditedUnitName(""); detail.setFileSource("系统生成电子文书"); detail.setPageCount(0); detail.setAttachmentUrl(document.getElectronicDocumentUrl() != null ? document.getElectronicDocumentUrl() : ""); detail.setOrderNum(orderNum++); detail.setIsDeleted("0"); costProjectTaskMaterialSummaryDetailManager.save(detail); } // 获取子任务的资料登记表 for (CostProjectTask childTask : childTasks) { List list = costProjectTaskEvidenceManager.list( new LambdaQueryWrapper().eq(CostProjectTaskEvidence::getTaskId, childTask.getId()) ); for (CostProjectTaskEvidence evidence : list) { // 只处理有附件的资料登记 if (StringUtil.isNotEmpty(evidence.getAttachmentUrl())) { CostProjectTaskMaterialSummaryDetail detail = new CostProjectTaskMaterialSummaryDetail(); detail.setMasterId(summary.getId()); detail.setTaskId(mainTask.getId()); detail.setDocumentName(evidence.getMaterialName() != null ? evidence.getMaterialName() : "提取资料登记"); detail.setDocumentNumber(""); detail.setAuditedUnitName(childTask.getAuditedUnitName() != null ? childTask.getAuditedUnitName() : ""); detail.setFileSource("系统生成电子文书"); detail.setPageCount(evidence.getPageCount() != null ? evidence.getPageCount() : 0); detail.setAttachmentUrl(evidence.getAttachmentUrl()); detail.setOrderNum(orderNum++); detail.setIsDeleted("0"); costProjectTaskMaterialSummaryDetailManager.save(detail); } } } } // ==================== 类型13:提取的成本资料和会计凭证等复印件 ==================== private void generateType13Details(CostProjectTaskMaterialSummary summary, CostProjectTask mainTask, List childTasks, List documents) { int orderNum = 1; // 获取"成本资料和会计凭证"(来源:被监审单位提交的资料) List matchedDocuments = documents.stream() .filter(doc -> "成本资料和会计凭证".equals(doc.getDocumentName())) .sorted(Comparator.comparing(doc -> doc.getOrderNum() != null ? doc.getOrderNum() : 0)) .collect(Collectors.toList()); for (CostProjectDocument document : matchedDocuments) { CostProjectTaskMaterialSummaryDetail detail = new CostProjectTaskMaterialSummaryDetail(); detail.setMasterId(summary.getId()); detail.setTaskId(mainTask.getId()); detail.setDocumentName(document.getDocumentName()); detail.setDocumentNumber(document.getDocumentNumber() != null ? document.getDocumentNumber() : ""); detail.setAuditedUnitName(""); detail.setFileSource("监审单位反馈文件"); detail.setPageCount(0); detail.setAttachmentUrl(document.getFeedbackDocumentUrl() != null ? document.getFeedbackDocumentUrl() : ""); detail.setOrderNum(orderNum++); detail.setIsDeleted("0"); costProjectTaskMaterialSummaryDetailManager.save(detail); } } /** * 档案校对通过后,异步生成Word卷宗 * * @param taskId 任务ID */ @Async public void generateWordArchiveAsync(String taskId) { try { // 1. 查询任务的所有资料归纳主表(按序号排序) // 2. 遍历每个主表,获取其明细列表(按序号排序) // 3. 按顺序读取每个明细对应的文件 // 4. 将所有文件合并为一个完整的Word文档 // 5. 保存生成的Word卷宗文件 System.out.println("开始生成Word卷宗,任务ID:" + taskId); // 示例代码框架(需要根据实际情况实现) List summaryList = costProjectTaskMaterialSummaryManager.listByTaskId(taskId); // 按序号排序 summaryList.sort(Comparator.comparing(CostProjectTaskMaterialSummary::getMaterialOrderNum)); // 创建Word文档 XWPFDocument document = new XWPFDocument(); for (CostProjectTaskMaterialSummary summary : summaryList) { // 获取明细列表 List detailList = summary.getDetailList(); if (detailList != null) { detailList.sort(Comparator.comparing(CostProjectTaskMaterialSummaryDetail::getOrderNum)); for (CostProjectTaskMaterialSummaryDetail detail : detailList) { // 读取文件内容并添加到Word文档 if (StringUtil.isNotEmpty(detail.getAttachmentUrl())) { try { // 读取Word文件 java.io.FileInputStream fis = new java.io.FileInputStream(detail.getAttachmentUrl()); XWPFDocument sourceDoc = new XWPFDocument(fis); // 合并段落 for (XWPFParagraph srcPara : sourceDoc.getParagraphs()) { XWPFParagraph destPara = document.createParagraph(); // 复制段落样式 destPara.setAlignment(srcPara.getAlignment()); destPara.setIndentationLeft(srcPara.getIndentationLeft()); destPara.setIndentationRight(srcPara.getIndentationRight()); destPara.setSpacingBefore(srcPara.getSpacingBefore()); destPara.setSpacingAfter(srcPara.getSpacingAfter()); for (XWPFRun srcRun : srcPara.getRuns()) { XWPFRun destRun = destPara.createRun(); destRun.setText(srcRun.getText(0)); destRun.setBold(srcRun.isBold()); destRun.setItalic(srcRun.isItalic()); destRun.setUnderline(srcRun.getUnderline()); destRun.setStrikeThrough(srcRun.isStrikeThrough()); destRun.setFontSize(srcRun.getFontSize()); if (srcRun.getFontFamily() != null) { destRun.setFontFamily(srcRun.getFontFamily()); } if (srcRun.getColor() != null) { destRun.setColor(srcRun.getColor()); } } } // 添加分页符(每个文档之间分页) XWPFParagraph pageBreakPara = document.createParagraph(); XWPFRun pageBreakRun = pageBreakPara.createRun(); pageBreakRun.addBreak(org.apache.poi.xwpf.usermodel.BreakType.PAGE); sourceDoc.close(); fis.close(); } catch (Exception e) { System.err.println("合并文件失败:" + detail.getDocumentName() + ",错误:" + e.getMessage()); e.printStackTrace(); } } } } } //保存Word文档 String outputPath = "卷宗_" + taskId + ".docx"; FileOutputStream out = new FileOutputStream(outputPath); document.write(out); out.close(); document.close(); System.out.println("Word卷宗生成完成,任务ID:" + taskId); // 更新任务的归档状态 CostProjectTask task = costProjectTaskManager.getById(taskId); if (task != null) { task.setIsGd("1"); costProjectTaskManager.updateById(task); System.out.println("任务归档状态已更新,任务ID:" + taskId); } } catch (Exception e) { e.printStackTrace(); System.err.println("生成Word卷宗失败,任务ID:" + taskId + ",错误:" + e.getMessage()); } } /** * 更新单个资料归纳主表的总页数 * * @param masterId 主表ID */ public void updateMasterTotalPageCount(String masterId) { try { CostProjectTaskMaterialSummary summary = costProjectTaskMaterialSummaryManager.getById(masterId); if (summary == null) { System.err.println("资料归纳主表不存在,ID:" + masterId); return; } int totalPageCount = 0; // 查询该主表的所有明细 List detailList = costProjectTaskMaterialSummaryDetailManager.list( new LambdaQueryWrapper() .eq(CostProjectTaskMaterialSummaryDetail::getMasterId, masterId) .eq(CostProjectTaskMaterialSummaryDetail::getIsDeleted, "0") ); // 累加所有明细的页数 for (CostProjectTaskMaterialSummaryDetail detail : detailList) { if (detail.getPageCount() != null) { totalPageCount += detail.getPageCount(); } } // 更新主表的总页数 summary.setTotalPageCount(String.valueOf(totalPageCount)); costProjectTaskMaterialSummaryManager.updateById(summary); System.out.println("资料归纳【" + summary.getMaterialName() + "】总页数已更新:" + totalPageCount); } catch (Exception e) { e.printStackTrace(); System.err.println("更新主表总页数失败,主表ID:" + masterId + ",错误:" + e.getMessage()); } } /** * 异步统计每个资料归纳主表的总页数(所有明细的页数之和) * * @param taskId 任务ID */ public void calculatePageCountAsync(String taskId) { try { System.out.println("开始异步统计页数,任务ID:" + taskId); // 查询任务的所有资料归纳主表 List summaryList = costProjectTaskMaterialSummaryManager.listByTaskId(taskId); for (CostProjectTaskMaterialSummary summary : summaryList) { int totalPageCount = 0; // 获取该主表的所有明细 if (summary.getDetailList() != null && !summary.getDetailList().isEmpty()) { for (CostProjectTaskMaterialSummaryDetail detail : summary.getDetailList()) { if (StringUtil.isNotEmpty(detail.getAttachmentUrl())) { // 统计该明细的页数 int pageCount = calculateFilePageCount(detail.getAttachmentUrl()); detail.setPageCount(pageCount); costProjectTaskMaterialSummaryDetailManager.updateById(detail); // 累加到总页数 totalPageCount += pageCount; } } } // 更新主表的总页数 summary.setTotalPageCount(String.valueOf(totalPageCount)); costProjectTaskMaterialSummaryManager.updateById(summary); System.out.println("资料归纳【" + summary.getMaterialName() + "】统计完成,总页数:" + totalPageCount); } System.out.println("页数统计完成,任务ID:" + taskId); } catch (Exception e) { e.printStackTrace(); System.err.println("统计页数失败,任务ID:" + taskId + ",错误:" + e.getMessage()); } } /** * 计算文件页数(公共方法,可被外部调用) * * @param fileUrl 文件URL或路径 * @return 页数 */ public int calculateFilePageCount(String fileUrl) { try { if (StringUtil.isEmpty(fileUrl)) { return 0; } // 判断文件类型 String lowerCaseUrl = fileUrl.toLowerCase(); if (lowerCaseUrl.endsWith(".xls") || lowerCaseUrl.endsWith(".xlsx")) { // Excel文件算1页 return 1; } else if (lowerCaseUrl.endsWith(".doc") || lowerCaseUrl.endsWith(".docx")) { // Word文件需要读取实际页数 return getWordPageCount(fileUrl); } else { // 其他格式默认1页 return 1; } } catch (Exception e) { System.err.println("计算文件页数失败,文件:" + fileUrl + ",错误:" + e.getMessage()); return 0; } } /** * 获取Word文档的页数 * * @param fileUrl 文件URL或路径(如:/profile/upload/20251116/xxx.docx) * @return 页数 */ private int getWordPageCount(String fileUrl) { java.io.FileInputStream fis = null; XWPFDocument document = null; try { String filePath = fileUrl; if (filePath.startsWith("/profile")) { filePath = com.hotent.config.EipConfig.getProfile() + filePath.substring(8); } fis = new java.io.FileInputStream(filePath); document = new XWPFDocument(fis); // 获取页数 int pageCount = document.getProperties().getExtendedProperties().getUnderlyingProperties().getPages(); return pageCount > 0 ? pageCount : 1; } catch (Exception e) { System.err.println("读取Word页数失败,文件:" + fileUrl + ",错误:" + e.getMessage()); // 读取失败默认返回1页 return 1; } finally { // 关闭资源 try { if (document != null) { document.close(); } if (fis != null) { fis.close(); } } catch (Exception e) { System.err.println("关闭文件流失败:" + e.getMessage()); } } } }