|
|
@ -98,6 +98,169 @@ public class Flow3Service extends MybatisBaseService<FlowMapper, Flowable> { |
|
|
|
@Autowired |
|
|
|
private ProcessEngine processEngine; |
|
|
|
|
|
|
|
public ResultBean<UpdateFlowFieldVo> businessStartProcessInstanceById(BusinessVariables bv) { |
|
|
|
ResultBean<UpdateFlowFieldVo> rb = ResultBean.fireFail(); |
|
|
|
// 或签任务候选人
|
|
|
|
List<String> userIds = Arrays.asList( |
|
|
|
"dc6b9e36-1b31-4b94-908b-d2d7f78a0977", |
|
|
|
"657bf5a5-7665-440e-9cbd-ab87eccfbdcc", |
|
|
|
"2737e5ee-5ffd-4127-919b-e6694dfc8361"); |
|
|
|
// 会签任务候选人
|
|
|
|
List<String> 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<String, Object> variables = bv.getFormVariables(); |
|
|
|
variables.put("userSids", userIds); |
|
|
|
variables.put("approvers", approvers); |
|
|
|
Map<String, Object> variablesSeconds = bv.getFormVariables(); |
|
|
|
|
|
|
|
// 根据流程定义ID查询最新的流程定义
|
|
|
|
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery() |
|
|
|
.processDefinitionId(procDefId) |
|
|
|
.latestVersion() |
|
|
|
.singleResult(); |
|
|
|
|
|
|
|
// 如果流程被挂起,返回错误信息
|
|
|
|
if (Objects.nonNull(processDefinition) && processDefinition.isSuspended()) { |
|
|
|
return rb.setMsg("流程已被挂起,请先激活流程"); |
|
|
|
} |
|
|
|
|
|
|
|
// 设置发起人信息
|
|
|
|
ResultBean<SysUserVo> 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<List<LatestTaskVo>> latestTasksNew = flowTaskService.getLatestTasksNew(processInstance.getId()); |
|
|
|
List<LatestTaskVo> 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<Task> 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<String> approvers, int index) { |
|
|
|
return approvers.size() > index ? approvers.get(index) : null; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 处理自动审批逻辑(当任务为转办时) |
|
|
|
*/ |
|
|
|
private ResultBean<UpdateFlowFieldVo> handleAutomaticApproval(BusinessVariables bv, Task task, String id_, String task_def_key_, |
|
|
|
Map<String, Object> variables, Map<String, Object> 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<UpdateFlowFieldVo> handleSelfApproval(BusinessVariables bv, Task task, String id_, String task_def_key_, |
|
|
|
Map<String, Object> variables, Map<String, Object> 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<FlowMapper, Flowable> { |
|
|
|
* @param bv |
|
|
|
* @return |
|
|
|
*/ |
|
|
|
public ResultBean<UpdateFlowFieldVo> businessStartProcessInstanceById(BusinessVariables bv) { |
|
|
|
public ResultBean<UpdateFlowFieldVo> businessStartProcessInstanceById2(BusinessVariables bv) { |
|
|
|
ResultBean<UpdateFlowFieldVo> rb = ResultBean.fireFail(); |
|
|
|
// 或签任务候选人
|
|
|
|
List<String> userIds = Arrays.asList( |
|
|
@ -118,6 +281,8 @@ public class Flow3Service extends MybatisBaseService<FlowMapper, Flowable> { |
|
|
|
"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<FlowMapper, Flowable> { |
|
|
|
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<FlowMapper, Flowable> { |
|
|
|
} |
|
|
|
} |
|
|
|
} else if (StringUtils.isBlank(nextUserSid)) { |
|
|
|
//是否是多实例任务
|
|
|
|
String isMultiInstanceTask = isMultiInstanceTask(task); |
|
|
|
if (!"会签任务".equals(isMultiInstanceTask) && !"或签任务".equals(isMultiInstanceTask)) { |
|
|
|
//获取下一环节用户
|
|
|
|
ResultBean<String> stringResultBean = getNextNodeUserSidsOfSubmit(bv); |
|
|
@ -385,7 +550,7 @@ public class Flow3Service extends MybatisBaseService<FlowMapper, Flowable> { |
|
|
|
} else { |
|
|
|
boolean checkTask = false;//是否要查询当前任务是否是会签环节
|
|
|
|
List<Task> 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<FlowMapper, Flowable> { |
|
|
|
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<FlowMapper, Flowable> { |
|
|
|
} else { |
|
|
|
ResultBean<String> userResultBean = getNextNodeUser(bv); |
|
|
|
bv.setNextNodeUserSids(userResultBean.getData()); |
|
|
|
nextUserSid = bv.getNextNodeUserSids(); |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
@ -434,15 +600,7 @@ public class Flow3Service extends MybatisBaseService<FlowMapper, Flowable> { |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
//设置管理员是否自动审批的字段是否是是。//若下一环节用户与系统管理员一致,则自动审批
|
|
|
|
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<FlowMapper, Flowable> { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
//设置管理员是否自动审批的字段是否是是。//若下一环节用户与系统管理员一致,则自动审批
|
|
|
|
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); |
|
|
|