Bladeren bron

fit:归档调整

zzw 3 weken geleden
bovenliggende
commit
8fbe9958ef

+ 26 - 1
assistMg/src/main/java/com/hotent/enterpriseDeclare/controller/material/CostProjectTaskMaterialSummaryController.java

@@ -1,5 +1,6 @@
 package com.hotent.enterpriseDeclare.controller.material;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.hotent.base.annotation.ApiGroup;
 import com.hotent.base.constants.ApiGroupConsts;
 import com.hotent.base.controller.BaseController;
@@ -7,6 +8,7 @@ import com.hotent.base.model.CommonResult;
 import com.hotent.base.util.StringUtil;
 import com.hotent.project.manager.CostProjectTaskMaterialSummaryDetailManager;
 import com.hotent.project.manager.CostProjectTaskMaterialSummaryManager;
+import com.hotent.project.model.CostProjectTask;
 import com.hotent.project.model.CostProjectTaskMaterialSummary;
 import com.hotent.project.req.MaterialSummarySortReq;
 import io.swagger.annotations.Api;
@@ -32,6 +34,9 @@ import java.util.List;
 public class CostProjectTaskMaterialSummaryController extends BaseController<CostProjectTaskMaterialSummaryManager, CostProjectTaskMaterialSummary> {
 
 
+    @Autowired
+    private com.hotent.project.manager.CostProjectTaskManager costProjectTaskManager;
+
     /**
      * 根据taskId获取资料归纳列表
      * @param taskId 任务ID
@@ -39,10 +44,30 @@ public class CostProjectTaskMaterialSummaryController extends BaseController<Cos
      */
     @GetMapping(value = "/listByTaskId")
     @ApiOperation(value = "根据taskId获取资料归纳列表", httpMethod = "GET", notes = "根据taskId获取资料归纳列表(包含明细)")
+    @Transactional
     public CommonResult<List<CostProjectTaskMaterialSummary>> listByTaskId(
             @ApiParam(name = "taskId", value = "任务ID", required = true)
             @RequestParam(required = true) String taskId) {
-        return CommonResult.<List<CostProjectTaskMaterialSummary>>ok().value(baseService.listByTaskId(taskId));
+
+        List<CostProjectTaskMaterialSummary> summaryList = baseService.listByTaskId(taskId);
+        // 如果为空,自动生成13个基础资料类别
+        if (summaryList == null || summaryList.isEmpty()) {
+            // 获取任务信息
+            com.hotent.project.model.CostProjectTask mainTask = costProjectTaskManager.getById(taskId);
+            if (mainTask != null) {
+                // 查询子任务列表
+                List<CostProjectTask> childTasks = costProjectTaskManager.list(
+                        new LambdaQueryWrapper<CostProjectTask>().eq(CostProjectTask::getPid, taskId)
+                );
+                // 同步生成资料归纳
+                asyncMaterialSummaryService.generateMaterialSummarySync(mainTask, childTasks);
+                asyncMaterialSummaryService.calculatePageCountAsync(mainTask.getId());
+                // 重新查询
+                summaryList = baseService.listByTaskId(taskId);
+            }
+        }
+
+        return CommonResult.<List<CostProjectTaskMaterialSummary>>ok().value(summaryList);
     }
 
     /**

+ 0 - 1
assistMg/src/main/java/com/hotent/project/manager/impl/CostProjectDocumentManagerImpl.java

@@ -516,7 +516,6 @@ public class CostProjectDocumentManagerImpl extends BaseManagerImpl<CostProjectD
     public List<CostProjectDocument> getListByProjectId(String projectId) {
         LambdaQueryWrapper<CostProjectDocument> qw = new LambdaQueryWrapper<>();
         qw.eq(CostProjectDocument::getProjectId, projectId);
-        qw.eq(CostProjectDocument::getIsDeleted, BaseConstant.NORMAL_STATUS);
         List<CostProjectDocument> list = this.list(qw);
         if (ObjectUtil.isEmpty(list)) {
             return new ArrayList<>();

+ 1 - 3
assistMg/src/main/java/com/hotent/project/manager/impl/CostProjectTaskManagerImpl.java

@@ -452,7 +452,7 @@ public class CostProjectTaskManagerImpl extends BaseManagerImpl<CostProjectTaskD
                 resultMessage = remindUnitTask(task, req);
                 break;
             case "9":
-                // 归档
+                // 归档(没有这个东西)
                 resultMessage = archiveTask(task, req);
                 break;
 
@@ -1397,8 +1397,6 @@ public class CostProjectTaskManagerImpl extends BaseManagerImpl<CostProjectTaskD
         nTask.setIsGd("1");
         costProjectTaskManager.updateById(nTask);
 
-        // 异步生成资料归纳主表
-        asyncMaterialSummaryService.generateMaterialSummaryAsync(nTask, children);
 
         // 发送通知
         String title = "任务已归档";

+ 5 - 0
assistMg/src/main/java/com/hotent/project/model/CostProjectTaskMaterialSummary.java

@@ -46,6 +46,11 @@ public class CostProjectTaskMaterialSummary extends BaseModel<CostProjectTaskMat
     @JsonProperty("materialOrderNum")
     private Integer materialOrderNum;
 
+    @ApiModelProperty(value = "总页数")
+    @TableField("total_page_count")
+    @JsonProperty("totalPageCount")
+    private String totalPageCount;
+
     @ApiModelProperty(value = "逻辑删除:0正常 1删除")
     @TableField("is_deleted")
     @JsonProperty("isDeleted")

+ 682 - 152
assistMg/src/main/java/com/hotent/project/service/AsyncMaterialSummaryService.java

@@ -1,11 +1,12 @@
 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.CostProjectTaskMaterialSummaryDetailManager;
-import com.hotent.project.manager.CostProjectTaskMaterialSummaryManager;
-import com.hotent.project.model.CostProjectTask;
-import com.hotent.project.model.CostProjectTaskMaterialSummaryDetail;
-import com.hotent.project.model.CostProjectTaskMaterialSummary;
+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;
@@ -16,6 +17,7 @@ import org.springframework.stereotype.Service;
 import java.io.FileOutputStream;
 import java.util.Comparator;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * 异步资料归纳服务
@@ -33,14 +35,52 @@ public class AsyncMaterialSummaryService {
     @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 子任务列表
      */
-    @Async
-    public void generateMaterialSummaryAsync(CostProjectTask mainTask, List<CostProjectTask> childTasks) {
+    public void generateMaterialSummarySync(CostProjectTask mainTask, List<CostProjectTask> childTasks) {
+        generateMaterialSummary(mainTask, childTasks);
+    }
+
+
+    /**
+     * 生成资料归纳主表(13个基础资料类别)- 核心逻辑
+     *
+     * @param mainTask 主任务
+     * @param childTasks 子任务列表
+     */
+    private void generateMaterialSummary(CostProjectTask mainTask, List<CostProjectTask> childTasks) {
         try {
             // 定义13个基础资料类别
             String[] materialNames = {
@@ -89,127 +129,511 @@ public class AsyncMaterialSummaryService {
                                                CostProjectTask mainTask,
                                                List<CostProjectTask> childTasks,
                                                int materialType) {
-        switch (materialType) {
-            case 1:
-                // 成本监审报告(含成本监审报告签发稿、送达回证)
-                generateDetail(summary, mainTask, "成本监审报告", 1);
-                generateDetail(summary, mainTask, "成本监审报告签发稿", 2);
-                generateDetail(summary, mainTask, "送达回证", 3);
-                break;
-            case 2:
-                // 被监审单位申请定(调)价报告(复印件)
-                for (int i = 0; i < childTasks.size(); i++) {
-                    CostProjectTask child = childTasks.get(i);
-                    generateDetail(summary, mainTask, child.getAuditedUnitName() + "申请定(调)价报告(复印件)", i + 1);
-                }
-                break;
-            case 3:
-                // 成本监审通知书(含送达回证)
-                for (int i = 0; i < childTasks.size(); i++) {
-                    CostProjectTask child = childTasks.get(i);
-                    generateDetail(summary, mainTask, child.getAuditedUnitName() + "成本监审通知书", i * 2 + 1);
-                    generateDetail(summary, mainTask, child.getAuditedUnitName() + "送达回证", i * 2 + 2);
-                }
-                break;
-            case 4:
-                // 经营者需提供成本资料清单
-                for (int i = 0; i < childTasks.size(); i++) {
-                    CostProjectTask child = childTasks.get(i);
-                    generateDetail(summary, mainTask, child.getAuditedUnitName() + "成本资料清单", i + 1);
-                }
-                break;
-            case 5:
-                // 《政府定价成本监审调查表》
-                for (int i = 0; i < childTasks.size(); i++) {
-                    CostProjectTask child = childTasks.get(i);
-                    generateDetail(summary, mainTask, child.getAuditedUnitName() + "《政府定价成本监审调查表》", i + 1);
-                }
-                break;
-            case 6:
-                // 成本监审补充资料通知书(含送达回证)
-                for (int i = 0; i < childTasks.size(); i++) {
-                    CostProjectTask child = childTasks.get(i);
-                    generateDetail(summary, mainTask, child.getAuditedUnitName() + "成本监审补充资料通知书", i * 2 + 1);
-                    generateDetail(summary, mainTask, child.getAuditedUnitName() + "送达回证", i * 2 + 2);
-                }
-                break;
-            case 7:
-                // 成本审核初步意见告知书(含送达回证)
-                for (int i = 0; i < childTasks.size(); i++) {
-                    CostProjectTask child = childTasks.get(i);
-                    generateDetail(summary, mainTask, child.getAuditedUnitName() + "成本审核初步意见告知书", i * 2 + 1);
-                    generateDetail(summary, mainTask, child.getAuditedUnitName() + "送达回证", i * 2 + 2);
-                }
-                break;
-            case 8:
-                // 经营者书面反馈的材料
-                for (int i = 0; i < childTasks.size(); i++) {
-                    CostProjectTask child = childTasks.get(i);
-                    generateDetail(summary, mainTask, child.getAuditedUnitName() + "书面反馈材料", i + 1);
-                }
-                break;
-            case 9:
-                // 成本审核初步意见表(集体审议用)
-                for (int i = 0; i < childTasks.size(); i++) {
-                    CostProjectTask child = childTasks.get(i);
-                    generateDetail(summary, mainTask, child.getAuditedUnitName() + "成本审核初步意见表", i + 1);
+        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);
                 }
-                break;
-            case 10:
-                // 成本监审集体审议记录
-                generateDetail(summary, mainTask, "成本监审集体审议记录", 1);
-                break;
-            case 11:
-                // 成本监审工作底稿
-                for (int i = 0; i < childTasks.size(); i++) {
-                    CostProjectTask child = childTasks.get(i);
-                    generateDetail(summary, mainTask, child.getAuditedUnitName() + "成本监审工作底稿", i + 1);
+            }
+        }
+    }
+
+    // ==================== 类型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);
                 }
-                break;
-            case 12:
-                // 成本监审提取资料登记表
-                for (int i = 0; i < childTasks.size(); i++) {
-                    CostProjectTask child = childTasks.get(i);
-                    generateDetail(summary, mainTask, child.getAuditedUnitName() + "提取资料登记表", i + 1);
+            }
+        }
+    }
+
+    // ==================== 类型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);
                 }
-                break;
-            case 13:
-                // 提取的成本资料和会计凭证等复印件
-                for (int i = 0; i < childTasks.size(); i++) {
-                    CostProjectTask child = childTasks.get(i);
-                    generateDetail(summary, mainTask, child.getAuditedUnitName() + "成本资料和会计凭证复印件", i + 1);
+            }
+        }
+    }
+
+    // ==================== 类型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);
                 }
-                break;
-            default:
-                generateDetail(summary, mainTask, "待补充", 1);
-                break;
+            }
         }
     }
 
-    /**
-     * 生成单个明细记录
-     *
-     * @param summary 资料归纳主表
-     * @param mainTask 主任务
-     * @param documentName 文书名称
-     * @param orderNum 序号
-     */
-    private void generateDetail(CostProjectTaskMaterialSummary summary,
-                                CostProjectTask mainTask,
-                                String documentName,
-                                int orderNum) {
-        CostProjectTaskMaterialSummaryDetail detail = new CostProjectTaskMaterialSummaryDetail();
-        detail.setMasterId(summary.getId());
-        detail.setTaskId(mainTask.getId());
-        detail.setDocumentName(documentName);
-        detail.setDocumentNumber("");
-        detail.setAuditedUnitName("");
-        detail.setFileSource("系统生成");
-        detail.setPageCount(0);
-        detail.setAttachmentUrl(""); // 初始为空,等待用户上传
-        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);
+        }
     }
 
     /**
@@ -255,8 +679,28 @@ public class AsyncMaterialSummaryService {
 
                                  // 合并段落
                                  for (XWPFParagraph srcPara : sourceDoc.getParagraphs()) {
-                                     XWPFParagraph newPara = document.createParagraph();
-                                     copyParagraph(srcPara, newPara);
+                                     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());
+                                         }
+                                     }
                                  }
 
                                  // 添加分页符(每个文档之间分页)
@@ -284,6 +728,14 @@ public class AsyncMaterialSummaryService {
 
             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());
@@ -291,44 +743,122 @@ public class AsyncMaterialSummaryService {
     }
 
     /**
-     * 复制段落内容
+     * 异步统计每个资料归纳主表的总页数(所有明细的页数之和)
      *
-     * @param srcPara 源段落
-     * @param destPara 目标段落
+     * @param taskId 任务ID
      */
-    private void copyParagraph(XWPFParagraph srcPara, XWPFParagraph destPara) {
-        // 复制段落样式
-        destPara.setAlignment(srcPara.getAlignment());
-        destPara.setIndentationLeft(srcPara.getIndentationLeft());
-        destPara.setIndentationRight(srcPara.getIndentationRight());
-        destPara.setSpacingBefore(srcPara.getSpacingBefore());
-        destPara.setSpacingAfter(srcPara.getSpacingAfter());
-
-        // 复制段落中的所有Run
-        for (XWPFRun srcRun : srcPara.getRuns()) {
-            XWPFRun destRun = destPara.createRun();
-            copyRun(srcRun, destRun);
+    @Async
+    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());
         }
     }
 
     /**
-     * 复制Run内容
+     * 计算文件页数
      *
-     * @param srcRun 源Run
-     * @param destRun 目标Run
+     * @param fileUrl 文件URL或路径
+     * @return 页数
      */
-    private void copyRun(XWPFRun srcRun, XWPFRun destRun) {
-        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());
+    private 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;
         }
-        if (srcRun.getColor() != null) {
-            destRun.setColor(srcRun.getColor());
+    }
+
+    /**
+     * 获取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());
+            }
         }
     }