| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895 |
- 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<CostProjectTask> 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<CostProjectTask> childTasks,
- int materialType) {
- try {
- // 查询项目下的所有文书
- List<CostProjectDocument> 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<CostProjectDocument> documents) {
- int orderNum = 1;
- // 获取"成本监审报告"、"成本监审报告签发稿"、"送达回证"
- List<CostProjectDocument> 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<CostProjectTask> childTasks, List<CostProjectDocument> documents) {
- int orderNum = 1;
- // 获取"申请定(调)价报告"
- List<CostProjectDocument> 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<CostProjectTask> childTasks, List<CostProjectDocument> documents) {
- int orderNum = 1;
- // "成本监审通知书"和"送达回证"
- List<CostProjectDocument> 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<CostProjectTask> childTasks, List<CostProjectDocument> documents) {
- int orderNum = 1;
- // 获取"成本资料清单"
- List<CostProjectDocument> 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<CostProjectTask> childTasks, List<CostProjectDocument> documents) {
- int orderNum = 1;
- for (CostProjectTask childTask : childTasks) {
- List<CostSurveyTemplateUpload> 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<CostProjectTask> childTasks, List<CostProjectDocument> documents) {
- int orderNum = 1;
- List<CostProjectDocument> 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<CostProjectTaskMaterial> 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<CostProjectTask> childTasks, List<CostProjectDocument> documents) {
- int orderNum = 1;
- // 获取"成本审核初步意见告知书"和"送达回证"
- List<CostProjectDocument> 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<CostProjectTask> childTasks, List<CostProjectDocument> documents) {
- int orderNum = 1;
- // 获取"书面反馈材料"(来源:监审单位反馈文件)
- List<CostProjectDocument> 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<CostProjectTaskPreliminaryOpinion> 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<CostProjectTask> childTasks, List<CostProjectDocument> documents) {
- int orderNum = 1;
- // 获取"成本审核初步意见表"
- List<CostProjectDocument> 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<CostProjectDocument> documents) {
- int orderNum = 1;
- // 获取"成本监审集体审议记录"
- List<CostProjectDocument> 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<CostProjectDeliberate> list = costProjectDeliberateManager.list(
- new LambdaQueryWrapper<CostProjectDeliberate>().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<CostProjectTask> childTasks, List<CostProjectDocument> documents) {
- int orderNum = 1;
- // 获取"成本监审工作底稿"
- List<CostProjectDocument> 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<CostProjectTaskAdjustmentRecord> 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<CostProjectTask> childTasks, List<CostProjectDocument> documents) {
- int orderNum = 1;
- // 获取"成本监审提取资料登记表"
- List<CostProjectDocument> 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<CostProjectTaskEvidence> list = costProjectTaskEvidenceManager.list(
- new LambdaQueryWrapper<CostProjectTaskEvidence>().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<CostProjectTask> childTasks, List<CostProjectDocument> documents) {
- int orderNum = 1;
- // 获取"成本资料和会计凭证"(来源:被监审单位提交的资料)
- List<CostProjectDocument> 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<CostProjectTaskMaterialSummary> summaryList =
- costProjectTaskMaterialSummaryManager.listByTaskId(taskId);
- // 按序号排序
- summaryList.sort(Comparator.comparing(CostProjectTaskMaterialSummary::getMaterialOrderNum));
- // 创建Word文档
- XWPFDocument document = new XWPFDocument();
- for (CostProjectTaskMaterialSummary summary : summaryList) {
- // 获取明细列表
- List<CostProjectTaskMaterialSummaryDetail> 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<CostProjectTaskMaterialSummaryDetail> detailList = costProjectTaskMaterialSummaryDetailManager.list(
- new LambdaQueryWrapper<CostProjectTaskMaterialSummaryDetail>()
- .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<CostProjectTaskMaterialSummary> 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());
- }
- }
- }
- }
|