/**
* 工作流开发的重点是:让流程关联业务,也就是说让流程实例关联业务数据
*/
@Override
public void saveStartProcess(WorkflowBean workflowBean) {
//1:获取请假单ID,使用请假单ID,查询请假单的对象LeaveBill
Long id = workflowBean.getId();
LeaveBill leaveBill = leaveBillDao.findLeaveBillById(id);
//2:更新请假单的请假状态从0变成1(初始录入-->审核中)
leaveBill.setState(1);
//3:使用当前对象获取到流程定义的key(对象的名称就是流程定义的key)
System.out.println(leaveBill.getClass().getName());
System.out.println(leaveBill.getClass().getSimpleName());
System.out.println(leaveBill.getClass().getCanonicalName());
String key = leaveBill.getClass().getSimpleName();
/**
* 4:从Session中获取当前任务的办理人,
* 使用流程变量设置下一个任务的办理人
* inputUser是流程变量的名称,
* 获取的办理人是流程变量的值
*/
/*
runtimeService.startProcessInstanceByKey(key);
流程图中的Assignee:${inputUser}
是使用流程变量的方式动态设置任务办理人
从Session中获取当前任务的办理人 使用流程变量设置下一个任务的办理人
inputUser是流程变量的名称
获取的办理人事流程变量的值
使用流程定义key启动流程实例,同时设置流程变量
runtimeService.startProcessInstanceByKey(key,variables);
*/
Map<String, Object> variables = new HashMap<String,Object>();
variables.put("inputUser", SessionContext.get().getName());//表示惟一用户
/**
* 5:(1)使用流程变量设置字符串(格式:LeaveBill.id的形式),
* 通过设置,让启动的流程(流程实例)关联业务
(2)使用正在执行对象表中的一个字段BUSINESS_KEY(Activiti提供的一个字段),
让启动的流程(流程实例)关联业务
格式:LeaveBill.id的形式(使用流程变量)
*/
/*
* 让流程关联业务
* 1.使用流程变量
* 方式一:使用一个LeaveBill类(javaBean)存放流程变量(与流程实例绑定)
* javaBean 一定要实现 序列化接口 固定序列化版本ID
* 方式二:使用一个字符串
* 字符串的格式 LeaveBill.ID
* 在查询流程变量的时候,如果获取流程变量的值LeaveBill.1,使用1查询
* LeaveBill对象,获取当前申请的请假单的数据
* 2.使用正在执行对象表中的一个字段(Activiti提供的一个字段JBPM没有提供)
* act_ru_execution表中的 BUSINESS_KEY 字段
* 将字符串存到该字段上 也可以实现让流程关联业务
*/
/**
* 5: (1)使用流程变量设置字符串(格式:LeaveBill.id的形式),通过设置,让启动的流程(流程实例)关联业务
* (2)使用正在执行对象表中的一个字段BUSINESS_KEY(Activiti提供的一个字段),让启动的流程(流程实例)关联业务
*/
//格式:LeaveBill.id的形式(使用流程变量)
String objId = key+"."+id;
variables.put("objId", objId);
//6:使用流程定义的key,启动流程实例,同时设置流程变量,
//同时向正在执行的执行对象表中的字段BUSINESS_KEY添加业务数据,同时让流程关联业务
runtimeService.startProcessInstanceByKey(key,objId,variables);
}
获取业务实体
/**
* 使用任务id获取LeaveBill
*/
@Override
public LeaveBill findLeaveBillByTaskId(String taskId) {
Task task = taskService.createTaskQuery()
.taskId(taskId)
.singleResult();
String processInstanceId = task.getProcessInstanceId();
String objId = (String) taskService.getVariable(taskId, "objId");
ProcessInstance pi = runtimeService.createProcessInstanceQuery()
.processInstanceId(processInstanceId)
.singleResult();
String buindess_key = pi.getBusinessKey();
if(StringUtils.isNotEmpty(buindess_key)){
//截取字符串 点 截取字符串的时候 需要转义 \\.
String leaveBillId = buindess_key.split("\\.")[1];
LeaveBill leaveBill = leaveBillDao.findLeaveBillById(Long.parseLong(leaveBillId));
return leaveBill;
}
return null;
}
runtimeService.createProcessInstanceQuery().processInstanceBusinessKey(processInstanceBusinessKey, processDefinitionKey)
建议数据库冗余设计:在业务表设计的时候添加一列: PROCESS_INSTANCE_ID varchar2(64),在流程启动之后把流程ID更新到业务表中,这样不管从业务还是流程都可以查询到对方!