Przeglądaj źródła

fit:提取资料登记

zzw 1 miesiąc temu
rodzic
commit
c9a79e2037
19 zmienionych plików z 735 dodań i 424 usunięć
  1. 28 1
      assistMg/src/main/java/com/hotent/constant/NodeConstant.java
  2. 3 224
      assistMg/src/main/java/com/hotent/enterpriseDeclare/controller/CostAuditReviewController.java
  3. 1 112
      assistMg/src/main/java/com/hotent/enterpriseDeclare/controller/CostAuditTaskController.java
  4. 115 0
      assistMg/src/main/java/com/hotent/enterpriseDeclare/controller/material/CostProjectTaskEvidenceController.java
  5. 3 1
      assistMg/src/main/java/com/hotent/enterpriseDeclare/controller/material/CostProjectTaskMaterialDataController.java
  6. 22 0
      assistMg/src/main/java/com/hotent/enterpriseDeclare/req/CostTaskEvidencePageReq.java
  7. 5 3
      assistMg/src/main/java/com/hotent/project/controller/CostNoticeController.java
  8. 4 4
      assistMg/src/main/java/com/hotent/project/controller/CostProjectTaskController.java
  9. 17 0
      assistMg/src/main/java/com/hotent/project/dao/CostProjectTaskEvidenceDao.java
  10. 3 0
      assistMg/src/main/java/com/hotent/project/manager/CostProjectApprovalManager.java
  11. 27 0
      assistMg/src/main/java/com/hotent/project/manager/CostProjectTaskEvidenceManager.java
  12. 9 12
      assistMg/src/main/java/com/hotent/project/manager/CostProjectTaskManager.java
  13. 8 0
      assistMg/src/main/java/com/hotent/project/manager/impl/CostNoticeManagerImpl.java
  14. 103 4
      assistMg/src/main/java/com/hotent/project/manager/impl/CostProjectApprovalManagerImpl.java
  15. 32 0
      assistMg/src/main/java/com/hotent/project/manager/impl/CostProjectTaskEvidenceManagerImpl.java
  16. 264 12
      assistMg/src/main/java/com/hotent/project/manager/impl/CostProjectTaskManagerImpl.java
  17. 88 0
      assistMg/src/main/java/com/hotent/project/model/CostProjectTaskEvidence.java
  18. 3 1
      assistMg/src/main/java/com/hotent/project/req/CostProjectNoticePageReq.java
  19. 0 50
      assistMg/src/main/resources/mapper/CostNoticeMapper.xml

+ 28 - 1
assistMg/src/main/java/com/hotent/constant/NodeConstant.java

@@ -32,7 +32,34 @@ public enum NodeConstant {
 
     //根据key获取value
     public static String getNodeValueByKey(String nodeKey) {
-        return NodeConstant.valueOf(nodeKey).getNodeValue();
+        for (NodeConstant n : NodeConstant.values()) {
+            if (n.getNodeKey().equals(nodeKey)) {
+                return n.getNodeValue();
+            }
+        }
+        return null;
+    }
+
+    // 获取下一个节点(线性顺序,流程最后一个节点返回null)
+    public static NodeConstant getNextNode(String nodeKey) {
+        NodeConstant[] nodes = NodeConstant.values();
+        for (int i = 0; i < nodes.length - 1; i++) {
+            if (nodes[i].getNodeKey().equals(nodeKey)) {
+                return nodes[i + 1];
+            }
+        }
+        return null;
+    }
+
+    // 获取上一个节点(线性顺序,流程首节点返回null)
+    public static NodeConstant getPrevNode(String nodeKey) {
+        NodeConstant[] nodes = NodeConstant.values();
+        for (int i = 1; i < nodes.length; i++) {
+            if (nodes[i].getNodeKey().equals(nodeKey)) {
+                return nodes[i - 1];
+            }
+        }
+        return null;
     }
 
 

+ 3 - 224
assistMg/src/main/java/com/hotent/enterpriseDeclare/controller/CostAuditReviewController.java

@@ -42,19 +42,13 @@ public class CostAuditReviewController {
     private CostProjectTaskManager costProjectTaskManager;
 
     @Autowired
-    private CostProjectApprovalManager costProjectApprovalManager;
-
-    @Autowired
     private CostProjectTaskNodeManager costProjectTaskNodeManager;
 
     @Autowired
-    private CostProjectTaskProccessManager costProjectTaskProccessManager;
 
     @Resource
     DataDictManager dataDictManager;
 
-    @Autowired
-    private CostNoticeManager costNoticeManager;
 
     /**
      * 分页查询待审核任务列表
@@ -65,93 +59,10 @@ public class CostAuditReviewController {
     @PostMapping(value = "/pageList")
     @ApiOperation(value = "分页查询待审核任务列表", httpMethod = "POST", notes = "分页查询待审核任务列表")
     public CommonResult<IPage<CostProjectTask>> pageList(@RequestBody CostTaskReviewPageReq req) {
-        IPage<CostProjectTask> pageResult = pageListForReviewTask(req);
+        IPage<CostProjectTask> pageResult = costProjectTaskManager.pageListForReviewTask(req);
         return CommonResult.<IPage<CostProjectTask>>ok().value(pageResult);
     }
 
-    /**
-     * 审核任务分页查询的具体实现
-     *
-     * @param req 分页查询请求参数
-     * @return 分页结果
-     */
-    private IPage<CostProjectTask> pageListForReviewTask(CostTaskReviewPageReq req) {
-        // 获取当前用户
-        IUser currentUser = ContextUtil.getCurrentUser();
-        String currentUserId = currentUser.getUserId();
-
-        // 1. 先查询当前用户有权限的立项(负责人或项目组成员)
-        LambdaQueryWrapper<CostProjectApproval> approvalQueryWrapper = new LambdaQueryWrapper<>();
-        approvalQueryWrapper.eq(CostProjectApproval::getIsDeleted, "0");
-        approvalQueryWrapper.and(wrapper -> wrapper
-                .eq(CostProjectApproval::getLeaderId, currentUserId)
-                .or(projectMembersWrapper -> {
-                    projectMembersWrapper.like(CostProjectApproval::getProjectMembers, currentUserId);
-                })
-        );
-
-        List<CostProjectApproval> accessibleApprovals = costProjectApprovalManager.list(approvalQueryWrapper);
-
-        // 如果没有权限的立项,返回空结果
-        if (accessibleApprovals.isEmpty()) {
-            Page<CostProjectTask> emptyPage = new Page<>(req.getPageNum(), req.getPageSize());
-            return emptyPage;
-        }
-
-        // 提取有权限的立项ID列表
-        List<String> accessibleProjectIds = accessibleApprovals.stream()
-                .map(CostProjectApproval::getProjectId)
-                .distinct()
-                .collect(java.util.stream.Collectors.toList());
-
-        // 2. 构建任务查询条件
-        LambdaQueryWrapper<CostProjectTask> queryWrapper = new LambdaQueryWrapper<>();
-
-        // 查询未删除的记录
-        queryWrapper.eq(CostProjectTask::getIsDeleted, "0");
-
-        // 查询根任务(pid为0)
-        queryWrapper.eq(CostProjectTask::getPid, "0");
-
-        // 只查询当前用户有权限的立项对应的任务
-        queryWrapper.in(CostProjectTask::getProjectId, accessibleProjectIds);
-
-        // 根据请求参数添加查询条件
-        if (StringUtil.isNotEmpty(req.getProjectName())) {
-            queryWrapper.like(CostProjectTask::getProjectName, req.getProjectName());
-        }
-        if (StringUtil.isNotEmpty(req.getStatus())) {
-            queryWrapper.eq(CostProjectTask::getStatus, req.getStatus());
-        }
-        if (StringUtil.isNotEmpty(req.getCurrentNode())) {
-            queryWrapper.eq(CostProjectTask::getCurrentNode, req.getCurrentNode());
-        }
-
-        // 按创建时间倒序排列
-        queryWrapper.orderByDesc(CostProjectTask::getCreateTime);
-
-        // 创建分页对象并执行查询
-        Page<CostProjectTask> page = new Page<>(req.getPageNum(), req.getPageSize());
-        IPage<CostProjectTask> result = costProjectTaskManager.page(page, queryWrapper);
-
-        // 填充根任务的子任务列表和流程信息
-        for (CostProjectTask rootTask : result.getRecords()) {
-            // 查询子任务列表
-            LambdaQueryWrapper<CostProjectTask> childQueryWrapper = new LambdaQueryWrapper<>();
-            childQueryWrapper.eq(CostProjectTask::getPid, rootTask.getId())
-                    .eq(CostProjectTask::getIsDeleted, "0")
-                    .orderByAsc(CostProjectTask::getOrderNum);
-
-            List<CostProjectTask> childTasks = costProjectTaskManager.list(childQueryWrapper);
-            for (CostProjectTask childTask : childTasks) {
-                childTask.setStatus(TaskStatusConstant.getStatusNameByCode(childTask.getStatus()));
-            }
-            rootTask.setChildTasks(childTasks);
-            rootTask.setCurrentNodeName(NodeConstant.getNodeValueByKey(rootTask.getCurrentNode()));
-        }
-
-        return result;
-    }
 
 
     @PostMapping(value = "/getProcessBtn")
@@ -194,148 +105,16 @@ public class CostAuditReviewController {
 
 
     @PostMapping(value = "/doProcessBtn")
-    @ApiOperation(value = "流程按钮操作", httpMethod = "POST", notes = "流程按钮操作")
+    @ApiOperation(value = "操作流程按钮", httpMethod = "POST", notes = "流程按钮操作")
     @org.springframework.transaction.annotation.Transactional
     public CommonResult<String> doProcessBtn(@RequestBody CostTaskPageReq req) {
         if (StringUtil.isEmpty(req.getTaskId()) || StringUtil.isEmpty(req.getKey())) {
             return CommonResult.<String>error().message("任务ID和操作key不能为空");
         }
-
-        // 获取任务信息
-        CostProjectTask task = costProjectTaskManager.getById(req.getTaskId());
-
-        String resultMessage = "";
-
-        switch (req.getKey()) {
-            case "2":
-                // 中止
-                resultMessage = suspendTask(task,req);
-                break;
-            case "3":
-                // 通过
-                resultMessage = supplementTask(task);
-                break;
-            case "4":
-                // 退回
-                resultMessage = returnToSubmit(task,req);
-                break;
-            default:
-                return CommonResult.<String>error().message("未知的操作类型");
-        }
-        return CommonResult.<String>ok().value(resultMessage);
+        return CommonResult.<String>ok().value(costProjectTaskManager.doProcessBtn(req));
     }
 
 
-    /**
-     * 初审通过,只修改状态,节点变化需要等待所有子任务完成。
-     */
-    private String supplementTask(CostProjectTask task) {
-        // 将当前任务置为办结
-        task.setStatus(TaskStatusConstant.COMPLETED.getStatusCode());
-        costProjectTaskManager.updateById(task);
-
-        // 材料初审通过通知
-        String title = "材料初审通过";
-        String auditedUnit = task.getAuditedUnitName() == null ? "" : task.getAuditedUnitName();
-        String projectName = task.getProjectName() == null ? "" : task.getProjectName();
-        String year = task.getYear() == null ? "" : task.getYear();
-        String content = String.format("%s%s%s材料初审通过。", year, projectName, auditedUnit);
-        String enterpriseId = task.getAuditedUnitId() == null ? "" : task.getAuditedUnitId();
-        String noticeSource = "系统";
-        String sendTarget = task.getCreateBy() == null ? "" : task.getCreateBy();
-        costNoticeManager.sendNotice(task.getProjectId(), "1", title, content, enterpriseId, noticeSource, sendTarget);
-
-
-        // 检查同一父任务下是否所有子任务均已办结;若是,父任务节点流转
-        List<CostProjectTask> siblingTasks = costProjectTaskManager.list(
-                new LambdaQueryWrapper<CostProjectTask>()
-                        .eq(CostProjectTask::getPid, task.getPid())
-                        .eq(CostProjectTask::getIsDeleted, "0")
-        );
-
-        boolean allSiblingsCompleted = true;
-        for (CostProjectTask s : siblingTasks) {
-            if (!TaskStatusConstant.COMPLETED.getStatusCode().equals(s.getStatus())) {
-                allSiblingsCompleted = false;
-                break;
-            }
-        }
-
-        if (allSiblingsCompleted) {
-            CostProjectTask parentTask = costProjectTaskManager.getById(task.getPid());
-            if (parentTask != null) {
-                CostProjectTaskProccess parentProccess = costProjectTaskProccessManager.getOne(
-                        new LambdaQueryWrapper<CostProjectTaskProccess>()
-                                .eq(CostProjectTaskProccess::getTaskId, parentTask.getId())
-                );
-                // 将父任务流转到实地审核
-                parentTask.setCurrentNode(NodeConstant.sdshenhe.getNodeKey());
-                costProjectTaskManager.updateById(parentTask);
-                if (parentProccess != null) {
-                    parentProccess.setCurrentNode(NodeConstant.sdshenhe.getNodeKey());
-                    costProjectTaskProccessManager.updateById(parentProccess);
-                }
-            }
-        }
-
-        return "初审已通过。";
-    }
-
-    /**
-     * 初审退回,退回企业补充材料,并可额外增加补充材料。
-     */
-    private String returnToSubmit(CostProjectTask task,CostTaskPageReq req) {
-        // 获取流程信息
-        CostProjectTaskProccess taskProccess = costProjectTaskProccessManager.getOne(
-                new LambdaQueryWrapper<CostProjectTaskProccess>()
-                        .eq(CostProjectTaskProccess::getTaskId, task.getId())
-        );
-        // 通知内容组装
-        String title = "材料初审退回";
-        String enterpriseId = task.getAuditedUnitId() == null ? "" : task.getAuditedUnitId();
-        String noticeSource = "系统";
-        String sendTarget = task.getCreateBy() == null ? "" : task.getCreateBy();
-        costNoticeManager.sendNotice(task.getProjectId(), "1", title, req.getContent(), enterpriseId, noticeSource, sendTarget);
-
-        // 退回提交材料环节
-        taskProccess.setCurrentNode(NodeConstant.tjcl.getNodeKey());
-        costProjectTaskProccessManager.updateById(taskProccess);
-
-        // 更新任务的当前节点和状态
-        task.setCurrentNode(NodeConstant.tjcl.getNodeKey());
-        task.setStatus(TaskStatusConstant.WAIT_SUBMIT.getStatusCode());
-        costProjectTaskManager.updateById(task);
-
-        return "初审已退回";
-    }
-
-    /**
-     * 中止监审,填写中止原因,并中止被监审单位审核
-     */
-    private String suspendTask(CostProjectTask task,CostTaskPageReq req) {
-
-        // 更新任务状态为中止
-        task.setStatus(TaskStatusConstant.SUSPENDED.getStatusCode());
-        costProjectTaskManager.updateById(task);
-
-        // 通知内容组装
-        String title = "材料初审中止";
-        String enterpriseId = task.getAuditedUnitId() == null ? "" : task.getAuditedUnitId();
-        String noticeSource = "系统";
-        String sendTarget = task.getCreateBy() == null ? "" : task.getCreateBy();
-        costNoticeManager.sendNotice(task.getProjectId(), "1", title, req.getContent(), enterpriseId, noticeSource, sendTarget);
-
-        // 更新流程阶段为中止(保持当前节点不变,但状态为中止)
-        CostProjectTaskProccess taskProccess = costProjectTaskProccessManager.getOne(
-                new LambdaQueryWrapper<CostProjectTaskProccess>()
-                        .eq(CostProjectTaskProccess::getTaskId, task.getId())
-        );
-        if (taskProccess != null) {
-            costProjectTaskProccessManager.updateById(taskProccess);
-        }
-
-        return "初审已中止";
-    }
 
 
 }

+ 1 - 112
assistMg/src/main/java/com/hotent/enterpriseDeclare/controller/CostAuditTaskController.java

@@ -51,14 +51,6 @@ public class CostAuditTaskController {
     @Autowired
     private CostProjectTaskManager costProjectTaskManager;
 
-    @Autowired
-    private CostProjectTaskProccessManager costProjectTaskProccessManager;
-
-    @Autowired
-    private CostDistrictManager costDistrictManager;
-
-    @Autowired
-    private OrgManager orgManager;
 
     /**
      * 分页查询当前用户企业需要填写的监审任务
@@ -68,113 +60,10 @@ public class CostAuditTaskController {
     @PostMapping(value = "/pageList")
     @ApiOperation(value = "分页查询当前用户企业需要填写的监审任务", httpMethod = "POST", notes = "分页查询当前用户企业需要填写的监审任务")
     public CommonResult<IPage<CostProjectApproval>> pageList(@RequestBody CostAuditTaskPageReq req) {
-        IPage<CostProjectApproval> pageResult = pageListForAuditTask(req);
+        IPage<CostProjectApproval> pageResult = costProjectApprovalManager.pageListForAuditTask(req);
         return CommonResult.<IPage<CostProjectApproval>>ok().value(pageResult);
     }
 
-    /**
-     * 企业端分页查询已发布任务的具体实现
-     * @param req 分页查询请求参数
-     * @return 分页结果
-     */
-    private IPage<CostProjectApproval> pageListForAuditTask(CostAuditTaskPageReq req) {
-        // 获取当前用户
-        IUser currentUser = ContextUtil.getCurrentUser();
-        AuditedUnit unit = auditedUnitManager.getOne(
-                new LambdaQueryWrapper<AuditedUnit>()
-                        .eq(AuditedUnit::getUserId, currentUser.getUserId())
-                        .eq(AuditedUnit::getIsDeleted, "0")
-        );
-
-        // 构建查询条件
-        LambdaQueryWrapper<CostProjectApproval> queryWrapper = new LambdaQueryWrapper<>();
-
-        // 查询已发布状态的任务
-        queryWrapper.eq(CostProjectApproval::getStatus, "2");
-
-        // 查询未删除的记录
-        queryWrapper.eq(CostProjectApproval::getIsDeleted, "0");
-
-        // 查询包含当前用户企业ID的记录
-        queryWrapper.like(CostProjectApproval::getAuditedUnitId, unit.getUnitId());
-
-        // 根据请求参数添加查询条件
-        if (StringUtil.isNotEmpty(req.getProjectName())) {
-            queryWrapper.like(CostProjectApproval::getProjectName, req.getProjectName());
-        }
-        if (StringUtil.isNotEmpty(req.getAreaCode())) {
-            queryWrapper.eq(CostProjectApproval::getAreaCode, req.getAreaCode());
-        }
-        if (StringUtil.isNotEmpty(req.getProjectYear())) {
-            queryWrapper.eq(CostProjectApproval::getProjectYear, req.getProjectYear());
-        }
-        if (StringUtil.isNotEmpty(req.getAuditType())) {
-            queryWrapper.eq(CostProjectApproval::getAuditType, req.getAuditType());
-        }
-
-        // 按创建时间倒序排列
-        queryWrapper.orderByDesc(CostProjectApproval::getCreateTime);
-
-        // 创建分页对象并执行查询
-        Page<CostProjectApproval> page = new Page<>(req.getPageNum(), req.getPageSize());
-
-        IPage<CostProjectApproval> result = costProjectApprovalManager.page(page, queryWrapper);
-
-        // 填充orgName和areaName
-        List<CostProjectApproval> records = result.getRecords();
-        for (CostProjectApproval record : records) {
-            // 设置监审主体
-            if (StringUtil.isNotEmpty(record.getOrgId())) {
-                String[] orgIds = record.getOrgId().split(",");
-                StringBuilder orgNames = new StringBuilder();
-                for (int i = 0; i < orgIds.length; i++) {
-                    String orgId = orgIds[i].trim();
-                    if (StringUtil.isNotEmpty(orgId)) {
-                        if (i > 0) {
-                            orgNames.append(",");
-                        }
-                        orgNames.append(orgManager.get(orgId).getName());
-                    }
-                }
-                record.setOrgName(orgNames.toString());
-            }
-
-            // 设置立项地区
-            if (StringUtil.isNotEmpty(record.getAreaCode())) {
-                CostDistrict district = costDistrictManager.getOne(
-                        new LambdaQueryWrapper<CostDistrict>()
-                                .eq(CostDistrict::getCode, record.getAreaCode())
-                );
-                record.setAreaName(district != null ? district.getName() : "山西省");
-            }
-
-            // 查询当前用户对应的子任务
-            CostProjectTask userTask = costProjectTaskManager.getOne(
-                    new LambdaQueryWrapper<CostProjectTask>()
-                            .eq(CostProjectTask::getProjectId, record.getProjectId())
-                            .ne(CostProjectTask::getPid,0)
-                            .eq(CostProjectTask::getAuditedUnitId, unit.getUnitId())
-                            .eq(CostProjectTask::getIsDeleted, 0)
-            );
-            CostProjectTaskProccess taskProccess = costProjectTaskProccessManager.getOne(
-                    new LambdaQueryWrapper<CostProjectTaskProccess>()
-                            .eq(CostProjectTaskProccess::getTaskId, userTask.getId())
-            );
-
-
-            // 设置子任务对象
-            record.setUserTask(userTask);
-            // 设置主状态为子任务状态
-            record.setStatus(userTask.getStatus());
-            record.setStatusName(TaskStatusConstant.getStatusNameByCode(userTask.getStatus()));
-            record.setCurrentNode(taskProccess.getCurrentNode());
-            record.setCurrentNodeName(NodeConstant.getNodeValueByKey(taskProccess.getCurrentNode())+ "-"+ TaskStatusConstant.getStatusNameByCode(userTask.getStatus()));
-
-        }
-
-        return result;
-    }
-
 
 
     @GetMapping(value="/getDetail")

+ 115 - 0
assistMg/src/main/java/com/hotent/enterpriseDeclare/controller/material/CostProjectTaskEvidenceController.java

@@ -0,0 +1,115 @@
+package com.hotent.enterpriseDeclare.controller.material;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.hotent.base.annotation.ApiGroup;
+import com.hotent.base.constants.ApiGroupConsts;
+import com.hotent.base.model.CommonResult;
+import com.hotent.base.util.StringUtil;
+import com.hotent.constant.BaseConstant;
+import com.hotent.enterpriseDeclare.req.CostTaskEvidencePageReq;
+import com.hotent.project.manager.CostProjectTaskEvidenceManager;
+import com.hotent.project.model.CostProjectTaskEvidence;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@Api(tags = "子任务提取资料登记")
+@RestController
+@RequestMapping("/api/enterprise/taskEvidence")
+@ApiGroup(group = {ApiGroupConsts.GROUP_COST})
+public class CostProjectTaskEvidenceController {
+
+    @Autowired
+    private CostProjectTaskEvidenceManager costProjectTaskEvidenceManager;
+
+    /**
+     * 分页查询资料登记列表
+     */
+    @PostMapping(value = "/pageList")
+    @ApiOperation(value = "分页查询资料登记列表", httpMethod = "POST", notes = "分页查询资料登记列表")
+    public CommonResult<IPage<CostProjectTaskEvidence>> pageList(@RequestBody CostTaskEvidencePageReq req) {
+        LambdaQueryWrapper<CostProjectTaskEvidence> queryWrapper = new LambdaQueryWrapper<>();
+
+        // 查询未删除的记录
+        queryWrapper.eq(CostProjectTaskEvidence::getIsDeleted, BaseConstant.NORMAL_STATUS);
+
+        // 根据任务ID查询
+        if (StringUtil.isNotEmpty(req.getTaskId())) {
+            queryWrapper.eq(CostProjectTaskEvidence::getTaskId, req.getTaskId());
+        }
+
+        // 根据资料名称模糊查询
+        if (StringUtil.isNotEmpty(req.getMaterialName())) {
+            queryWrapper.like(CostProjectTaskEvidence::getMaterialName, req.getMaterialName());
+        }
+
+        // 按序号排序
+        queryWrapper.orderByAsc(CostProjectTaskEvidence::getOrderNum);
+
+        // 创建分页对象并执行查询
+        Page<CostProjectTaskEvidence> page = new Page<>(req.getPageNum(), req.getPageSize());
+        IPage<CostProjectTaskEvidence> result = costProjectTaskEvidenceManager.page(page, queryWrapper);
+
+        return CommonResult.<IPage<CostProjectTaskEvidence>>ok().value(result);
+    }
+
+    /**
+     * 根据任务ID查询资料列表
+     */
+    @GetMapping(value = "/listByTaskId")
+    @ApiOperation(value = "根据任务ID查询资料列表", httpMethod = "GET", notes = "根据任务ID查询资料列表")
+    public CommonResult<List<CostProjectTaskEvidence>> listByTaskId(@RequestParam String taskId) {
+        LambdaQueryWrapper<CostProjectTaskEvidence> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(CostProjectTaskEvidence::getTaskId, taskId)
+                   .eq(CostProjectTaskEvidence::getIsDeleted, BaseConstant.NORMAL_STATUS)
+                   .orderByAsc(CostProjectTaskEvidence::getOrderNum);
+
+        List<CostProjectTaskEvidence> list = costProjectTaskEvidenceManager.list(queryWrapper);
+        return CommonResult.<List<CostProjectTaskEvidence>>ok().value(list);
+    }
+
+    /**
+     * 根据ID获取详情
+     */
+    @GetMapping(value = "/getDetail")
+    @ApiOperation(value = "根据ID获取详情", httpMethod = "GET", notes = "根据ID获取详情")
+    public CommonResult<CostProjectTaskEvidence> getDetail(@RequestParam String id) {
+        CostProjectTaskEvidence evidence = costProjectTaskEvidenceManager.getDetail(id);
+        return CommonResult.<CostProjectTaskEvidence>ok().value(evidence);
+    }
+
+    /**
+     * 新增资料登记
+     */
+    @PostMapping(value = "/add")
+    @ApiOperation(value = "新增资料登记", httpMethod = "POST", notes = "新增资料登记")
+    public CommonResult<String> add(@RequestBody CostProjectTaskEvidence evidence) {
+        costProjectTaskEvidenceManager.createOrUpdate(evidence);
+        return CommonResult.<String>ok().value("新增成功");
+    }
+
+    /**
+     * 更新资料登记
+     */
+    @PostMapping(value = "/update")
+    @ApiOperation(value = "更新资料登记", httpMethod = "POST", notes = "更新资料登记")
+    public CommonResult<String> update(@RequestBody CostProjectTaskEvidence evidence) {
+        costProjectTaskEvidenceManager.createOrUpdate(evidence);
+        return CommonResult.<String>ok().value("更新成功");
+    }
+
+    /**
+     * 删除资料登记
+     */
+    @PostMapping(value = "/delete")
+    @ApiOperation(value = "删除资料登记", httpMethod = "POST", notes = "删除资料登记")
+    public CommonResult<String> delete(@RequestParam String id) {
+        costProjectTaskEvidenceManager.removeById(id);
+        return CommonResult.<String>ok().value("删除成功");
+    }
+}

+ 3 - 1
assistMg/src/main/java/com/hotent/enterpriseDeclare/controller/CostProjectTaskMaterialDataController.java → assistMg/src/main/java/com/hotent/enterpriseDeclare/controller/material/CostProjectTaskMaterialDataController.java

@@ -1,8 +1,9 @@
-package com.hotent.enterpriseDeclare.controller;
+package com.hotent.enterpriseDeclare.controller.material;
 
 
 import com.hotent.enterpriseDeclare.manager.CostProjectTaskMaterialDataManager;
 import com.hotent.enterpriseDeclare.model.CostProjectTaskMaterialData;
+import io.swagger.annotations.Api;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -21,6 +22,7 @@ import com.hotent.base.controller.BaseController;
  * @author 超级管理员
  * @since 2025-10-28
  */
+@Api(tags = "任务定制-报送资料要求")
 @RestController
 @RequestMapping("/costProjectTaskMaterialData/v1/")
 public class CostProjectTaskMaterialDataController extends BaseController<CostProjectTaskMaterialDataManager, CostProjectTaskMaterialData> {

+ 22 - 0
assistMg/src/main/java/com/hotent/enterpriseDeclare/req/CostTaskEvidencePageReq.java

@@ -0,0 +1,22 @@
+package com.hotent.enterpriseDeclare.req;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@ApiModel("子任务资料登记分页查询请求")
+@Data
+public class CostTaskEvidencePageReq {
+
+    @ApiModelProperty(value = "页码", required = true)
+    private Integer pageNum = 1;
+
+    @ApiModelProperty(value = "每页大小", required = true)
+    private Integer pageSize = 10;
+
+    @ApiModelProperty(value = "任务ID")
+    private String taskId;
+
+    @ApiModelProperty(value = "资料名称")
+    private String materialName;
+}

+ 5 - 3
assistMg/src/main/java/com/hotent/project/controller/CostNoticeController.java

@@ -1,6 +1,7 @@
 package com.hotent.project.controller;
 
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.hotent.base.annotation.ApiGroup;
 import com.hotent.base.constants.ApiGroupConsts;
 import com.hotent.common.CrudService;
@@ -42,15 +43,16 @@ public class CostNoticeController extends BaseController<CostNoticeManager, Cost
 	//分页查询
 	@PostMapping(value="/pageList")
 	@ApiOperation(value="分页查询pageList")
-	public CommonResult<PageResp<CostNotice>> pageList(@RequestBody CostProjectNoticePageReq req) {
-		return CommonResult.<PageResp<CostNotice>>ok().value(crudService.pageQuery(req, baseService::pageList));
+	public CommonResult<IPage<CostNotice>> pageList(@RequestBody CostProjectNoticePageReq req) {
+		IPage<CostNotice> costNoticeIPage = baseService.pageList(req);
+		return CommonResult.<IPage<CostNotice>>ok().value(costNoticeIPage);
 	}
 
 	/**
 	 * 根据id获取通知公告表数据详情
 	 * @param id
 	 * @return
-	 * @throws Exception 
+	 * @throws Exception
 	 * ModelAndView
 	 */
 	@GetMapping(value="/getDetail")

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

@@ -55,20 +55,20 @@ public class CostProjectTaskController extends BaseController<CostProjectTaskMan
 	 * 根据id获取项目任务表数据详情
 	 * @param id
 	 * @return
-	 * @throws Exception 
+	 * @throws Exception
 	 * ModelAndView
 	 */
 	@GetMapping(value="/getDetail")
 	@ApiOperation(value="根据id获取项目任务表数据详情",httpMethod = "GET",notes = "根据id获取项目任务表数据详情")
 	public CommonResult<CostProjectTask> getDetail(@ApiParam(name="id",value="业务对象主键", required = true)@RequestParam(required=true) String id) throws Exception{
-		return CommonResult.<CostProjectTask>ok().value(baseService.getDetail(id));
+		return CommonResult.<CostProjectTask>ok().value(baseService.getById(id));
 	}
     /**
 	 * 新增,更新项目任务表
 	 * @param costProjectTask
-	 * @throws Exception 
+	 * @throws Exception
 	 * @return
-	 * @exception 
+	 * @exception
 	 */
 	@PostMapping(value="/save")
 	@ApiOperation(value = "新增,更新项目任务表数据", httpMethod = "POST", notes = "新增,更新项目任务表数据")

+ 17 - 0
assistMg/src/main/java/com/hotent/project/dao/CostProjectTaskEvidenceDao.java

@@ -0,0 +1,17 @@
+package com.hotent.project.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.hotent.project.model.CostProjectTaskEvidence;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 子任务资料登记表 数据访问层
+ *
+ * @company 山西清众科技股份有限公司
+ * @author 超级管理员
+ * @since 2025-01-27
+ */
+@Mapper
+public interface CostProjectTaskEvidenceDao extends BaseMapper<CostProjectTaskEvidence> {
+
+}

+ 3 - 0
assistMg/src/main/java/com/hotent/project/manager/CostProjectApprovalManager.java

@@ -1,6 +1,7 @@
 package com.hotent.project.manager;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.hotent.enterpriseDeclare.req.CostAuditTaskPageReq;
 import com.hotent.project.model.CostProjectApproval;
 import com.hotent.base.manager.BaseManager;
 import com.hotent.project.req.CostProjectApprovalPageReq;
@@ -39,4 +40,6 @@ public interface CostProjectApprovalManager extends BaseManager<CostProjectAppro
 	 */
 	void publish(CostProjectApprovalPublishReq req);
 
+    IPage<CostProjectApproval> pageListForAuditTask(CostAuditTaskPageReq req);
+
 }

+ 27 - 0
assistMg/src/main/java/com/hotent/project/manager/CostProjectTaskEvidenceManager.java

@@ -0,0 +1,27 @@
+package com.hotent.project.manager;
+
+import com.hotent.project.model.CostProjectTaskEvidence;
+import com.hotent.base.manager.BaseManager;
+
+/**
+ * 子任务资料登记表 服务类
+ *
+ * @company 山西清众科技股份有限公司
+ * @author 超级管理员
+ * @since 2025-01-27
+ */
+public interface CostProjectTaskEvidenceManager extends BaseManager<CostProjectTaskEvidence> {
+    /**
+     * 根据主键获取详情
+     * @param id
+     * @return
+     */
+    CostProjectTaskEvidence getDetail(String id);
+    
+    /**
+     * 新建、更新子任务资料登记表
+     * @param costProjectTaskEvidence
+     * @return
+     */
+    void createOrUpdate(CostProjectTaskEvidence costProjectTaskEvidence);
+}

+ 9 - 12
assistMg/src/main/java/com/hotent/project/manager/CostProjectTaskManager.java

@@ -1,7 +1,9 @@
 package com.hotent.project.manager;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.hotent.baseInfo.req.CostTaskSearchReq;
 import com.hotent.enterpriseDeclare.req.CostTaskPageReq;
+import com.hotent.enterpriseDeclare.req.CostTaskReviewPageReq;
 import com.hotent.project.model.CostProjectTask;
 import com.hotent.base.manager.BaseManager;
 
@@ -15,21 +17,16 @@ import java.util.List;
  * @since 2025-10-03
  */
 public interface CostProjectTaskManager extends BaseManager<CostProjectTask> {
-	/**
-	 * 根据主键获取详情
-	 * @param id
-	 * @return
-	 */
-	CostProjectTask getDetail(String id);
-	/**
-	 * 新建、更新项目任务表
-	 * @param costProjectTask
-	 * @return
-	 */
-	void createOrUpdate(CostProjectTask costProjectTask);
 
 
 	List<CostProjectTask> getTaskList(CostTaskSearchReq req);
 
+	IPage<CostProjectTask> pageListForReviewTask(CostTaskReviewPageReq req);
+
+	void createOrUpdate(CostProjectTask costProjectTask);
+
 	String saveTask(CostTaskPageReq costTaskPageReq);
+
+    String doProcessBtn(CostTaskPageReq req);
+
 }

+ 8 - 0
assistMg/src/main/java/com/hotent/project/manager/impl/CostNoticeManagerImpl.java

@@ -56,6 +56,14 @@ public class CostNoticeManagerImpl extends BaseManagerImpl<CostNoticeDao, CostNo
 		if(ObjectUtil.isNotEmpty(req.getProjectId())){
 			qw.eq(CostNotice::getProjectId, req.getProjectId());
 		}
+		if(ObjectUtil.isNotEmpty(req.getProjectId())){
+			qw.eq(CostNotice::getProjectId, req.getProjectId());
+		}
+		if(ObjectUtil.isNotEmpty(req.getEnterpriseId())){
+			qw.eq(CostNotice::getEnterpriseId, req.getEnterpriseId());
+		}
+
+		qw.orderByDesc(CostNotice::getCreateTime);
 		IPage<CostNotice> page=new Page<>(req.getPageNum(), req.getPageSize());
 		return this.page(page, qw);
 	}

+ 103 - 4
assistMg/src/main/java/com/hotent/project/manager/impl/CostProjectApprovalManagerImpl.java

@@ -8,13 +8,11 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.hotent.base.exception.BaseException;
 import com.hotent.base.util.StringUtil;
 import com.hotent.baseInfo.manager.*;
-import com.hotent.baseInfo.model.AuditedUnit;
-import com.hotent.baseInfo.model.CostCatalog;
-import com.hotent.baseInfo.model.CostCatalogInformation;
-import com.hotent.baseInfo.model.CostCatalogUnit;
+import com.hotent.baseInfo.model.*;
 import com.hotent.constant.BaseConstant;
 import com.hotent.constant.NodeConstant;
 import com.hotent.constant.TaskStatusConstant;
+import com.hotent.enterpriseDeclare.req.CostAuditTaskPageReq;
 import com.hotent.project.manager.*;
 import com.hotent.project.model.*;
 import com.hotent.project.dao.CostProjectApprovalDao;
@@ -25,6 +23,7 @@ import com.hotent.project.resp.CostAnnualPlanDetailResp;
 import com.hotent.project.resp.CostProjectApprovalDetailResp;
 import com.hotent.surveyinfo.manager.*;
 import com.hotent.surveyinfo.model.*;
+import com.hotent.uc.api.model.IUser;
 import com.hotent.uc.manager.OrgManager;
 import com.hotent.uc.util.ContextUtil;
 import com.hotent.util.AreaCodeUtil;
@@ -147,6 +146,8 @@ public class CostProjectApprovalManagerImpl extends BaseManagerImpl<CostProjectA
     @Autowired
     private CostSurveyTemplateItemsManager costSurveyTemplateItemsManager;
 
+    @Autowired
+    private CostDistrictManager costDistrictManager;
 
     /**
      * cost_survey_fd_project_data
@@ -481,4 +482,102 @@ public class CostProjectApprovalManagerImpl extends BaseManagerImpl<CostProjectA
         this.costProjectTaskManager.updateById(costProjectTask);
     }
 
+    @Override
+    public IPage<CostProjectApproval> pageListForAuditTask(CostAuditTaskPageReq req) {
+        // 获取当前用户
+        IUser currentUser = ContextUtil.getCurrentUser();
+        AuditedUnit unit = auditedUnitManager.getOne(
+                new LambdaQueryWrapper<AuditedUnit>()
+                        .eq(AuditedUnit::getUserId, currentUser.getUserId())
+                        .eq(AuditedUnit::getIsDeleted, "0")
+        );
+
+        // 构建查询条件
+        LambdaQueryWrapper<CostProjectApproval> queryWrapper = new LambdaQueryWrapper<>();
+
+        // 查询已发布状态的任务
+        queryWrapper.eq(CostProjectApproval::getStatus, "2");
+
+        // 查询未删除的记录
+        queryWrapper.eq(CostProjectApproval::getIsDeleted, "0");
+
+        // 查询包含当前用户企业ID的记录
+        queryWrapper.like(CostProjectApproval::getAuditedUnitId, unit.getUnitId());
+
+        // 根据请求参数添加查询条件
+        if (StringUtil.isNotEmpty(req.getProjectName())) {
+            queryWrapper.like(CostProjectApproval::getProjectName, req.getProjectName());
+        }
+        if (StringUtil.isNotEmpty(req.getAreaCode())) {
+            queryWrapper.eq(CostProjectApproval::getAreaCode, req.getAreaCode());
+        }
+        if (StringUtil.isNotEmpty(req.getProjectYear())) {
+            queryWrapper.eq(CostProjectApproval::getProjectYear, req.getProjectYear());
+        }
+        if (StringUtil.isNotEmpty(req.getAuditType())) {
+            queryWrapper.eq(CostProjectApproval::getAuditType, req.getAuditType());
+        }
+
+        // 按创建时间倒序排列
+        queryWrapper.orderByDesc(CostProjectApproval::getCreateTime);
+
+        // 创建分页对象并执行查询
+        Page<CostProjectApproval> page = new Page<>(req.getPageNum(), req.getPageSize());
+
+        IPage<CostProjectApproval> result = this.page(page, queryWrapper);
+
+        // 填充orgName和areaName
+        List<CostProjectApproval> records = result.getRecords();
+        for (CostProjectApproval record : records) {
+            // 设置监审主体
+            if (StringUtil.isNotEmpty(record.getOrgId())) {
+                String[] orgIds = record.getOrgId().split(",");
+                StringBuilder orgNames = new StringBuilder();
+                for (int i = 0; i < orgIds.length; i++) {
+                    String orgId = orgIds[i].trim();
+                    if (StringUtil.isNotEmpty(orgId)) {
+                        if (i > 0) {
+                            orgNames.append(",");
+                        }
+                        orgNames.append(orgManager.get(orgId).getName());
+                    }
+                }
+                record.setOrgName(orgNames.toString());
+            }
+
+            // 设置立项地区
+            if (StringUtil.isNotEmpty(record.getAreaCode())) {
+                CostDistrict district = costDistrictManager.getOne(
+                        new LambdaQueryWrapper<CostDistrict>()
+                                .eq(CostDistrict::getCode, record.getAreaCode())
+                );
+                record.setAreaName(district != null ? district.getName() : "山西省");
+            }
+
+            // 查询当前用户对应的子任务
+            CostProjectTask userTask = costProjectTaskManager.getOne(
+                    new LambdaQueryWrapper<CostProjectTask>()
+                            .eq(CostProjectTask::getProjectId, record.getProjectId())
+                            .ne(CostProjectTask::getPid,0)
+                            .eq(CostProjectTask::getAuditedUnitId, unit.getUnitId())
+                            .eq(CostProjectTask::getIsDeleted, 0)
+            );
+            CostProjectTaskProccess taskProccess = costProjectTaskProccessManager.getOne(
+                    new LambdaQueryWrapper<CostProjectTaskProccess>()
+                            .eq(CostProjectTaskProccess::getTaskId, userTask.getId())
+            );
+
+
+            // 设置子任务对象
+            record.setUserTask(userTask);
+            // 设置主状态为子任务状态
+            record.setStatus(userTask.getStatus());
+            record.setStatusName(TaskStatusConstant.getStatusNameByCode(userTask.getStatus()));
+            record.setCurrentNode(taskProccess.getCurrentNode());
+            record.setCurrentNodeName(NodeConstant.getNodeValueByKey(taskProccess.getCurrentNode())+ "-"+ TaskStatusConstant.getStatusNameByCode(userTask.getStatus()));
+
+        }
+        return result;
+    }
+
 }

+ 32 - 0
assistMg/src/main/java/com/hotent/project/manager/impl/CostProjectTaskEvidenceManagerImpl.java

@@ -0,0 +1,32 @@
+package com.hotent.project.manager.impl;
+
+import com.hotent.project.model.CostProjectTaskEvidence;
+import com.hotent.project.dao.CostProjectTaskEvidenceDao;
+import com.hotent.project.manager.CostProjectTaskEvidenceManager;
+import com.hotent.base.manager.impl.BaseManagerImpl;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * 子任务资料登记表 服务实现类
+ *
+ * @company 山西清众科技股份有限公司
+ * @author 超级管理员
+ * @since 2025-01-27
+ */
+@Service
+public class CostProjectTaskEvidenceManagerImpl extends BaseManagerImpl<CostProjectTaskEvidenceDao, CostProjectTaskEvidence> implements CostProjectTaskEvidenceManager {
+
+    @Override
+    public CostProjectTaskEvidence getDetail(String id) {
+        CostProjectTaskEvidence costProjectTaskEvidence = this.get(id);
+        return costProjectTaskEvidence;
+    }
+
+    @Override
+    @Transactional
+    public void createOrUpdate(CostProjectTaskEvidence costProjectTaskEvidence) {
+        //新建或更新
+        this.saveOrUpdate(costProjectTaskEvidence);
+    }
+}

+ 264 - 12
assistMg/src/main/java/com/hotent/project/manager/impl/CostProjectTaskManagerImpl.java

@@ -3,17 +3,27 @@ package com.hotent.project.manager.impl;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.hotent.base.manager.impl.BaseManagerImpl;
+import com.hotent.base.model.CommonResult;
+import com.hotent.base.util.StringUtil;
 import com.hotent.baseInfo.req.CostTaskSearchReq;
 import com.hotent.constant.BaseConstant;
 import com.hotent.constant.NodeConstant;
 import com.hotent.constant.TaskStatusConstant;
 import com.hotent.enterpriseDeclare.req.CostTaskPageReq;
+import com.hotent.enterpriseDeclare.req.CostTaskReviewPageReq;
 import com.hotent.project.dao.CostProjectTaskDao;
+import com.hotent.project.manager.CostNoticeManager;
+import com.hotent.project.manager.CostProjectApprovalManager;
 import com.hotent.project.manager.CostProjectTaskManager;
 import com.hotent.project.manager.CostProjectTaskProccessManager;
+import com.hotent.project.model.CostProjectApproval;
 import com.hotent.project.model.CostProjectTask;
 import com.hotent.project.model.CostProjectTaskProccess;
+import com.hotent.uc.api.model.IUser;
+import com.hotent.uc.util.ContextUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -35,21 +45,15 @@ public class CostProjectTaskManagerImpl extends BaseManagerImpl<CostProjectTaskD
     @Autowired
     private CostProjectTaskProccessManager costProjectTaskProccessManager;
 
+    @Autowired
+    private CostProjectTaskManager costProjectTaskManager;
 
-    @Override
-    public CostProjectTask getDetail(String id) {
-        CostProjectTask costProjectTask = this.get(id);
-
+    @Autowired
+    private CostNoticeManager costNoticeManager;
 
-        return costProjectTask;
-    }
+    @Autowired
+    private CostProjectApprovalManager costProjectApprovalManager;
 
-    @Override
-    @Transactional
-    public void createOrUpdate(CostProjectTask costProjectTask) {
-        //新建或更新
-        this.saveOrUpdate(costProjectTask);
-    }
 
     @Override
     public List<CostProjectTask> getTaskList(CostTaskSearchReq req) {
@@ -65,6 +69,91 @@ public class CostProjectTaskManagerImpl extends BaseManagerImpl<CostProjectTaskD
     }
 
     @Override
+    public IPage<CostProjectTask> pageListForReviewTask(CostTaskReviewPageReq req) {
+        // 获取当前用户
+        IUser currentUser = ContextUtil.getCurrentUser();
+        String currentUserId = currentUser.getUserId();
+
+        // 1. 先查询当前用户有权限的立项(负责人或项目组成员)
+        LambdaQueryWrapper<CostProjectApproval> approvalQueryWrapper = new LambdaQueryWrapper<>();
+        approvalQueryWrapper.eq(CostProjectApproval::getIsDeleted, "0");
+        approvalQueryWrapper.and(wrapper -> wrapper
+                .eq(CostProjectApproval::getLeaderId, currentUserId)
+                .or(projectMembersWrapper -> {
+                    projectMembersWrapper.like(CostProjectApproval::getProjectMembers, currentUserId);
+                })
+        );
+
+        List<CostProjectApproval> accessibleApprovals = costProjectApprovalManager.list(approvalQueryWrapper);
+
+        // 如果没有权限的立项,返回空结果
+        if (accessibleApprovals.isEmpty()) {
+            return new Page<>(req.getPageNum(), req.getPageSize());
+        }
+
+        // 提取有权限的立项ID列表
+        List<String> accessibleProjectIds = accessibleApprovals.stream()
+                .map(CostProjectApproval::getProjectId)
+                .distinct()
+                .collect(java.util.stream.Collectors.toList());
+
+        // 2. 构建任务查询条件
+        LambdaQueryWrapper<CostProjectTask> queryWrapper = new LambdaQueryWrapper<>();
+
+        // 查询未删除的记录
+        queryWrapper.eq(CostProjectTask::getIsDeleted, "0");
+
+        // 查询根任务(pid为0)
+        queryWrapper.eq(CostProjectTask::getPid, "0");
+
+        // 只查询当前用户有权限的立项对应的任务
+        queryWrapper.in(CostProjectTask::getProjectId, accessibleProjectIds);
+
+        // 根据请求参数添加查询条件
+        if (StringUtil.isNotEmpty(req.getProjectName())) {
+            queryWrapper.like(CostProjectTask::getProjectName, req.getProjectName());
+        }
+        if (StringUtil.isNotEmpty(req.getStatus())) {
+            queryWrapper.eq(CostProjectTask::getStatus, req.getStatus());
+        }
+        if (StringUtil.isNotEmpty(req.getCurrentNode())) {
+            queryWrapper.eq(CostProjectTask::getCurrentNode, req.getCurrentNode());
+        }
+
+        // 按创建时间倒序排列
+        queryWrapper.orderByDesc(CostProjectTask::getCreateTime);
+
+        // 创建分页对象并执行查询
+        Page<CostProjectTask> page = new Page<>(req.getPageNum(), req.getPageSize());
+        IPage<CostProjectTask> result = costProjectTaskManager.page(page, queryWrapper);
+
+        // 填充根任务的子任务列表和流程信息
+        for (CostProjectTask rootTask : result.getRecords()) {
+            // 查询子任务列表
+            LambdaQueryWrapper<CostProjectTask> childQueryWrapper = new LambdaQueryWrapper<>();
+            childQueryWrapper.eq(CostProjectTask::getPid, rootTask.getId())
+                    .eq(CostProjectTask::getIsDeleted, "0")
+                    .orderByAsc(CostProjectTask::getOrderNum);
+
+            List<CostProjectTask> childTasks = costProjectTaskManager.list(childQueryWrapper);
+            for (CostProjectTask childTask : childTasks) {
+                childTask.setStatus(TaskStatusConstant.getStatusNameByCode(childTask.getStatus()));
+            }
+            rootTask.setChildTasks(childTasks);
+            rootTask.setCurrentNodeName(NodeConstant.getNodeValueByKey(rootTask.getCurrentNode()));
+        }
+
+        return result;
+    }
+
+    @Override
+    @Transactional
+    public void createOrUpdate(CostProjectTask costProjectTask) {
+        //新建或更新
+        this.saveOrUpdate(costProjectTask);
+    }
+
+    @Override
     @Transactional
     public String saveTask(CostTaskPageReq costTaskPageReq) {
 
@@ -86,4 +175,167 @@ public class CostProjectTaskManagerImpl extends BaseManagerImpl<CostProjectTaskD
 
         return "任务提交成功,已进入材料初审阶段";
     }
+
+    @Override
+    public String doProcessBtn(CostTaskPageReq req) {
+
+        CostProjectTask task = costProjectTaskManager.getById(req.getTaskId());
+        String resultMessage = "";
+        switch (req.getKey()) {
+            case "1":
+                // 补充材料
+                resultMessage = supplementMaterial(task, req);
+                break;
+            case "2":
+                // 中止
+                resultMessage = suspendTask(task,req);
+                break;
+            case "3":
+                // 通过
+                resultMessage = completeTask(task);
+                break;
+            case "4":
+                // 退回
+                resultMessage = returnToSubmit(task,req);
+                break;
+            default:
+                return "未知的操作类型";
+        }
+        return resultMessage;
+    }
+
+    /**
+     * 通过,只修改状态,节点变化需要等待所有子任务完成。
+     */
+    private String completeTask(CostProjectTask task) {
+        NodeConstant nextNode = NodeConstant.getNextNode(task.getCurrentNode());
+        if (nextNode == null){
+            return "当前节点无法通过";
+        }
+        // 将当前任务置为办结
+        String nextNodeStatus = nextNode.getNodeKey();
+        task.setStatus(TaskStatusConstant.COMPLETED.getStatusCode());
+        task.setCurrentNode(nextNodeStatus);
+        costProjectTaskManager.updateById(task);
+
+        // 材料初审通过通知
+        String title = nextNodeStatus+"通过";
+        String auditedUnit = task.getAuditedUnitName() == null ? "" : task.getAuditedUnitName();
+        String projectName = task.getProjectName() == null ? "" : task.getProjectName();
+        String year = task.getYear() == null ? "" : task.getYear();
+        String content = String.format("%s%s%s%s。", year, projectName, auditedUnit,title);
+        String enterpriseId = task.getAuditedUnitId() == null ? "" : task.getAuditedUnitId();
+        String noticeSource = "系统";
+        String sendTarget = task.getCreateBy() == null ? "" : task.getCreateBy();
+        costNoticeManager.sendNotice(task.getProjectId(), "1", title, content, enterpriseId, noticeSource, sendTarget);
+
+
+        // 检查同一父任务下是否所有子任务均已办结;若是,父任务节点流转
+        List<CostProjectTask> siblingTasks = costProjectTaskManager.list(
+                new LambdaQueryWrapper<CostProjectTask>()
+                        .eq(CostProjectTask::getPid, task.getPid())
+                        .eq(CostProjectTask::getIsDeleted, "0")
+        );
+
+        boolean allSiblingsCompleted = true;
+        for (CostProjectTask s : siblingTasks) {
+            if (!TaskStatusConstant.COMPLETED.getStatusCode().equals(s.getStatus())) {
+                allSiblingsCompleted = false;
+                break;
+            }
+        }
+
+        if (allSiblingsCompleted) {
+            CostProjectTask parentTask = costProjectTaskManager.getById(task.getPid());
+            if (parentTask != null) {
+                CostProjectTaskProccess parentProccess = costProjectTaskProccessManager.getOne(
+                        new LambdaQueryWrapper<CostProjectTaskProccess>()
+                                .eq(CostProjectTaskProccess::getTaskId, parentTask.getId())
+                );
+                // 将父任务流转到下一步
+                parentTask.setCurrentNode(NodeConstant.getNextNode(task.getCurrentNode()).getNodeKey());
+                costProjectTaskManager.updateById(parentTask);
+                if (parentProccess != null) {
+                    parentProccess.setCurrentNode(NodeConstant.getNextNode(task.getCurrentNode()).getNodeKey());
+                    costProjectTaskProccessManager.updateById(parentProccess);
+                }
+            }
+        }
+
+        return title;
+    }
+
+    /**
+     * 退回,填写退回原因 修改状态
+     */
+    private String returnToSubmit(CostProjectTask task,CostTaskPageReq req) {
+        NodeConstant nextNode = NodeConstant.getNextNode(task.getCurrentNode());
+        if (nextNode == null){
+            return "当前节点无法通过";
+        }
+        // 将当前任务置为办结
+        String nextNodeStatus = nextNode.getNodeKey();
+        // 通知内容组装
+        String title = nextNodeStatus+"退回";
+        String enterpriseId = task.getAuditedUnitId() == null ? "" : task.getAuditedUnitId();
+        String noticeSource = "系统";
+        String sendTarget = task.getCreateBy() == null ? "" : task.getCreateBy();
+        costNoticeManager.sendNotice(task.getProjectId(), "1", title, req.getContent(), enterpriseId, noticeSource, sendTarget);
+
+        // 更新任务的当前节点和状态
+        task.setCurrentNode(nextNodeStatus);
+        task.setStatus(TaskStatusConstant.WAIT_SUBMIT.getStatusCode());
+        costProjectTaskManager.updateById(task);
+
+        return title;
+    }
+
+    /**
+     * 中止,填写中止原因 只修改状态
+     */
+    private String suspendTask(CostProjectTask task,CostTaskPageReq req) {
+        NodeConstant nextNode = NodeConstant.getNextNode(task.getCurrentNode());
+        if (nextNode == null){
+            return "当前节点无法通过";
+        }
+        // 将当前任务置为办结
+        String nextNodeStatus = nextNode.getNodeKey();
+
+        // 更新任务状态为中止
+        task.setStatus(TaskStatusConstant.SUSPENDED.getStatusCode());
+        costProjectTaskManager.updateById(task);
+
+        // 通知内容组装
+        String title = nextNodeStatus+"中止";
+        String enterpriseId = task.getAuditedUnitId() == null ? "" : task.getAuditedUnitId();
+        String noticeSource = "系统";
+        String sendTarget = task.getCreateBy() == null ? "" : task.getCreateBy();
+        costNoticeManager.sendNotice(task.getProjectId(), "1", title, req.getContent(), enterpriseId, noticeSource, sendTarget);
+
+        // 更新流程阶段为中止
+        CostProjectTaskProccess taskProccess = costProjectTaskProccessManager.getOne(
+                new LambdaQueryWrapper<CostProjectTaskProccess>()
+                        .eq(CostProjectTaskProccess::getTaskId, task.getId())
+        );
+        if (taskProccess != null) {
+            costProjectTaskProccessManager.updateById(taskProccess);
+        }
+
+        return title;
+    }
+
+    /**
+     * 补充材料,仅发送通知,不修改任务状态或节点
+     */
+    private String supplementMaterial(CostProjectTask task, CostTaskPageReq req) {
+        // 通知内容组装
+        String title = "补充材料通知";
+        String enterpriseId = task.getAuditedUnitId() == null ? "" : task.getAuditedUnitId();
+        String noticeSource = "系统";
+        String sendTarget = task.getCreateBy() == null ? "" : task.getCreateBy();
+        costNoticeManager.sendNotice(task.getProjectId(), "1", title, req.getContent(), enterpriseId, noticeSource, sendTarget);
+
+        return "补充材料通知已发送";
+    }
+
 }

+ 88 - 0
assistMg/src/main/java/com/hotent/project/model/CostProjectTaskEvidence.java

@@ -0,0 +1,88 @@
+package com.hotent.project.model;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.hotent.base.entity.BaseModel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * 子任务资料登记表
+ *
+ * @company 山西清众科技股份有限公司
+ * @author 超级管理员
+ * @since 2025-01-27
+ */
+@ApiModel(value="CostProjectTaskEvidence对象", description="子任务资料登记表")
+@Data
+public class CostProjectTaskEvidence extends BaseModel<CostProjectTaskEvidence> {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    @JsonProperty("id")
+    private String id;
+
+    @ApiModelProperty(value = "子任务ID")
+    @TableField("task_id")
+    @JsonProperty("taskId")
+    private String taskId;
+
+    @ApiModelProperty(value = "资料名称")
+    @TableField("material_name")
+    @JsonProperty("materialName")
+    private String materialName;
+
+    @ApiModelProperty(value = "页数")
+    @TableField("page_count")
+    @JsonProperty("pageCount")
+    private Integer pageCount;
+
+    @ApiModelProperty(value = "备注")
+    @TableField("remark")
+    @JsonProperty("remark")
+    private String remark;
+
+    @ApiModelProperty(value = "序号")
+    @TableField("order_num")
+    @JsonProperty("orderNum")
+    private Integer orderNum;
+
+    @ApiModelProperty(value = "附件ID")
+    @TableField("attachment_id")
+    @JsonProperty("attachmentId")
+    private String attachmentId;
+
+    @ApiModelProperty(value = "逻辑删除:0正常 1删除")
+    @TableField("is_deleted")
+    @JsonProperty("isDeleted")
+    private String isDeleted;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField(value = "create_time", fill = FieldFill.INSERT)
+    @JsonProperty("createTime")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty(value = "创建人")
+    @TableField(value = "create_by", fill = FieldFill.INSERT)
+    @JsonProperty("createBy")
+    private String createBy;
+
+    @ApiModelProperty(value = "更新时间")
+    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
+    @JsonProperty("updateTime")
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty(value = "更新人")
+    @TableField(value = "update_by", fill = FieldFill.INSERT_UPDATE)
+    @JsonProperty("updateBy")
+    private String updateBy;
+
+}

+ 3 - 1
assistMg/src/main/java/com/hotent/project/req/CostProjectNoticePageReq.java

@@ -11,7 +11,7 @@ import java.time.LocalDate;
 
 /**
  * @author zyj
- * @date 2025/9/25 9:36 
+ * @date 2025/9/25 9:36
  */
 @ApiModel("备忘录列表请求参数")
 @Getter
@@ -28,6 +28,8 @@ public class CostProjectNoticePageReq extends PageReq {
     @ApiModelProperty(value = "公告标题")
     private String title;
 
+    private String  enterpriseId;
+
 
 
 

+ 0 - 50
assistMg/src/main/resources/mapper/CostNoticeMapper.xml

@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.hotent.project.dao.CostNoticeDao">
-
-    <!-- 通用查询映射结果 -->
-    <resultMap id="BaseResultMap" type="com.hotent.project.model.CostNotice">
-        <id column="notice_id" property="noticeId" />
-    <result column="notice_title" property="noticeTitle" />
-    <result column="notice_type" property="noticeType" />
-    <result column="notice_content" property="noticeContent" />
-    <result column="status" property="status" />
-    <result column="create_by" property="createBy" />
-    <result column="create_time" property="createTime" />
-    <result column="update_by" property="updateBy" />
-    <result column="update_time" property="updateTime" />
-    <result column="remark" property="remark" />
-    <result column="is_deleted" property="isDeleted" />
-    <result column="project_id" property="projectId" />
-    </resultMap>
-
-    <!-- 通用查询结果列 -->
-    <sql id="Base_Column_List">
-        notice_id, notice_title, notice_type, notice_content, status, create_by, create_time, update_by, update_time, remark, is_deleted, project_id
-    </sql>
-
-	<select id="selectPage" resultMap="BaseResultMap">
-		select 
-			<include refid="Base_Column_List"/> 
-		from
-			cost_notice
-		${ew.customSqlSegment}
-	</select>
-	
-	<select id="selectList" resultMap="BaseResultMap">
-		select 
-			<include refid="Base_Column_List"/> 
-		from
-			cost_notice
-		${ew.customSqlSegment}
-	</select>
-	
-	<select id="selectById" resultMap="BaseResultMap">
-		select 
-			<include refid="Base_Column_List"/> 
-		from
-			cost_notice
-		where 
-		    notice_id = ${noticeId}
-	</select>
-</mapper>