工作流activiti 6 学习笔记九 用户任务UserTask
【摘要】 给用户任务分配用户的四种方法:第一种使用potentialOwner节点,第二种使用acititi:candidateUsers 属性,第三种使用juel表达式,第四种使用监听任务
用户任务是非常常用的任务,可以为任务指定审批人,根据审批人进行控制流程流转。分配审批人/组有以下几种方法:
第一种:在bpmn文件中设置potentialOwner节点。
允许用户scf 和 组management boss 有权限看到task1 .此处所列出的是用户id,不是name。
<process id="myProcess" name="My process" isExecutable="true">
<startEvent id="startevent1" name="Start"></startEvent>
<endEvent id="endevent1" name="End"></endEvent>
<userTask id="usertask1" name="task1">
<potentialOwner>
<resourceAssignmentExpression>
<formalExpression>
user(scf),group(management),boss
</formalExpression>
</resourceAssignmentExpression>
</potentialOwner>
</userTask>
<sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
<sequenceFlow id="flow2" sourceRef="usertask1" targetRef="endevent1"></sequenceFlow>
</process>
验证代码
// 部署流程
Deployment deploye = rs.createDeployment().addClasspathResource("userTask_candidate.bpmn").deploy();
ProcessDefinition pdf = rs.createProcessDefinitionQuery().deploymentId(deploye.getId()).singleResult();
// 创建用户 和用户组
IdentityService idS = en.getIdentityService();
User user = idS.newUser("scf1");
user.setFirstName("scf");
idS.saveUser(user);
Group group = idS.newGroup("management1");
group.setName("management");
idS.saveGroup(group);
group = idS.newGroup("boss");
group.setName("boss");
idS.saveGroup(group);
ProcessInstance pi = runS.startProcessInstanceById(pdf.getId());
System.out.println(pi.getId());
List<Task> tasks = ts.createTaskQuery().processInstanceId(pi.getId()).taskCandidateUser("scf").list();
System.out.println("scf 所能看到的任务有"+tasks.size()+"条==="+tasks.get(0).getName());
//ts.complete(tasks.get(0).getId()); // 如果scf审批完成,
tasks = ts.createTaskQuery().processInstanceId(pi.getId()).taskCandidateGroup("boss").list();
System.out.println("boss 所能看到的任务有"+tasks.size()+"条==="+tasks.get(0).getName());
tasks = ts.createTaskQuery().processInstanceId(pi.getId()).taskCandidateGroup("management").list();
System.out.println("management 所能看到的任务有"+tasks.size()+"条==="+tasks.get(0).getName());
运行结果:
237505
scf 所能看到的任务有1条===task1
boss 所能看到的任务有1条===task1
management 所能看到的任务有1条===task1
当某人把任务审批完成后,其他用户则看不到任务,验证代码如下
// 部署流程
Deployment deploye = rs.createDeployment().addClasspathResource("userTask_candidate.bpmn").deploy();
ProcessDefinition pdf = rs.createProcessDefinitionQuery().deploymentId(deploye.getId()).singleResult();
ProcessInstance pi = runS.startProcessInstanceById(pdf.getId());
System.out.println(pi.getId());
List<Task> tasks = ts.createTaskQuery().processInstanceId(pi.getId()).taskCandidateUser("scf").list();
System.out.println("scf 所能看到的任务有"+tasks.size()+"条==="+tasks.get(0).getName());
ts.complete(tasks.get(0).getId()); // 如果scf审批完成,
tasks = ts.createTaskQuery().processInstanceId(pi.getId()).taskCandidateGroup("boss").list();
System.out.println("boss 所能看到的任务有"+tasks.size()+"条==="+tasks.get(0).getName());
tasks = ts.createTaskQuery().processInstanceId(pi.getId()).taskCandidateGroup("management").list();
System.out.println("management 所能看到的任务有"+tasks.size()+"条==="+tasks.get(0).getName());
运行结果:
245005
scf 所能看到的任务有1条===task1
scf 审批完成
boss 所能看到的任务有0条===
management 所能看到的任务有0条===
第二种分配用户的方法:使用acititi:candidateUsers 属性进行扩展实现
,多个用户可以使用逗号分开,activiti:candidateGroup 分配用户组。
bpmn文件
<process id="myProcess" name="My process" isExecutable="true">
<startEvent id="startevent1" name="Start"></startEvent>
<endEvent id="endevent1" name="End"></endEvent>
<userTask id="usertask1" name="task1" activiti:candidateUsers="scf"></userTask>
<sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
<sequenceFlow id="flow2" sourceRef="usertask1" targetRef="endevent1"></sequenceFlow>
</process>
java代码验证
// 部署流程
Deployment deploye = rs.createDeployment().addClasspathResource("userTask_activiti_candidate.bpmn").deploy();
ProcessDefinition pdf = rs.createProcessDefinitionQuery().deploymentId(deploye.getId()).singleResult();
ProcessInstance pi = runS.startProcessInstanceById(pdf.getId());
System.out.println(pi.getId());
List<Task> tasks = ts.createTaskQuery().processInstanceId(pi.getId()).taskCandidateUser("scf").list();
System.out.println("scf 所能看到的任务有"+tasks.size()+"条===");
运行结果:
scf 所能看到的任务有1条===task1。
第三种分配用户的方法:使用JUEL分配用户
动态的分配用户
bpmn文件
<process id="myProcess" name="My process" isExecutable="true">
<startEvent id="startevent1" name="Start"></startEvent>
<endEvent id="endevent1" name="End"></endEvent>
<userTask id="usertask1" name="task1" activiti:candidateUsers="${authService.getCandidateUsers()}"></userTask>
<sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
<sequenceFlow id="flow2" sourceRef="usertask1" targetRef="endevent1"></sequenceFlow>
</process>
java代码
authservice类:需要实现序列化接口,否则不能被保存到资源包。
package org.scf.act.api.task.userTask;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
public class AuthService implements Serializable {
public List<String> getCandidateUsers(){
List<String> list = new ArrayList<String>();
list.add("scf");
list.add("scf2");
return list;
}
}
测试类,流程部署时需要指定auth类,作为参数,否则报找不到表达式。
// 部署流程
Deployment deploye = rs.createDeployment().addClasspathResource("userTask_juel_candidate.bpmn").deploy();
ProcessDefinition pdf = rs.createProcessDefinitionQuery().deploymentId(deploye.getId()).singleResult();
Map<String, Object> map = new HashMap<String, Object>();
map.put("authService", new AuthService());
ProcessInstance pi = runS.startProcessInstanceById(pdf.getId(),map);
System.out.println(pi.getId());
List<Task> tasks = ts.createTaskQuery().processInstanceId(pi.getId()).taskCandidateUser("scf").list();
System.out.println("scf 所能看到的任务有"+tasks.size()+"条==="+tasks.get(0).getName());
运行结果:
267505
scf 所能看到的任务有1条===task1
第四种:使用任务监听器进行分配用户
bpmn文件
<process id="myProcess" name="My process" isExecutable="true">
<startEvent id="startevent1" name="Start"></startEvent>
<endEvent id="endevent1" name="End"></endEvent>
<userTask id="usertask1" name="task1">
<extensionElements>
<activiti:taskListener event="create" class="org.scf.act.api.task.userTask.UserTaskListener" ></activiti:taskListener>
</extensionElements>
</userTask>
<sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
<sequenceFlow id="flow2" sourceRef="usertask1" targetRef="endevent1"></sequenceFlow>
</process>
监听类
package org.scf.act.api.task.userTask;
import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;
public class UserTaskListener implements TaskListener {
@Override
public void notify(DelegateTask delegateTask) {
System.out.println("使用任务监听器设置用户权限");
delegateTask.addCandidateUser("scf");// 设置用户,用户组,代理人等
}
}
测试类:
// 部署流程
Deployment deploye = rs.createDeployment().addClasspathResource("userTask_listener_candidate.bpmn").deploy();
ProcessDefinition pdf = rs.createProcessDefinitionQuery().deploymentId(deploye.getId()).singleResult();
ProcessInstance pi = runS.startProcessInstanceById(pdf.getId());
System.out.println(pi.getId());
List<Task> tasks = ts.createTaskQuery().processInstanceId(pi.getId()).taskCandidateUser("scf").list();
System.out.println("scf 所能看到的任务有"+tasks.size()+"条==="+tasks.get(0).getName());
运行结果:
使用任务监听器设置用户权限
270005
scf 所能看到的任务有1条===task1
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)