zzw пре 1 недеља
родитељ
комит
4bb96e6bf2

+ 4 - 50
assistMg/src/main/java/com/hotent/project/controller/CostProjectSuperviseController.java

@@ -13,6 +13,7 @@ import com.hotent.project.manager.CostProjectTaskManager;
 import com.hotent.project.manager.CostProjectTaskNodeManager;
 import com.hotent.project.manager.CostProjectTaskProccessManager;
 import com.hotent.project.model.*;
+import com.hotent.project.component.TaskWarningStatusComponent;
 import com.hotent.project.req.CostProjectSuperviseReq;
 import com.hotent.project.vo.CostProjectSuperviseDataVo;
 import com.hotent.util.JsonUtil;
@@ -50,6 +51,8 @@ public class CostProjectSuperviseController {
     private CostProjectTaskProccessManager costProjectTaskProccessManager;
     @Autowired
     private CostProjectTaskNodeManager costProjectTaskNodeManager;
+    @Autowired
+    private TaskWarningStatusComponent taskWarningStatusComponent;
 
 
 
@@ -94,7 +97,7 @@ public class CostProjectSuperviseController {
             TaskTreeVo taskTreeVo = allList.get(i);
             taskTreeVo.setId(task.getId());
             taskTreeVo.setParentId(task.getPid());
-            taskTreeVo.setWarningStatus(calculateWarningStatus(task));
+            taskTreeVo.setWarningStatus(taskWarningStatusComponent.calculateWarningStatus(task));
             CostProjectSupervise projectSupervise = supervises.stream().filter(s -> s.getProjectId().equals(taskTreeVo.getProjectId())&& StringUtil.isNotEmpty(taskTreeVo.getAuditType()) && taskTreeVo.getAuditType().equals("1")).findAny().orElse(null);
             if (projectSupervise!=null) {
                 taskTreeVo.setSuperviseStatus(String.valueOf(projectSupervise.getStatus()));
@@ -107,53 +110,4 @@ public class CostProjectSuperviseController {
         return result;
 
     }
-
-
-    /**
-     * 计算任务预警状态
-     * @param task 任务对象
-     * @return 预警状态:green-绿色预警(在办理期限内) yellow-黄色预警(超过环节期限但没超过流程期限) red-红色预警(超过流程期限)
-     */
-    private String calculateWarningStatus(CostProjectTask task) {
-        // 获取任务对应的流程信息
-        CostProjectTaskProccess process = costProjectTaskProccessManager.getOne(
-                new LambdaQueryWrapper<CostProjectTaskProccess>()
-                        .eq(CostProjectTaskProccess::getTaskId, task.getId())
-        );
-
-        if (process == null) {
-            return "green"; // 默认绿色预警
-        }
-
-        // 获取当前环节的节点信息
-        CostProjectTaskNode currentNode = costProjectTaskNodeManager.getOne(
-                new LambdaQueryWrapper<CostProjectTaskNode>()
-                        .eq(CostProjectTaskNode::getTaskId, task.getId())
-                        .eq(CostProjectTaskNode::getProcessNodeKey, task.getCurrentNode())
-        );
-
-        // 获取当前时间
-        LocalDateTime now = LocalDateTime.now();
-
-        // 1. 如果超过流程期限,红色预警
-        if (process.getPlannedAuditEndDate() != null &&
-                now.toLocalDate().isAfter(process.getPlannedAuditEndDate())) {
-            return "red";
-        }
-
-        // 2. 如果当前环节有截止时间且已超过,但未超过流程期限,黄色预警
-        if (currentNode != null && currentNode.getEndTime() != null &&
-                now.isAfter(currentNode.getEndTime())) {
-            // 检查是否超过流程期限
-            if (process.getPlannedAuditEndDate() != null &&
-                    now.toLocalDate().isAfter(process.getPlannedAuditEndDate())) {
-                return "red"; // 超过流程期限,红色预警
-            } else {
-                return "yellow"; // 超过环节期限但未超过流程期限,黄色预警
-            }
-        }
-
-        // 3. 默认绿色预警(在办理期限内)
-        return "green";
-    }
 }

+ 42 - 64
assistMg/src/main/java/com/hotent/project/controller/CostProjectTaskController.java

@@ -15,12 +15,10 @@ import com.hotent.common.CrudService;
 import com.hotent.constant.NodeConstant;
 import com.hotent.constant.TaskStatusConstant;
 import com.hotent.enterpriseDeclare.req.CostTaskReviewPageReq;
-import com.hotent.project.manager.CostProjectSuperviseManager;
-import com.hotent.project.manager.CostProjectTaskNodeManager;
-import com.hotent.project.manager.CostProjectTaskProccessManager;
-import com.hotent.project.model.CostProjectSupervise;
-import com.hotent.project.model.CostProjectTaskNode;
-import com.hotent.project.model.CostProjectTaskProccess;
+import com.hotent.project.manager.*;
+import com.hotent.project.model.*;
+import com.hotent.uc.manager.UserManager;
+import com.hotent.uc.model.User;
 import com.hotent.util.JsonUtil;
 import com.hotent.util.treeutil.SumTree;
 import com.hotent.util.treeutil.newtreeutil.TreeDotUtils;
@@ -37,12 +35,10 @@ import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import org.springframework.web.bind.annotation.RestController;
 import com.hotent.base.controller.BaseController;
-import com.hotent.project.model.CostProjectTask;
-import com.hotent.project.manager.CostProjectTaskManager;
+import com.hotent.project.component.TaskWarningStatusComponent;
 
 import java.time.LocalDateTime;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -61,10 +57,13 @@ public class CostProjectTaskController extends BaseController<CostProjectTaskMan
     @Autowired
     private CostProjectSuperviseManager costProjectSuperviseManager;
     @Autowired
-    private CostProjectTaskNodeManager costProjectTaskNodeManager;
-
+    UserManager userService;
+    @Autowired
+    private CostProjectApprovalManager costProjectApprovalManager;
     @Autowired
-    private CostProjectTaskProccessManager costProjectTaskProccessManager;
+    private TaskWarningStatusComponent taskWarningStatusComponent;
+
+
     /**
      * 根据id获取项目任务表数据详情
      *
@@ -103,9 +102,38 @@ public class CostProjectTaskController extends BaseController<CostProjectTaskMan
     public  CommonResult<IPage<CostProjectTask>> getCatalogList(@RequestBody CostTaskReviewPageReq req) throws Exception {
         req.setNStatus(TaskStatusConstant.COMPLETED.getStatusCode());
         IPage<CostProjectTask> pageResult = baseService.pageListForReviewTask(req);
+        for (CostProjectTask task : pageResult.getRecords()) {
+            task.setWarningStatus(taskWarningStatusComponent.calculateWarningStatus(task));
+        }
         return CommonResult.<IPage<CostProjectTask>>ok().value(pageResult);
     }
 
+    @GetMapping("/taskUser")
+    @ApiOperation(value = "任务进度管理列表", notes = "任务进度管理列表")
+    public CommonResult<List<User>> getCatalogList(@RequestParam String projectId,
+                                                   @RequestParam String type) throws Exception {
+        CostProjectApproval approval = costProjectApprovalManager.getById(projectId);
+        String projectMembers = approval.getProjectMembers();
+
+        // 项目成员 ID 集合
+        Set<String> userIdSet = new HashSet<>(Arrays.asList(projectMembers.split(",")));
+
+        // 查询全部用户
+        List<User> list = userService.getUserList();
+
+        // type:0 在项目中,1 不在项目中
+        if ("0".equals(type)) {
+            list = list.stream()
+                    .filter(user -> userIdSet.contains(user.getId()))
+                    .collect(Collectors.toList());
+        } else if ("1".equals(type)) {
+            list = list.stream()
+                    .filter(user -> !userIdSet.contains(user.getId()))
+                    .collect(Collectors.toList());
+        }
+
+        return CommonResult.<List<User>>ok().value(list);
+    }
 
     /**
      * 任务查询统计
@@ -160,7 +188,7 @@ public class CostProjectTaskController extends BaseController<CostProjectTaskMan
             TaskTreeVo taskTreeVo = allList.get(i);
             taskTreeVo.setId(task.getId());
             taskTreeVo.setParentId(task.getPid());
-            taskTreeVo.setWarningStatus(calculateWarningStatus(task));
+            taskTreeVo.setWarningStatus(taskWarningStatusComponent.calculateWarningStatus(task));
             CostProjectSupervise projectSupervise = supervises.stream().filter(s -> s.getProjectId().equals(taskTreeVo.getProjectId())&& StringUtil.isNotEmpty(taskTreeVo.getAuditType()) && taskTreeVo.getAuditType().equals("1")).findAny().orElse(null);
             if (projectSupervise!=null) {
                 taskTreeVo.setSuperviseStatus(String.valueOf(projectSupervise.getStatus()));
@@ -172,54 +200,4 @@ public class CostProjectTaskController extends BaseController<CostProjectTaskMan
         result.setValue(trees);
         return result;
     }
-
-
-
-    /**
-     * 计算任务预警状态
-     * @param task 任务对象
-     * @return 预警状态:green-绿色预警(在办理期限内) yellow-黄色预警(超过环节期限但没超过流程期限) red-红色预警(超过流程期限)
-     */
-    private String calculateWarningStatus(CostProjectTask task) {
-        // 获取任务对应的流程信息
-        CostProjectTaskProccess process = costProjectTaskProccessManager.getOne(
-                new LambdaQueryWrapper<CostProjectTaskProccess>()
-                        .eq(CostProjectTaskProccess::getTaskId, task.getId())
-        );
-
-        if (process == null) {
-            return "green"; // 默认绿色预警
-        }
-
-        // 获取当前环节的节点信息
-        CostProjectTaskNode currentNode = costProjectTaskNodeManager.getOne(
-                new LambdaQueryWrapper<CostProjectTaskNode>()
-                        .eq(CostProjectTaskNode::getTaskId, task.getId())
-                        .eq(CostProjectTaskNode::getProcessNodeKey, task.getCurrentNode())
-        );
-
-        // 获取当前时间
-        LocalDateTime now = LocalDateTime.now();
-
-        // 1. 如果超过流程期限,红色预警
-        if (process.getPlannedAuditEndDate() != null &&
-                now.toLocalDate().isAfter(process.getPlannedAuditEndDate())) {
-            return "red";
-        }
-
-        // 2. 如果当前环节有截止时间且已超过,但未超过流程期限,黄色预警
-        if (currentNode != null && currentNode.getEndTime() != null &&
-                now.isAfter(currentNode.getEndTime())) {
-            // 检查是否超过流程期限
-            if (process.getPlannedAuditEndDate() != null &&
-                    now.toLocalDate().isAfter(process.getPlannedAuditEndDate())) {
-                return "red"; // 超过流程期限,红色预警
-            } else {
-                return "yellow"; // 超过环节期限但未超过流程期限,黄色预警
-            }
-        }
-
-        // 3. 默认绿色预警(在办理期限内)
-        return "green";
-    }
 }

+ 20 - 78
assistMg/src/main/java/com/hotent/project/manager/impl/CostProjectTaskManagerImpl.java

@@ -26,6 +26,7 @@ import com.hotent.enterpriseDeclare.req.CostTaskReviewPageReq;
 import com.hotent.project.dao.CostProjectTaskDao;
 import com.hotent.project.manager.*;
 import com.hotent.project.model.*;
+import com.hotent.project.component.TaskWarningStatusComponent;
 import com.hotent.project.resp.CostProjectApprovalDetailResp;
 import com.hotent.surveyinfo.manager.CostSurveyTemplateUploadManager;
 import com.hotent.surveyinfo.model.CostSurveyTemplateUpload;
@@ -100,9 +101,6 @@ public class CostProjectTaskManagerImpl extends BaseManagerImpl<CostProjectTaskD
     private CostSurveyTemplateUploadManager costSurveyTemplateUploadManager;
 
     @Autowired
-    private CostProjectTaskNodeManager costProjectTaskNodeManager;
-
-    @Autowired
     private OrgManager orgManager;
 
     @Autowired
@@ -112,10 +110,7 @@ public class CostProjectTaskManagerImpl extends BaseManagerImpl<CostProjectTaskD
     private AuditedUnitManager auditedUnitManager;
 
     @Autowired
-    private CostProjectTaskMaterialSummaryManager costProjectTaskMaterialSummaryManager;
-
-    @Autowired
-    private com.hotent.project.service.AsyncMaterialSummaryService asyncMaterialSummaryService;
+    private TaskWarningStatusComponent taskWarningStatusComponent;
 
 
     @Override
@@ -160,54 +155,6 @@ public class CostProjectTaskManagerImpl extends BaseManagerImpl<CostProjectTaskD
         return costProjectTaskManager.list(queryWrapper);
     }
 
-    /**
-     * 计算任务预警状态
-     *
-     * @param task 任务对象
-     * @return 预警状态:green-绿色预警(在办理期限内) yellow-黄色预警(超过环节期限但没超过流程期限) red-红色预警(超过流程期限)
-     */
-    private String calculateWarningStatus(CostProjectTask task) {
-        // 获取任务对应的流程信息
-        CostProjectTaskProccess process = costProjectTaskProccessManager.getOne(
-                new LambdaQueryWrapper<CostProjectTaskProccess>()
-                        .eq(CostProjectTaskProccess::getTaskId, task.getId())
-        );
-
-        if (process == null) {
-            return "green"; // 默认绿色预警
-        }
-
-        // 获取当前环节的节点信息
-        CostProjectTaskNode currentNode = costProjectTaskNodeManager.getOne(
-                new LambdaQueryWrapper<CostProjectTaskNode>()
-                        .eq(CostProjectTaskNode::getTaskId, task.getId())
-                        .eq(CostProjectTaskNode::getProcessNodeKey, task.getCurrentNode())
-        );
-
-        // 获取当前时间
-        LocalDateTime now = LocalDateTime.now();
-
-        // 1. 如果超过流程期限,红色预警
-        if (process.getPlannedAuditEndDate() != null &&
-                now.toLocalDate().isAfter(process.getPlannedAuditEndDate())) {
-            return "red";
-        }
-
-        // 2. 如果当前环节有截止时间且已超过,但未超过流程期限,黄色预警
-        if (currentNode != null && currentNode.getEndTime() != null &&
-                now.isAfter(currentNode.getEndTime())) {
-            // 检查是否超过流程期限
-            if (process.getPlannedAuditEndDate() != null &&
-                    now.toLocalDate().isAfter(process.getPlannedAuditEndDate())) {
-                return "red"; // 超过流程期限,红色预警
-            } else {
-                return "yellow"; // 超过环节期限但未超过流程期限,黄色预警
-            }
-        }
-
-        // 3. 默认绿色预警(在办理期限内)
-        return "green";
-    }
 
     @Override
     public IPage<CostProjectTask> pageListForReviewTask(CostTaskReviewPageReq req) throws Exception {
@@ -399,7 +346,7 @@ public class CostProjectTaskManagerImpl extends BaseManagerImpl<CostProjectTaskD
             // 根任务状态
             rootTask.setStatusName(TaskStatusConstant.getStatusNameByCode(rootTask.getStatus()));
             rootTask.setCurrentNodeName(NodeConstant.getNodeValueByKey(rootTask.getCurrentNode()));
-            rootTask.setWarningStatus(calculateWarningStatus(rootTask));
+            rootTask.setWarningStatus(taskWarningStatusComponent.calculateWarningStatus(rootTask));
             // 设置目录
             CostProjectApproval rootDetail = approvalMap.get(rootTask.getProjectId());
             if (rootDetail != null) {
@@ -1276,7 +1223,7 @@ public class CostProjectTaskManagerImpl extends BaseManagerImpl<CostProjectTaskD
             // 任务状态
             rootTask.setStatusName(TaskStatusConstant.getStatusNameByCode(rootTask.getStatus()));
             rootTask.setCurrentNodeName(NodeConstant.getNodeValueByKey(rootTask.getCurrentNode()));
-            rootTask.setWarningStatus(calculateWarningStatus(rootTask));
+            rootTask.setWarningStatus(taskWarningStatusComponent.calculateWarningStatus(rootTask));
             // 找根任务
             String pid = rootTask.getPid();
             if (StringUtils.isNotBlank(pid)) {
@@ -1358,34 +1305,29 @@ public class CostProjectTaskManagerImpl extends BaseManagerImpl<CostProjectTaskD
     }
 
     /**
-     * 催任务,仅记录消息
+     * 催任务,仅记录消息
      *
      * @param task 任务对象
      * @param req  请求参数
-     * @return 催结果消息
+     * @return 催结果消息
      */
     private String remindUnitTask(CostProjectTask task, CostTaskPageReq req) {
-        // 检查是否提供了用户ID
-        if (StringUtil.isEmpty(req.getAuditedUnitIds())) {
-            throw new RuntimeException("未指定催报企业");
-        }
-        String title = NodeConstant.getNodeValueByKey(task.getCurrentNode()) + "催办";
-        // 分割用户ID并逐个发送通知
-        for (String unitId : req.getAuditedUnitIds().split(",")) {
 
-            // 发送催办通知
-            String content = "[" + NodeConstant.getNodeValueByKey(task.getCurrentNode()) + "]" + AuthenticationUtil.getCurrentUserFullname() + "催报" + task.getAuditedUnitName() + "的项目(" + task.getProjectName() + ")";
-            if (StringUtil.isNotEmpty(req.getContent())) {
-                content += ",原因:" + req.getContent();
-            }
-            String enterpriseId = task.getAuditedUnitId() == null ? "" : task.getAuditedUnitId();
-            String orgId = getCurrentUserMainOrgId();
-            Org org = orgManager.getById(orgId);
-            String noticeSource = (org.getName()) + " " + AuthenticationUtil.getCurrentUserFullname();
-            String sendTarget = task.getCreateBy() == null ? "" : task.getCreateBy();
-            // 使用传入的用户ID作为发送目标
-            costNoticeManager.sendNotice(task.getProjectId(), task.getId(), "1", title, content, enterpriseId, noticeSource, sendTarget);
+        String title = NodeConstant.getNodeValueByKey(task.getCurrentNode()) + "催报";
+        // 分割用户ID并逐个发送通知
+        // 发送催报通知
+        String content = "[" + NodeConstant.getNodeValueByKey(task.getCurrentNode()) + "]" + AuthenticationUtil.getCurrentUserFullname() + "催报" + task.getAuditedUnitName() + "的项目(" + task.getProjectName() + ")";
+        if (StringUtil.isNotEmpty(req.getContent())) {
+            content += ",原因:" + req.getContent();
         }
+        String enterpriseId = task.getAuditedUnitId() == null ? "" : task.getAuditedUnitId();
+        String orgId = getCurrentUserMainOrgId();
+        Org org = orgManager.getById(orgId);
+        String noticeSource = (org.getName()) + " " + AuthenticationUtil.getCurrentUserFullname();
+        String sendTarget = task.getCreateBy() == null ? "" : task.getCreateBy();
+        // 使用传入的用户ID作为发送目标
+        costNoticeManager.sendNotice(task.getProjectId(), task.getId(), "1", title, content, enterpriseId, noticeSource, sendTarget);
+
         return title;
     }
 

+ 84 - 55
assistMg/src/main/java/com/hotent/project/service/AsyncMaterialSummaryService.java

@@ -2,6 +2,7 @@ package com.hotent.project.service;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.hotent.base.util.StringUtil;
+import com.hotent.baseInfo.manager.AuditedUnitManager;
 import com.hotent.config.EipConfig;
 import com.hotent.project.manager.*;
 import com.hotent.project.model.*;
@@ -74,6 +75,8 @@ public class AsyncMaterialSummaryService {
     @Autowired
     private CostProjectApprovalManager costProjectApprovalManager;
 
+    @Autowired
+    private AuditedUnitManager auditedUnitManager;
 
     @Autowired
     private OrgManager orgManager;
@@ -95,7 +98,7 @@ public class AsyncMaterialSummaryService {
     /**
      * 生成资料归纳主表(14个基础资料类别)- 核心逻辑
      *
-     * @param mainTask 主任务
+     * @param mainTask   主任务
      * @param childTasks 子任务列表
      */
     public void generateMaterialSummary(CostProjectTask mainTask, List<CostProjectTask> childTasks) {
@@ -139,9 +142,9 @@ public class AsyncMaterialSummaryService {
     /**
      * 根据资料类别生成对应的明细记录
      *
-     * @param summary 资料归纳主表
-     * @param mainTask 主任务
-     * @param childTasks 子任务列表
+     * @param summary      资料归纳主表
+     * @param mainTask     主任务
+     * @param childTasks   子任务列表
      * @param materialType 资料类别序号(1-13)
      */
     private void generateDetailsByMaterialType(CostProjectTaskMaterialSummary summary,
@@ -242,7 +245,7 @@ public class AsyncMaterialSummaryService {
         // 获取"成本监审报告"、"成本监审报告签发稿"、"送达回证"
         List<CostProjectDocument> matchedDocuments = documents.stream()
                 .filter(doc -> "3".equals(doc.getDocumentType())
-                        || "3-12".equals(doc.getDocumentType()+"-"+doc.getDocumentTypeName())
+                        || "3-12".equals(doc.getDocumentType() + "-" + doc.getDocumentTypeName())
                 )
                 .sorted(Comparator.comparing(doc -> doc.getOrderNum() != null ? doc.getOrderNum() : 0))
                 .collect(Collectors.toList());
@@ -253,8 +256,10 @@ public class AsyncMaterialSummaryService {
             detail.setTaskId(mainTask.getId());
             detail.setDocumentName(document.getDocumentName());
             detail.setDocumentNumber(document.getDocumentNumber() != null ? document.getDocumentNumber() : "");
-            detail.setAuditedUnitId(mainTask.getAuditedUnitId());
-            detail.setAuditedUnitName(mainTask.getAuditedUnitName() != null ? mainTask.getAuditedUnitName() : "");
+            detail.setAuditedUnitId(document.getEnterpriseId());
+            if (document.getEnterpriseId() != null) {
+                detail.setAuditedUnitName(auditedUnitManager.getById(document.getEnterpriseId()).getUnitName());
+            }
             detail.setFileSource("系统生成电子文书");
             detail.setPageCount(0);
             detail.setAttachmentUrl(document.getActUrl() != null ? document.getActUrl() : "");
@@ -281,9 +286,11 @@ public class AsyncMaterialSummaryService {
             detail.setTaskId(mainTask.getId());
             detail.setDocumentName(document.getDocumentName());
             detail.setDocumentNumber(document.getDocumentNumber() != null ? document.getDocumentNumber() : "");
-            detail.setAuditedUnitId(mainTask.getAuditedUnitId());
-            detail.setAuditedUnitName(mainTask.getAuditedUnitName() != null ? mainTask.getAuditedUnitName() : "");
-            detail.setFileSource("监审主体上传文件");
+            detail.setAuditedUnitId(document.getEnterpriseId());
+            if (document.getEnterpriseId() != null) {
+                detail.setAuditedUnitName(auditedUnitManager.getById(document.getEnterpriseId()).getUnitName());
+            }
+            detail.setFileSource("系统生成电子文书");
             detail.setPageCount(0);
             detail.setAttachmentUrl(document.getScanDocumentUrl() != null ? document.getScanDocumentUrl() : "");
             detail.setOrderNum(orderNum++);
@@ -316,7 +323,7 @@ public class AsyncMaterialSummaryService {
         // "成本监审通知书"和"送达回证"
         List<CostProjectDocument> matchedDocuments = documents.stream()
                 .filter(doc -> "4".equals(doc.getDocumentType())
-                        || "4-12".equals(doc.getDocumentType()+"-"+doc.getDocumentTypeName()))
+                        || "4-12".equals(doc.getDocumentType() + "-" + doc.getDocumentTypeName()))
                 .sorted(Comparator.comparing(doc -> doc.getOrderNum() != null ? doc.getOrderNum() : 0))
                 .collect(Collectors.toList());
 
@@ -326,8 +333,10 @@ public class AsyncMaterialSummaryService {
             detail.setTaskId(mainTask.getId());
             detail.setDocumentName(document.getDocumentName());
             detail.setDocumentNumber(document.getDocumentNumber() != null ? document.getDocumentNumber() : "");
-            detail.setAuditedUnitId(mainTask.getAuditedUnitId());
-            detail.setAuditedUnitName(mainTask.getAuditedUnitName() != null ? mainTask.getAuditedUnitName() : "");
+            detail.setAuditedUnitId(document.getEnterpriseId());
+            if (document.getEnterpriseId() != null) {
+                detail.setAuditedUnitName(auditedUnitManager.getById(document.getEnterpriseId()).getUnitName());
+            }
             detail.setFileSource("系统生成电子文书");
             detail.setPageCount(0);
             detail.setAttachmentUrl(document.getActUrl() != null ? document.getActUrl() : "");
@@ -354,8 +363,10 @@ public class AsyncMaterialSummaryService {
             detail.setTaskId(mainTask.getId());
             detail.setDocumentName(document.getDocumentName());
             detail.setDocumentNumber(document.getDocumentNumber() != null ? document.getDocumentNumber() : "");
-            detail.setAuditedUnitId(mainTask.getAuditedUnitId());
-            detail.setAuditedUnitName(mainTask.getAuditedUnitName() != null ? mainTask.getAuditedUnitName() : "");
+            detail.setAuditedUnitId(document.getEnterpriseId());
+            if (document.getEnterpriseId() != null) {
+                detail.setAuditedUnitName(auditedUnitManager.getById(document.getEnterpriseId()).getUnitName());
+            }
             detail.setFileSource("系统生成电子文书");
             detail.setPageCount(0);
             detail.setAttachmentUrl(document.getActUrl() != null ? document.getActUrl() : "");
@@ -377,7 +388,7 @@ public class AsyncMaterialSummaryService {
                     detail.setDocumentNumber("");
                     detail.setAuditedUnitId(childTask.getAuditedUnitId());
                     detail.setAuditedUnitName(childTask.getAuditedUnitName() != null ? childTask.getAuditedUnitName() : "");
-                    detail.setFileSource("系统生成电子文书");
+                    detail.setFileSource("监审单位反馈文件");
                     detail.setPageCount(evidence.getPageCount() != null ? evidence.getPageCount() : 0);
                     detail.setAttachmentUrl(evidence.getAttachmentUrl());
                     detail.setOrderNum(orderNum++);
@@ -424,7 +435,7 @@ public class AsyncMaterialSummaryService {
         int orderNum = 1;
         List<CostProjectDocument> matchedDocuments = documents.stream()
                 .filter(doc -> "10".equals(doc.getDocumentType())
-                        || "10-12".equals(doc.getDocumentType()+"-"+doc.getDocumentTypeName()))
+                        || "10-12".equals(doc.getDocumentType() + "-" + doc.getDocumentTypeName()))
                 .sorted(Comparator.comparing(doc -> doc.getOrderNum() != null ? doc.getOrderNum() : 0))
                 .collect(Collectors.toList());
 
@@ -434,8 +445,10 @@ public class AsyncMaterialSummaryService {
             detail.setTaskId(mainTask.getId());
             detail.setDocumentName(document.getDocumentName());
             detail.setDocumentNumber(document.getDocumentNumber() != null ? document.getDocumentNumber() : "");
-            detail.setAuditedUnitId(mainTask.getAuditedUnitId());
-            detail.setAuditedUnitName(mainTask.getAuditedUnitName() != null ? mainTask.getAuditedUnitName() : "");
+            detail.setAuditedUnitId(document.getEnterpriseId());
+            if (document.getEnterpriseId() != null) {
+                detail.setAuditedUnitName(auditedUnitManager.getById(document.getEnterpriseId()).getUnitName());
+            }
             detail.setFileSource("系统生成电子文书");
             detail.setPageCount(0);
             detail.setAttachmentUrl(document.getActUrl() != null ? document.getActUrl() : "");
@@ -453,7 +466,7 @@ public class AsyncMaterialSummaryService {
         // 获取"成本审核初步意见告知书"和"送达回证"
         List<CostProjectDocument> matchedDocuments = documents.stream()
                 .filter(doc -> "5".equals(doc.getDocumentType())
-                        || "5-12".equals(doc.getDocumentType()+"-"+doc.getDocumentTypeName()))
+                        || "5-12".equals(doc.getDocumentType() + "-" + doc.getDocumentTypeName()))
                 .sorted(Comparator.comparing(doc -> doc.getOrderNum() != null ? doc.getOrderNum() : 0))
                 .collect(Collectors.toList());
 
@@ -463,8 +476,10 @@ public class AsyncMaterialSummaryService {
             detail.setTaskId(mainTask.getId());
             detail.setDocumentName(document.getDocumentName());
             detail.setDocumentNumber(document.getDocumentNumber() != null ? document.getDocumentNumber() : "");
-            detail.setAuditedUnitId(mainTask.getAuditedUnitId());
-            detail.setAuditedUnitName(mainTask.getAuditedUnitName() != null ? mainTask.getAuditedUnitName() : "");
+            detail.setAuditedUnitId(document.getEnterpriseId());
+            if (document.getEnterpriseId() != null) {
+                detail.setAuditedUnitName(auditedUnitManager.getById(document.getEnterpriseId()).getUnitName());
+            }
             detail.setFileSource("系统生成电子文书");
             detail.setPageCount(0);
             detail.setAttachmentUrl(document.getActUrl() != null ? document.getActUrl() : "");
@@ -491,9 +506,11 @@ public class AsyncMaterialSummaryService {
             detail.setTaskId(mainTask.getId());
             detail.setDocumentName(document.getDocumentName());
             detail.setDocumentNumber(document.getDocumentNumber() != null ? document.getDocumentNumber() : "");
-            detail.setAuditedUnitId(mainTask.getAuditedUnitId());
-            detail.setAuditedUnitName(mainTask.getAuditedUnitName() != null ? mainTask.getAuditedUnitName() : "");
-            detail.setFileSource("监审单位反馈文件");
+            detail.setAuditedUnitId(document.getEnterpriseId());
+            if (document.getEnterpriseId() != null) {
+                detail.setAuditedUnitName(auditedUnitManager.getById(document.getEnterpriseId()).getUnitName());
+            }
+            detail.setFileSource("系统生成电子文书");
             detail.setPageCount(0);
             detail.setAttachmentUrl(document.getActUrl() != null ? document.getActUrl() : "");
             detail.setOrderNum(orderNum++);
@@ -543,8 +560,10 @@ public class AsyncMaterialSummaryService {
             detail.setTaskId(mainTask.getId());
             detail.setDocumentName(document.getDocumentName());
             detail.setDocumentNumber(document.getDocumentNumber() != null ? document.getDocumentNumber() : "");
-            detail.setAuditedUnitId(mainTask.getAuditedUnitId());
-            detail.setAuditedUnitName(mainTask.getAuditedUnitName() != null ? mainTask.getAuditedUnitName() : "");
+            detail.setAuditedUnitId(document.getEnterpriseId());
+            if (document.getEnterpriseId() != null) {
+                detail.setAuditedUnitName(auditedUnitManager.getById(document.getEnterpriseId()).getUnitName());
+            }
             detail.setFileSource("系统生成电子文书");
             detail.setPageCount(0);
             detail.setAttachmentUrl(document.getActUrl() != null ? document.getActUrl() : "");
@@ -570,8 +589,10 @@ public class AsyncMaterialSummaryService {
             detail.setTaskId(mainTask.getId());
             detail.setDocumentName(document.getDocumentName());
             detail.setDocumentNumber(document.getDocumentNumber() != null ? document.getDocumentNumber() : "");
-            detail.setAuditedUnitId(mainTask.getAuditedUnitId());
-            detail.setAuditedUnitName(mainTask.getAuditedUnitName() != null ? mainTask.getAuditedUnitName() : "");
+            detail.setAuditedUnitId(document.getEnterpriseId());
+            if (document.getEnterpriseId() != null) {
+                detail.setAuditedUnitName(auditedUnitManager.getById(document.getEnterpriseId()).getUnitName());
+            }
             detail.setFileSource("系统生成电子文书");
             detail.setPageCount(0);
             detail.setAttachmentUrl(document.getActUrl() != null ? document.getActUrl() : "");
@@ -593,7 +614,7 @@ public class AsyncMaterialSummaryService {
                 detail.setDocumentNumber("");
                 detail.setAuditedUnitId(mainTask.getAuditedUnitId());
                 detail.setAuditedUnitName(mainTask.getAuditedUnitName() != null ? mainTask.getAuditedUnitName() : "");
-                detail.setFileSource("系统生成电子文书");
+                detail.setFileSource("监审主体上传文件");
                 detail.setPageCount(0);
                 detail.setAttachmentUrl(deliberate.getAttachmentUrl());
                 detail.setOrderNum(orderNum++);
@@ -619,8 +640,10 @@ public class AsyncMaterialSummaryService {
             detail.setTaskId(mainTask.getId());
             detail.setDocumentName(document.getDocumentName());
             detail.setDocumentNumber(document.getDocumentNumber() != null ? document.getDocumentNumber() : "");
-            detail.setAuditedUnitId(mainTask.getAuditedUnitId());
-            detail.setAuditedUnitName(mainTask.getAuditedUnitName() != null ? mainTask.getAuditedUnitName() : "");
+            detail.setAuditedUnitId(document.getEnterpriseId());
+            if (document.getEnterpriseId() != null) {
+                detail.setAuditedUnitName(auditedUnitManager.getById(document.getEnterpriseId()).getUnitName());
+            }
             detail.setFileSource("系统生成电子文书");
             detail.setPageCount(0);
             detail.setAttachmentUrl(document.getActUrl() != null ? document.getActUrl() : "");
@@ -641,7 +664,7 @@ public class AsyncMaterialSummaryService {
                     detail.setDocumentNumber("");
                     detail.setAuditedUnitId(childTask.getAuditedUnitId());
                     detail.setAuditedUnitName(childTask.getAuditedUnitName() != null ? childTask.getAuditedUnitName() : "");
-                    detail.setFileSource("系统生成电子文书");
+                    detail.setFileSource("监审单位反馈文件");
                     detail.setPageCount(0);
                     detail.setAttachmentUrl(record.getAttachmentUrl());
                     detail.setOrderNum(orderNum++);
@@ -668,8 +691,10 @@ public class AsyncMaterialSummaryService {
             detail.setTaskId(mainTask.getId());
             detail.setDocumentName(document.getDocumentName());
             detail.setDocumentNumber(document.getDocumentNumber() != null ? document.getDocumentNumber() : "");
-            detail.setAuditedUnitId(mainTask.getAuditedUnitId());
-            detail.setAuditedUnitName(mainTask.getAuditedUnitName() != null ? mainTask.getAuditedUnitName() : "");
+            detail.setAuditedUnitId(document.getEnterpriseId());
+            if (document.getEnterpriseId() != null) {
+                detail.setAuditedUnitName(auditedUnitManager.getById(document.getEnterpriseId()).getUnitName());
+            }
             detail.setFileSource("系统生成电子文书");
             detail.setPageCount(0);
             detail.setAttachmentUrl(document.getActUrl() != null ? document.getActUrl() : "");
@@ -692,7 +717,7 @@ public class AsyncMaterialSummaryService {
                     detail.setDocumentNumber("");
                     detail.setAuditedUnitId(childTask.getAuditedUnitId());
                     detail.setAuditedUnitName(childTask.getAuditedUnitName() != null ? childTask.getAuditedUnitName() : "");
-                    detail.setFileSource("系统生成电子文书");
+                    detail.setFileSource("监审单位反馈文件");
                     detail.setPageCount(evidence.getPageCount() != null ? evidence.getPageCount() : 0);
                     detail.setAttachmentUrl(evidence.getAttachmentUrl());
                     detail.setOrderNum(orderNum++);
@@ -719,8 +744,10 @@ public class AsyncMaterialSummaryService {
             detail.setTaskId(mainTask.getId());
             detail.setDocumentName(document.getDocumentName());
             detail.setDocumentNumber(document.getDocumentNumber() != null ? document.getDocumentNumber() : "");
-            detail.setAuditedUnitId(mainTask.getAuditedUnitId());
-            detail.setAuditedUnitName(mainTask.getAuditedUnitName() != null ? mainTask.getAuditedUnitName() : "");
+            detail.setAuditedUnitId(document.getEnterpriseId());
+            if (document.getEnterpriseId() != null) {
+                detail.setAuditedUnitName(auditedUnitManager.getById(document.getEnterpriseId()).getUnitName());
+            }
             detail.setFileSource("监审单位反馈文件");
             detail.setPageCount(0);
             detail.setAttachmentUrl(document.getActUrl() != null ? document.getActUrl() : "");
@@ -763,7 +790,7 @@ public class AsyncMaterialSummaryService {
         // 获取"中止定价成本监审通知书"(来源:被监审单位提交的资料)
         List<CostProjectDocument> matchedDocuments = documents.stream()
                 .filter(doc -> "11".equals(doc.getDocumentType())
-                        || "11-12".equals(doc.getDocumentType()+"-"+doc.getDocumentTypeName()))
+                        || "11-12".equals(doc.getDocumentType() + "-" + doc.getDocumentTypeName()))
                 .sorted(Comparator.comparing(doc -> doc.getOrderNum() != null ? doc.getOrderNum() : 0))
                 .collect(Collectors.toList());
 
@@ -773,9 +800,11 @@ public class AsyncMaterialSummaryService {
             detail.setTaskId(mainTask.getId());
             detail.setDocumentName(document.getDocumentName());
             detail.setDocumentNumber(document.getDocumentNumber() != null ? document.getDocumentNumber() : "");
-            detail.setAuditedUnitId(mainTask.getAuditedUnitId());
-            detail.setAuditedUnitName(mainTask.getAuditedUnitName() != null ? mainTask.getAuditedUnitName() : "");
-            detail.setFileSource("监审单位反馈文件");
+            detail.setAuditedUnitId(document.getEnterpriseId());
+            if (document.getEnterpriseId() != null) {
+                detail.setAuditedUnitName(auditedUnitManager.getById(document.getEnterpriseId()).getUnitName());
+            }
+            detail.setFileSource("系统生成电子文书");
             detail.setPageCount(0);
             detail.setAttachmentUrl(document.getActUrl() != null ? document.getActUrl() : "");
             detail.setOrderNum(orderNum++);
@@ -798,7 +827,7 @@ public class AsyncMaterialSummaryService {
 
             // 查询任务的所有资料归纳主表(包含封面、目录、封底)
             List<CostProjectTaskMaterialSummary> allSummaryList =
-                costProjectTaskMaterialSummaryManager.listAllByTaskId(taskId);
+                    costProjectTaskMaterialSummaryManager.listAllByTaskId(taskId);
 
             // 创建Word文档
             XWPFDocument document = new XWPFDocument();
@@ -832,7 +861,7 @@ public class AsyncMaterialSummaryService {
             // 生成输出文件路径
             String fileName = FileUploadUtil.generateFileName("卷宗_" + taskId + ".docx");
             String outputPath = FileUploadUtil.generateSavePath(
-                EipConfig.getUploadPath(), fileName, "docx");
+                    EipConfig.getUploadPath(), fileName, "docx");
 
             // 确保目录存在
             java.io.File outputFile = new java.io.File(outputPath);
@@ -872,8 +901,8 @@ public class AsyncMaterialSummaryService {
     /**
      * 合并单个文档文件到主文档(保持原始样式)
      *
-     * @param document 主文档
-     * @param fileUrl 文件URL(如:/profile/upload/20251116/xxx.docx)
+     * @param document        主文档
+     * @param fileUrl         文件URL(如:/profile/upload/20251116/xxx.docx)
      * @param isFirstDocument 是否是第一个文档
      * @return 是否是第一个文档(用于下次调用)
      */
@@ -1176,9 +1205,9 @@ public class AsyncMaterialSummaryService {
                 }
             }
             CostProjectTaskMaterialSummaryDetail existingDetail = costProjectTaskMaterialSummaryDetailManager.getOne(
-                new LambdaQueryWrapper<CostProjectTaskMaterialSummaryDetail>()
-                    .eq(CostProjectTaskMaterialSummaryDetail::getMasterId, masterId)
-                    .eq(CostProjectTaskMaterialSummaryDetail::getIsDeleted, "0")
+                    new LambdaQueryWrapper<CostProjectTaskMaterialSummaryDetail>()
+                            .eq(CostProjectTaskMaterialSummaryDetail::getMasterId, masterId)
+                            .eq(CostProjectTaskMaterialSummaryDetail::getIsDeleted, "0")
             );
             if (existingDetail != null) {
                 // 更新已有明细
@@ -1237,11 +1266,11 @@ public class AsyncMaterialSummaryService {
      *
      * @param templatePath 模板路径
      * @param documentName 文书名称
-     * @param req 请求参数
+     * @param req          请求参数
      * @return 生成的文书URL
      */
     private String generateDocumentFromTemplate(String templatePath, String documentName,
-                                                 com.hotent.project.req.ArchiveProofreadReq req) throws Exception {
+                                                com.hotent.project.req.ArchiveProofreadReq req) throws Exception {
         java.io.FileInputStream fis = null;
         XWPFDocument document = null;
         java.io.FileOutputStream fos = null;
@@ -1313,8 +1342,8 @@ public class AsyncMaterialSummaryService {
 
         // 从数据库获取立项审批信息(包含监审组人员)
         CostProjectApproval approval = costProjectApprovalManager.getOne(
-            new LambdaQueryWrapper<CostProjectApproval>()
-                .eq(CostProjectApproval::getProjectId, task.getProjectId())
+                new LambdaQueryWrapper<CostProjectApproval>()
+                        .eq(CostProjectApproval::getProjectId, task.getProjectId())
         );
 
         // ========== 自动获取的字段 ==========
@@ -1507,7 +1536,7 @@ public class AsyncMaterialSummaryService {
      * 填充表格行数据
      */
     private void fillTableRow(XWPFTableRow row, int sequence,
-                               CompleteTemplateProcessor.TableRowData data) {
+                              CompleteTemplateProcessor.TableRowData data) {
         List<XWPFTableCell> cells = row.getTableCells();
         if (cells.size() >= 4) {
             setCellText(cells.get(0), String.valueOf(sequence));
@@ -1532,4 +1561,4 @@ public class AsyncMaterialSummaryService {
         paragraph.setAlignment(ParagraphAlignment.CENTER);
     }
 
- }
+}

+ 7 - 0
assistMg/src/main/java/com/hotent/surveyinfo/controller/CostVerifyTemplateHeadersController.java

@@ -22,6 +22,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import java.time.LocalDateTime;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.UUID;
 
@@ -194,6 +195,8 @@ public class CostVerifyTemplateHeadersController extends BaseController<CostVeri
             }
 
 
+            // 批量处理指标项数据
+            List<CostVerifyTemplateItems> itemsToSave = new ArrayList<>();
             for (CostVerifyTemplateItems item : itemsList) {
                 // 检查是否已设置 headersId
                 if (StringUtil.isEmpty(item.getHeadersId())) {
@@ -206,7 +209,11 @@ public class CostVerifyTemplateHeadersController extends BaseController<CostVeri
                 item.setUpdateTime(LocalDateTime.now());
                 costSurveyTemplateItemsManager.create(item);
 
+                itemsToSave.add(item);
             }
+
+            // 批量保存
+            costSurveyTemplateItemsManager.saveBatch(itemsToSave);
         }
 
         return CommonResult.<String>ok().message("批量操作成功");