diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/controller/TodoCenterController.java b/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/controller/TodoCenterController.java index 58a090c..cf31e16 100644 --- a/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/controller/TodoCenterController.java +++ b/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/controller/TodoCenterController.java @@ -5,8 +5,8 @@ import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import com.ningdatech.pmapi.todocenter.bean.vo.ProcessProgressDetailVo; -import com.ningdatech.pmapi.todocenter.model.dto.req.ReqProcessHandlerDTO; import com.ningdatech.pmapi.todocenter.model.dto.req.ToBeProcessedExportReq; +import com.wflow.workflow.bean.dto.ReqProcessHandlerDTO; import org.springframework.web.bind.annotation.*; import com.ningdatech.basic.model.PageVo; import com.ningdatech.pmapi.todocenter.manage.TodoCenterManage; diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/manage/TodoCenterManage.java b/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/manage/TodoCenterManage.java index 2131c7a..c48e2e6 100644 --- a/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/manage/TodoCenterManage.java +++ b/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/manage/TodoCenterManage.java @@ -1,9 +1,7 @@ package com.ningdatech.pmapi.todocenter.manage; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ningdatech.basic.exception.BizException; import com.ningdatech.basic.model.PageVo; @@ -25,9 +23,6 @@ import com.ningdatech.pmapi.projectlib.service.IProjectService; import com.ningdatech.pmapi.todocenter.bean.entity.WorkNoticeInfo; import com.ningdatech.pmapi.todocenter.bean.vo.ProcessProgressDetailVo; import com.ningdatech.pmapi.todocenter.enumeration.IsAppendProjectEnum; -import com.ningdatech.pmapi.todocenter.extension.cmd.BackToHisApprovalNodeCmd; -import com.ningdatech.pmapi.todocenter.extension.cmd.SaveCommentCmd; -import com.ningdatech.pmapi.todocenter.model.dto.req.ReqProcessHandlerDTO; import com.ningdatech.pmapi.todocenter.model.dto.req.ToBeProcessedReq; import com.ningdatech.pmapi.todocenter.model.dto.req.ToBeProcessedExportReq; import com.ningdatech.pmapi.todocenter.model.dto.vo.ResToBeProcessedVO; @@ -36,34 +31,20 @@ import com.ningdatech.pmapi.user.entity.UserInfo; import com.ningdatech.pmapi.user.service.IUserInfoService; import com.ningdatech.pmapi.user.util.LoginUserUtil; import com.ningdatech.zwdd.client.ZwddClient; -import com.wflow.bean.entity.WflowModels; import com.wflow.contants.HisProInsEndActId; -import com.wflow.exception.BusinessException; -import com.wflow.mapper.WflowCcTasksMapper; -import com.wflow.mapper.WflowModelHistorysMapper; import com.wflow.workflow.bean.dto.ProcessInstanceUserDto; -import com.wflow.workflow.bean.process.ProcessComment; +import com.wflow.workflow.bean.dto.ReqProcessHandlerDTO; import com.wflow.workflow.bean.process.ProgressNode; import com.wflow.workflow.bean.vo.ProcessInstanceVo; import com.wflow.workflow.bean.vo.ProcessProgressVo; import com.wflow.workflow.bean.vo.ProcessTaskVo; -import com.wflow.workflow.enums.ProcessHandlerEnum; import com.wflow.workflow.enums.ProcessStatusEnum; import com.wflow.workflow.service.*; -import com.wflow.workflow.service.FormService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.assertj.core.util.Lists; -import org.assertj.core.util.Maps; -import org.flowable.bpmn.model.*; import org.flowable.engine.*; -import org.flowable.engine.history.HistoricActivityInstance; import org.flowable.engine.history.HistoricProcessInstance; -import org.flowable.engine.runtime.ActivityInstance; -import org.flowable.engine.runtime.Execution; -import org.flowable.engine.task.Comment; -import org.flowable.task.api.Task; -import org.flowable.task.api.history.HistoricTaskInstance; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletResponse; @@ -87,15 +68,7 @@ public class TodoCenterManage { private final TaskService taskService; private final ProcessTaskService processTaskService; - private final RepositoryService repositoryService; - private final RuntimeService runtimeService; - private final FormService formService; - private final ManagementService managementService; private final HistoryService historyService; - private final WflowModelHistorysMapper modelHistorysMapper; - private final ProcessNodeCatchService nodeCatchService; - private final WflowCcTasksMapper ccTasksMapper; - private final ProcessModelService processModelService; private final IUserInfoService userInfoService; private final IProjectService projectService; @@ -209,91 +182,164 @@ public class TodoCenterManage { String processInstanceId = param.getInstanceId(); Long projectId = param.getProjectId(); + // 获取当前申报项目 + Project declaredProject = projectService.getOne(Wrappers.lambdaQuery(Project.class) + .eq(Project::getInstCode, processInstanceId) + .eq(Project::getId,projectId)); + // 获取当前项目名称 + String projectName = declaredProject.getProjectName(); + // 获取当前项目状态 + Integer projectStatus = declaredProject.getStatus(); + // 获取当前未处理流程详情 + ProcessProgressVo currentInstanceDetail = processInstanceService.getProgressInstanceDetail(null, processInstanceId); + // 获取当前未处理流程状态 + String currentProcessStatus = currentInstanceDetail.getStatus(); + // 获取当前要处理的流程实例 HistoricProcessInstance instance = historyService.createHistoricProcessInstanceQuery() .processInstanceId(processInstanceId) .singleResult(); // 获取流程发起人信息 String startUserId = instance.getStartUserId(); - ProcessInstanceUserDto startUser = userInfoService.getUserInfo(startUserId); - - // 若进行的是撤回操作(流程发起人和当前流程审核人的前一个审核人操作) - if (param.getAction().equals(ProcessHandlerEnum.WITHDRAW)) { - // 当前登录用户是流程发起人 - if (userId.equals(Long.valueOf(startUser.getUserId()))){ - // processTaskService.handleTask(param, userId); - // 获取当前申报项目 - Project declaredProject = projectService.getOne(Wrappers.lambdaQuery(Project.class) - .eq(Project::getInstCode, processInstanceId) - .eq(Project::getId,projectId)); - // 获取当前项目状态 - Integer projectStatus = declaredProject.getStatus(); - // TODO 若是流程发起人点击撤回,项目回到上一个状态,并删除当前审核人对应的待办记录 - // 若是流程发起人点击撤回,项目回到上一个状态,需调用状态机更新项目状态,流程状态更新为审核通过 - switch (Objects.requireNonNull(ProjectStatusEnum.getValue(projectStatus))) { - // 当前项目状态是单位内部审核中 - case UNDER_INTERNAL_AUDIT: - // 当前项目状态是预审中 - case PRE_APPLYING: - // 当前项目状态是部门联审中 - case DEPARTMENT_JOINT_REVIEW: - // 当前项目状态是方案评审中 - case SCHEME_UNDER_REVIEW: - // 当前项目状态是终验审核中 - case FINAL_ACCEPTANCE_IS_UNDER_REVIEW: - updateWithdrawProjectStatus(userId, declaredProject); - break; - default: - throw new IllegalStateException("Unexpected value: " + projectStatus); - } - }else { - // 当前登录用户不是流程发起人 - ProcessProgressVo progressInstanceDetail = processInstanceService - .getProgressInstanceDetail(null, processInstanceId); - List progressInfo = progressInstanceDetail.getProgressInfo(); - // 获取当前当前工作流任务前一个审核人信息 - ProgressNode beforeProgressNode = progressInfo.get(progressInfo.size() - 2); - ProcessInstanceUserDto beforeUser = beforeProgressNode.getUser(); - // 获取当前当前工作流任务当前审核人信息 - ProgressNode currentProgressNode = progressInfo.get(progressInfo.size() - 1); - ProcessInstanceUserDto currentUser = currentProgressNode.getUser(); - // 判断当前工作流任务前一个审核人的部门和当前登录用户的部门是否是同一个,如果是同一个才可以撤回,否则抛出异常 - - Boolean orgFlag = true; - // processTaskService.handleTask(param, userId); - } - HistoricTaskInstance handledTaskInstance = historyService.createHistoricTaskInstanceQuery() - .taskId(param.getTaskId()) - .singleResult(); - doWithDrawProcess(handledTaskInstance, userId, projectId); - return; - } - Task task = taskService.createTaskQuery().taskId(param.getTaskId()).active().singleResult(); - HashMap formData = new HashMap<>(32); - if (Objects.isNull(task)) { - throw new BizException("任务不存在"); - } + UserInfo startUserInfo = userInfoService.getById(Long.valueOf(startUserId)); + // 获取流程定义名称 + String processDefinitionName = instance.getProcessDefinitionName(); + switch (param.getAction()) { // 通过 case PASS: - formService.updateInstanceFormData(param.getInstanceId(), formData); - doPass(task, userId, param); + // 通过该任务,流程到下一审核人处 + processTaskService.handleTask(param, userId); + // 获取流程通过后的流程实例 + HistoricProcessInstance newInstance = historyService.createHistoricProcessInstanceQuery() + .processInstanceId(processInstanceId) + .singleResult(); + // 获取流程通过后当前流程详情 + ProcessProgressVo newInstanceDetail = processInstanceService.getProgressInstanceDetail(null, processInstanceId); + // 获取流程通过后当前审核人信息,向其发送工作通知 + List newProgressInfo = newInstanceDetail.getProgressInfo(); + ProgressNode currentNode = newProgressInfo.get(newProgressInfo.size() - 1); + UserInfo auditUserInfo = userInfoService.getById(Long.valueOf(currentNode.getUserId())); + + // 如果流程状态是被退回状态,流程通过后,进入下一个审核人, + // 当前通过审核人一定不是最后一个审核人(下一个审核人至多是最后一个),更新流程状态为审核中 + if (ProcessStatusEnum.BE_BACKED.getCode().equals(currentProcessStatus)) { + // 更新流程状态为审核中 + declaredProject.setProcessStatus(ProcessStatusEnum.UNDER_REVIEW.getCode()); + declaredProject.setUpdateOn(LocalDateTime.now()); + declaredProject.setUpdateBy(userId); + projectService.updateById(declaredProject); + // 获取发送浙政钉工作通知必要信息 + WorkNoticeInfo passWorkNoticeInfo = getSendWorkNoticeInfo(auditUserInfo); + String passMsg = String.format(PASS_MSG_TEMPLATE, null, projectName); + // zwddClient.sendWorkNotice(passWorkNoticeInfo.getReceiverUserId(),passWorkNoticeInfo.getBizMsgId(),passMsg); + return; + } + // 若不是被退回状态,流程通过后,判断当前登录用户是不是最后一个审核人 + + // TODO 若当前流程是预审流程,需要在提交预审申报的时候,调用状态机判断申报后的项目状态, + // 若是省级部门联审中,要对接外部接口,获取省级部门联审的结果,更新项目状态(预审申报提交的时候处理) + + // 若当前登录用户是最后一个审批人,需更新流程状态为审核完成,项目状态到下个状态 + // 并向流程发起人发送浙政钉工作通知:【项目名称】已通过【流程名称】,请及时开始下一步操作。 + if (HisProInsEndActId.END.equals(newInstance.getEndActivityId())) { + switch (Objects.requireNonNull(ProjectStatusEnum.getValue(projectStatus))) { + // 当前项目状态是单位内部审核中 + case UNDER_INTERNAL_AUDIT: + // 当前项目状态是预审中 + case PRE_APPLYING: + // 当前项目状态是部门联审中 + case DEPARTMENT_JOINT_REVIEW: + // 当前项目状态是方案评审中 + case SCHEME_UNDER_REVIEW: + // 当前项目状态是终验审核中 + case FINAL_ACCEPTANCE_IS_UNDER_REVIEW: + updatePassProjectStatus(userId, declaredProject); + break; + default: + throw new IllegalStateException("Unexpected value: " + projectStatus); + } + WorkNoticeInfo passWorkNoticeInfo2 = getSendWorkNoticeInfo(startUserInfo); + String passMsg2 = String.format(PASS_MSG_TEMPLATE2, projectName, processDefinitionName); + // zwddClient.sendWorkNotice(passWorkNoticeInfo2.getReceiverUserId(),passWorkNoticeInfo2.getBizMsgId(),passMsg2); + }else { + // 若有下一个审核人(当前节点的用户), + // 向其发送浙政钉工作通知:标题:审核任务 内容:【单位名称】的【项目名称】需要您审核。 + // 获取发送浙政钉工作通知必要信息 + WorkNoticeInfo sendWorkNoticeInfo = getSendWorkNoticeInfo(auditUserInfo); + String msg = String.format(PASS_MSG_TEMPLATE, null, projectName); + // zwddClient.sendWorkNotice(sendWorkNoticeInfo.getReceiverUserId(),sendWorkNoticeInfo.getBizMsgId(),msg); + } break; // 盖章并通过 case SEAL_PASS: - formService.updateInstanceFormData(param.getInstanceId(), formData); - doSealPass(task, userId, param); + // 通过该任务,流程到下一审核人处 + processTaskService.handleTask(param, userId); break; // 驳回 case REJECT: - formService.updateInstanceFormData(param.getInstanceId(), formData); - doReject(task, userId, param); + // 驳回该任务,中止流程并使项目进入对应状态,给项目创建人、流程发起人发送浙政钉工作通知: + // 【项目名称】的【流程名称】被驳回,请及时处理。 + processTaskService.handleTask(param, userId); + WorkNoticeInfo rejectWorkNoticeInfo = getSendWorkNoticeInfo(startUserInfo); + String rejectMsg = String.format(REJECT_MSG_TEMPLATE, projectName, processDefinitionName); + zwddClient.sendWorkNotice(rejectWorkNoticeInfo.getReceiverUserId(),rejectWorkNoticeInfo.getBizMsgId(),rejectMsg); + // 更新项目状态和流程状态 + updateRejectProjectStatus(userId, declaredProject); break; // 退回 case BACK: - formService.updateInstanceFormData(param.getInstanceId(), formData); - doBackTask(task, userId, param); + // 退回该任务 + processTaskService.handleTask(param, userId); + // 更新申报项目表中的流程状态为被退回 + declaredProject.setProcessStatus(ProcessStatusEnum.BE_BACKED.getCode()); + declaredProject.setUpdateOn(LocalDateTime.now()); + declaredProject.setUpdateBy(userId); + projectService.updateById(declaredProject); + // 给项目创建人、流程发起人发送浙政钉工作通知:【项目名称】的【流程名称】被退回,请及时处理。 + WorkNoticeInfo backWorkNoticeInfo = getSendWorkNoticeInfo(startUserInfo); + String backMsg = String.format(BACK_MSG_TEMPLATE, projectName, processDefinitionName); + zwddClient.sendWorkNotice(backWorkNoticeInfo.getReceiverUserId(),backWorkNoticeInfo.getBizMsgId(),backMsg); break; + // 撤回(流程发起人和当前流程审核人的前一个审核人操作) + case WITHDRAW: + // 当前登录用户是流程发起人 + if (userId.equals(Long.valueOf(startUserId))){ + processTaskService.handleTask(param, userId); + // 若是流程发起人点击撤回,项目回到上一个状态,需调用状态机更新项目状态,流程状态更新为审核通过 + switch (Objects.requireNonNull(ProjectStatusEnum.getValue(projectStatus))) { + // 当前项目状态是单位内部审核中 + case UNDER_INTERNAL_AUDIT: + // 当前项目状态是预审中 + case PRE_APPLYING: + // 当前项目状态是部门联审中 + case DEPARTMENT_JOINT_REVIEW: + // 当前项目状态是方案评审中 + case SCHEME_UNDER_REVIEW: + // 当前项目状态是终验审核中 + case FINAL_ACCEPTANCE_IS_UNDER_REVIEW: + updateWithdrawProjectStatus(userId, declaredProject); + break; + default: + throw new IllegalStateException("Unexpected value: " + projectStatus); + } + }else { + // 当前登录用户不是流程发起人 + List currentProgressInfo = currentInstanceDetail.getProgressInfo(); + // 获取当前工作流任务前一个审核人信息 + ProgressNode beforeProgressNode = currentProgressInfo.get(currentProgressInfo.size() - 2); + ProcessInstanceUserDto beforeUser = beforeProgressNode.getUser(); + // 获取当前当前工作流任务当前审核人信息 + ProgressNode currentProgressNode = currentProgressInfo.get(currentProgressInfo.size() - 1); + ProcessInstanceUserDto currentUser = currentProgressNode.getUser(); + // 判断当前工作流任务前一个审核人的部门和当前登录用户的部门是否是同一个,如果是同一个才可以撤回,否则抛出异常 + boolean orgFlag = currentUser.getOrgCode().equals(beforeUser.getOrgCode()); + if (!orgFlag) { + throw new BizException("下一个审核人和您不是同一个部门,无法撤回!"); + } else { + processTaskService.handleTask(param, userId); + } + } default: throw new IllegalStateException("Unexpected value: " + param.getAction()); } @@ -306,39 +352,39 @@ public class TodoCenterManage { * @param userId * @param param 参数 */ - private void doReject(Task task, Long userId, ReqProcessHandlerDTO param) { - // 获取当前申报项目 - Project declaredProject = projectService.getOne(Wrappers.lambdaQuery(Project.class) - .eq(Project::getInstCode, task.getProcessInstanceId()) - .eq(Project::getId,param.getProjectId())); - String projectName = declaredProject.getProjectName(); - - Map var = new HashMap<>(16); - var.put("approve_" + task.getId(), param.getAction()); - // 保存审核意见 - if (hasComment(param.getAuditInfo())) { - // 执行自定义的保存评论的功能 - managementService.executeCommand(new SaveCommentCmd(param.getTaskId(), param.getInstanceId(), - String.valueOf(userId), JSONObject.toJSONString(param.getAuditInfo()))); - } - // 获取bpm对象 - BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId()); - // 获取根节点即流程发起节点 - FlowNode rootNode = (FlowNode) bpmnModel.getFlowElement("root"); - // TODO 中止流程并使项目进入对应状态,给项目创建人、 - // 流程发起人发送浙政钉工作通知:【项目名称】的【流程名称】被驳回,请及时处理。 - String startUserId = getRootUserId(rootNode, task.getProcessInstanceId()); - // 获取浙政钉用户ID - UserInfo auditUserInfo = userInfoService.getById(Long.valueOf(startUserId)); - WorkNoticeInfo sendWorkNoticeInfo = getSendWorkNoticeInfo(auditUserInfo); - WflowModels wflowModels = getLastWflowModels(task); - String formName = wflowModels.getFormName(); - String msg = String.format(REJECT_MSG_TEMPLATE, projectName, formName); - zwddClient.sendWorkNotice(sendWorkNoticeInfo.getReceiverUserId(),sendWorkNoticeInfo.getBizMsgId(),msg); - // 更新项目状态和流程状态 - updateRejectProjectStatus(userId, declaredProject); - taskService.complete(param.getTaskId(), var); - } + //private void doReject(Task task, Long userId, ReqProcessHandlerDTO param) { + // // 获取当前申报项目 + // Project declaredProject = projectService.getOne(Wrappers.lambdaQuery(Project.class) + // .eq(Project::getInstCode, task.getProcessInstanceId()) + // .eq(Project::getId,param.getProjectId())); + // String projectName = declaredProject.getProjectName(); + // + // Map var = new HashMap<>(16); + // var.put("approve_" + task.getId(), param.getAction()); + // // 保存审核意见 + // if (hasComment(param.getAuditInfo())) { + // // 执行自定义的保存评论的功能 + // managementService.executeCommand(new SaveCommentCmd(param.getTaskId(), param.getInstanceId(), + // String.valueOf(userId), JSONObject.toJSONString(param.getAuditInfo()))); + // } + // // 获取bpm对象 + // BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId()); + // // 获取根节点即流程发起节点 + // FlowNode rootNode = (FlowNode) bpmnModel.getFlowElement("root"); + // // TODO 中止流程并使项目进入对应状态,给项目创建人、 + // // 流程发起人发送浙政钉工作通知:【项目名称】的【流程名称】被驳回,请及时处理。 + // String startUserId = getRootUserId(rootNode, task.getProcessInstanceId()); + // // 获取浙政钉用户ID + // UserInfo auditUserInfo = userInfoService.getById(Long.valueOf(startUserId)); + // WorkNoticeInfo sendWorkNoticeInfo = getSendWorkNoticeInfo(auditUserInfo); + // WflowModels wflowModels = getLastWflowModels(task); + // String formName = wflowModels.getFormName(); + // String msg = String.format(REJECT_MSG_TEMPLATE, projectName, formName); + // zwddClient.sendWorkNotice(sendWorkNoticeInfo.getReceiverUserId(),sendWorkNoticeInfo.getBizMsgId(),msg); + // // 更新项目状态和流程状态 + // updateRejectProjectStatus(userId, declaredProject); + // taskService.complete(param.getTaskId(), var); + //} /** * 当为驳回操作时,更新项目表中的项目状态 @@ -376,15 +422,15 @@ public class TodoCenterManage { * @author CMM * @since 2023/02/01 17:30 */ - private WflowModels getLastWflowModels(Task task) { - WflowModels wflowModels = processModelService.getOne( - Wrappers.lambdaQuery(WflowModels.class).eq(WflowModels::getProcessDefId, task.getProcessDefinitionId())); - if (ObjectUtil.isNull(wflowModels)) { - log.warn("流程{}不存在", wflowModels.getFormId()); - throw new BusinessException("不存在该表单"); - } - return wflowModels; - } + //private WflowModels getLastWflowModels(Task task) { + // WflowModels wflowModels = processModelService.getOne( + // Wrappers.lambdaQuery(WflowModels.class).eq(WflowModels::getProcessDefId, task.getProcessDefinitionId())); + // if (ObjectUtil.isNull(wflowModels)) { + // log.warn("流程{}不存在", wflowModels.getFormId()); + // throw new BusinessException("不存在该表单"); + // } + // return wflowModels; + //} /** * 审批任务:盖章并通过 @@ -393,26 +439,26 @@ public class TodoCenterManage { * @param userId * @param param 参数 */ - private void doSealPass(Task task, Long userId, ReqProcessHandlerDTO param) { - String processInstanceId = task.getProcessInstanceId(); - // 获取当前申报项目 - Project declaredProject = projectService - .getOne(Wrappers.lambdaQuery(Project.class).eq(Project::getInstCode, task.getProcessInstanceId())); - String projectName = declaredProject.getProjectName(); - - Map var = new HashMap<>(16); - var.put("approve_" + task.getId(), param.getAction()); - // 保存审核意见 - if (hasComment(param.getAuditInfo())) { - // 执行自定义的保存评论的功能 - managementService.executeCommand(new SaveCommentCmd(param.getTaskId(), param.getInstanceId(), - String.valueOf(userId), JSONObject.toJSONString(param.getAuditInfo()))); - } - // TODO 判断项目申报单位级别,区县单位申报有上级主管单位意见栏,市级单位没有 - - // TODO 市级单位:为大数据局;区县单位:为大数据中心(根据附件区分?) - taskService.complete(param.getTaskId(), var); - } + //private void doSealPass(Task task, Long userId, ReqProcessHandlerDTO param) { + // String processInstanceId = task.getProcessInstanceId(); + // // 获取当前申报项目 + // Project declaredProject = projectService + // .getOne(Wrappers.lambdaQuery(Project.class).eq(Project::getInstCode, task.getProcessInstanceId())); + // String projectName = declaredProject.getProjectName(); + // + // Map var = new HashMap<>(16); + // var.put("approve_" + task.getId(), param.getAction()); + // // 保存审核意见 + // if (hasComment(param.getAuditInfo())) { + // // 执行自定义的保存评论的功能 + // managementService.executeCommand(new SaveCommentCmd(param.getTaskId(), param.getInstanceId(), + // String.valueOf(userId), JSONObject.toJSONString(param.getAuditInfo()))); + // } + // // TODO 判断项目申报单位级别,区县单位申报有上级主管单位意见栏,市级单位没有 + // + // // TODO 市级单位:为大数据局;区县单位:为大数据中心(根据附件区分?) + // taskService.complete(param.getTaskId(), var); + //} /** * 审批任务:通过 @@ -420,100 +466,100 @@ public class TodoCenterManage { * @param userId * @param param 参数 */ - private void doPass(Task task, Long userId, ReqProcessHandlerDTO param) { - String processInstanceId = task.getProcessInstanceId(); - // 获取当前申报项目 - Project declaredProject = projectService.getOne(Wrappers.lambdaQuery(Project.class) - .eq(Project::getInstCode, task.getProcessInstanceId()) - .eq(Project::getId,param.getProjectId())); - String projectName = declaredProject.getProjectName(); - - Map var = new HashMap<>(16); - var.put("approve_" + task.getId(), param.getAction()); - // 保存审核意见 - if (hasComment(param.getAuditInfo())) { - // 执行自定义的保存评论的功能 - managementService.executeCommand(new SaveCommentCmd(param.getTaskId(), param.getInstanceId(), - String.valueOf(userId), JSONObject.toJSONString(param.getAuditInfo()))); - } - // 如果流程状态是被退回状态,流程通过后,进入下一个审核人,当前通过审核人一定不是最后一个审核人(下一个审核人至多是最后一个),更新流程状态为审核中 - if (ProcessStatusEnum.BE_BACKED.getCode().equals(declaredProject.getProcessStatus())) { - // 通过该任务,流程到下一审核人处 - taskService.complete(param.getTaskId(), var); - // 更新流程状态为审核中 - declaredProject.setProcessStatus(ProcessStatusEnum.UNDER_REVIEW.getCode()); - declaredProject.setUpdateOn(LocalDateTime.now()); - declaredProject.setUpdateBy(userId); - projectService.updateById(declaredProject); - // 获取此时待审核任务 - Task currentTask = taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult(); - // 获取审核人信息,向审核人发送工作通知 - String currentUserId = currentTask.getAssignee(); - UserInfo auditUserInfo = userInfoService.getById(Long.valueOf(currentUserId)); - // 获取发送浙政钉工作通知必要信息 - WorkNoticeInfo sendWorkNoticeInfo = getSendWorkNoticeInfo(auditUserInfo); - String msg = String.format(PASS_MSG_TEMPLATE, null, projectName); - zwddClient.sendWorkNotice(sendWorkNoticeInfo.getReceiverUserId(),sendWorkNoticeInfo.getBizMsgId(),msg); - return; - } - // 获取bpm对象 - BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId()); - // 若不是被退回项目,传节点定义key 获取当前节点 - FlowNode currentNode = (FlowNode) bpmnModel.getFlowElement(task.getTaskDefinitionKey()); - // TODO 若当前流程是预审流程,需要在提交预审申报的时候,调用状态机判断申报后的项目状态, - // 若是省级部门联审中,要对接外部接口,获取省级部门联审的结果,更新项目状态(预审申报提交的时候处理) - // 需要先通过后才能有下一个节点的信息 - taskService.complete(param.getTaskId(), var); - // 获取当前项目状态 - Integer status = declaredProject.getStatus(); - // 若当前登录用户是最后一个审批人,需更新流程状态为审核完成,项目状态到下个状态 - // 并向流程发起人发送浙政钉工作通知:【项目名称】已通过【流程名称】,请及时开始下一步操作。 - HistoricProcessInstance instance = historyService - .createHistoricProcessInstanceQuery() - .processInstanceId(processInstanceId) - .singleResult(); - if (HisProInsEndActId.END.equals(instance.getEndActivityId())) { - switch (Objects.requireNonNull(ProjectStatusEnum.getValue(status))) { - // 当前项目状态是单位内部审核中 - case UNDER_INTERNAL_AUDIT: - // 当前项目状态是预审中 - case PRE_APPLYING: - // 当前项目状态是部门联审中 - case DEPARTMENT_JOINT_REVIEW: - // 当前项目状态是方案评审中 - case SCHEME_UNDER_REVIEW: - // 当前项目状态是终验审核中 - case FINAL_ACCEPTANCE_IS_UNDER_REVIEW: - updatePassProjectStatus(userId, declaredProject); - break; - default: - throw new IllegalStateException("Unexpected value: " + status); - } - } - // 若有下一个审核人(当前节点的用户), - // 向其发送浙政钉工作通知:标题:审核任务 内容:【单位名称】的【项目名称】需要您审核。 - String nextUserId = getNextUserId(currentNode, processInstanceId); - if (Objects.nonNull(nextUserId)) { - // 获取浙政钉用户ID - UserInfo auditUserInfo = userInfoService.getById(Long.valueOf(nextUserId)); - WorkNoticeInfo sendWorkNoticeInfo = getSendWorkNoticeInfo(auditUserInfo); - String msg = String.format(PASS_MSG_TEMPLATE, sendWorkNoticeInfo.getOrganizationName(), projectName); - zwddClient.sendWorkNotice(sendWorkNoticeInfo.getReceiverUserId(),sendWorkNoticeInfo.getBizMsgId(),msg); - } else { - // 若没有,向发起人发送浙政钉工作通知:【项目名称】已通过【流程名称】,请及时开始下一步操作。 - // TODO 向其发送浙政钉工作通知 获取根节点的孩子节点(即发起人节点),向其发送浙政钉工作通知 - // 获取根节点即流程发起节点 - FlowNode rootNode = (FlowNode) bpmnModel.getFlowElement("root"); - String startUserId = getRootUserId(rootNode, task.getProcessInstanceId()); - // 获取浙政钉用户ID - UserInfo auditUserInfo = userInfoService.getById(Long.valueOf(startUserId)); - WorkNoticeInfo sendWorkNoticeInfo = getSendWorkNoticeInfo(auditUserInfo); - WflowModels wflowModels = getLastWflowModels(task); - String formName = wflowModels.getFormName(); - String msg = String.format(PASS_MSG_TEMPLATE2, projectName, formName); - zwddClient.sendWorkNotice(sendWorkNoticeInfo.getReceiverUserId(),sendWorkNoticeInfo.getBizMsgId(),msg); - } - } + //private void doPass(Task task, Long userId, ReqProcessHandlerDTO param) { + // String processInstanceId = task.getProcessInstanceId(); + // // 获取当前申报项目 + // Project declaredProject = projectService.getOne(Wrappers.lambdaQuery(Project.class) + // .eq(Project::getInstCode, task.getProcessInstanceId()) + // .eq(Project::getId,param.getProjectId())); + // String projectName = declaredProject.getProjectName(); + // + // Map var = new HashMap<>(16); + // var.put("approve_" + task.getId(), param.getAction()); + // // 保存审核意见 + // if (hasComment(param.getAuditInfo())) { + // // 执行自定义的保存评论的功能 + // managementService.executeCommand(new SaveCommentCmd(param.getTaskId(), param.getInstanceId(), + // String.valueOf(userId), JSONObject.toJSONString(param.getAuditInfo()))); + // } + // // 如果流程状态是被退回状态,流程通过后,进入下一个审核人,当前通过审核人一定不是最后一个审核人(下一个审核人至多是最后一个),更新流程状态为审核中 + // if (ProcessStatusEnum.BE_BACKED.getCode().equals(declaredProject.getProcessStatus())) { + // // 通过该任务,流程到下一审核人处 + // taskService.complete(param.getTaskId(), var); + // // 更新流程状态为审核中 + // declaredProject.setProcessStatus(ProcessStatusEnum.UNDER_REVIEW.getCode()); + // declaredProject.setUpdateOn(LocalDateTime.now()); + // declaredProject.setUpdateBy(userId); + // projectService.updateById(declaredProject); + // // 获取此时待审核任务 + // Task currentTask = taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult(); + // // 获取审核人信息,向审核人发送工作通知 + // String currentUserId = currentTask.getAssignee(); + // UserInfo auditUserInfo = userInfoService.getById(Long.valueOf(currentUserId)); + // // 获取发送浙政钉工作通知必要信息 + // WorkNoticeInfo sendWorkNoticeInfo = getSendWorkNoticeInfo(auditUserInfo); + // String msg = String.format(PASS_MSG_TEMPLATE, null, projectName); + // zwddClient.sendWorkNotice(sendWorkNoticeInfo.getReceiverUserId(),sendWorkNoticeInfo.getBizMsgId(),msg); + // return; + // } + // // 获取bpm对象 + // BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId()); + // // 若不是被退回项目,传节点定义key 获取当前节点 + // FlowNode currentNode = (FlowNode) bpmnModel.getFlowElement(task.getTaskDefinitionKey()); + // // TODO 若当前流程是预审流程,需要在提交预审申报的时候,调用状态机判断申报后的项目状态, + // // 若是省级部门联审中,要对接外部接口,获取省级部门联审的结果,更新项目状态(预审申报提交的时候处理) + // // 需要先通过后才能有下一个节点的信息 + // taskService.complete(param.getTaskId(), var); + // // 获取当前项目状态 + // Integer status = declaredProject.getStatus(); + // // 若当前登录用户是最后一个审批人,需更新流程状态为审核完成,项目状态到下个状态 + // // 并向流程发起人发送浙政钉工作通知:【项目名称】已通过【流程名称】,请及时开始下一步操作。 + // HistoricProcessInstance instance = historyService + // .createHistoricProcessInstanceQuery() + // .processInstanceId(processInstanceId) + // .singleResult(); + // if (HisProInsEndActId.END.equals(instance.getEndActivityId())) { + // switch (Objects.requireNonNull(ProjectStatusEnum.getValue(status))) { + // // 当前项目状态是单位内部审核中 + // case UNDER_INTERNAL_AUDIT: + // // 当前项目状态是预审中 + // case PRE_APPLYING: + // // 当前项目状态是部门联审中 + // case DEPARTMENT_JOINT_REVIEW: + // // 当前项目状态是方案评审中 + // case SCHEME_UNDER_REVIEW: + // // 当前项目状态是终验审核中 + // case FINAL_ACCEPTANCE_IS_UNDER_REVIEW: + // updatePassProjectStatus(userId, declaredProject); + // break; + // default: + // throw new IllegalStateException("Unexpected value: " + status); + // } + // } + // // 若有下一个审核人(当前节点的用户), + // // 向其发送浙政钉工作通知:标题:审核任务 内容:【单位名称】的【项目名称】需要您审核。 + // String nextUserId = getNextUserId(currentNode, processInstanceId); + // if (Objects.nonNull(nextUserId)) { + // // 获取浙政钉用户ID + // UserInfo auditUserInfo = userInfoService.getById(Long.valueOf(nextUserId)); + // WorkNoticeInfo sendWorkNoticeInfo = getSendWorkNoticeInfo(auditUserInfo); + // String msg = String.format(PASS_MSG_TEMPLATE, sendWorkNoticeInfo.getOrganizationName(), projectName); + // zwddClient.sendWorkNotice(sendWorkNoticeInfo.getReceiverUserId(),sendWorkNoticeInfo.getBizMsgId(),msg); + // } else { + // // 若没有,向发起人发送浙政钉工作通知:【项目名称】已通过【流程名称】,请及时开始下一步操作。 + // // TODO 向其发送浙政钉工作通知 获取根节点的孩子节点(即发起人节点),向其发送浙政钉工作通知 + // // 获取根节点即流程发起节点 + // FlowNode rootNode = (FlowNode) bpmnModel.getFlowElement("root"); + // String startUserId = getRootUserId(rootNode, task.getProcessInstanceId()); + // // 获取浙政钉用户ID + // UserInfo auditUserInfo = userInfoService.getById(Long.valueOf(startUserId)); + // WorkNoticeInfo sendWorkNoticeInfo = getSendWorkNoticeInfo(auditUserInfo); + // WflowModels wflowModels = getLastWflowModels(task); + // String formName = wflowModels.getFormName(); + // String msg = String.format(PASS_MSG_TEMPLATE2, projectName, formName); + // zwddClient.sendWorkNotice(sendWorkNoticeInfo.getReceiverUserId(),sendWorkNoticeInfo.getBizMsgId(),msg); + // } + //} /** * 获取发送浙政钉工作通知的信息 @@ -583,28 +629,28 @@ public class TodoCenterManage { * @author CMM * @since 2023/02/02 */ - private String getRootUserId(FlowNode rootNode, String processInstanceId) { - String rootUserId = null; - // 输出连线 - List outgoingFlows = rootNode.getOutgoingFlows(); - // 遍历返回下一个节点信息 - for (SequenceFlow currentOutgoingFlow : outgoingFlows) { - // 类型自己判断 - FlowElement targetFlowElement = currentOutgoingFlow.getTargetFlowElement(); - // TODO 若要会签需判断候选人 - // 发起事件 - if (targetFlowElement instanceof StartEvent) { - String actId = targetFlowElement.getId(); - ActivityInstance activityInstance = runtimeService.createActivityInstanceQuery() - .processInstanceId(processInstanceId).activityId(actId).singleResult(); - String executionId = activityInstance.getExecutionId(); - rootUserId = runtimeService.getVariable(executionId, "initiator", String.class); - break; - } - } - return rootUserId; - - } + //private String getRootUserId(FlowNode rootNode, String processInstanceId) { + // String rootUserId = null; + // // 输出连线 + // List outgoingFlows = rootNode.getOutgoingFlows(); + // // 遍历返回下一个节点信息 + // for (SequenceFlow currentOutgoingFlow : outgoingFlows) { + // // 类型自己判断 + // FlowElement targetFlowElement = currentOutgoingFlow.getTargetFlowElement(); + // // TODO 若要会签需判断候选人 + // // 发起事件 + // if (targetFlowElement instanceof StartEvent) { + // String actId = targetFlowElement.getId(); + // ActivityInstance activityInstance = runtimeService.createActivityInstanceQuery() + // .processInstanceId(processInstanceId).activityId(actId).singleResult(); + // String executionId = activityInstance.getExecutionId(); + // rootUserId = runtimeService.getVariable(executionId, "initiator", String.class); + // break; + // } + // } + // return rootUserId; + // + //} /** * 获取当前节点的下一个节点的审核用户ID * @@ -614,31 +660,31 @@ public class TodoCenterManage { * @author CMM * @since 2023/02/02 */ - private String getNextUserId(FlowNode currentNode, String processInstanceId) { - String nextUserId = null; - // 输出连线 - List outgoingFlows = currentNode.getOutgoingFlows(); - // 遍历返回下一个节点信息 - for (SequenceFlow currentOutgoingFlow : outgoingFlows) { - // 类型自己判断 - FlowElement targetFlowElement = currentOutgoingFlow.getTargetFlowElement(); - // 如果下个审批节点为结束节点,那么跳过该节点 - if (targetFlowElement instanceof EndEvent) { - continue; - } - // TODO 若要会签需判断候选人 - // 用户任务 - if (targetFlowElement instanceof UserTask) { - String actId = targetFlowElement.getId(); - ActivityInstance activityInstance = runtimeService.createActivityInstanceQuery() - .processInstanceId(processInstanceId).activityId(actId).singleResult(); - String executionId = activityInstance.getExecutionId(); - nextUserId = runtimeService.getVariable(executionId, "assignee", String.class); - break; - } - } - return nextUserId; - } + //private String getNextUserId(FlowNode currentNode, String processInstanceId) { + // String nextUserId = null; + // // 输出连线 + // List outgoingFlows = currentNode.getOutgoingFlows(); + // // 遍历返回下一个节点信息 + // for (SequenceFlow currentOutgoingFlow : outgoingFlows) { + // // 类型自己判断 + // FlowElement targetFlowElement = currentOutgoingFlow.getTargetFlowElement(); + // // 如果下个审批节点为结束节点,那么跳过该节点 + // if (targetFlowElement instanceof EndEvent) { + // continue; + // } + // // TODO 若要会签需判断候选人 + // // 用户任务 + // if (targetFlowElement instanceof UserTask) { + // String actId = targetFlowElement.getId(); + // ActivityInstance activityInstance = runtimeService.createActivityInstanceQuery() + // .processInstanceId(processInstanceId).activityId(actId).singleResult(); + // String executionId = activityInstance.getExecutionId(); + // nextUserId = runtimeService.getVariable(executionId, "assignee", String.class); + // break; + // } + // } + // return nextUserId; + //} /** * 判断处理操作是否含有审核意见 @@ -648,10 +694,10 @@ public class TodoCenterManage { * @author CMM * @since 2023/02/01 */ - private boolean hasComment(ProcessComment comment) { - return Objects.nonNull(comment) - && (StrUtil.isNotBlank(comment.getText()) || isNotEmpty(comment.getAttachments())); - } + //private boolean hasComment(ProcessComment comment) { + // return Objects.nonNull(comment) + // && (StrUtil.isNotBlank(comment.getText()) || isNotEmpty(comment.getAttachments())); + //} /** * 撤销流程处理 @@ -660,117 +706,117 @@ public class TodoCenterManage { * @param userId 当前登录用户ID * @param projectId */ - private void doWithDrawProcess(HistoricTaskInstance handledTaskInstance, Long userId, Long projectId) { - String processInstanceId = handledTaskInstance.getProcessInstanceId(); - // 获取当前流程实例待审核任务信息 - Task task = taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult(); - // 获取当前流程实例信息 - HistoricProcessInstance historicProcessInstance = historyService - .createHistoricProcessInstanceQuery() - .processInstanceId(processInstanceId) - .singleResult(); - // 流程发起人ID - String startUserId = historicProcessInstance.getStartUserId(); - // 获取当前申报项目 - Project declaredProject = projectService.getOne(Wrappers.lambdaQuery(Project.class) - .eq(Project::getInstCode, processInstanceId) - .eq(Project::getId,projectId)); - String projectName = declaredProject.getProjectName(); - - // 获取bpm对象 - BpmnModel bpmnModel = repositoryService.getBpmnModel(handledTaskInstance.getProcessDefinitionId()); - // 传节点定义key 获取传入节点(撤回操作人在流程配置中所在的节点) - FlowNode handledNode = (FlowNode) bpmnModel.getFlowElement(handledTaskInstance.getTaskDefinitionKey()); - - // 获取当前流程状态 - Integer status = declaredProject.getStatus(); - - // 判断当前登录用户是否是流程发起人 - if (startUserId.equals(String.valueOf(userId))) { - // TODO 若是流程发起人点击撤回,项目回到上一个状态,并删除当前审核人对应的待办记录 - // 若是流程发起人点击撤回,项目回到上一个状态,需调用状态机更新项目状态,流程状态更新为审核通过 - switch (Objects.requireNonNull(ProjectStatusEnum.getValue(status))) { - // 当前项目状态是单位内部审核中 - case UNDER_INTERNAL_AUDIT: - // 当前项目状态是预审中 - case PRE_APPLYING: - // 当前项目状态是部门联审中 - case DEPARTMENT_JOINT_REVIEW: - // 当前项目状态是方案评审中 - case SCHEME_UNDER_REVIEW: - // 当前项目状态是终验审核中 - case FINAL_ACCEPTANCE_IS_UNDER_REVIEW: - updateWithdrawProjectStatus(userId, declaredProject); - break; - default: - throw new IllegalStateException("Unexpected value: " + status); - } - List executions = runtimeService.createExecutionQuery() - .processInstanceId(handledTaskInstance.getProcessInstanceId()).onlyChildExecutions().list(); - // 强制流程指向撤回 - runtimeService.createChangeActivityStateBuilder() - .processInstanceId(task.getProcessInstanceId()) - .moveActivityIdTo(task.getTaskDefinitionKey(), HisProInsEndActId.WITHDRAW) - .moveExecutionsToSingleActivityId(executions.stream() - .map(Execution::getId) - .collect(Collectors.toList()), HisProInsEndActId.WITHDRAW) - .changeState(); - } else { - // 获取当前流程待审核节点 - FlowNode currentNode = (FlowNode) bpmnModel.getFlowElement(task.getTaskDefinitionKey()); - SequenceFlow sequenceFlow = currentNode.getIncomingFlows().get(0); - // 获取上一个节点的activityId - String sourceRef = sequenceFlow.getSourceRef(); - - HistoricActivityInstance lastInstance = historyService.createHistoricActivityInstanceQuery() - .processInstanceId(task.getProcessInstanceId()) - .activityId(sourceRef) - .activityType("userTask") - .finished() - .singleResult(); - // 获取前一个审核节点审核人信息 - String beforeUserId = lastInstance.getAssignee(); - // 获取当前审核节点审核人信息 - String currentUserId = task.getAssignee(); - //HashSet userSet = new HashSet<>(); - //userSet.add(beforeUserId); - //userSet.add(currentUserId); - //Map userMap = userInfoService.getUserMapByIds(userSet); - //UserInfoVO beforeUserInfoVO = userMap.get(Long.valueOf(beforeUserId)); - //UserInfoVO currentUserInfoVO = userMap.get(Long.valueOf(currentUserId)); - //String beforeUserOrgCode = beforeUserInfoVO.getOrganizationCode(); - //String currentUserOrgCode = currentUserInfoVO.getOrganizationCode(); - //Boolean orgFlag = currentUserOrgCode.equals(beforeUserOrgCode) ? true : false; - - // TODO 判断前一个审核人的部门和当前登录用户的部门是否是同一个,如果是同一个才可以撤回,否则抛出异常 - Boolean orgFlag = true; - if (orgFlag) { - // 注意:是前一个审核人,说明此时仍在一个审核流程中,项目状态不需要改变,流程状态也不要改变,仍为审核中 - // 在审核记录中移除前一个审核人提交过的审核意见 - Comment comment = taskService.getProcessInstanceComments(processInstanceId).stream() - .filter(c -> c.getTaskId().equals(handledTaskInstance.getId())) - .findFirst() - .get(); - taskService.deleteComment(comment.getId()); - // 我已处理中去掉自己之前处理的记录 - String taskInstanceId = handledTaskInstance.getId(); - historyService.deleteHistoricTaskInstance(taskInstanceId); - - List executions = runtimeService.createExecutionQuery() - .processInstanceId(handledTaskInstance.getProcessInstanceId()).onlyChildExecutions().list(); - // 强制流程指向前一个审核人节点 - runtimeService.createChangeActivityStateBuilder() - .processInstanceId(task.getProcessInstanceId()) - .moveActivityIdsToSingleActivityId(executions.stream() - .map(Execution::getActivityId) - .collect(Collectors.toList()), handledNode.getId()) - .changeState(); - } else { - throw new BizException("下一个审核人和您不是同一个部门,无法撤回!"); - } - - } - } + //private void doWithDrawProcess(HistoricTaskInstance handledTaskInstance, Long userId, Long projectId) { + // String processInstanceId = handledTaskInstance.getProcessInstanceId(); + // // 获取当前流程实例待审核任务信息 + // Task task = taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult(); + // // 获取当前流程实例信息 + // HistoricProcessInstance historicProcessInstance = historyService + // .createHistoricProcessInstanceQuery() + // .processInstanceId(processInstanceId) + // .singleResult(); + // // 流程发起人ID + // String startUserId = historicProcessInstance.getStartUserId(); + // // 获取当前申报项目 + // Project declaredProject = projectService.getOne(Wrappers.lambdaQuery(Project.class) + // .eq(Project::getInstCode, processInstanceId) + // .eq(Project::getId,projectId)); + // String projectName = declaredProject.getProjectName(); + // + // // 获取bpm对象 + // BpmnModel bpmnModel = repositoryService.getBpmnModel(handledTaskInstance.getProcessDefinitionId()); + // // 传节点定义key 获取传入节点(撤回操作人在流程配置中所在的节点) + // FlowNode handledNode = (FlowNode) bpmnModel.getFlowElement(handledTaskInstance.getTaskDefinitionKey()); + // + // // 获取当前流程状态 + // Integer status = declaredProject.getStatus(); + // + // // 判断当前登录用户是否是流程发起人 + // if (startUserId.equals(String.valueOf(userId))) { + // // TODO 若是流程发起人点击撤回,项目回到上一个状态,并删除当前审核人对应的待办记录 + // // 若是流程发起人点击撤回,项目回到上一个状态,需调用状态机更新项目状态,流程状态更新为审核通过 + // switch (Objects.requireNonNull(ProjectStatusEnum.getValue(status))) { + // // 当前项目状态是单位内部审核中 + // case UNDER_INTERNAL_AUDIT: + // // 当前项目状态是预审中 + // case PRE_APPLYING: + // // 当前项目状态是部门联审中 + // case DEPARTMENT_JOINT_REVIEW: + // // 当前项目状态是方案评审中 + // case SCHEME_UNDER_REVIEW: + // // 当前项目状态是终验审核中 + // case FINAL_ACCEPTANCE_IS_UNDER_REVIEW: + // updateWithdrawProjectStatus(userId, declaredProject); + // break; + // default: + // throw new IllegalStateException("Unexpected value: " + status); + // } + // List executions = runtimeService.createExecutionQuery() + // .processInstanceId(handledTaskInstance.getProcessInstanceId()).onlyChildExecutions().list(); + // // 强制流程指向撤回 + // runtimeService.createChangeActivityStateBuilder() + // .processInstanceId(task.getProcessInstanceId()) + // .moveActivityIdTo(task.getTaskDefinitionKey(), HisProInsEndActId.WITHDRAW) + // .moveExecutionsToSingleActivityId(executions.stream() + // .map(Execution::getId) + // .collect(Collectors.toList()), HisProInsEndActId.WITHDRAW) + // .changeState(); + // } else { + // // 获取当前流程待审核节点 + // FlowNode currentNode = (FlowNode) bpmnModel.getFlowElement(task.getTaskDefinitionKey()); + // SequenceFlow sequenceFlow = currentNode.getIncomingFlows().get(0); + // // 获取上一个节点的activityId + // String sourceRef = sequenceFlow.getSourceRef(); + // + // HistoricActivityInstance lastInstance = historyService.createHistoricActivityInstanceQuery() + // .processInstanceId(task.getProcessInstanceId()) + // .activityId(sourceRef) + // .activityType("userTask") + // .finished() + // .singleResult(); + // // 获取前一个审核节点审核人信息 + // String beforeUserId = lastInstance.getAssignee(); + // // 获取当前审核节点审核人信息 + // String currentUserId = task.getAssignee(); + // //HashSet userSet = new HashSet<>(); + // //userSet.add(beforeUserId); + // //userSet.add(currentUserId); + // //Map userMap = userInfoService.getUserMapByIds(userSet); + // //UserInfoVO beforeUserInfoVO = userMap.get(Long.valueOf(beforeUserId)); + // //UserInfoVO currentUserInfoVO = userMap.get(Long.valueOf(currentUserId)); + // //String beforeUserOrgCode = beforeUserInfoVO.getOrganizationCode(); + // //String currentUserOrgCode = currentUserInfoVO.getOrganizationCode(); + // //Boolean orgFlag = currentUserOrgCode.equals(beforeUserOrgCode) ? true : false; + // + // // TODO 判断前一个审核人的部门和当前登录用户的部门是否是同一个,如果是同一个才可以撤回,否则抛出异常 + // Boolean orgFlag = true; + // if (orgFlag) { + // // 注意:是前一个审核人,说明此时仍在一个审核流程中,项目状态不需要改变,流程状态也不要改变,仍为审核中 + // // 在审核记录中移除前一个审核人提交过的审核意见 + // Comment comment = taskService.getProcessInstanceComments(processInstanceId).stream() + // .filter(c -> c.getTaskId().equals(handledTaskInstance.getId())) + // .findFirst() + // .get(); + // taskService.deleteComment(comment.getId()); + // // 我已处理中去掉自己之前处理的记录 + // String taskInstanceId = handledTaskInstance.getId(); + // historyService.deleteHistoricTaskInstance(taskInstanceId); + // + // List executions = runtimeService.createExecutionQuery() + // .processInstanceId(handledTaskInstance.getProcessInstanceId()).onlyChildExecutions().list(); + // // 强制流程指向前一个审核人节点 + // runtimeService.createChangeActivityStateBuilder() + // .processInstanceId(task.getProcessInstanceId()) + // .moveActivityIdsToSingleActivityId(executions.stream() + // .map(Execution::getActivityId) + // .collect(Collectors.toList()), handledNode.getId()) + // .changeState(); + // } else { + // throw new BizException("下一个审核人和您不是同一个部门,无法撤回!"); + // } + // + // } + //} /** * 当为撤回操作时,更新项目表中的项目状态为前一个状态 * @@ -806,47 +852,47 @@ public class TodoCenterManage { * @param userId 当前登录用户ID * @param param 参数 */ - private void doBackTask(Task task, Long userId, ReqProcessHandlerDTO param) { - // 获取当前申报项目 - Project declaredProject = projectService.getOne(Wrappers.lambdaQuery(Project.class) - .eq(Project::getInstCode, task.getProcessInstanceId()) - .eq(Project::getId,param.getProjectId())); - String projectName = declaredProject.getProjectName(); - // 保存审核意见 - if (hasComment(param.getAuditInfo())) { - // 执行自定义的保存评论的功能 - managementService.executeCommand(new SaveCommentCmd(param.getTaskId(), param.getInstanceId(), - String.valueOf(userId), JSONObject.toJSONString(param.getAuditInfo()))); - } - // 获取bpm对象 - BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId()); - // 传节点定义key 获取根节点即流程发起节点 - FlowNode rootNode = (FlowNode) bpmnModel.getFlowElement("root"); - - // 流程变成【被退回】状态,待我处理中,为流程发起人增加一条待办记录, - // 执行自定义回退逻辑,回退到流程发起人 - // 注意:因为审核人有执行退回的权限,且是退回到流程发起人,说明是在同一个流程实例中,所以项目状态不需要更新 - managementService.executeCommand(new BackToHisApprovalNodeCmd(runtimeService, bpmnModel, param.getTaskId(), rootNode.getId())); - runtimeService.setVariables(param.getInstanceId(), - Maps.newHashMap("approve_" + param.getTaskId(), param.getAction())); - log.info("用户[{}] 退回流程[{}] [{} -> {}]", userId, param.getInstanceId(), - task.getTaskDefinitionKey(), - param.getTargetNode()); - // 更新申报项目表中的流程状态为被退回 - declaredProject.setProcessStatus(ProcessStatusEnum.BE_BACKED.getCode()); - declaredProject.setUpdateOn(LocalDateTime.now()); - declaredProject.setUpdateBy(userId); - projectService.updateById(declaredProject); - // TODO 给项目创建人、流程发起人发送浙政钉工作通知:【项目名称】的【流程名称】被退回,请及时处理。 - String startUserId = getRootUserId(rootNode, task.getProcessInstanceId()); - UserInfo auditUserInfo = userInfoService.getById(Long.valueOf(startUserId)); - WorkNoticeInfo sendWorkNoticeInfo = getSendWorkNoticeInfo(auditUserInfo); - WflowModels wflowModels = getLastWflowModels(task); - String formName = wflowModels.getFormName(); - String msg = String.format(BACK_MSG_TEMPLATE, projectName, formName); - zwddClient.sendWorkNotice(sendWorkNoticeInfo.getReceiverUserId(),sendWorkNoticeInfo.getBizMsgId(),msg); - - } + //private void doBackTask(Task task, Long userId, ReqProcessHandlerDTO param) { + // // 获取当前申报项目 + // Project declaredProject = projectService.getOne(Wrappers.lambdaQuery(Project.class) + // .eq(Project::getInstCode, task.getProcessInstanceId()) + // .eq(Project::getId,param.getProjectId())); + // String projectName = declaredProject.getProjectName(); + // // 保存审核意见 + // if (hasComment(param.getAuditInfo())) { + // // 执行自定义的保存评论的功能 + // managementService.executeCommand(new SaveCommentCmd(param.getTaskId(), param.getInstanceId(), + // String.valueOf(userId), JSONObject.toJSONString(param.getAuditInfo()))); + // } + // // 获取bpm对象 + // BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId()); + // // 传节点定义key 获取根节点即流程发起节点 + // FlowNode rootNode = (FlowNode) bpmnModel.getFlowElement("root"); + // + // // 流程变成【被退回】状态,待我处理中,为流程发起人增加一条待办记录, + // // 执行自定义回退逻辑,回退到流程发起人 + // // 注意:因为审核人有执行退回的权限,且是退回到流程发起人,说明是在同一个流程实例中,所以项目状态不需要更新 + // managementService.executeCommand(new BackToHisApprovalNodeCmd(runtimeService, bpmnModel, param.getTaskId(), rootNode.getId())); + // runtimeService.setVariables(param.getInstanceId(), + // Maps.newHashMap("approve_" + param.getTaskId(), param.getAction())); + // log.info("用户[{}] 退回流程[{}] [{} -> {}]", userId, param.getInstanceId(), + // task.getTaskDefinitionKey(), + // param.getTargetNode()); + // // 更新申报项目表中的流程状态为被退回 + // declaredProject.setProcessStatus(ProcessStatusEnum.BE_BACKED.getCode()); + // declaredProject.setUpdateOn(LocalDateTime.now()); + // declaredProject.setUpdateBy(userId); + // projectService.updateById(declaredProject); + // // TODO 给项目创建人、流程发起人发送浙政钉工作通知:【项目名称】的【流程名称】被退回,请及时处理。 + // String startUserId = getRootUserId(rootNode, task.getProcessInstanceId()); + // UserInfo auditUserInfo = userInfoService.getById(Long.valueOf(startUserId)); + // WorkNoticeInfo sendWorkNoticeInfo = getSendWorkNoticeInfo(auditUserInfo); + // WflowModels wflowModels = getLastWflowModels(task); + // String formName = wflowModels.getFormName(); + // String msg = String.format(BACK_MSG_TEMPLATE, projectName, formName); + // zwddClient.sendWorkNotice(sendWorkNoticeInfo.getReceiverUserId(),sendWorkNoticeInfo.getBizMsgId(),msg); + // + //} /** * 查询流程表单数据及审批的进度步骤 diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/model/dto/req/ReqProcessHandlerDTO.java b/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/model/dto/req/ReqProcessHandlerDTO.java deleted file mode 100644 index 0a9c98d..0000000 --- a/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/model/dto/req/ReqProcessHandlerDTO.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.ningdatech.pmapi.todocenter.model.dto.req; - -import com.wflow.workflow.bean.process.ProcessComment; -import com.wflow.workflow.enums.ProcessHandlerEnum; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -import javax.validation.constraints.NotNull; - -/** - * 流程处理操作参数实体 - * - * @author CMM - * @since 2023/01/30 09:09 - */ -@Data -@NoArgsConstructor -@AllArgsConstructor -public class ReqProcessHandlerDTO { - - /** - * 要处理的项目ID - */ - @NotNull(message = "要处理的项目ID不能为空!") - private Long projectId; - - /** - * 实例ID - */ - @NotNull(message = "流程实例ID不能为空!") - private String instanceId; - /** - * 任务ID - */ - @NotNull(message = "任务ID不能为空!") - private String taskId; - /** - * 签名图片地址 - */ - private String signature; - /** - * 操作类型 - */ - @NotNull(message = "操作类型不能为空!") - private ProcessHandlerEnum action; - /** - * 目标用户 - */ - private String targetUser; - /** - * 目标节点 - */ - private String targetNode; - - /** - * 审核信息 - */ - private ProcessComment auditInfo; -}