在学习工作流时遇到这么一种情况,就是员工在提交流程时,应该直接跳到下一级进行审批。但目前却停留在第一节点,还得自己审批一下自己的流程,才可以进入到下一节点。如下图:
员工提交完流程之后,比如请假流程,应该直接到项目经理审批环节,不应该停留在“员工提交”环节中。先说一下解决思路。
1、在画流程图时,设置办理人(Assignee)变量,假设为userName,如图1;
2、在员工提交流程时,设置变量,将userName的值设置为当前用户,然后在启动时将变量加入到启动参数中,如图2:
3、查询当前用户的代办任务,将任务的流程ID与刚刚启动的流程ID进行比较,若相等,说明是刚刚启动的任务,通过即可。
图1
接下来,在提交流程的代码块里完成自己的待办事项。
public Boolean saveStartProcess(Integer leaveId) {
// 这两行代码是请假数据,和工作流组件没有直接关系。
LeaveBill leaveBill = leaveBillMapper.selectById(leaveId);
leaveBill.setState(TaskStatusEnum.CHECK.getStatus());
String key = leaveBill.getClass().getSimpleName();
String businessKey = key + "_" + leaveBill.getLeaveId();
// 将当前用户设置办理人,注意,这个userName是画流程图的时候的变量。
Map<String, Object> variables = new HashMap<>(1);
variables.put("userName", "当前用户名(自己想办法)");
// 启动流程,此时,已有相应的任务了。
ProcessInstance processInstance = runtimeService.startProcessInstanceByKeyAndTenantId(key, businessKey,variables,
String.valueOf(TenantContextHolder.getTenantId()));
// 查询自己所有的待办任务,若上一步启动的流程ID与查询到的流程ID匹配,说明是自己提交的流程,通过即可
Task task = null;
TaskQuery taskQuery = taskService.createTaskQuery().taskCandidateOrAssigned("当前用户名(自己想办法)").active();
List<Task> todoList = taskQuery.list();
for(Task tmp : todoList){
if(tmp.getProcessInstanceId().equals(processInstance.getId())){
task = tmp;
break;
}
}
taskService.complete(task.getId());
leaveBillMapper.updateById(leaveBill);
return Boolean.TRUE;
}
好啦,就这样吧。大致逻辑就是员工自己提交的流程,自己给自己审批了一下。
有不了解的,可以随时提问,我也是刚学习,大家一起交流。
我是来自北京天码科技的卢泽