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 9d0413f6ea..2a6ef70e19 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 @@ -171,9 +171,11 @@ public class Flow3Service extends MybatisBaseService { String approver = getApproverForTask(approvers, i); // 动态获取会签候选人 taskService.claim(task2.getId(), approver); // 由会签候选人认领任务 isMultiInstanceTaskNext = true; - } - // 单一审批任务 - else if ("单一审批任务".equals(isMultiInstanceTask)) { + }else if("或签任务".equals(isMultiInstanceTask)){ + String userId = getApproverForTask(userIds, i); + taskService.claim(task2.getId(), userId); + isMultiInstanceTaskNext = true; + } else if("单一审批任务".equals(isMultiInstanceTask)) { String userSidForNextNode = getNextNodeUser(bv).getData(); taskService.claim(task2.getId(), userSidForNextNode); bv.setNextNodeUserSids(userSidForNextNode); @@ -268,7 +270,7 @@ public class Flow3Service extends MybatisBaseService { * @param bv * @return */ - public ResultBean businessStartProcessInstanceById2(BusinessVariables bv) { + /* public ResultBean businessStartProcessInstanceById2(BusinessVariables bv) { ResultBean rb = ResultBean.fireFail(); // 或签任务候选人 List userIds = Arrays.asList( @@ -403,7 +405,7 @@ public class Flow3Service extends MybatisBaseService { updateFlowFieldVo.setSid(bv.getBusinessSid()); updateFlowFieldVo.setName(processDefinition.getName()); return rb.success().setData(updateFlowFieldVo).setMsg("流程启动成功"); - } + }*/ /** * 查询下一环节用户是否有转办用户,若有转办用户则添加转办评论 @@ -470,6 +472,222 @@ public class Flow3Service extends MybatisBaseService { "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"); + //获取表单中的参数 + Map formVariables = bv.getFormVariables(); + formVariables = formVariables == null ? new HashMap<>() : formVariables; + formVariables.put("businessSid", bv.getBusinessSid()); + formVariables.put("userSids", userIds); + formVariables.put("approvers", approvers); + String nextUserSid = bv.getNextNodeUserSids(); + String taskId = bv.getTaskId(); + String userSid = bv.getUserSid(); + String instanceId = bv.getInstanceId(); + String comment = bv.getComment(); + String nodeState = ""; + String taskDefKey = ""; + String orgPath = bv.getOrgSidPath(); + //设置下一环节审批人是否自动审批通过,默认否 + boolean contains = false; + //设置是否是管理员自动审批,默认否 + boolean adminContains = false; + //查询任务id为taskId的任务是否存在 + Task task = taskService.createTaskQuery().taskId(taskId).singleResult(); + 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"); + + String assignee = task.getAssignee(); + if (b && (StringUtils.isNotBlank(assignee) && assignee.indexOf(userSid) < 0)) { + return rb.setMsg("当前用户不是环节的待办人,不能进行办理操作!"); + } + + if (DelegationState.PENDING.equals(task.getDelegationState())) { + adminContains = false; + //加签 + Authentication.setAuthenticatedUserId(userSid); + taskService.addComment(taskId, instanceId, + FlowComment.DELEGATE.getType(), comment); + taskService.resolveTask(taskId, formVariables); + nodeState = task.getName(); + taskDefKey = task.getTaskDefinitionKey(); + } else { + boolean checkTask = false;//是否要查询当前任务是否是会签环节 + List tasks = taskService.createTaskQuery().processInstanceId(instanceId).list(); + if (tasks.size() == 1 || "或签任务".equals(isMultiInstanceTask)) { + checkTask = true; + } + taskService.addComment(taskId, instanceId, FlowComment.NORMAL.getType(), comment); + log.error("taskid:{},userSid:{}", taskId, userSid); + log.error("formVariables:{}", JSON.toJSONString(formVariables)); + taskService.setAssignee(taskId, userSid); + taskService.complete(taskId, formVariables); + if (checkTask) { + tasks = taskService.createTaskQuery().processInstanceId(instanceId).list(); + for (int i = 0; i < tasks.size(); i++) { + Task task2 = tasks.get(i); + isMultiInstanceTask = isMultiInstanceTask(task2); + if ("会签任务".equals(isMultiInstanceTask)) { + taskService.claim(task2.getId(), approvers.get(i)); // 由候选人认领任务 + isMultiInstanceTaskNext = true; + } else if ("或签任务".equals(isMultiInstanceTask)) { + taskService.claim(task2.getId(), userIds.get(i)); // 由候选人认领任务 + isMultiInstanceTaskNext = true; + } else { + if ("公司间调车".equals(service) && "Activity_0695qh4".equals(bv.getTaskDefKey())) { + if (StringUtils.isBlank(nextUserSid)) { + bv.setOrgSidPath(ydfOrgPath); + ResultBean stringResultBean = getNextNodeUserSidsOfSubmit(bv); + if (!stringResultBean.getSuccess()) { + //下一环节用户为空的情况 + nextUserSid = ProcDefEnum.DEFAUL_TADMIN_SID.getProDefId(); + adminContains = true; + } else { + nextUserSid = stringResultBean.getData(); + } + } + } else if (StringUtils.isBlank(nextUserSid)) { + //获取下一环节用户 + ResultBean stringResultBean = getNextNodeUserSidsOfSubmit(bv); + if (!stringResultBean.getSuccess()) { + //下一环节用户为空的情况 + nextUserSid = ProcDefEnum.DEFAUL_TADMIN_SID.getProDefId(); + adminContains = true; + } else { + nextUserSid = stringResultBean.getData(); + } + } else { + //若下一环节用户与系统管理员一致,则自动审批 + if (ProcDefEnum.DEFAUL_TADMIN_SID.getProDefId().equals(nextUserSid)) { + adminContains = true; + } + } + break; + } + } + } + //根据流程实例的id取最新的待办环节,给环节设置上用户sid + ResultBean> ll = flowTaskService.getLatestTasksNew(instanceId); + if (ll.getData().size() > 0) { + LatestTaskVo latestTaskVo = ll.getData().get(0); + String id_ = latestTaskVo.getId_(); + if (!isMultiInstanceTaskNext && checkTask) { + //查询下一环节用户是否有转办人 + nextUserSid = change(nextUserSid, bv.getInstanceId()); + taskService.setAssignee(id_, nextUserSid);//将下一环节用户放入流程中 + } + vo.setTaskId(id_); + //在act_ru_variable表中增加环节上的业务参数的变量 + taskService.setVariablesLocal(id_, formVariables); + nodeState = latestTaskVo.getName_(); + taskDefKey = latestTaskVo.getTask_def_key_(); + } else { + nodeState = FlowComment.SETTLE.getRemark(); + taskDefKey = "Event_end"; + vo.setNodeState(FlowComment.SETTLE.getRemark()); + } + + + } + + if (!isMultiInstanceTaskNext) { + if (!DelegationState.PENDING.equals(task.getDelegationState())) { + //获取该流程所有要走的环节节点 + List flowElements = calApprovePath(bv.getModelId(), + bv.getFormVariables()); + for (int i = 0; i < flowElements.size(); i++) { + FlowElement flowElement = flowElements.get(i); + String id = flowElement.getId(); + // 如果当前环节匹配taskDefKey,并且后续环节存在 + if (taskDefKey.equals(id) && i + 1 < flowElements.size()) { + FlowElement nextFlowElement = flowElements.get(i + 1); // 获取下一个环节 + List nextUserList = getUserListFromFlowElement(nextFlowElement, orgPath); // 获取下一个环节的用户列表 + + // 获取下下一个环节的用户列表(如果存在) + List nextNextUserList = new ArrayList<>(); + if (i + 2 < flowElements.size()) { + FlowElement nextNextFlowElement = flowElements.get(i + 2); // 获取下下一个环节 + nextNextUserList = getUserListFromFlowElement(nextNextFlowElement, orgPath); // 获取下下一个环节的用户列表 + } + + // 如果下一个环节只有一个用户,并且其sid与下一级相同,则设置contains为true + if (nextUserList.size() == 1 && nextUserList.get(0).getSid().equals(nextUserSid)) { + contains = true; // 确定自动审批 + break; // 跳出循环,不再检查后续环节 + } + + // 如果下下一个环节没有用户,且下下下一个环节与下一级相同,设置contains为true + if (nextUserList.isEmpty() && nextNextUserList.size() == 1 && nextNextUserList.get(0).getSid().equals(nextUserSid)) { + contains = true; // 确定自动审批 + break; // 跳出循环 + } + } + } + } + } + //设置管理员是否自动审批的字段是否是是。//若下一环节用户与系统管理员一致,则自动审批 + 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); + bv.setTaskId(vo.getTaskId()); + bv.setTaskDefKey(taskDefKey); + bv.setComment("因与下一级审批人相同,系统自动处理,需以下一级审批人审批意见为准!"); + return handleProsess(bv, false); + } + vo.setProcInsId(instanceId); + vo.setProcDefId(bv.getModelId()); + vo.setNodeState(nodeState); + vo.setTaskDefKey(taskDefKey); + vo.setSid(bv.getBusinessSid()); + return rb.success().setData(vo); + } + + /** + * 提取获取用户角色列表的公共方法,避免重复代码 + * + * @param flowElement 当前流程环节 + * @param orgPath 当前用户的组织路径 + * @return 用户列表 + */ + private List getUserListFromFlowElement(FlowElement flowElement, String orgPath) { + List userList = new ArrayList<>(); // 初始化用户列表 + if (flowElement instanceof UserTask) { // 判断当前环节是否为用户任务 + UserTask userTask = (UserTask) flowElement; // 转换为用户任务类型 + List candidateGroups = userTask.getCandidateGroups(); // 获取候选组 + UserssQuery userssQuery = new UserssQuery(); // 创建查询对象 + userssQuery.setCandidateGroups(candidateGroups); // 设置候选组 + userssQuery.setOrgSidPath(orgPath); // 设置组织路径 + userList = sysUserFeign.getUsersByRoles(userssQuery).getData(); // 根据角色查询用户 + } + return userList == null ? new ArrayList<>() : userList; // 如果返回为null,则返回空列表 + } + + /* public ResultBean handleProsess222(BusinessVariables bv, boolean b) { + ResultBean rb = ResultBean.fireFail(); + UpdateFlowFieldVo vo = new UpdateFlowFieldVo(); + // 或签任务候选人 + 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", @@ -562,7 +780,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); - isMultiInstanceTask = isMultiInstanceTask(task2); + isMultiInstanceTask = isMultiInstanceTask(task2); if ("会签任务".equals(isMultiInstanceTask)) { taskService.claim(task2.getId(), approvers.get(i)); // 由候选人认领任务 isMultiInstanceTaskNext = true; @@ -570,9 +788,15 @@ public class Flow3Service extends MybatisBaseService { taskService.claim(task2.getId(), userIds.get(i)); // 由候选人认领任务 isMultiInstanceTaskNext = true; } else { - ResultBean userResultBean = getNextNodeUser(bv); - bv.setNextNodeUserSids(userResultBean.getData()); - nextUserSid = bv.getNextNodeUserSids(); + //获取下一环节用户 + ResultBean stringResultBean = getNextNodeUserSidsOfSubmit(bv); + if (!stringResultBean.getSuccess()) { + //下一环节用户为空的情况 + nextUserSid = ProcDefEnum.DEFAUL_TADMIN_SID.getProDefId(); + adminContains = true; + } else { + nextUserSid = stringResultBean.getData(); + } break; } } @@ -681,7 +905,7 @@ public class Flow3Service extends MybatisBaseService { vo.setTaskDefKey(taskDefKey); vo.setSid(bv.getBusinessSid()); return rb.success().setData(vo); - } + }*/ /** * 获取下一环节用户 @@ -1285,7 +1509,7 @@ public class Flow3Service extends MybatisBaseService { } - public ResultBean submit222() { + /* public ResultBean submit222() { String userSid = "7f56f6ec-4a5f-47b0-aaab-158d64cb97b1"; // 或签任务候选人 List userIds = new ArrayList<>(); @@ -1400,37 +1624,10 @@ public class Flow3Service extends MybatisBaseService { assertTrue(isEnded2); return ResultBean.fireSuccess(); - } - - - /* private boolean isMultiInstanceTask(Task task, boolean isSequential) { - // 获取任务节点的ID - String taskDefinitionKey = task.getTaskDefinitionKey(); - - // 获取流程定义对象 - ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery() - .processDefinitionId(task.getProcessDefinitionId()) - .singleResult(); - - // 获取BPMN模型,解析任务定义 - BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinition.getId()); - FlowElement flowElement = bpmnModel.getFlowElement(taskDefinitionKey); - - // 判断flowElement是否是UserTask,并且获取其multiInstanceLoopCharacteristics - if (flowElement instanceof UserTask) { - UserTask userTask = (UserTask) flowElement; - // 获取multiInstanceLoopCharacteristics - MultiInstanceLoopCharacteristics multiInstance = userTask.getLoopCharacteristics(); - if (multiInstance != null) { - boolean sequential = multiInstance.isSequential(); - return sequential == isSequential; - } - } - return false; }*/ - public ResultBean submit333() { + public ResultBean submit333() { String userSid = "7f56f6ec-4a5f-47b0-aaab-158d64cb97b1"; // 或签任务候选人 List userIds = Arrays.asList(