您的位置:首页 > 其它

Activiti工作流--流程变量的设置与应用--之六

2018-10-13 18:14 417 查看
流程变量

在流程执行或者任务执行过程中,用于设置和获取变量,工作流引擎通过使用流程变量在溜车鞥的执行过程中传递参数。

流程变量的作用域

只对应一个流程实例,也就是各个流程之间的变量是相互不影响的。

流程变量的设置

流程变量可以在流程实例启动的时候,在任务执行的过程中,在任务执行完毕饿时候进行设置。

先获取连接

private ProcessEngine processEngine;

@Before
public void initProcessEngine(){
processEngine = ProcessEngines.getDefaultProcessEngine();
}
  1. 流程定义与部署
    设计一个财务报账的流程,并且部署成功,生成一个流程定义
@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>

流程图

2. 启动流程

@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
}
  1. 查询个人任务 ,设置流程变量

设置流程变量有三种方式(taskService和runtimeService)
单个设置
map集合设置
javaBean设置(序列化)

@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);
}
  1. 获取流程变量

类似于设置流程变量的接口和方法

@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());
}
  1. 历史流程变量
/**
* 当某个任务结束以后,在任务表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("---------------------");

}
}
}

【上一篇:Activiti工作流–流程启动的相关操作–之五】
【下一篇:Activiti工作流–流程变量应用之一:选择连线–之七】

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐