Activiti工作流--流程变量应用之一:选择连线--之七

流程的业务描述

财务报账审批流程:
如果财务主管接到审批任务,发现金额只有500时,自己审批完流程结束
如果财务主管接到审批任务,发现金额是1000时,审批完以后转给财务经理继续审批,财务经理审批完流程结束

先获取连接
private ProcessEngine processEngine;
   
@Before
public void initProcessEngine(){
   processEngine = ProcessEngines.getDefaultProcessEngine();
}
流程定义与部署
@Test
public void testProcessDeployment(){
	Deployment deployment = processEngine.getRepositoryService()
								.createDeployment()
								.addClasspathResource("diagram/approve.bpmn")
								.addClasspathResource("diagram/approve.png")
								.name("财务报账")
								.deploy();
	System.out.println("流程部署ID:"+deployment.getId());//60001
	System.out.println("流程的名称:"+deployment.getName());
}

流程图
approve.bpmn代码

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
  <process id="approve" name="approveProcess" isExecutable="true">
    <startEvent id="startevent1" name="Start"></startEvent>
    <userTask id="usertask1" name="报账申请" activiti:assignee="王五"></userTask>
    <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
    <userTask id="usertask2" name="财务审批" activiti:assignee="赵六"></userTask>
    <sequenceFlow id="flow2" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow>
    <endEvent id="endevent1" name="End"></endEvent>
    <sequenceFlow id="flow3" sourceRef="usertask2" targetRef="endevent1"></sequenceFlow>
  </process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_approve">
    <bpmndi:BPMNPlane bpmnElement="approve" id="BPMNPlane_approve">
      <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
        <omgdc:Bounds height="35.0" width="35.0" x="250.0" y="90.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1">
        <omgdc:Bounds height="55.0" width="105.0" x="330.0" y="80.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="usertask2" id="BPMNShape_usertask2">
        <omgdc:Bounds height="55.0" width="105.0" x="480.0" y="80.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
        <omgdc:Bounds height="35.0" width="35.0" x="630.0" y="90.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
        <omgdi:waypoint x="285.0" y="107.0"></omgdi:waypoint>
        <omgdi:waypoint x="330.0" y="107.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
        <omgdi:waypoint x="435.0" y="107.0"></omgdi:waypoint>
        <omgdi:waypoint x="480.0" y="107.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3">
        <omgdi:waypoint x="585.0" y="107.0"></omgdi:waypoint>
        <omgdi:waypoint x="630.0" y="107.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</definitions>

流程图

启动流程
@Test
public void testStartProcess(){
	String processDefinitionKey = "approve";
	ProcessInstance processInstance = processEngine.getRuntimeService()
		.startProcessInstanceByKey(processDefinitionKey);
	System.out.println("流程部署ID:"+processInstance.getId());
	System.out.println("流程定义ID:"+processInstance.getProcessDefinitionId());
	System.out.println("流程实例ID:"+processInstance.getProcessInstanceId());//62501
}
查询个人,完成个人任务

注意:在完成个人任务的同时,设置流程变量,通过流程变量的设值来决定流程的下一步走向

/**
 * 流程处理过程:查询个人任务
 */
@Test
public void testSetVariable(){
	String assignee = "王五";
	String processInstanceId = "62501";
	List<Task> list = processEngine.getTaskService()
						.createTaskQuery()
						.taskAssignee(assignee)
						.processInstanceId(processInstanceId)
						.list();
	if (list != null && list .size() > 0) {
		for (Task task : list) {
			System.out.println("流程定义ID:"+task.getProcessDefinitionId());
			System.out.println("流程实例ID:"+task.getProcessInstanceId());
			System.out.println("执行对象ID:"+task.getExecutionId());
			System.out.println("任务ID:"+task.getId());
			System.out.println("任务名称:"+task.getName());
			System.out.println("任务创建时间:"+task.getCreateTime());
		}
	}
	String taskId = "62504";
	//设置流程变量,当任务id相同是,后面的值会覆盖前面的值
	/**
	 * 可以通过processEngine.getTaskService().setVariable(taskId taskid
	 * , variableName 变量名称
	 * , value 变量名称的值
	 * )
	 */
	//第一种方式
	/*processEngine.getTaskService().setVariable(taskId, "报账原因", "出差");
	processEngine.getTaskService().setVariable(taskId, "报账金额", 10000);
	processEngine.getTaskService().setVariable(taskId, "报账时间", new Date());*/
	//第二种方式
	/*Map<String, Object> map = new HashMap<String,Object>();
	map.put("报账原因", "餐费");
	map.put("报账金额", 1000);
	map.put("报账时间", new Date());
	processEngine.getTaskService().setVariables(taskId, map);*/
	//第三种方式,是通过bean的序列化的方式,往bean里面赋值,此時的報賬信息是存在流程圖的表中act_ge_bytearray表中
	ApproveForm approveForm = new ApproveForm();
	approveForm.setApproveReason("餐費");
	approveForm.setApproveMoney("1000");
	approveForm.setDate(new Date());
	processEngine.getTaskService().setVariable(taskId, "報賬信息", approveForm);
}

/**
 * 流程处理过程,完成个人任务
 */
@Test
public void testCompleteTask(){
	String taskId = "62504";
	Map<String, Object> map = new HashMap<String,Object>();
	map.put("审批意见", "批准");
	processEngine.getTaskService().complete(taskId,map);
	System.out.println("审批任务完成");
}

/**
 * 根据查询的任务id去获取变量
 */
@Test
public void testGetVariable(){
	String assignee = "赵六";
	String processInstanceId = "62501";
	List<Task> tasks = processEngine.getTaskService()
						.createTaskQuery()
						.taskAssignee(assignee)
						.processInstanceId(processInstanceId)
						.list();
	if (tasks != null && tasks.size() > 0) {
		for (Task task : tasks) {
			System.out.println("流程定义ID:"+task.getProcessDefinitionId());
			System.out.println("流程实例ID:"+task.getProcessInstanceId());
			System.out.println("执行对象ID:"+task.getExecutionId());
			System.out.println("任务ID:"+task.getId());
			System.out.println("任务名称:"+task.getName());
			System.out.println("任务创建时间:"+task.getCreateTime());
		}
	}
	String taskId = "62504";
	ApproveForm approveForm = (ApproveForm)processEngine.getTaskService().getVariable(taskId, "報賬信息");
	System.out.println("报账信息金额:"+approveForm.getApproveMoney());
	System.out.println("报账原因:"+approveForm.getApproveReason());
	System.out.println("报账时间:"+approveForm.getDate());
}

/**
 * 当某个任务结束以后,在任务表act_ru_task中的记录会被删除 ,
 * 但是act_hi_taskinst记录的endtime会加上 ,所以我们可以从这个表查询我们的任务执行历史记录
 *  
 * 
 */
@Test
public void testQueryHistoryTask(){
	String assignee = "王五";
	List<HistoricTaskInstance> historyTaskList = processEngine.getHistoryService()
								.createHistoricTaskInstanceQuery()
								.taskAssignee(assignee)
								.list();
	if(historyTaskList!=null&&historyTaskList.size()>0){
		for(HistoricTaskInstance hisTask:historyTaskList){
			System.out.println("流程定义ID:"+hisTask.getProcessDefinitionId());
			System.out.println("流程实例ID:"+hisTask.getProcessInstanceId());
			System.out.println("执行对象ID:"+hisTask.getExecutionId());
			System.out.println("历史任务ID:"+hisTask.getId());//任务ID:12502
			System.out.println("历史任务名称:"+hisTask.getName());
			System.out.println("历史任务的结束时间:"+hisTask.getEndTime());
			System.out.println("---------------------");

			
		}
	}
}

/**
 * 当某个流程实例执行完以后以后,在流程实例表表act_ru_variable中的记录会被删除 ,
 * 但是 act_hi_varinst表中存储了历史记录
 * 
 */
@Test
public void testQueryHistoryVariables(){
	String processInstanceId = "50001";
	 List<HistoricVariableInstance> hisVariableList = processEngine.getHistoryService()
				.createHistoricVariableInstanceQuery()
				.processInstanceId(processInstanceId)
				.list();
	if(hisVariableList != null && hisVariableList.size() > 0){
		for(HistoricVariableInstance historicVariableInstance :hisVariableList){
			System.out.println("流程定义ID:"+historicVariableInstance.getProcessInstanceId());
 			System.out.println("历史流程变量名称:"+historicVariableInstance.getVariableName());
 			System.out.println("历史流程变量value:"+historicVariableInstance.getValue());
			System.out.println("---------------------");

		}
	}
}
总结:

一个活动中可以指定一个或者多个sequenceFlow
结束活动没有 sequenceFlow
如果一个活动中指定了多个sequenceFlow,则需要使用流程变量设置condition的表达式(返回结果是boolean)来判断进入就哪条连线.

【上一篇:Activiti工作流–流程变量的设置与应用–之六】
【下一篇:Activiti工作流–流程变量的应用之二:排他网关–之八】

猜你喜欢

转载自blog.csdn.net/changqi008/article/details/83041128
今日推荐