diff --git a/anrui-flowable/anrui-flowable-biz/src/main/java/com/yxt/anrui/flowable/biz/flow3/Flow3Service.java b/anrui-flowable/anrui-flowable-biz/src/main/java/com/yxt/anrui/flowable/biz/flow3/Flow3Service.java index a98d5400ab..9d0413f6ea 100644 --- a/anrui-flowable/anrui-flowable-biz/src/main/java/com/yxt/anrui/flowable/biz/flow3/Flow3Service.java +++ b/anrui-flowable/anrui-flowable-biz/src/main/java/com/yxt/anrui/flowable/biz/flow3/Flow3Service.java @@ -98,6 +98,169 @@ public class Flow3Service extends MybatisBaseService { @Autowired private ProcessEngine processEngine; + public ResultBean businessStartProcessInstanceById(BusinessVariables bv) { + ResultBean rb = ResultBean.fireFail(); + // 或签任务候选人 + List userIds = Arrays.asList( + "dc6b9e36-1b31-4b94-908b-d2d7f78a0977", + "657bf5a5-7665-440e-9cbd-ab87eccfbdcc", + "2737e5ee-5ffd-4127-919b-e6694dfc8361"); + // 会签任务候选人 + List approvers = Arrays.asList( + "1d85d1fe-e527-4ec5-a5e4-c37a76a36518", + "64e289bc-80cd-487a-9498-5ae61e260f71", + "7ffcd76a-4fa0-4c9c-87ca-a0c2116bb2ed"); + // 获取流程定义ID和发起人ID + String procDefId = bv.getModelId(); + String userSid = bv.getUserSid(); + + // 获取传入的变量 + Map variables = bv.getFormVariables(); + variables.put("userSids", userIds); + variables.put("approvers", approvers); + Map variablesSeconds = bv.getFormVariables(); + + // 根据流程定义ID查询最新的流程定义 + ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery() + .processDefinitionId(procDefId) + .latestVersion() + .singleResult(); + + // 如果流程被挂起,返回错误信息 + if (Objects.nonNull(processDefinition) && processDefinition.isSuspended()) { + return rb.setMsg("流程已被挂起,请先激活流程"); + } + + // 设置发起人信息 + ResultBean sysUserVoResultBean = sysUserFeign.fetchBySid(userSid); + SysUserVo sysUser = sysUserVoResultBean.getData(); + identityService.setAuthenticatedUserId(sysUser.getSid()); + variables.put(ProcessConstants.PROCESS_INITIATOR, userSid); + variables.put(ProcessConstants.USER_TYPE_ASSIGNEE, userSid); + + // 启动流程实例 + ProcessInstance processInstance = runtimeService.startProcessInstanceById(procDefId, variables); + + // 获取第一步任务并设置任务执行人和意见 + Task task = taskService.createTaskQuery().processInstanceId(processInstance.getProcessInstanceId()).singleResult(); + if (Objects.nonNull(task)) { + taskService.addComment(task.getId(), processInstance.getProcessInstanceId(), FlowComment.START.getType(), + sysUser.getName() + "发起流程申请"); + taskService.setAssignee(task.getId(), userSid); + taskService.complete(task.getId(), variables); + } + + boolean isMultiInstanceTaskNext = false; + + // 查询当前流程实例的待办任务 + ResultBean> latestTasksNew = flowTaskService.getLatestTasksNew(processInstance.getId()); + List data = latestTasksNew.getData(); + LatestTaskVo latestTaskVo = data.get(0); + String id_ = latestTaskVo.getId_(); + String task_def_key_ = latestTaskVo.getTask_def_key_(); + + // 获取下一个环节的待办人 + if (StringUtils.isBlank(bv.getNextNodeUserSids())) { + List tasks = taskService.createTaskQuery().processInstanceId(processInstance.getId()).list(); + for (int i = 0; i < tasks.size(); i++) { + Task task2 = tasks.get(i); + String isMultiInstanceTask = isMultiInstanceTask(task2); + + // 会签任务认领 + if ("会签任务".equals(isMultiInstanceTask)) { + String approver = getApproverForTask(approvers, i); // 动态获取会签候选人 + taskService.claim(task2.getId(), approver); // 由会签候选人认领任务 + isMultiInstanceTaskNext = true; + } + // 单一审批任务 + else if ("单一审批任务".equals(isMultiInstanceTask)) { + String userSidForNextNode = getNextNodeUser(bv).getData(); + taskService.claim(task2.getId(), userSidForNextNode); + bv.setNextNodeUserSids(userSidForNextNode); + break; + } + } + } + + // 如果没有会签任务,继续处理其他节点 + if (!isMultiInstanceTaskNext) { + String nextNodeUserSids = bv.getNextNodeUserSids(); + // 查询下一环节是否有转办并添加评论 + nextNodeUserSids = change(nextNodeUserSids, processInstance.getProcessInstanceId()); + taskService.setAssignee(id_, nextNodeUserSids); + taskService.setVariablesLocal(id_, variables); + + if (ProcDefEnum.DEFAUL_TADMIN_SID.getProDefId().equals(nextNodeUserSids)) { + return handleAutomaticApproval(bv, task, id_, task_def_key_, variables, variablesSeconds, processDefinition); + } + + // 如果申请人与下一环节审批人相同,则自动审批 + if (bv.getUserSid().equals(nextNodeUserSids)) { + return handleSelfApproval(bv, task, id_, task_def_key_, variables, variablesSeconds, processDefinition); + } + } + + // 实例化 UpdateFlowFieldVo + UpdateFlowFieldVo updateFlowFieldVo = new UpdateFlowFieldVo(); + updateFlowFieldVo.setProcInsId(task.getProcessInstanceId()); + updateFlowFieldVo.setNodeState(latestTaskVo.getName_()); + updateFlowFieldVo.setTaskId(id_); + updateFlowFieldVo.setTaskDefKey(task_def_key_); + updateFlowFieldVo.setProcDefId(bv.getModelId()); + updateFlowFieldVo.setSid(bv.getBusinessSid()); + updateFlowFieldVo.setName(processDefinition.getName()); + + return rb.success().setData(updateFlowFieldVo).setMsg("流程启动成功"); + } + + /** + * 获取会签候选人 + */ + private String getApproverForTask(List approvers, int index) { + return approvers.size() > index ? approvers.get(index) : null; + } + + /** + * 处理自动审批逻辑(当任务为转办时) + */ + private ResultBean handleAutomaticApproval(BusinessVariables bv, Task task, String id_, String task_def_key_, + Map variables, Map variablesSeconds, ProcessDefinition processDefinition) { + bv.setModelId(bv.getModelId()); + bv.setInstanceId(task.getProcessInstanceId()); + bv.setTaskId(id_); + bv.setUserSid(ProcDefEnum.DEFAUL_TADMIN_SID.getProDefId()); // 默认转办管理员ID + bv.setBusinessSid(bv.getBusinessSid()); + bv.setTaskDefKey(task_def_key_); + bv.setFormVariables(variables); + bv.setOrgSidPath(bv.getOrgSidPath()); + bv.setFormVariables(variablesSeconds); + bv.setComment("系统自动转办!"); + bv.setNextNodeUserSids(""); + + // 继续执行后续流程 + return handleProsess(bv, false); + } + + /** + * 处理自动审批逻辑(当申请人与下一环节审批人相同) + */ + private ResultBean handleSelfApproval(BusinessVariables bv, Task task, String id_, String task_def_key_, + Map variables, Map variablesSeconds, ProcessDefinition processDefinition) { + bv.setModelId(bv.getModelId()); + bv.setInstanceId(task.getProcessInstanceId()); + bv.setTaskId(id_); + bv.setUserSid(bv.getUserSid()); + bv.setBusinessSid(bv.getBusinessSid()); + bv.setTaskDefKey(task_def_key_); + bv.setFormVariables(variables); + bv.setOrgSidPath(bv.getOrgSidPath()); + bv.setFormVariables(variablesSeconds); + bv.setComment("因与申请人相同,系统自动处理,需以下一级审批人审批意见为准!"); + bv.setNextNodeUserSids(""); + + // 继续执行后续流程 + return handleProsess(bv, false); + } /** * 启动流程 @@ -105,7 +268,7 @@ public class Flow3Service extends MybatisBaseService { * @param bv * @return */ - public ResultBean businessStartProcessInstanceById(BusinessVariables bv) { + public ResultBean businessStartProcessInstanceById2(BusinessVariables bv) { ResultBean rb = ResultBean.fireFail(); // 或签任务候选人 List userIds = Arrays.asList( @@ -118,6 +281,8 @@ public class Flow3Service extends MybatisBaseService { "1d85d1fe-e527-4ec5-a5e4-c37a76a36518", "64e289bc-80cd-487a-9498-5ae61e260f71", "7ffcd76a-4fa0-4c9c-87ca-a0c2116bb2ed"); + + UpdateFlowFieldVo updateFlowFieldVo = new UpdateFlowFieldVo(); String procDefId = bv.getModelId(); String userSid = bv.getUserSid(); @@ -333,6 +498,8 @@ public class Flow3Service extends MybatisBaseService { if (Objects.isNull(task)) { return rb.setMsg("任务不存在"); } + //是否是多实例任务 + String isMultiInstanceTask = isMultiInstanceTask(task); boolean isMultiInstanceTaskNext = false; String service = (String) formVariables.get("service"); String ydfOrgPath = (String) formVariables.get("ydfOrgPath"); @@ -349,8 +516,6 @@ public class Flow3Service extends MybatisBaseService { } } } else if (StringUtils.isBlank(nextUserSid)) { - //是否是多实例任务 - String isMultiInstanceTask = isMultiInstanceTask(task); if (!"会签任务".equals(isMultiInstanceTask) && !"或签任务".equals(isMultiInstanceTask)) { //获取下一环节用户 ResultBean stringResultBean = getNextNodeUserSidsOfSubmit(bv); @@ -385,7 +550,7 @@ public class Flow3Service extends MybatisBaseService { } else { boolean checkTask = false;//是否要查询当前任务是否是会签环节 List tasks = taskService.createTaskQuery().processInstanceId(instanceId).list(); - if (tasks.size() == 1) { + if (tasks.size() == 1 || "或签任务".equals(isMultiInstanceTask)) { checkTask = true; } taskService.addComment(taskId, instanceId, FlowComment.NORMAL.getType(), comment); @@ -397,7 +562,7 @@ public class Flow3Service extends MybatisBaseService { tasks = taskService.createTaskQuery().processInstanceId(instanceId).list(); for (int i = 0; i < tasks.size(); i++) { Task task2 = tasks.get(i); - String isMultiInstanceTask = isMultiInstanceTask(task2); + isMultiInstanceTask = isMultiInstanceTask(task2); if ("会签任务".equals(isMultiInstanceTask)) { taskService.claim(task2.getId(), approvers.get(i)); // 由候选人认领任务 isMultiInstanceTaskNext = true; @@ -407,6 +572,7 @@ public class Flow3Service extends MybatisBaseService { } else { ResultBean userResultBean = getNextNodeUser(bv); bv.setNextNodeUserSids(userResultBean.getData()); + nextUserSid = bv.getNextNodeUserSids(); break; } } @@ -434,15 +600,7 @@ public class Flow3Service extends MybatisBaseService { } - //设置管理员是否自动审批的字段是否是是。//若下一环节用户与系统管理员一致,则自动审批 - if (adminContains) { - bv.setUserSid(nextUserSid); - bv.setTaskId(vo.getTaskId()); - bv.setTaskDefKey(taskDefKey); - bv.setComment("系统自动跳过"); - bv.setNextNodeUserSids(""); - return handleProsess(bv, false); - } + if (!isMultiInstanceTaskNext) { if (!DelegationState.PENDING.equals(task.getDelegationState())) { //获取该流程所有要走的环节节点 @@ -500,7 +658,15 @@ public class Flow3Service extends MybatisBaseService { } } } - + //设置管理员是否自动审批的字段是否是是。//若下一环节用户与系统管理员一致,则自动审批 + if (adminContains) { + bv.setUserSid(nextUserSid); + bv.setTaskId(vo.getTaskId()); + bv.setTaskDefKey(taskDefKey); + bv.setComment("系统自动跳过"); + bv.setNextNodeUserSids(""); + return handleProsess(bv, false); + } if (contains) { bv.setUserSid(nextUserSid);