工作流activiti 6 学习笔记九 用户任务UserTask

举报
lu_zhishen 发表于 2021/09/27 16:24:23 2021/09/27
【摘要】 给用户任务分配用户的四种方法:第一种使用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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。