流程中的任务对应一组候选人,由一个或者多个user组成。
1.画流程图,定义候选人
(也可以通过过程变量传入,之前的文章《activiti7---用户任务的创建与执行》有用到过程变量)
2.流程定义的部署
/**
* 流程定义的部署
*/
@Test
public void activitiDeployment() {
//创建ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//得到RepositoryService,用于加载流程图,部署流程图
RepositoryService repositoryService = processEngine.getRepositoryService();
//部署
Deployment deployment = repositoryService.createDeployment().addClasspathResource("leave.bpmn").name("leave").deploy();
//输出部署信息
System.out.println(deployment.getName());
System.out.println(deployment.getId());
}
3.执行流程实例
/**
* 执行流程实例
*/
@Test
public void startProcessInstance() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//第一个传入值对应bpmn中的id
//businesskey对应具体的业务表的主键,例如请假详情中的请假天数,请假起始时间,请假原因等等。
ProcessInstance processInstance = processEngine.getRuntimeService().startProcessInstanceByKey("_leave2","businesskey");
}
4.候选人查询任务
/**
* 候选人查询组任务
*/
@Test
public void finGroupTaskList() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 流程定义key
String processDefinitionKey = "_leave2";
// 任务候选人
String candidateUser = "a";
//创建tastServervice
TaskService taskService = processEngine.getTaskService();
//根据候选人查询组任务
List<Task> list = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskCandidateUser(candidateUser).list();
list.forEach(l -> {
System.out.println("任务名称: " + l.getName());
System.out.println("任务id: " + l.getId());
});
}
5.拾取(claim)任务,组任务变为个人任务
/**
* 拾取任务,组任务变为个人任务
*/
@Test
public void claimTask() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//创建tastServervice
TaskService taskService = processEngine.getTaskService();
//任务id
String taskId = "147502";
//候选人id
String username= "a";
//校验候选人是否有拾取任务的资格
Task task = taskService.createTaskQuery().taskId(taskId).taskCandidateUser(username).singleResult();
if (task != null) {
taskService.claim(taskId, username);
System.out.println("任务拾取成功");
}
}
6.归还任务,个人任务变为组任务
当拿到组任务之后又不想执行时,可以归还任务,但自己依旧可以拾取这个任务
/**
* 归还任务,个人务变为组任务
*/
@Test
public void setAssigneeToGroupTask() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//创建tastServervice
TaskService taskService = processEngine.getTaskService();
//任务id
String taskId = "147502";
//任务负责人
String username= "a";
//校验任务负责人是否有资格
Task task = taskService.createTaskQuery().taskId(taskId).taskAssignee(username).singleResult();
if (task != null) {
taskService.claim(taskId, null);
System.out.println("归还组任务成功");
}
}
7.任务交接,任务负责人将任务交给其他候选人办理
/**
* 任务交接,任务负责人将任务交给其他候选人办理
*/
@Test
public void setAssigneeToCandidateUser() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//创建tastServervice
TaskService taskService = processEngine.getTaskService();
//任务id
String taskId = "147502";
//任务负责人
String username = "a";
//校验任务负责人是否有资格
Task task = taskService.createTaskQuery().taskId(taskId).taskAssignee(username).singleResult();
if (task != null) {
// 将此任务交给其它候选人办理该 任务
String candidateuser = "b";
//校验候选人是否有拾取任务的资格
Task task2 = taskService.createTaskQuery().taskId(taskId).taskCandidateOrAssigned(candidateuser).singleResult();
if (task2 != null) {
taskService.setAssignee(taskId, candidateuser);
System.out.println("任务交接成功");
}
}
}
8.查询个人任务
/**
* 查询当前任务
*/
@Test
public void findMyCurrentTask() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
String asssignee = "b";
List<Task> list = processEngine.getTaskService().createTaskQuery().taskAssignee(asssignee).list();
list.forEach(task -> {
System.out.println("任务ID:" + task.getId());
System.out.println("任务名称:" + task.getName());
System.out.println("任务创建时间:" + task.getCreateTime());
System.out.println("任务的处理人:" + task.getAssignee());
System.out.println("任务的实例ID:" + task.getProcessDefinitionId());
System.out.println("执行对象的ID:" + task.getExecutionId());
System.out.println("任务的班里人:" + task.getAssignee());
System.out.println("流程定义ID:" + task.getProcessInstanceId());
});
}
9.执行任务
/**
* 处理任务
*/
@Test
public void completeTask() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
String taskId = "147502";
String asssignee = "b";
//创建tastServervice
TaskService taskService = processEngine.getTaskService();
//校验是否有权限,根据任务id和assignee查得到任务,说明有权限
Task task = taskService.createTaskQuery().taskId(taskId).taskAssignee(asssignee).singleResult();
if (task != null) {
taskService.complete(taskId);
System.out.println("完成任务id=" + taskId);
}
}