JBPM4工作流之流程变量的应用和动态指定工作流中某一个任务的办理者以及工作流的决策理解和实现

上一篇介绍了JBPM4工作流之在myecplsie中安装jBPM4.0开发插件以及JBPM4的简单介绍和入门

主要说明了JBPM4的搭建和初步的认识jbpm4工作流,这几天在学习jbpm4工作流框架中有不少的收获,一般在流程审批的oa项目中,,工作流框架是oa项目中经常应用到的,如何理解工作流整个的工作流程以及如何理解工作流中的任务和活动的区别,所以下面介绍一下jbpm4的流程变量和如何流程实例中任务的办理者,以及流程中决策的流转。

小知识:

任务:一般人为参与的称为任务。

活动:非人为参与的称为活动。

1、流程变量的junit单元测试实例:

根绝上一篇贴出的代码往下继续编写和介绍:

1.1、流程实例中的流程变量的定义

/**
	 * 通过流程定义的key创建流程实例
	 */
	@Test
	public void testCreateStartProcessInstanceByKey(){
		//获取流程实例的服务对象
		ExecutionService es=pe.getExecutionService();
		//创建流程实例
		ProcessInstance instance= es.startProcessInstanceByKey("test");
		//定义流程定义上的变量
		Map variables=new HashMap();
		variables.put("initData", "员工试用期之间尽量少请假");
		variables.put("initData_days", "请假天数至少不要超过5天");
		es.setVariables(instance.getId(), variables);
		//通过key创建流程实例
		System.out.println("流程实例的ID,不是DBID:"+instance.getId());
		System.out.println("流程实例的key:"+instance.getKey());
		System.out.println("流程实例的名字:"+instance.getName());
		System.out.println("流程实例的状态:"+instance.getState());
	}
   1.2、流程实例中办理指定任务的流程变量的定义:

/**
	 * 根据任务ID办理指定的任务
	 */
	@Test
	public void testCompleteTasks(){
		//指定的任务ID
		String taskId="50002";
		TaskService ts=pe.getTaskService();
		//在任务中设置流程变量
		Map variables=new HashMap();
		variables.put("reason", "由于家里有事");
		variables.put("days", "请假5天");
		ts.setVariables(taskId, variables);
		//办理任务
		ts.completeTask(taskId);
	}
1.3、获取流程实例中的流程变量:

/**
	 * 获取流程实例上的指定变量和所有变量
	 */
	@Test
	public void testProcessDifinitionVariable(){
		ExecutionService service=pe.getExecutionService();
		/**
		 * 1、获取指定的流程变量
		 */
		//executionId:流程实例的id(不过我这里是通过key创建流程实例的,key的形式:name.id)
		String executionId="test.50001";
		System.out.println(	service.getVariable(executionId, "initData"));
		/**
		 * 2、获取所有的流程实例中所有流程变量
		 */
		Set variableNames=service.getVariableNames(executionId);
		System.out.println("executionId指定的流程实例中的所有的流程变量:"+service.getVariables(executionId, variableNames));
	}
1.4:获取流程实例中任务的流程变量:

/**
	 * 在任务中找到流程的指定变量和所有变量,和流程实例中找到流程变量具有相似性
	 */
	@Test
	public void testFindTaskVariable(){
		TaskService service= pe.getTaskService();
		/**
		 * 1、获取任务中指定的流程变量
		 */
		//taskId:任务的id
		String taskId="70002";
		System.out.println(	service.getVariable(taskId, "reason"));
		System.out.println(	service.getVariable(taskId, "days"));
	}

2、在OA项目中我们会发现,一个工作流程有多个任务或者活动,随着一个流程实例中的一个任务的完成会交给下个任务办理者办理。功能的实现:

2.1、某个任务对应某一个角色,比如说在某种特定的场景下:假设一间公司有几个项目组长,一般一个员工在某一个项目组,因此如果我们请假的话是交给项目组长审批,但是在jbpm4工作流中,我们都知道请假这个工作流是根据流程模板指定的,所以流程模板中的某一个任务通常指定的是某种角色,而不是指定的每一个人,因此下面会实现假设有一个请假工作流交给项目组长时,我们可以指定是哪一个项目组长(比如给小张或者大张审批)。

2.1.1、硬性指定流程实例中的任务办理者是谁:

          JBPM4工作流之流程变量的应用和动态指定工作流中某一个任务的办理者以及工作流的决策理解和实现_第1张图片

/**
	 * 指定任务的下一个办理者(硬性指定的任务办理者是小张)
	 */
	@Test
	public void testAssigneeByUser(){
		//指定的任务ID
		String taskId="250002";
		TaskService ts=pe.getTaskService();
		//在任务中设置流程变量
		Map variables=new HashMap();
		variables.put("reason", "由于家里有事");
		variables.put("days", "请假三天");
		variables.put("user", "小张");
		//办理任务
		ts.completeTask(taskId,"to 部门经理审批",variables);
	}
2.2、通过请假的天数指定下一个任务办理者是谁:

    流程定义图中的变量指定和上述的一样。

        2.2.1、定义一个办理者处理器:

package jbpm4.demo1;

import org.jbpm.api.model.OpenExecution;
import org.jbpm.api.task.Assignable;
import org.jbpm.api.task.AssignmentHandler;
/**
 * 办理者处理器:(根据运算动态指定办理人),也就是说指定任务的下个办理者是谁,比如说部门经理:小张,大张
 * @author Administrator
 *
 */
public class MyAssgineeHandler implements AssignmentHandler {

	@Override
	public void assign(Assignable assignable, OpenExecution execution)
			throws Exception {
		// TODO Auto-generated method stub
		//从流程实例中获取流程变量
		int day= Integer.parseInt(execution.getVariable("day").toString());
		if(day<5){
			assignable.setAssignee("小张");
		}else{
			assignable.setAssignee("大张");
			
		}
	}

}
JBPM4工作流之流程变量的应用和动态指定工作流中某一个任务的办理者以及工作流的决策理解和实现_第2张图片

2.2.2:实现的代码:

/**
	 * 指定任务的下一个办理者(通过请假的天数指定是由 部门经理:小张或者大张办理)
	 */
	@Test
	public void testAssigneeByDay(){
		//指定的任务ID
		String taskId="280002";
		TaskService ts=pe.getTaskService();
		//在任务中设置流程变量
		Map variables=new HashMap();
		variables.put("reason", "由于家里有事");
		variables.put("day", "5");
		//办理任务
		ts.completeTask(taskId,"to 部门经理审批",variables);
	}

3、在工作流中还会存在决策,任务的下一个流转走哪一条分支也取决决策中的判断,下面给出实例:

3.1、重新画出流程定义图:

JBPM4工作流之流程变量的应用和动态指定工作流中某一个任务的办理者以及工作流的决策理解和实现_第3张图片

3..2.2、代码实现:

决策处理器:

package jbpm4.demo2;

import org.jbpm.api.jpdl.DecisionHandler;
import org.jbpm.api.model.OpenExecution;
/*
 * 决策处理器:指定任务的下一个跳转路径
 */
public class MyDecision implements DecisionHandler {

	@Override
	public String decide(OpenExecution execution) {
		// TODO Auto-generated method stub
		int day= Integer.parseInt(execution.getVariable("day").toString());
		if(day<5){
			 return "to end1";//到部门经理这里结束审批
		}else{
			 return "to 总经理审批";//到总经理这里结束审批
			
		}
	}

}


工作流中决策的实现:

/**
	 * 指定任务的下一个跳转路径:是直接到部门经理就已经审批结束or总经理审批结束
	 */
	@Test
	public void testTaskByUser(){
		//指定的任务ID
		String taskId="340002";
		TaskService ts=pe.getTaskService();
		//在任务中设置流程变量
		Map variables=new HashMap();
		variables.put("user", "小张");
		variables.put("reason", "由于家里有事");
		variables.put("day", "6");
		//办理任务
		ts.completeTask(taskId,"to 部门经理审批",variables);
	}
	
	/**
	 * 指定任务的下一个跳转路径:是直接到部门经理就已经审批结束or总经理审批结束
	 */
	@Test
	public void testTaskPathAssigneeByUser(){
		//指定的任务ID
		String taskId="350004";
		TaskService ts=pe.getTaskService();
		//在办理任务时添加自己的流程变量
		Map variables=new HashMap();
		variables.put("user", "大张");
		//办理任务
		ts.completeTask(taskId,"to 决策",variables);
	}

最后贴出完整的代码:

package jbpm4.demo2;

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

import org.jbpm.api.Configuration;
import org.jbpm.api.ExecutionService;
import org.jbpm.api.NewDeployment;
import org.jbpm.api.ProcessEngine;
import org.jbpm.api.ProcessInstance;
import org.jbpm.api.RepositoryService;
import org.jbpm.api.TaskService;
import org.jbpm.api.task.Task;
import org.junit.Test;

public class HellowordDemo1 {

	/**
	 * //建立jBPM4.4的数据库表
	 */
	@Test
	public void testCreateJbpmTable(){
		new org.hibernate.cfg.Configuration().configure("jbpm.hibernate.cfg.xml").buildSessionFactory();
	} 

	//流程引擎,通过流程引擎获取各种服务接口
	private ProcessEngine pe=Configuration.getProcessEngine();
	/**
	 * 部署流程定义模板
	 */
	@Test
	public void testDeployProcessDefinition(){
		System.out.println(pe);
		//获取流程定义的service对象
		RepositoryService ps= pe.getRepositoryService();
		//获取流程定义对象
		NewDeployment  deployment= ps.createDeployment();
		//添加流程定义模板到流程定义对象中
		deployment.addResourceFromClasspath("test.jpdl.xml").addResourceFromClasspath("test.png");
		//流程定义模板的名称和时间
		deployment.setName("请假流程模板");
		deployment.setTimestamp(new Date().getTime());
		//部署流程定义到数据库中
		deployment.deploy();
	}
	
	/**
	 * 通过流程定义模板的ID创建流程实例
	 */
	@Test
	public void testCreateStartProcessInstanceById(){
		ExecutionService es= pe.getExecutionService();
		ProcessInstance instance= es.startProcessInstanceById("test-2");
		System.out.println("流程实例的ID:"+instance.getId());
		System.out.println("流程实例的key:"+instance.getKey());
		System.out.println("流程实例的名字:"+instance.getName());
		System.out.println("流程实例的状态:"+instance.getState());
	}
	
	/**
	 * 通过流程定义的key创建流程实例
	 */
	@Test
	public void testCreateStartProcessInstanceByKey(){
		//获取流程实例的服务对象
		ExecutionService es=pe.getExecutionService();
		//创建流程实例
		ProcessInstance instance= es.startProcessInstanceByKey("test");
		//定义流程定义上的变量
		Map variables=new HashMap();
		variables.put("initData", "员工试用期之间尽量少请假");
		variables.put("initData_days", "请假天数至少不要超过5天");
		es.setVariables(instance.getId(), variables);
		//通过key创建流程实例
		System.out.println("流程实例的ID,不是DBID:"+instance.getId());
		System.out.println("流程实例的key:"+instance.getKey());
		System.out.println("流程实例的名字:"+instance.getName());
		System.out.println("流程实例的状态:"+instance.getState());
	}
	
	/**
	 * 级联删除流程实例(不推荐)
	 * 实质:不是通过DBID,而是通过实例表的ID来删除
	 */
	public void testDeleteProcessInstance(){
		ExecutionService es= pe.getExecutionService();
		es.deleteProcessInstanceCascade("test.200001");
	}
	/**
	 * 查看用户未办理的任务
	 */
	@Test
	public void testFindTasksById(){
		String taskId="员工";
		//获取任务的服务对象
		TaskService ts=pe.getTaskService() ;
		List tasks= ts.findPersonalTasks(taskId);
		for(Task temp: tasks){
			System.out.println("任务的DBID:"+temp.getId());
			System.out.println("任务的名称:"+temp.getName());
			System.out.println("任务的办理者:"+temp.getAssignee());
			System.out.println("任务参照的流程实例:"+temp.getExecutionId());
			System.out.println("任务参照的创建时间:"+temp.getCreateTime());
		}
	}
	/**
	 * 根据任务ID办理指定的任务
	 */
	@Test
	public void testCompleteTasks(){
		//指定的任务ID
		String taskId="50002";
		TaskService ts=pe.getTaskService();
		//在任务中设置流程变量
		Map variables=new HashMap();
		variables.put("reason", "由于家里有事");
		variables.put("days", "请假5天");
		ts.setVariables(taskId, variables);
		//办理任务
		ts.completeTask(taskId);
	}
	
	/**
	 * 获取流程实例上的指定变量和所有变量
	 */
	@Test
	public void testProcessDifinitionVariable(){
		ExecutionService service=pe.getExecutionService();
		/**
		 * 1、获取指定的流程变量
		 */
		//executionId:流程实例的id(不过我这里是通过key创建流程实例的,key的形式:name.id)
		String executionId="test.50001";
		System.out.println(	service.getVariable(executionId, "initData"));
		/**
		 * 2、获取所有的流程实例中所有流程变量
		 */
		Set variableNames=service.getVariableNames(executionId);
		System.out.println("executionId指定的流程实例中的所有的流程变量:"+service.getVariables(executionId, variableNames));
	}
	/**
	 * 在任务中找到流程的指定变量和所有变量,和流程实例中找到流程变量具有相似性
	 */
	@Test
	public void testFindTaskVariable(){
		TaskService service= pe.getTaskService();
		/**
		 * 1、获取任务中指定的流程变量
		 */
		//taskId:任务的id
		String taskId="70002";
		System.out.println(	service.getVariable(taskId, "reason"));
		System.out.println(	service.getVariable(taskId, "days"));
	}
	
	/**
	 * 指定任务的下一个办理者(通过请假的天数指定是由 部门经理:小张或者大张办理)
	 */
	@Test
	public void testAssigneeByUser(){
		//指定的任务ID
		String taskId="250002";
		TaskService ts=pe.getTaskService();
		//在任务中设置流程变量
		Map variables=new HashMap();
		variables.put("reason", "由于家里有事");
		variables.put("user", "李四");
		//办理任务
		ts.completeTask(taskId,"to 部门经理审批",variables);
	}
	/**
	 * 指定任务的下一个办理者(通过请假的天数指定是由 部门经理:小张或者大张办理)
	 */
	@Test
	public void testAssigneeByDay(){
		//指定的任务ID
		String taskId="280002";
		TaskService ts=pe.getTaskService();
		//在任务中设置流程变量
		Map variables=new HashMap();
		variables.put("reason", "由于家里有事");
		variables.put("day", "5");
		//办理任务
		ts.completeTask(taskId,"to 部门经理审批",variables);
	}
	/**
	 * 指定任务的下一个跳转路径:是直接到部门经理就已经审批结束or总经理审批结束
	 */
	@Test
	public void testTaskByUser(){
		//指定的任务ID
		String taskId="340002";
		TaskService ts=pe.getTaskService();
		//在任务中设置流程变量
		Map variables=new HashMap();
		variables.put("user", "小张");
		variables.put("reason", "由于家里有事");
		variables.put("day", "6");
		//办理任务
		ts.completeTask(taskId,"to 部门经理审批",variables);
	}
	
	/**
	 * 指定任务的下一个跳转路径:是直接到部门经理就已经审批结束or总经理审批结束
	 */
	@Test
	public void testTaskPathAssigneeByUser(){
		//指定的任务ID
		String taskId="350004";
		TaskService ts=pe.getTaskService();
		//在办理任务时添加自己的流程变量
		Map variables=new HashMap();
		variables.put("user", "大张");
		//办理任务
		ts.completeTask(taskId,"to 决策",variables);
	}
	
}


·

你可能感兴趣的:(工作流)