Activiti5 流程变量设置
//变量和整个流程关联,不能先重复参数,从表ACT_RU_VARIABLE和ACT_HI_VRINST查看 this.taskService.setVariable(taskId,variables) //变量和流程的任务节点关联,从表ACT_HI_VRINST查看 this.taskService.setVariableLocal(taskId,variables)
参考:http://tylanbin.tk/record/201402
使用Activiti的人应该都会发现 一个问题,就是在高度自由的变量存储方式中,不做特殊操作时,所有的变量都会只跟流程实例(历史)进行关联,但act_ru_variable和 act_hi_varinst是有TASK_ID_这么一列的,利用它,将存储的变量和流程的任务节点关联,会大大方便我们对流程的扩展(比如一些自定义 的业务数据),这里记录一下笔者研究的过程及使用方法。
首先,我们常用的任务完成方式无外乎以下两种:
1、使用FormService中的submitTaskFormData(String taskId, Map<String,String> properties)方法
Map<String, String> map = new HashMap<String, String>(); // 填表 for (FormProperty formProperty : taskFormData.getFormProperties()) { if (formProperty.isWritable()) { String name = formProperty.getId(); map.put(name, request.getParameter(name)); } } // 自定义值存储测试 map.put("test", "testVal"); // 提交用户定义的表单,同时也会完成该任务 formService.submitTaskFormData(taskId, map);
这样在表单提交后(变量存储),该任务也随之完成。
2、使用TaskService中的complete(String taskId, Map<String,Object> variables)方法
Map<String, Object> map = new HashMap<String, Object>(); // 填表 for (FormProperty formProperty : taskFormData.getFormProperties()) { if (formProperty.isWritable()) { String name = formProperty.getId(); map.put(name, request.getParameter(name)); } } // 自定义值存储测试 map.put("test", "testVal"); // 完成该任务 taskService.complete(taskId, map);
这样是另一种完成任务的方式。
但是,我们可以查看数据库,无论是第一种还是第二种,act_ru_variable(act_hi_varinst)表的TASK_ID_字段全部为空,这样是无法将test的值与当前任务关联起来的,test的值仍然属于这个流程。
通过阅读API和测试,我们在第二种方式complete之前,调用setVariableLocal或setVariablesLocal即可达到目的。
// 存储特殊的与任务关联的变量值 taskService.setVariableLocal(taskId, "test", "testVal"); taskService.complete(taskId, map);
这样的话,我们在流程完成之后,通过使用org.activiti.engine.history中的HistoricVariableInstanceQuery即可完成对某个流程,某个任务的特殊变量的查询操作,以完成一些自定义的特殊业务。
// 测试查询 List<HistoricTaskInstance> listOfTask = historyService.createHistoricTaskInstanceQuery().processDefinitionKey(key).list(); List<HistoricVariableInstance> listOfVar = null; for (HistoricTaskInstance hti : listOfTask) { System.out.println(hti.getName() + "-" + hti.getId()); listOfVar = historyService.createHistoricVariableInstanceQuery().taskId(hti.getId()).list(); for (HistoricVariableInstance hvi : listOfVar) { System.out.println("\t" + hvi.getId() + "-" + hvi.getVariableName() + "-" + hvi.getValue()); } }