Activiti业务键(businessKey)

问题:如何让业务对象和对应的流程 关联?

  发现ProcessInstance 有个方法getBusinessKey()可以得到一个businessKey。

  ProcessInstance 对应数据库中的表act_ru_execution有个字段BUSINESS_KEY_对应类中的businessKey,这个字段在创建表时自动被设置为unique

解决:

  1、保证流程的ID和业务对象的类名一致。例如:流程id为LeaveBill,我们的业务对象的类名也创建为LeaveBill。

  2、在流程启动的时候获取业务对象执行方法的时候传入businessKey,workflowService.startProcess(key,businessKey,vars);(这里vars为一些变量根据实际情况可有可无)businessKey 产生规则: className+“.”+objId

    public void startProcess(Long id) {

        //1. 获取业务对象

        LeaveBill bill = this.get(id);

        if(bill!=null){

            // 修改业务对象状态

            bill.setState(1);// 请假单状态 0初始录入,1.开始审批,2为审批通过

            this.update(bill);

            //2. 添加流程变量(Map)

            Map<String,Object> vars = new HashMap<>();

            vars.put("inputUser", bill.getUser().getName());

            // 添加变量来描述业务对象的信息

            String classType =bill.getClass().getSimpleName();

            vars.put("classType", classType);

            vars.put("objId", bill.getId());

            //3. 启动流程

            // 获取流程定义key

            String key = classType;

            // 获取业务键 产生规则: className+“.”+objId

            String businessKey = classType +"." + bill.getId();

            this.workflowService.startProcess(key,businessKey,vars);

        }

    }

   3、根据以下方法就可以用taskId获取业务对象id

    public String getBusinessObjId(String taskId) {

        //1  获取任务对象

        Task task  =  taskService.createTaskQuery().taskId(taskId).singleResult();

        

        //2  通过任务对象获取流程实例

        ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult();

        //3 通过流程实例获取“业务键”

        String businessKey = pi.getBusinessKey();

        //4 拆分业务键,拆分成“业务对象名称”和“业务对象ID”的数组 

        // a=b  LeaveBill.1

        String objId = null;

        if(StringUtils.isNotBlank(businessKey)){

            objId = businessKey.split("\\.")[1];

        }

        return objId;

    }

  4、根据业务键获取流程实例和任务

ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceBusinessKey("LeaveBill.1").singleResult();

List<Task> task = taskService.createTaskQuery().processInstanceBusinessKey("LeaveBill.1").list();

 

 

 

 

  

你可能感兴趣的:(Activiti)