单人
方式一:写死Assignee
画流程图时填写Assignee,启动流程自动会为每个环节分配好审批人。
方式二:写死变量 ${xx},然后在启动流程时设置变量。
与方式一一样,启动流程时分配好,只不过它是以变量的形式。
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
Map<String, Object> param = new HashMap<>();
param.put("user0", "张三");
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myflow", "businessKey",param);
方式三:实现TaskListener接口
import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;
public class MyTaskListener implements TaskListener {
@Override
public void notify(DelegateTask delegateTask) {
delegateTask.setAssignee("张三");
}
}
然后侦听这里配置好侦听类,指向我们上面新建的类
方式四:taskService.setAssignee设置
这种的好处就是,在每个环节处理审批的时候,可以指定审批人,而不用在流程启动时就指定好,这个审批人就可以用我们自己定义的“审批人配置表”。
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myflow", "businessKey");
TaskService taskService = processEngine.getTaskService();
Task task=taskService.createTaskQuery()
.processInstanceId(processInstance.getProcessInstanceId()).singleResult();
taskService.setAssignee(task.getId(), "张三");
多人
个人觉得单人完全无法满足实际要求,就算暂时是单人审批,难保哪天客户突然要求要分给多个人审批。
多人审批的意思是说,分配给A,B,C三个人,他们任何一个人都能审批,一旦有人审批了,其他人就不能再审批了。主要场景是说,可能三个人不一定都有空,因此任何一个人审批都行。
多人方式和单人的几种方式是一样的,只不过不是setAssignee,而是Candidate
//taskService.setAssignee(task.getId(), "张三");
taskService.addCandidateUser(task.getId(), "张三");
taskService.addCandidateUser(task.getId(), "李四");
设置完act_ru_identitylink会出现下面这样的数据。
审批流程
1、获取待办列表
@PostMapping("qryTodoList")
public R<IPage<TaskVo>> qryTodoList(@RequestBody FlowTaskReq flowTaskReq) {
SecurityUtil bean = SpringUtils.getBean(SecurityUtil.class);
bean.logInAs(flowTaskReq.getCandidateUser());
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = defaultProcessEngine.getTaskService();
// 创建TaskQuery查询当前用户的待办任务
int firstResult = (flowTaskReq.getPageNo() - 1) * flowTaskReq.getPageSize();
TaskQuery taskQuery = taskService.createTaskQuery();
taskQuery.taskCandidateUser(flowTaskReq.getCandidateUser());
List<Task> tasks = taskQuery.listPage(firstResult,flowTaskReq.getPageSize());
long total = taskQuery.count();
IPage<TaskVo> page = new Page<>();
List<TaskVo> list = new ArrayList<>();
// 遍历并打印任务信息
for (Task task : tasks) {
// 根据需要打印其他任务信息
list.add(parseTask(task));
}
page.setRecords(list);
page.setTotal(total);
return R.ok(page);
}
private static TaskVo parseTask(Task task) {
log.debug("任务ID: " + task.getId());
log.debug("任务名称: " + task.getName());
TaskVo taskVo = new TaskVo();
taskVo.setId(task.getId());
taskVo.setStartTime(task.getCreateTime());
taskVo.setName(task.getName());
taskVo.setAssignee(task.getAssignee());
taskVo.setOwner(task.getOwner());
taskVo.setProcessInstanceId(task.getProcessInstanceId());
taskVo.setProcessDefinitionId(task.getProcessDefinitionId());
taskVo.setCreateTime(task.getCreateTime());
taskVo.setDueDate(task.getDueDate());
taskVo.setTaskInstName(task.getName());
taskVo.setProcInstId(task.getProcessInstanceId());
taskVo.setExecutionId(task.getExecutionId());
return taskVo;
}
2、上一步得到executionId后,获取要处理的任务,拿到task.id。
(1)根据任务id用claim领取任务
(2)用任务id调用complete完成任务
(3)再次根据executionId查询下一环节任务,设置下一环节候选人。
@PostMapping("doTask")
public void doTask(@RequestBody(required = false) Req flowTaskReq) {
// SecurityUtil bean = SpringUtils.getBean(SecurityUtil.class);
// bean.logInAs("张三");
// 获取任务对象
Task task = taskService.createTaskQuery()
.executionId(flowTaskReq.getExecutionId()).singleResult();
if (task == null) {
throw new RuntimeException("任务不存在!");
}
if (StrUtil.isNotBlank(flowTaskReq.getAssignee())) {
// task.setAssignee(flowTaskReq.getAssignee());
taskService.setAssignee(task.getId(), flowTaskReq.getAssignee());
}
if (StrUtil.isNotBlank(flowTaskReq.getComments())) {
taskService.addComment(task.getId(), task.getProcessInstanceId(), flowTaskReq.getComments());
}
taskService.claim(task.getId(),"张三");
// 完成任务
taskService.complete(task.getId());
Task taskNext = taskService.createTaskQuery()
.executionId(flowTaskReq.getExecutionId()).singleResult();
if(taskNext!=null){
taskService.addCandidateUser(taskNext.getId(), "张三");
}
}