package com.hotent.project.manager.impl; 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.manager.impl.BaseManagerImpl; import com.hotent.base.util.AuthenticationUtil; import com.hotent.base.util.StringUtil; import com.hotent.baseInfo.req.CostTaskSearchReq; 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.*; import com.hotent.project.model.CostProjectApproval; import com.hotent.project.model.CostProjectTask; import com.hotent.project.model.CostProjectTaskMaterial; import com.hotent.project.model.CostProjectTaskPreliminaryOpinion; import com.hotent.project.resp.CostProjectApprovalDetailResp; import com.hotent.surveyinfo.manager.CostSurveyTemplateUploadManager; import com.hotent.surveyinfo.model.CostSurveyTemplateUpload; import com.hotent.uc.api.model.IUser; import com.hotent.uc.manager.UserManager; import com.hotent.uc.model.User; import com.hotent.uc.util.ContextUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; /** * 项目任务表 服务实现类 * * @author 超级管理员 * @company 山西清众科技股份有限公司 * @since 2025-10-03 */ @Service public class CostProjectTaskManagerImpl extends BaseManagerImpl implements CostProjectTaskManager { @Autowired private CostProjectTaskProccessManager costProjectTaskProccessManager; @Autowired private CostProjectTaskManager costProjectTaskManager; @Autowired private CostNoticeManager costNoticeManager; @Autowired private CostProjectApprovalManager costProjectApprovalManager; @Autowired private CostProjectTaskPreliminaryOpinionManager preliminaryOpinionManager; @Autowired private UserManager userService; @Autowired private CostProjectTaskMaterialManager costProjectTaskMaterialManager; @Autowired private CostSurveyTemplateUploadManager costSurveyTemplateUploadManager; @Autowired private CostProjectTaskLogManager costProjectTaskLogManager; @Override public List getTaskList(CostTaskSearchReq req) throws Exception { IUser iUser = ContextUtil.getCurrentUser(); User user = userService.getByAccount(iUser.getAccount()); req.setDataScope(user.getDataScope()); req.setProvinceCode(user.getProvinceCode()); req.setCityCode(user.getCityCode()); req.setCountyCode(user.getCountyCode()); List list = baseMapper.getCostProjectTaskList(req.getDataScope() , req.getProvinceCode() , req.getCityCode() , req.getCountyCode() , req.getYear() , req.getProjectName()); /*LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); if (ObjectUtil.isNotEmpty(req.getYear())) { queryWrapper.eq(CostProjectTask::getYear, req.getYear()); } if (ObjectUtil.isNotEmpty(req.getProjectName())) { queryWrapper.like(CostProjectTask::getProjectName, req.getProjectName()); } queryWrapper.eq(CostProjectTask::getIsDeleted, BaseConstant.NORMAL_STATUS); List list = this.list(queryWrapper);*/ return list; } @Override public IPage pageListForReviewTask(CostTaskReviewPageReq req) { // 获取当前用户 IUser currentUser = ContextUtil.getCurrentUser(); String currentUserId = currentUser.getUserId(); // 1. 先查询当前用户有权限的立项(负责人或项目组成员) LambdaQueryWrapper approvalQueryWrapper = new LambdaQueryWrapper<>(); approvalQueryWrapper.eq(CostProjectApproval::getIsDeleted, "0"); approvalQueryWrapper.and(wrapper -> wrapper .eq(CostProjectApproval::getLeaderId, currentUserId) .or(projectMembersWrapper -> { projectMembersWrapper.like(CostProjectApproval::getProjectMembers, currentUserId); }) ); List accessibleApprovals = costProjectApprovalManager.list(approvalQueryWrapper); // 如果没有权限的立项,返回空结果 if (accessibleApprovals.isEmpty()) { return new Page<>(req.getPageNum(), req.getPageSize()); } // 提取有权限的立项ID列表 List accessibleProjectIds = accessibleApprovals.stream() .map(CostProjectApproval::getProjectId) .distinct() .collect(java.util.stream.Collectors.toList()); // 2. 构建任务查询条件 LambdaQueryWrapper 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.getAuditedUnitName())) { queryWrapper.like(CostProjectTask::getAuditedUnitName, req.getAuditedUnitName()); } if (StringUtil.isNotEmpty(req.getStatus())) { queryWrapper.eq(CostProjectTask::getStatus, req.getStatus()); } if (StringUtil.isNotEmpty(req.getCurrentNode())) { // 如果指定了节点,按节点查询 queryWrapper.eq(CostProjectTask::getCurrentNode, req.getCurrentNode()); } else { // 如果没有指定节点,默认排除归档节点(待审核列表) queryWrapper.ne(CostProjectTask::getCurrentNode, NodeConstant.guidang.getNodeKey()); } // 按创建时间倒序排列 queryWrapper.orderByDesc(CostProjectTask::getCreateTime); // 创建分页对象并执行查询 Page page = new Page<>(req.getPageNum(), req.getPageSize()); IPage result = costProjectTaskManager.page(page, queryWrapper); // 填充根任务的子任务列表和流程信息 for (CostProjectTask rootTask : result.getRecords()) { // 查询子任务列表 LambdaQueryWrapper childQueryWrapper = new LambdaQueryWrapper<>(); childQueryWrapper.eq(CostProjectTask::getPid, rootTask.getId()) .eq(CostProjectTask::getIsDeleted, "0") .orderByAsc(CostProjectTask::getOrderNum); List childTasks = costProjectTaskManager.list(childQueryWrapper); for (CostProjectTask childTask : childTasks) { childTask.setStatusName(TaskStatusConstant.getStatusNameByCode(childTask.getStatus())); CostProjectApprovalDetailResp detail = costProjectApprovalManager.getDetail(childTask.getProjectId()); childTask.setCatalogId(detail.getCatalogId()); } rootTask.setStatusName(TaskStatusConstant.getStatusNameByCode(rootTask.getStatus())); rootTask.setChildTasks(childTasks); rootTask.setCurrentNodeName(NodeConstant.getNodeValueByKey(rootTask.getCurrentNode())); CostProjectApprovalDetailResp detail = costProjectApprovalManager.getDetail(rootTask.getProjectId()); rootTask.setCatalogId(detail.getCatalogId()); } return result; } @Override public IPage pageListForArchive(CostTaskReviewPageReq req) { // 获取当前用户 IUser currentUser = ContextUtil.getCurrentUser(); String currentUserId = currentUser.getUserId(); // 1. 先查询当前用户有权限的立项(负责人或项目组成员) LambdaQueryWrapper approvalQueryWrapper = new LambdaQueryWrapper<>(); approvalQueryWrapper.eq(CostProjectApproval::getIsDeleted, "0"); approvalQueryWrapper.and(wrapper -> wrapper .eq(CostProjectApproval::getLeaderId, currentUserId) .or(projectMembersWrapper -> { projectMembersWrapper.like(CostProjectApproval::getProjectMembers, currentUserId); }) ); List accessibleApprovals = costProjectApprovalManager.list(approvalQueryWrapper); // 如果没有权限的立项,返回空结果 if (accessibleApprovals.isEmpty()) { return new Page<>(req.getPageNum(), req.getPageSize()); } // 提取有权限的立项ID列表 List accessibleProjectIds = accessibleApprovals.stream() .map(CostProjectApproval::getProjectId) .distinct() .collect(java.util.stream.Collectors.toList()); // 2. 构建任务查询条件 LambdaQueryWrapper 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.getAuditedUnitName())) { queryWrapper.like(CostProjectTask::getAuditedUnitName, req.getAuditedUnitName()); } if (StringUtil.isNotEmpty(req.getStatus())) { queryWrapper.eq(CostProjectTask::getStatus, req.getStatus()); } // 根据是否归档字段过滤 if (StringUtil.isNotEmpty(req.getIsGd())) { queryWrapper.eq(CostProjectTask::getIsGd, req.getIsGd()); } // 按创建时间倒序排列 queryWrapper.orderByDesc(CostProjectTask::getCreateTime); // 创建分页对象并执行查询 Page page = new Page<>(req.getPageNum(), req.getPageSize()); IPage result = costProjectTaskManager.page(page, queryWrapper); // 只填充节点名称,不查询子任务 for (CostProjectTask rootTask : result.getRecords()) { 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) { // 1.校验内容是否填写完毕!t List costProjectTaskMaterials = costProjectTaskMaterialManager.listByTaskId(costTaskPageReq.getTaskId()); boolean c = costProjectTaskMaterials.stream() .filter(item ->"1".equals(item.getIsRequired())) .allMatch( item -> "1".equals(item.getIsUpload()) ); if (!c) { throw new RuntimeException("报送资料必填文件未全部填写完成!"); } List costSurveyTemplateUploads = costSurveyTemplateUploadManager.listByTaskId(costTaskPageReq.getTaskId()); boolean d = costSurveyTemplateUploads.stream() .filter(item ->"1".equals(item.getIsRequired())) .allMatch( item -> "1".equals(item.getIsUpload()) ); if (!d) { throw new RuntimeException("成本调查必填文件未全部填写完成!"); } // 2. 子流程状态改为审核中 CostProjectTask task = this.getById(costTaskPageReq.getTaskId()); task.setCurrentNode(NodeConstant.clcs.getNodeKey()); task.setStatus(TaskStatusConstant.AUDITING.getStatusCode()); this.updateById(task); return "任务提交成功,已进入材料初审阶段"; } @Override public String saveYjTask(CostProjectTaskPreliminaryOpinion costProjectTaskPreliminaryOpinion) { // 1.校验内容是否填写完毕!todo preliminaryOpinionManager.createOrUpdate(costProjectTaskPreliminaryOpinion); // 3. 子流程状态改为已反馈 CostProjectTask task = this.getById(costProjectTaskPreliminaryOpinion.getTaskId()); task.setStatus(TaskStatusConstant.FEEDBACKED.getStatusCode()); this.updateById(task); 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; case "6": // 退回上一步 resultMessage = backPreToSubmit(task, req); break; case "7": // 扭转下一步 resultMessage = toNextSubmit(task, req); break; default: return "未知的操作类型"; } return resultMessage; } /** * 通过,填写原因 修改状态 */ private String completeTask(CostProjectTask task) { CostProjectTask nTask = costProjectTaskManager.getById(task.getId()); if (nTask == null) { return "任务不存在"; } List children = costProjectTaskManager.list( new LambdaQueryWrapper() .eq(CostProjectTask::getPid, nTask.getId()) ); if (children.isEmpty()) { // 子任务 所有“是否必填”为“是”的资料“初审结果”均为“通过”. List costProjectTaskMaterials = costProjectTaskMaterialManager.listByTaskId(nTask.getId()); boolean c = costProjectTaskMaterials.stream() .filter(item -> "1".equals(item.getIsRequired())) .allMatch( item -> "1".equals(item.getAuditedStatus()) ); if (!c) { throw new RuntimeException("报送资料未全部通过!"); } List costSurveyTemplateUploads = costSurveyTemplateUploadManager.listByTaskId(nTask.getId()); boolean d = costSurveyTemplateUploads.stream() .filter(item -> "1".equals(item.getIsRequired())) .allMatch( item -> "1".equals(item.getAuditedStatus()) ); if (!d) { throw new RuntimeException("成本调查表未全部通过!"); } } else { // 主任务 boolean b = children.stream().noneMatch(child -> child.getStatus().equals(TaskStatusConstant.AUDITING.getStatusCode())); if (!b) { throw new RuntimeException("子任务未全部办理,主任务无法办结"); } } task.setStatus(TaskStatusConstant.COMPLETED.getStatusCode()); costProjectTaskManager.updateById(task); // 发送通知 String title = NodeConstant.getNodeValueByKey(task.getCurrentNode()) + "通过"; // 操作人 String content = "[" + NodeConstant.getNodeValueByKey(task.getCurrentNode()) + "]" + AuthenticationUtil.getCurrentUserFullname() + "已通过" + task.getAuditedUnitName() + "的项目(" + task.getProjectName() + ")"; String enterpriseId = task.getAuditedUnitId() == null ? "" : task.getAuditedUnitId(); String noticeSource = "系统"; String sendTarget = task.getCreateBy() == null ? "" : task.getCreateBy(); costNoticeManager.sendNotice(task.getProjectId(), task.getId(), "1", title, content, enterpriseId, noticeSource, sendTarget); return title; } /** * 退回,填写原因 修改状态 */ private String returnToSubmit(CostProjectTask task, CostTaskPageReq req) { switch (req.getProcessNodeKey()) { case "sdsh": throw new RuntimeException("当前节点无法退回"); default: // 通知内容组装 String title = NodeConstant.getNodeValueByKey(task.getCurrentNode()) + "退回"; String enterpriseId = task.getAuditedUnitId() == null ? "" : task.getAuditedUnitId(); String noticeSource = "系统"; String sendTarget = task.getCreateBy() == null ? "" : task.getCreateBy(); String content = "[" + NodeConstant.getNodeValueByKey(task.getCurrentNode()) + "]" + AuthenticationUtil.getCurrentUserFullname() + "已退回" + task.getAuditedUnitName() + "的项目(" + task.getProjectName() + ")"; costNoticeManager.sendNotice(task.getProjectId(), task.getId(), "1", title, content, enterpriseId, noticeSource, sendTarget); // 更新任务的当前节点和状态 task.setStatus(TaskStatusConstant.NOT_PASSED.getStatusCode()); costProjectTaskManager.updateById(task); return title; } } /** * 中止,填写原因 修改状态 */ private String suspendTask(CostProjectTask task, CostTaskPageReq req) { // 更新任务状态为中止/恢复 String status = req.getStatus() == null ? TaskStatusConstant.SUSPENDED.getStatusCode() : TaskStatusConstant.AUDITING.getStatusCode(); task.setStatus(status); costProjectTaskManager.updateById(task); // 通知内容组装 String title = NodeConstant.getNodeValueByKey(task.getCurrentNode()) + TaskStatusConstant.getStatusNameByCode(status); String content = "[" + NodeConstant.getNodeValueByKey(task.getCurrentNode()) + "]" + AuthenticationUtil.getCurrentUserFullname() + "已" + TaskStatusConstant.getStatusNameByCode(status) + task.getAuditedUnitName() + "的项目(" + task.getProjectName() + ")"; String enterpriseId = task.getAuditedUnitId() == null ? "" : task.getAuditedUnitId(); String noticeSource = "系统"; String sendTarget = task.getCreateBy() == null ? "" : task.getCreateBy(); costNoticeManager.sendNotice(task.getProjectId(), task.getId(), "1", title, content, enterpriseId, noticeSource, sendTarget); return title; } /** * 补充材料,发送通知+修改任务状态 */ private String supplementMaterial(CostProjectTask task, CostTaskPageReq req) { String currentNode = task.getCurrentNode(); String title = NodeConstant.getNodeValueByKey(currentNode) + TaskStatusConstant.BCCL.getStatusName(); String noticeSource = "系统"; switch (currentNode) { // 集体审议节点:支持指定多个子任务补充材料 case "jtsy": if (StringUtil.isNotEmpty(req.getChildTaskId())) { String[] childTaskIdArray = req.getChildTaskId().split(","); List unitNames = new java.util.ArrayList<>(); for (String childTaskId : childTaskIdArray) { CostProjectTask childTask = costProjectTaskManager.getById(childTaskId); if (childTask == null) { throw new RuntimeException("子任务不存在:" + childTaskId); } // 验证子任务是否属于当前主任务 if (!childTask.getPid().equals(task.getId())) { throw new RuntimeException("子任务不属于当前主任务:" + childTaskId); } // 更新子任务状态为补充材料 childTask.setStatus(TaskStatusConstant.BCCL.getStatusCode()); costProjectTaskManager.updateById(childTask); // 通知内容组装(针对子任务对应的单位) String childContent = "[" + NodeConstant.getNodeValueByKey(task.getCurrentNode()) + "]" + AuthenticationUtil.getCurrentUserFullname() + "要求" + childTask.getAuditedUnitName() + "补充材料,项目(" + task.getProjectName() + ")"; String childEnterpriseId = childTask.getAuditedUnitId() == null ? "" : childTask.getAuditedUnitId(); String childSendTarget = childTask.getCreateBy() == null ? "" : childTask.getCreateBy(); costNoticeManager.sendNotice(task.getProjectId(), task.getId(), "1", title, childContent, childEnterpriseId, noticeSource, childSendTarget); // 收集单位名称 if (StringUtil.isNotEmpty(childTask.getAuditedUnitName())) { unitNames.add(childTask.getAuditedUnitName()); } } // 返回结果,包含所有单位名称 String unitNamesStr = unitNames.isEmpty() ? "" : String.join("、", unitNames); return title + "(单位:" + unitNamesStr + ")"; } default: task.setStatus(TaskStatusConstant.BCCL.getStatusCode()); costProjectTaskManager.updateById(task); String content = "[" + NodeConstant.getNodeValueByKey(task.getCurrentNode()) + "]" + AuthenticationUtil.getCurrentUserFullname() + "要求" + task.getAuditedUnitName() + "补充材料,项目(" + task.getProjectName() + ")"; String enterpriseId = task.getAuditedUnitId() == null ? "" : task.getAuditedUnitId(); String sendTarget = task.getCreateBy() == null ? "" : task.getCreateBy(); costNoticeManager.sendNotice(task.getProjectId(), task.getId(), "1", title, content, enterpriseId, noticeSource, sendTarget); return title; } } /** * 退回上一步,填写原因 修改状态和节点 */ private String backPreToSubmit(CostProjectTask task, CostTaskPageReq req) { CostProjectTask nTask = costProjectTaskManager.getById(task.getId()); if (nTask == null || !nTask.getPid().equals("0")) { throw new RuntimeException("当前节点无法退回"); } // 获取退回后的上一节点 NodeConstant prevNode = NodeConstant.getPrevNode(nTask.getCurrentNode()); if (prevNode == null) { throw new RuntimeException("当前节点已是第一步,无法退回"); } String prevNodeStatus = prevNode.getNodeKey(); // 主任务退回上一步 nTask.setStatus(TaskStatusConstant.AUDITING.getStatusCode()); nTask.setCurrentNode(prevNodeStatus); costProjectTaskManager.updateById(nTask); // 子任务都要退回,并根据退回后的节点设置正确的状态 List children = costProjectTaskManager.list( new LambdaQueryWrapper() .eq(CostProjectTask::getPid, nTask.getId()) .eq(CostProjectTask::getIsDeleted, "0") ); // 根据退回后的节点,设置子任务状态(参考completeTask的逻辑) String childStatus = ""; switch (prevNodeStatus) { case "yjfk": childStatus = TaskStatusConstant.WAIT_FEEDBACK.getStatusCode(); break; case "cjbg": case "jtsy": childStatus = TaskStatusConstant.COMPLETED.getStatusCode(); break; default: childStatus = TaskStatusConstant.AUDITING.getStatusCode(); break; } for (CostProjectTask child : children) { child.setStatus(childStatus); child.setCurrentNode(prevNodeStatus); costProjectTaskManager.updateById(child); } // 通知内容组装 String title = NodeConstant.getNodeValueByKey(prevNodeStatus) + "退回上一步"; String enterpriseId = task.getAuditedUnitId() == null ? "" : task.getAuditedUnitId(); String noticeSource = "系统"; String sendTarget = task.getCreateBy() == null ? "" : task.getCreateBy(); costNoticeManager.sendNotice(task.getProjectId(), task.getId(), "1", title, req.getContent(), enterpriseId, noticeSource, sendTarget); return title; } /** * 扭转下一步,填写原因 修改状态和节点 */ private String toNextSubmit(CostProjectTask task, CostTaskPageReq req) { CostProjectTask nTask = costProjectTaskManager.getById(task.getId()); if (nTask == null || !nTask.getPid().equals("0")) { throw new RuntimeException("当前节点无法扭转"); } if (!task.getStatus().equals(TaskStatusConstant.COMPLETED.getStatusCode())) { throw new RuntimeException("请办结任务后,在进行扭转下一步"); } // 子任务都办结才可以扭转 List children = costProjectTaskManager.list( new LambdaQueryWrapper() .eq(CostProjectTask::getPid, nTask.getId()) ); boolean b = children.stream().noneMatch( child -> child.getStatus().equals(TaskStatusConstant.AUDITING.getStatusCode())); if (!b) { throw new RuntimeException("子任务未全部办结,主任务无法扭转"); } // 将当前任务置为办结 String nextNodeStatus = NodeConstant.getNextNode(nTask.getCurrentNode()).getNodeKey(); task.setStatus(TaskStatusConstant.AUDITING.getStatusCode()); task.setCurrentNode(nextNodeStatus); nTask.setIsGd("0"); costProjectTaskManager.updateById(task); // 如果所有子任务都办结,则将父子任务都扭转 String status = ""; switch (nextNodeStatus) { case "yjfk": status = TaskStatusConstant.WAIT_FEEDBACK.getStatusCode(); break; case "jtsy": status = TaskStatusConstant.COMPLETED.getStatusCode(); break; default: status = TaskStatusConstant.AUDITING.getStatusCode(); break; } for (CostProjectTask child : children) { if (!child.getStatus().equals(TaskStatusConstant.SUSPENDED.getStatusCode())) { child.setStatus(status); child.setCurrentNode(nextNodeStatus); costProjectTaskManager.updateById(child); } } // 通知内容组装 String title = NodeConstant.getNodeValueByKey(task.getCurrentNode()) + "扭转至下一步"; String enterpriseId = task.getAuditedUnitId() == null ? "" : task.getAuditedUnitId(); String noticeSource = "系统"; String sendTarget = task.getCreateBy() == null ? "" : task.getCreateBy(); costNoticeManager.sendNotice(task.getProjectId(), task.getId(), "1", title, req.getContent(), enterpriseId, noticeSource, sendTarget); return title; } @Override public Integer countForReviewTask(CostTaskReviewPageReq req) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(CostProjectTask::getIsDeleted, "0") .eq(CostProjectTask::getPid, "0") ; if (StringUtil.isNotEmpty(req.getCurrentNode())) { queryWrapper.eq(CostProjectTask::getCurrentNode, req.getCurrentNode()); } else { queryWrapper.ne(CostProjectTask::getCurrentNode, NodeConstant.guidang.getNodeKey()); } return costProjectTaskManager.count(queryWrapper); } }