第八章:activiti多用户任务分配

第八章:activiti多用户任务分配第八章:activiti多用户任务分配

大家好,又见面了,我是你们的朋友全栈君。

就是只要有一个人审批通过就可以进入到下一个节点。

画图如下:

第八章:activiti多用户任务分配

点击leave001节点在下图位置加入几个人物的执行人:

第八章:activiti多用户任务分配

完了还要设置流程图di为StudentLeaveProcess07;

代码:

package com.xiaoyexinxixn.ActivityLesson.flow;


import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;

import com.xiaoyexinxixn.ActivityLesson.model.Student;

public class StudentLeaveProcess7 {
	//获取默认流程引擎实例,会自动读取activiti.cfg.xml ,所以我们要严格定义配置文件的名称
	private ProcessEngine processEngine =ProcessEngines.getDefaultProcessEngine();
	
	/**
	 * 部署流程定义
	 */
	@Test
	public void deploy() {
		//获取部署相关service,这些都是activiti封装好的api接口,还有很多,下面也会用到很多
		Deployment deployment=processEngine.getRepositoryService()
		//创建部署
		.createDeployment()
		//加载流程图资源文件
		.addClasspathResource("diagrams/StudentLeave7.bpmn")
		//加载流程图片
		.addClasspathResource("diagrams/StudentLeave7.png")
		//流程名称
		.name("leave07")
		//部署流程
		.deploy();
		System.out.println("流程部署的ID: "+deployment.getId());
		System.out.println("流程部署的Name: "+deployment.getName());
	}
	

部署启动流程;

我们看身份联系表 act_ru_identitiylink

第八章:activiti多用户任务分配

有六条数据,我们前面设置了三个人,这里每个人有两条数据,一个是参与者 participant.一个是候选人candidate,这样设计的目的是有可以修改删除候选人,此外我们后面使用接口查看任务时是通过候选人查询的,因为我们不知道参与者是哪个,所以就使用候选者了。

我们看任务表:

第八章:activiti多用户任务分配

任务表的委派人是空的,因为是多用户,所以是空。

查看任务接口:

/**
	 * 查看任务
	 */
	@Test
	public void findTaskList(){
		//获取任务列表的service
		List<Task> taskList=processEngine.getTaskService()
				//创建任务查询
				.createTaskQuery()
				//指定任务的执行人
//				.taskAssignee("xiaoliu001")  //单用户
				.taskCandidateUser("xiaoliu002")
				.list();
		for(Task task:taskList){
			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.getProcessInstanceId());
		}
	}

结果:

任务ID:127504
任务名称:leave001
任务创建时间:Sun Apr 22 16:57:52 CST 2018
任务委派人:null
任务流程实例Id:127501

完成任务也是根据任务id完成的。

上面是写死了任务的多用户人是那些人,下面我们通过变量来这是用户。

复制一个流程图如下:

第八章:activiti多用户任务分配

流程id改为:StudentLeaveProcess08

把leave001的用户置为空。

第八章:activiti多用户任务分配

leave001的任务执行人这里我们设置一个参数,后面通过变量赋值。

保存

package com.xiaoyexinxixn.ActivityLesson.flow;


import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;

import com.xiaoyexinxixn.ActivityLesson.model.Student;

public class StudentLeaveProcess8 {
	//获取默认流程引擎实例,会自动读取activiti.cfg.xml ,所以我们要严格定义配置文件的名称
	private ProcessEngine processEngine =ProcessEngines.getDefaultProcessEngine();
	
	/**
	 * 部署流程定义
	 */
	@Test
	public void deploy() {
		//获取部署相关service,这些都是activiti封装好的api接口,还有很多,下面也会用到很多
		Deployment deployment=processEngine.getRepositoryService()
		//创建部署
		.createDeployment()
		//加载流程图资源文件
		.addClasspathResource("diagrams/StudentLeave8.bpmn")
		//加载流程图片
		.addClasspathResource("diagrams/StudentLeave8.png")
		//流程名称
		.name("leave08")
		//部署流程
		.deploy();
		System.out.println("流程部署的ID: "+deployment.getId());
		System.out.println("流程部署的Name: "+deployment.getName());
	}
	
	/*
	 * 指定那些用过能够执行启动流程实例
	 */
	@Test
	public void start(){
		Map<String, Object> variables=new HashMap<String,Object>();
		variables.put("userIds","liuxin01,liuxin02");//指定执行人有那些
		//运行启动流程的servicee
		ProcessInstance pi=processEngine.getRuntimeService()
		//定义流程表的KEY字段值,key值是我们前面定义好的key,可在act_re_procdef表中的key_字段中找到,
		.startProcessInstanceByKey("StudentLeaveProcess08",variables);
		System.out.println(pi.getId());
		System.out.println(pi.getProcessDefinitionId());
	}
	
	/**
	 * 查看任务
	 */
	@Test
	public void findTaskList(){
		//获取任务列表的service
		List<Task> taskList=processEngine.getTaskService()
				//创建任务查询
				.createTaskQuery()
				//指定任务的执行人
//				.taskAssignee("xiaoliu001")  //单用户
				.taskCandidateUser("liuxin02")
				.list();
		for(Task task:taskList){
			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.getProcessInstanceId());
		}
	}
}	

依次执行上面方法,最后的结果是:

任务ID:147505
任务名称:leave001
任务创建时间:Sun Apr 22 17:25:22 CST 2018
任务委派人:null
任务流程实例Id:147501

说明没有问题。

下面介绍通过监听器指定任务委派人:

监听器代码:

package com.xiaoyexinxixn.ActivityLesson;

import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;

public class MyTaskListener implements TaskListener{

	@Override
	public void notify(DelegateTask delegateTask) {
		// TODO Auto-generated method stub
		delegateTask.addCandidateUser("liu001");
		delegateTask.addCandidateUser("liu002");
	}

}

然后新建流程图,修改流程图id,StudentLeaveProcess09

然后点击任务节点,选择Listeners–>new–》select class–》选择我们刚才写的监听类,–》ok

第八章:activiti多用户任务分配

测试代码:

package com.xiaoyexinxixn.ActivityLesson.flow;


import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;

import com.xiaoyexinxixn.ActivityLesson.model.Student;

public class StudentLeaveProcess9 {
	//获取默认流程引擎实例,会自动读取activiti.cfg.xml ,所以我们要严格定义配置文件的名称
	private ProcessEngine processEngine =ProcessEngines.getDefaultProcessEngine();
	
	/**
	 * 部署流程定义
	 */
	@Test
	public void deploy() {
		//获取部署相关service,这些都是activiti封装好的api接口,还有很多,下面也会用到很多
		Deployment deployment=processEngine.getRepositoryService()
		//创建部署
		.createDeployment()
		//加载流程图资源文件
		.addClasspathResource("diagrams/StudentLeave9.bpmn")
		//加载流程图片
		.addClasspathResource("diagrams/StudentLeave9.png")
		//流程名称
		.name("leave09")
		//部署流程
		.deploy();
		System.out.println("流程部署的ID: "+deployment.getId());
		System.out.println("流程部署的Name: "+deployment.getName());
	}
	
	/*
	 * 指定那些用过能够执行启动流程实例
	 */
	@Test
	public void start(){
		//运行启动流程的servicee
		ProcessInstance pi=processEngine.getRuntimeService()
		//定义流程表的KEY字段值,key值是我们前面定义好的key,可在act_re_procdef表中的key_字段中找到,
		.startProcessInstanceByKey("StudentLeaveProcess09");
		System.out.println(pi.getId());
		System.out.println(pi.getProcessDefinitionId());
	}
	
	/**
	 * 查看任务
	 */
	@Test
	public void findTaskList(){
		//获取任务列表的service
		List<Task> taskList=processEngine.getTaskService()
				//创建任务查询
				.createTaskQuery()
				//指定任务的执行人
//				.taskAssignee("xiaoliu001")  //单用户
				.taskCandidateUser("liu002")
				.list();
		for(Task task:taskList){
			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.getProcessInstanceId());
		}
	}

依次执行上面代码,最后查看任务是:

任务ID:155004
任务名称:leave001
任务创建时间:Sun Apr 22 17:36:07 CST 2018
任务委派人:null
任务流程实例Id:155001

说明也是OK的。

我们看看身份联系表:

第八章:activiti多用户任务分配

是有两个人的。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/106140.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Python 标识符详解[学习 Python 必备基础知识][看此一篇就够了]「建议收藏」

    Python 标识符详解[学习 Python 必备基础知识][看此一篇就够了]「建议收藏」标识符就是一个名字,它的主要作用就是作为变量、函数、类、模块以及其他对象的名称。就好像我们人一样,需要起个名字,便于称呼、指代。在给标识符命名的时候还要尽量做到“见名知其意”,例如`book_name`我们看到之后,就能大概猜出是“书的名字”相关的内容;`user_name`我们看到之后,能大概猜出是“用户名字”相关的内容等等。

  • dos命令进入d盘文件夹(windows cd到d盘)

    如何运行命令提示符,然后使用CD命令进入制定文件夹在win系统下进入命令提示符的方式是在开始的输入框中输入“cmd”,然后按“enter”进入。cd为进入的命令。具体步骤如下:步骤一:在pc端主界面中点击“开始”菜单栏,输入“cmd”,按“enter”进入命令提示符界面。步骤二:使用cd命令进入e盘。如何运行命令提示符,然后使用CD命令进入制定文件夹?使用CD命令进入指定文件?比如在桌面文…

  • IIc通信协议(一)[通俗易懂]

    IIc通信协议(一)[通俗易懂]–>物理结构:–>通信原理:通过对SCL和SDA线高低电平时序的控制,来产生I2C总线协议所需要的信号进行数据的传递。在总线空闲状态时,这两根线一般被上面所接的上拉电阻拉高,保持着高电平。–>iic总线协议:1】起始和结束信号总是由主设备产生。起始信号:SCL高电平空闲,SDA由高变低;(SDA拉低后SCL再拉低)结束信号:SCL高电平空闲…

  • 数据库设计工具推荐

    数据库设计工具推荐要是MySQL推荐Workbench。PD(PowerDesigner)和ERWin。大家是这样介绍的,需要的可以使用下看看。

  • 机器学习算法(15)之Xgboost算法

    机器学习算法(15)之Xgboost算法前言:前一篇文章对boosting的两个方法做了阐述,这篇文章将会是对前两篇文章的深化,谈的是一个更加优化了的boostIng算法,自从2014年9月份在Kaggle的希格斯玻色子机器学习大赛中夺魁以来,XGBoost与深度学习两个算法垄断了Kaggle大赛的大部分冠军。现在Kaggle大赛的情况基本是这样的,凡是非结构化数据相关,比如语音、图像,基本都是深度学习获胜,凡是结构化数据上…

  • mysql有多少个端口号_mysql默认端口号(mysql端口号是多少)[通俗易懂]

    mysql默认端口号(mysql端口号是多少)2020-05-0722:14:36共10个回答mysql的默认端口号是多少mysql默认端口号为3306,修改端口号方法:修改配置文件/etc/my.cnfmysql使用的默认端口号是哪个端口mysql的默认端口是3306,可以编辑用户目录下的.my.cnf文件进行修改.sqlserver默认端口号为:1433oracle默认端口号为:1521DB…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号