1、候选人
画流程图的时候在“固定值”tab页面指定 候选人。也可以通过“身份存储”tab页面码指定(UI里边的用户)。
在启动流程之后,发现task中的分配人是个null,分配人得需要从候选人中选择。
有如下的是三个候选人。
查询任务
在启动流程之后,根据登录的用户查询对应可以拾取的任务。
查询张三可以拾取的任务。
拾取任务
张三在拾取任务之后,发现分配人变成了张三。
一个候选人拾取了任务之后,其他的用户就没有办法拾取这个任务了。
如果一个用户拾取了任务之后又不想处理了,那么可以退还。
退还任务
张三退还任务之后,分配人变成了null,意味着其他用户可以拾取了。
李四拾取任务。
交接任务
如果我获取了任务,但是不想执行,那么我可以把这个任务交接给其他的用户。
李四把任务交接给了王五。
完成任务
王五进行完成任务。任务到了下一个节点(经理审批)。
/**
* 部署流程
*/
@Test
public void TestDeployment() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("请假流程-候选人.bpmn20.xml")
.name("请假流程-候选人")
.deploy();
System.out.println("deployment.getId()" + deployment.getId());
System.out.println("deployment.getName()" + deployment.getName());
}
/**
* 删除流程定义
*/
@Test
public void TestDeploymentDelete() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
// 第一个参数是id,如果部署的流程启动了,就不允许删除了
// repositoryService.deleteDeployment("30001");
// 第二个参数是级联删除,如果流程启动了,相关的任务一并会被删除
repositoryService.deleteDeployment("57501", true);
}
/**
* 启动流程实例
*/
@Test
public void TestDeploymentRun() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RuntimeService runtimeService = processEngine.getRuntimeService();
// 流程变量
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("candidate1", "张三");
variables.put("candidate2", "李四");
variables.put("candidate3", "王五");
// 启动流程实例
ProcessInstance processInstance = runtimeService.startProcessInstanceById("holiday-candidate:1:80004", variables);
System.out.println("processInstance.getProcessDefinitionId() = " + processInstance.getProcessDefinitionId());
System.out.println("processInstance.getActivityId() = " + processInstance.getActivityId());
System.out.println("processInstance.getId()" + processInstance.getId());
}
/**
* 根据登录的用户查询对应可以拾取的任务
*/
@Test
public void TestQueryTaskCandidate() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
List<Task> list = taskService.createTaskQuery()
// .processInstanceId("82501") //根据流程实例编号查找
.processDefinitionId("holiday-candidate:1:80004")
.taskCandidateUser("李四")
.list();
for (Task task : list) {
System.out.println("task.getId() = " + task.getId());
System.out.println("task.getName() = " + task.getName());
}
}
/**
* 拾取任务
* 一个候选人拾取了任务之后,其他的用户就没有办法拾取这个任务了
* 如果一个用户拾取了任务之后又不想处理了,那么可以退还
*/
@Test
public void TestClaimTaskCandidate() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
Task task = taskService.createTaskQuery()
// .processInstanceId("82501") //根据流程实例编号查找
.processDefinitionId("holiday-candidate:1:80004")
.taskCandidateUser("李四")
.singleResult();
if(task != null){
// 拾取对应的任务
taskService.claim(task.getId(), "李四");
System.out.println("拾取任务成功");
}
}
/**
* 退还任务
*/
@Test
public void TestUnClaimTaskCandidate() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
Task task = taskService.createTaskQuery()
// .processInstanceId("82501") //根据流程实例编号查找
.processDefinitionId("holiday-candidate:1:80004")
.taskAssignee("张三")
.singleResult();
if(task != null){
// 退还任务
taskService.unclaim(task.getId());
System.out.println("退还任务成功");
}
}
/**
* 交接任务
* 如果我获取了任务,但是不想执行,那么我可以把这个任务交接给其他的用户
*/
@Test
public void TestJoinTaskCandidate() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
Task task = taskService.createTaskQuery()
// .processInstanceId("82501") //根据流程实例编号查找
.processDefinitionId("holiday-candidate:1:80004")
.taskAssignee("李四")
.singleResult();
if(task != null){
// 交接任务
taskService.setAssignee(task.getId(), "王五");
System.out.println("交接任务成功");
}
}
/**
* 完成任务
*/
@Test
public void TestCompleteTask() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
Task task = taskService.createTaskQuery()
// .processInstanceId("82501") //根据流程实例编号查找
.processDefinitionId("holiday-candidate:1:80004")
.taskAssignee("王五")
.singleResult();
if(task != null){
// 完成任务
taskService.complete(task.getId());
System.out.println("完成任务成功");
}
}
2、候选人组
当候选人很多的情况下,我们可以分组来处理。先创建组,然后把用户分配到这个组中。
这里是用到了flowable的用户相关的表结构,通过代码的方式进行用户的相关操作。
用户与组的维护
创建用户
@Test
public void TestCreateUser() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
IdentityService identityService = processEngine.getIdentityService();
User user = identityService.newUser("田佳");
user.setFirstName("tian");
user.setLastName("jia");
user.setEmail("tianjia@qq.com");
identityService.saveUser(user);
}
创建用户组
@Test
public void TestCreateUserGroup() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
IdentityService identityService = processEngine.getIdentityService();
Group group1 = identityService.newGroup("group2");
group1.setName("开发部");
group1.setType("type2");
identityService.saveGroup(group1);
}
将用户分配给对应的组
@Test
public void TestUserGroup() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
IdentityService identityService = processEngine.getIdentityService();
// 找到组
Group group = identityService.createGroupQuery().groupId("group1").singleResult();
// 找到用户
List<User> list = identityService.createUserQuery().list();
for (User user : list) {
// 将用户分配给对应的组
identityService.createMembership(user.getId(), group.getId());
}
}
案例讲解
在画流程的时候,在“身份存储”、“固定值”tab页都可以指定候选人组。
启动流程实例之后,任务的分配人是null。
拾取任务
邓超拾取任务。其他人就不能再拾取这个任务了。
退还任务
邓超退还任务,这个任务的分配人又变成了null。其他人可以再拾取这个任务了。
李飞拾取任务。
交接任务
李飞把任务交接给田佳。
完成任务
田佳完成任务。任务走到了下一个节点(总经理审批–lisi)
/**
* 部署流程
*/
@Test
public void TestDeployment() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("请假流程-候选人组.bpmn20.xml")
.name("请假流程-候选人组")
.deploy();
System.out.println("deployment.getId()" + deployment.getId());
System.out.println("deployment.getName()" + deployment.getName());
}
/**
* 删除流程定义
*/
@Test
public void TestDeploymentDelete() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
// 第一个参数是id,如果部署的流程启动了,就不允许删除了
// repositoryService.deleteDeployment("30001");
// 第二个参数是级联删除,如果流程启动了,相关的任务一并会被删除
repositoryService.deleteDeployment("57501", true);
}
/**
* 启动流程实例
*/
@Test
public void TestDeploymentRun() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RuntimeService runtimeService = processEngine.getRuntimeService();
IdentityService identityService = processEngine.getIdentityService();
Group group = identityService.createGroupQuery().groupId("group1").singleResult();
// 流程变量
Map<String, Object> variables = new HashMap<String, Object>();
// variables.put("g1", "group1");
variables.put("g1", group.getId());
// 启动流程实例
ProcessInstance processInstance = runtimeService.startProcessInstanceById("holiday-group:1:102504", variables);
System.out.println("processInstance.getProcessDefinitionId() = " + processInstance.getProcessDefinitionId());
System.out.println("processInstance.getActivityId() = " + processInstance.getActivityId());
System.out.println("processInstance.getId()" + processInstance.getId());
}
/**
* 根据登录的用户找到所属的组,根据组找到相关的任务
*/
@Test
public void TestQueryTaskCandidateGroup() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 根据登录的用户找到所属的组
IdentityService identityService = processEngine.getIdentityService();
Group group = identityService.createGroupQuery().groupMember("邓超").singleResult();
System.out.println("group.getId() = " + group.getId());
TaskService taskService = processEngine.getTaskService();
List<Task> list = taskService.createTaskQuery()
// .processInstanceId("82501") //根据流程实例编号查找
.processDefinitionId("holiday-group:1:102504")
.taskCandidateGroup("group1")// 根据组找到相关的任务
.list();
for (Task task : list) {
System.out.println("task.getId() = " + task.getId());
System.out.println("task.getName() = " + task.getName());
}
}
/**
* 拾取任务
* 一个候选人拾取了任务之后,其他的用户就没有办法拾取这个任务了
* 如果一个用户拾取了任务之后又不想处理了,那么可以退还
*/
@Test
public void TestClaimTaskCandidate() {
String userId = "李飞";
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 根据登录的用户找到所属的组
IdentityService identityService = processEngine.getIdentityService();
Group group = identityService.createGroupQuery().groupMember(userId).singleResult();
System.out.println("group.getId() = " + group.getId());
TaskService taskService = processEngine.getTaskService();
Task task = taskService.createTaskQuery()
// .processInstanceId("82501") //根据流程实例编号查找
.processDefinitionId("holiday-group:1:102504")
.taskCandidateGroup(group.getId())
.singleResult();
if(task != null){
// 拾取对应的任务
taskService.claim(task.getId(), userId);
System.out.println("拾取任务成功");
}
}
/**
* 退还任务
*/
@Test
public void TestUnClaimTaskCandidate() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
Task task = taskService.createTaskQuery()
// .processInstanceId("82501") //根据流程实例编号查找
.processDefinitionId("holiday-group:1:102504")
.taskAssignee("邓超")
.singleResult();
if(task != null){
// 退还任务
taskService.unclaim(task.getId());
System.out.println("退还任务成功");
}
}
/**
* 交接任务
* 如果我获取了任务,但是不想执行,那么我可以把这个任务交接给其他的用户
*/
@Test
public void TestJoinTaskCandidate() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
Task task = taskService.createTaskQuery()
// .processInstanceId("82501") //根据流程实例编号查找
.processDefinitionId("holiday-group:1:102504")
.taskAssignee("李飞")
.singleResult();
if(task != null){
// 交接任务
taskService.setAssignee(task.getId(), "田佳");
System.out.println("交接任务成功");
}
}
/**
* 完成任务
*/
@Test
public void TestCompleteTask() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
Task task = taskService.createTaskQuery()
// .processInstanceId("82501") //根据流程实例编号查找
.processDefinitionId("holiday-group:1:102504")
.taskAssignee("田佳")
.singleResult();
if(task != null){
// 完成任务
taskService.complete(task.getId());
System.out.println("完成任务成功");
}
}