首页 > 工作流 > 工作流Activiti5入门(下)

工作流Activiti5入门(下)

2015年11月29日 发表评论 阅读评论

看了工作流上和中的人,相信已经在慢慢入门了,因为本教程也只是致力于做一个入门而已,然后在用的过程中再慢慢学习,用来工作也许是一点问题都没有了,如果没有看过请看这篇这篇,所以本没有必要再写下了,但实在感觉留下一个小尾巴:数据库还没有给大家介绍,这个入门实在是太过简陋,所以今天就把这篇文章来一个扫尾,下面先看最后一个想用的task

六. 组任务

流程图:
9
其实和用户任务看起来并无差别,下面看实现

1. 分配组任务方式一(直接指定办理人)

具体配置:

11

完成任务:


	/**查询当前人的个人任务*/
	@Test
	public void findMyPersonalTask(){
		String assignee = "小A";
		List<Task> list = processEngine.getTaskService()//与正在执行的任务管理相关的Service
						.createTaskQuery()//创建任务查询对象
						/**查询条件(where部分)*/
						.taskAssignee(assignee)//指定个人任务查询,指定办理人
//						.taskCandidateUser(candidateUser)//组任务的办理人查询
						/**排序*/
						.orderByTaskCreateTime().asc()//使用创建时间的升序排列
						/**返回结果集*/
						.list();//返回列表
		if(list!=null && list.size()>0){
			for(Task task:list){
				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());
				System.out.println("执行对象ID:"+task.getExecutionId());
				System.out.println("流程定义ID:"+task.getProcessDefinitionId());
				System.out.println("########################################################");
			}
		}
	}
	
	/**查询当前人的组任务*/
	@Test
	public void findMyGroupTask(){
		String candidateUser = "大大";
		List<Task> list = processEngine.getTaskService()//与正在执行的任务管理相关的Service
						.createTaskQuery()//创建任务查询对象
						/**查询条件(where部分)*/
						.taskCandidateUser(candidateUser)//组任务的办理人查询
						/**排序*/
						.orderByTaskCreateTime().asc()//使用创建时间的升序排列
						/**返回结果集*/
						.list();//返回列表
		if(list!=null && list.size()>0){
			for(Task task:list){
				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());
				System.out.println("执行对象ID:"+task.getExecutionId());
				System.out.println("流程定义ID:"+task.getProcessDefinitionId());
				System.out.println("########################################################");
			}
		}
	}
	
	/**完成我的任务*/
	@Test
	public void completeMyPersonalTask(){
		//任务ID
		String taskId = "6905";
		processEngine.getTaskService()//与正在执行的任务管理相关的Service
					.complete(taskId);
		System.out.println("完成任务:任务ID:"+taskId);
	}
	
	
	/**查询正在执行的任务办理人表*/
	@Test
	public void findRunPersonTask(){
		//任务ID
		String taskId = "6204";
		List<IdentityLink> list = processEngine.getTaskService()//
					.getIdentityLinksForTask(taskId);
		if(list!=null && list.size()>0){
			for(IdentityLink identityLink:list){
				System.out.println(identityLink.getTaskId()+"   "+identityLink.getType()+"   "+identityLink.getProcessInstanceId()+"   "+identityLink.getUserId());
			}
		}
	}
	/**查询历史任务的办理人表*/
	@Test
	public void findHistoryPersonTask(){
		//流程实例ID
		String processInstanceId = "6201";
		List<HistoricIdentityLink> list = processEngine.getHistoryService()//
						.getHistoricIdentityLinksForProcessInstance(processInstanceId);
		if(list!=null && list.size()>0){
			for(HistoricIdentityLink identityLink:list){
				System.out.println(identityLink.getTaskId()+"   "+identityLink.getType()+"   "+identityLink.getProcessInstanceId()+"   "+identityLink.getUserId());
			}
		}
	}
	
	
	/**拾取任务,将组任务分给个人任务,指定任务的办理人字段*/
	@Test
	public void claim(){
		//将组任务分配给个人任务
		//任务ID
		String taskId = "6905";
		//分配的个人任务(可以是组任务中的成员,也可以是非组任务的成员)
		String userId = "大大";
		processEngine.getTaskService()//
					.claim(taskId, userId);
	}
	
	
	/**将个人任务回退到组任务,前提,之前一定是个组任务*/
	@Test
	public void setAssigee(){
		//任务ID
		String taskId = "6204";
		processEngine.getTaskService()//
					.setAssignee(taskId, null);
	}
	
	/**向组任务中添加成员*/
	@Test
	public void addGroupUser(){
		//任务ID
		String taskId = "6204";
		//成员办理人
		String userId = "大H";
		processEngine.getTaskService()//
					.addCandidateUser(taskId, userId);
	}
	
	/**从组任务中删除成员*/
	@Test
	public void deleteGroupUser(){
		//任务ID
		String taskId = "6204";
		//成员办理人
		String userId = "小B";
		processEngine.getTaskService()//
					.deleteCandidateUser(taskId, userId);
	}

2. 分配组任务方式二(使用流程变量)

具体配置:

13

完成任务:


		// 2 启动流程
		//启动流程实例,同时设置流程变量,用来指定组任务的办理人
		Map<String, Object> variables = new HashMap<String, Object>();
		variables.put("userIDs", "大大,小小,中中");
		ProcessInstance pi = processEngine.getRuntimeService()//
						.startProcessInstanceByKey("taskProcess",variables);
		System.out.println("pid:" + pi.getId());
	}
	
	//查询我的个人任务列表
	@Test
	public void findMyTaskList(){
		String userId = "大大";
		List<Task> list = processEngine.getTaskService()//
		                .createTaskQuery()//
		                .taskAssignee(userId)//指定个人任务查询
		                .list();
		for(Task task:list ){
			System.out.println("id="+task.getId());
			System.out.println("name="+task.getName());
			System.out.println("assinee="+task.getAssignee());
			System.out.println("assinee="+task.getCreateTime());
			System.out.println("executionId="+task.getExecutionId());
			
		}
	}
	
	//查询组任务列表
	@Test
	public void findGroupList(){
		String userId = "大大";
		List<Task> list = processEngine.getTaskService()//
		                .createTaskQuery()//
		                .taskCandidateUser(userId)//指定组任务查询
		                .list();
		for(Task task:list ){
			System.out.println("id="+task.getId());
			System.out.println("name="+task.getName());
			System.out.println("assinee="+task.getAssignee());
			System.out.println("assinee="+task.getCreateTime());
			System.out.println("executionId="+task.getExecutionId());
			System.out.println("##################################");
			
		}
	}
	
	//查询组任务成员列表
	@Test
	public void findGroupUser(){
		String taskId = "3709";
		List<IdentityLink> list = processEngine.getTaskService()//
		                .getIdentityLinksForTask(taskId);
		for(IdentityLink identityLink:list ){
			System.out.println("userId="+identityLink.getUserId());
			System.out.println("taskId="+identityLink.getTaskId());
			System.out.println("piId="+identityLink.getProcessInstanceId());
			System.out.println("######################");
		}
	}
	
	//查询组任务成员历史列表
	@Test
	public void findGroupHisUser(){
		String taskId = "3709";
		List<HistoricIdentityLink> list = processEngine.getHistoryService()//
						.getHistoricIdentityLinksForTask(taskId);
		for(HistoricIdentityLink identityLink:list ){
			System.out.println("userId="+identityLink.getUserId());
			System.out.println("taskId="+identityLink.getTaskId());
			System.out.println("piId="+identityLink.getProcessInstanceId());
			System.out.println("######################");
		}
	}
	
	//完成任务
	@Test
	public void completeTask(){
		String taskId = "3709";
		processEngine.getTaskService()//
					.complete(taskId);//
		System.out.println("完成任务");
	}

     /**将组任务分配给个人任务,拾取任务*/
	//由1个人去完成任务
	@Test
	public void claim(){
		//任务ID
		String taskId = "5908";
		//分配的办理人
		String userId = "小B";
		processEngine.getTaskService()//
					.claim(taskId, userId);
	}

七. 数据库

Activiti的后台是有数据库的支持,所有的表都以ACT_开头。 第二部分是表示表的用途的两个字母标识。 用途也和服务的API对应。
ACT_RE_*: ‘RE’表示repository。 这个前缀的表包含了流程定义和流程静态资源 (图片,规则,等等)。
ACT_RU_*: ‘RU’表示runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。 Activiti只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。
ACT_ID_*: ‘ID’表示identity。 这些表包含身份信息,比如用户,组等等。
ACT_HI_*: ‘HI’表示history。 这些表包含历史数据,比如历史流程实例, 变量,任务等等。
ACT_GE_*: 通用数据, 用于不同场景下,如存放资源文件。

再具体的各个表结构操作如下,至于各个表的每个字段什么含义,就靠读者自己学习了:
1:资源库流程规则表
act_re_deployment 部署信息表
act_re_model 流程设计模型部署表
act_re_procdef 流程定义数据表
2:运行时数据库表
act_ru_execution 运行时流程执行实例表
act_ru_identitylink 运行时流程人员表,主要存储任务节点与参与者的相关信息
act_ru_task 运行时任务节点表
act_ru_variable 运行时流程变量数据表
3:历史数据库表
act_hi_actinst 历史节点表
act_hi_attachment 历史附件表
act_hi_comment 历史意见表
act_hi_identitylink 历史流程人员表
act_hi_detail 历史详情表,提供历史变量的查询
act_hi_procinst 历史流程实例表
act_hi_taskinst 历史任务实例表
act_hi_varinst 历史变量表
4:组织机构表
act_id_group 用户组信息表
act_id_info 用户扩展信息表
act_id_membership 用户与用户组对应信息表
act_id_user 用户信息表
这四张表很常见,基本的组织机构管理,关于用户认证方面建议还是自己开发一套,组件自带的功能太简单,使用中有很多需求难以满足
5:通用数据表
act_ge_bytearray 二进制数据表
act_ge_property 属性数据表存储整个流程引擎级别的数据,初始化表结构时,会默认插入三条记录,

至于这些表的ER图,则如下:

acticiti_er_1

activiti_er_2
写到这里,工作流activiti的一个基本教程就完了,因为这几篇博客,是老夫随性所写,并无一个整体的计划,所以很散漫,但老夫相信看完这个系列的教程,读者对activiti一定有了一个初步的概念,聪明如读者,再加上自己的使用过程中的自学,在工作中一定可以如鱼得水

分享到:
作 者: BridgeLi,http://www.bridgeli.cn/
原文链接:https://www.bridgeli.cn/archives/233
版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。
分类: 工作流 标签: ,
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.