Activiti工作流--流程变量的设置与应用--之六
2018-10-13 18:14
417 查看
流程变量
在流程执行或者任务执行过程中,用于设置和获取变量,工作流引擎通过使用流程变量在溜车鞥的执行过程中传递参数。
流程变量的作用域
只对应一个流程实例,也就是各个流程之间的变量是相互不影响的。
流程变量的设置
流程变量可以在流程实例启动的时候,在任务执行的过程中,在任务执行完毕饿时候进行设置。
先获取连接
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>
流程图
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 }
- 查询个人任务 ,设置流程变量
设置流程变量有三种方式(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); }
- 获取流程变量
类似于设置流程变量的接口和方法
@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("---------------------"); } } }
【上一篇:Activiti工作流–流程启动的相关操作–之五】
【下一篇:Activiti工作流–流程变量应用之一:选择连线–之七】
相关文章推荐
- Activiti工作流--流程变量应用之一:选择连线--之七
- Activiti工作流--流程变量的应用之二:排他网关--之八
- 工作流Activiti5流程变量 任务变量 setVariables 和 setVariablesLocal区别
- 工作流Activiti5流程变量 任务变量 setVariables 跟 setVariablesLocal区别
- activiti学习--06流程变量:流程变量+变量的类型+流程变量api+设置流程变量1或2+查询流程变量的历史表
- activiti设置流程变量
- 工作流引擎Activiti学习第四天(七)--- 设置获取与流程变量
- activiti 工作流会签 / 多人审批时一人通过也可 / 在当前节点获取下一节点的信息 / 流程部署之后发布之前获取所有节点的信息 / 流程启动开始之前传送之后节点办理人 / 同一结点设置多个监听
- 工作流Activiti 变量设置问题
- 【Activiti 基础篇四】流程变量设置与获取方式
- Activiti进阶(四)——流程变量的设置和获取
- activiti 部署流程定义(InputStream) 流程变量设置 及获取流程变量、查询流程变量历史表
- 工作流Activiti5流程变量 任务变量 setVariables 和 setVariablesLocal区别
- JAVAWEB开发之工作流详解(二)——Activiti核心API的使用(流程定义和流程实例的管理、流程变量、监听器...)以及与Spring的集成
- 工作流学习——Activiti流程变量五步曲
- 工作流框架--activiti(三)--流程变量
- Activiti进阶(四)——流程变量的设置和获取
- activiti学习--12 个人任务及三种分配方式:直接设置代理人+流程变量设置代理人+实现类的方式设置代理人+将任务代理人设置为别人
- activiti 设置流程变量
- JBPM4工作流之流程变量的应用和动态指定工作流中某一个任务的办理者以及工作流的决策理解和实现