Activiti业务关联流程

来源:互联网 发布:淘宝评价雷锋侠 编辑:程序博客网 时间:2024/05/17 05:06
/** * 工作流开发的重点是:让流程关联业务,也就是说让流程实例关联业务数据 */@Overridepublic void saveStartProcess(WorkflowBean workflowBean) {//1:获取请假单ID,使用请假单ID,查询请假单的对象LeaveBillLong 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 */@Overridepublic 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更新到业务表中,这样不管从业务还是流程都可以查询到对方!


0 0
原创粉丝点击