Actviti工作流入门知识(流程变量) DAY-02

一、流程变量

流程变量在整个工作流中扮演很重要的作用。例如:请假流程中有请假天数、请假原因等一些参数都为流程变量的范围。流程变量的作用域范围是流程实例。也就是说各个流程实例的流程变量是不相互影响的。流程实例结束完成以后流程变量还保存在数据库中(存放到流程变量的历史表中)。
在这里插入图片描述

二、部署流程定义

public class VatTest {
	@Test
	public void testDeploy() throws Exception {
		//获取核心对象  服务大管家
		ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
		//获取服务
		RepositoryService repositoryService = defaultProcessEngine.getRepositoryService();
		//部署对象
		DeploymentBuilder createDeployment = repositoryService.createDeployment();
		//上传资源
		InputStream inputStream = this.getClass().getResourceAsStream("Leave.bpmn");
		InputStream inputStream2 = this.getClass().getResourceAsStream("Leave.png");
		createDeployment.addInputStream("Leave.bpmn", inputStream);
		createDeployment.addInputStream("Leave.png", inputStream2);
		createDeployment.name("申请假期");
		//部署
		createDeployment.deploy();
	}
	
}

三、启动流程实例

/**
	 * 启动流程实例
	 * @throws Exception
	 */
	@Test
	public void testStart() throws Exception {
		//获取核心对象  服务大管家 
		ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
		//获取服务
		RuntimeService runtimeService = defaultProcessEngine.getRuntimeService();
		//启动  并且设置变量
		Map<String,Object> map = new HashMap<>();
		map.put("time", new Date());// s时间
		map.put("is", true); // 是否是会员卡
		map.put("user", new User(1, "kd", "1111"));
		ProcessInstance startProcessInstanceByKey = runtimeService.startProcessInstanceByKey("Leave",map);
		System.out.println(startProcessInstanceByKey);
		
	}

四、完成任务 获取流程变量

	public void testCompleTask() throws Exception {
		// 获取核心对象 服务大管家
		ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
	    // 获取服务
		RuntimeService runtimeService = defaultProcessEngine.getRuntimeService();
		// 实例  processInstance  和 excution 执行对象
		String executionId="7501";
		String variableName="cardID";
		// 获取单个值
		String variable = (String) runtimeService.getVariable(executionId, variableName);
	   // 某几个值
		Map<String, Object> variables2 = runtimeService.getVariables(executionId, Arrays.asList("cardID","money"));
		System.out.println(variables2);
		
		System.out.println("================分割线=======================");
		
		// 任务服务对象 TaskService 获取流程变量
		TaskService taskService = defaultProcessEngine.getTaskService();
		String taskId="7511";
		String variableName2="cardID";
		Map<String, Object> variables = taskService.getVariables(taskId);
		System.out.println(variables);
		// 完成
		// 添加流程变量代表申请的原因
		Map<String, Object> variables3=new HashMap<>();
		variables3.put("reson", "需要去植发");
		variables3.put("date", "一天");
		// 
		variables3.put("is", false);
		taskService.complete(taskId,variables3);
	}

说明:
1)流程变量的作用域就是流程实例,所以只要设置就行了,不用管在哪个阶段设置
2)基本类型设置流程变量,在taskService中使用任务ID,定义流程变量的名称,设置流程变量的值。
3)Javabean类型设置流程变量,需要这个javabean实现了Serializable接口
4)设置流程变量的时候,向act_ru_variable这个表添加数据

五、经理审批 完成任务-获取流程变量

	public void testlsCompleTask() throws Exception {
		// 获取核心对象 服务大管家
		ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
		TaskService taskService = defaultProcessEngine.getTaskService();
		String taskId="10004";
		Map<String, Object> variables = taskService.getVariables(taskId);
		System.out.println(variables);
	}

说明:
1)流程变量的获取针对流程实例(即1个流程),每个流程实例获取的流程变量时不同的
2)使用基本类型获取流程变量,在taskService中使用任务ID,流程变量的名称,获取流程变量的值。
3)Javabean类型设置获取流程变量,除了需要这个javabean实现了Serializable接口外,还要求流程变量对象的属性不能发生变化,否则抛出异常。解决方案,固定序列化ID

六、顺序流 -线-判断走向

分支流
同意和驳回(一旦驳回重新申请)
${flag==true}
在这里插入图片描述

七、任务节点
用户节点 (必须人参与) ----usertask –
complate(taskid)
接收节点(自动化程序参与) ---- receive --计算销售额-发送短信
signal(excuid)
流程图如下:
在这里插入图片描述

八、网关节点
排他网关 --只能一个完成
并行网关 – 所有执行完才能算完成

九、监听器
在流程中我们有时会对整个流程或者一个节点的某种状态做出相应的处理。这时就会用到监听器。

在Activiti中流程的监听主要分为两大类:

执行监听器和任务监听器。

任务监听器:只能绑定到用户任务节点。 可用于用户节点办理者的动态设置,操作日志等

执行监听器:可以在任何节点绑定。修改流程结束状态(在结束节点绑定执行监听器执行修改),操作日志等

1,执行监听器 任何节点
excutionListener
2.任务监听器 用户任务节点
taskListener

场景:动态设置处理人

十、封装了BaseBpmn类

public class BaseBpmn {
	// 获取核心对象 服务大管家
	protected ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
	// 获取运行的service服务
	protected RuntimeService runtimeService = defaultProcessEngine.getRuntimeService();
	// 获取TaskService
	protected TaskService taskService = defaultProcessEngine.getTaskService();

	/**
	 * 部署文件
	 */
	public void deploy(String resource,String name){
		//获取核心对象  服务大管家
		ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
		//获取服务
		RepositoryService repositoryService = defaultProcessEngine.getRepositoryService();
		//部署对象
		DeploymentBuilder createDeployment = repositoryService.createDeployment();
		//上传资源
		InputStream inputStream = this.getClass().getResourceAsStream(resource+".bpmn");
		InputStream inputStream2 = this.getClass().getResourceAsStream(resource+".png");
		createDeployment.addInputStream(resource+".bpmn", inputStream);
		createDeployment.addInputStream(resource+".png", inputStream2);
		createDeployment.name(name);
		//部署
		createDeployment.deploy();
	}
	
	/**
	 * 启动实例带流程变量
	 */
	public ProcessInstance start(String key, Map<String, Object> variables) {
		// 启动
		// 设置一下变量
		ProcessInstance startProcessInstanceByKey = runtimeService.startProcessInstanceByKey(key, variables);
		return startProcessInstanceByKey;
	}

	/**
	 * 启动实例带流程变量
	 */
	public ProcessInstance start(String key) {
		// 启动
		// 设置一下变量
		ProcessInstance startProcessInstanceByKey = runtimeService.startProcessInstanceByKey(key);
		return startProcessInstanceByKey;
	}

	/**
	 * 完成任务 带流程变量 方便流转到下以个节点
	 */
	public void compleTask(String taskId, Map<String, Object> variables) throws Exception {
		taskService.complete(taskId, variables);
	}

	/**
	 * 完成任务
	 */
	public void compleTask(String taskId) throws Exception {
		taskService.complete(taskId);
	}

	/**
	 * 完成任务 实例id 和 人的名称
	 */
	public void compleTaskByPIdAndName(String pid, String name) throws Exception {
		// 获取查询对象
		TaskQuery createTaskQuery = taskService.createTaskQuery();
		// 获取任务id
		Task task = createTaskQuery.processInstanceId(pid).taskAssignee(name).singleResult();
		// 完成
		taskService.complete(task.getId());
	}

	/**
	 * 完成任务 实例id 和 人的名称
	 */
	public void compleTaskByPIdAndName(String pid, String name, Map<String, Object> variables) throws Exception {
		// 获取查询对象
		TaskQuery createTaskQuery = taskService.createTaskQuery();
		// 获取任务id
		Task task = createTaskQuery.processInstanceId(pid).taskAssignee(name).singleResult();
		// 完成
		taskService.complete(task.getId(), variables);
	}

	/**
	 * 查询某个人的任务列表
	 */
	public List<Task> queryTaskList(String name) throws Exception {
		// 获取查询对象
		TaskQuery createTaskQuery = taskService.createTaskQuery();
		// 设置查询条件
		createTaskQuery.taskAssignee(name);
		// 查询列表
		List<Task> list = createTaskQuery.list();
		return list;
	}

	/**
	 * 查询某个人的当前任务
	 */
	public Task queryTaskByName(String pid, String name) throws Exception {
		// 获取查询对象
		TaskQuery createTaskQuery = taskService.createTaskQuery();
		// 设置查询条件
		createTaskQuery.taskAssignee(name);
		createTaskQuery.processInstanceId(pid);
		//
		Task task = createTaskQuery.singleResult();
		return task;
	}

	/**
	 * 查询当前执行对象(当前活动节点)
	 */
	public Execution queryExcution(String pid, String actid) throws Exception {
		// 获取查询对象
		ExecutionQuery createExecutionQuery = runtimeService.createExecutionQuery();
		// 设置查询条件
		Execution execution = createExecutionQuery.processInstanceId(pid).activityId(actid).singleResult();
		// 返回
		return execution;
	}

	// 查询流程是否结束
	public void isEnd(String pid) {
		// 查询对象
		ProcessInstanceQuery createProcessInstanceQuery = runtimeService.createProcessInstanceQuery();
		// 根据id
		ProcessInstance singleResult = createProcessInstanceQuery.processInstanceId(pid).singleResult();
		// 如果singleResult找到说明流程还没有结束
		if (singleResult != null) {
			System.out.println("流程未结束或不存在");
		} else {
			System.out.println("流程结束");
		}

	}

}

猜你喜欢

转载自blog.csdn.net/weixin_43849591/article/details/84638047