activiti 流程实例关联业务

/**更新请假状态,启动流程实例,让启动的流程实例关联业务*/
    @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)
        String key = leaveBill.getClass().getSimpleName();
        /**
         * 4:从Session中获取当前任务的办理人,使用流程变量设置下一个任务的办理人
                * inputUser是流程变量的名称,
                * 获取的办理人是流程变量的值
         */
        Map<String, Object> variables = new HashMap<String,Object>();
        variables.put("inputUser", SessionContext.get().getName());//表示惟一用户
        /**
         * 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);
        
    }
启动流程实例,让启动的流程实例关联业务

 

 

 

/**
 * 员工经理任务分配
 *
 */
@SuppressWarnings("serial")
public class ManagerTaskHandler implements TaskListener {

    @Override
    public void notify(DelegateTask delegateTask) {
        /**懒加载异常*/
//        Employee employee = SessionContext.get();
//        //设置个人任务的办理人
//        delegateTask.setAssignee(employee.getManager().getName());
        /**从新查询当前用户,再获取当前用户对应的领导*/
        Employee employee = SessionContext.get();
        //当前用户
        String name = employee.getName();
        //使用当前用户名查询用户的详细信息
        //从web中获取spring容器
        WebApplicationContext ac = WebApplicationContextUtils.getWebApplicationContext(ServletActionContext.getServletContext());
        IEmployeeService employeeService = (IEmployeeService) ac.getBean("employeeService");
        Employee emp = employeeService.findEmployeeByName(name);
        //设置个人任务的办理人
        delegateTask.setAssignee(emp.getManager().getName());
        
    }

}
动态指定下一个办理人

 

/**
     * 打开任务表单
     */
    public String viewTaskForm(){
        //任务ID
        String taskId = workflowBean.getTaskId();
        //获取任务表单中任务节点的url连接
        String url = workflowService.findTaskFormKeyByTaskId(taskId);
        url += "?taskId="+taskId;
        ValueContext.putValueContext("url", url);
        return "viewTaskForm";
    }



    /**使用任务ID,获取当前任务节点中对应的Form key中的连接的值*/
    @Override
    public String findTaskFormKeyByTaskId(String taskId) {
        TaskFormData formData = formService.getTaskFormData(taskId);
        //获取Form key的值
        String url = formData.getFormKey();
        return url;
    }
打开任务表单

 

// 准备表单数据
    public String audit(){
        //获取任务ID
        String taskId = workflowBean.getTaskId();
        /**一:使用任务ID,查找请假单ID,从而获取请假单信息*/
        LeaveBill leaveBill = workflowService.findLeaveBillByTaskId(taskId);
        ValueContext.putValueStack(leaveBill);
        /**二:已知任务ID,查询ProcessDefinitionEntiy对象,从而获取当前任务完成之后的连线名称,并放置到List<String>集合中*/
        List<String> outcomeList = workflowService.findOutComeListByTaskId(taskId);
        ValueContext.putValueContext("outcomeList", outcomeList);
        /**三:查询所有历史审核人的审核信息,帮助当前人完成审核,返回List<Comment>*/
        List<Comment> commentList = workflowService.findCommentByTaskId(taskId);
        ValueContext.putValueContext("commentList", commentList);
        return "taskForm";
    }

/**一:使用任务ID,查找请假单ID,从而获取请假单信息*/
    @Override
    public LeaveBill findLeaveBillByTaskId(String taskId) {
        //1:使用任务ID,查询任务对象Task
        Task task = taskService.createTaskQuery()//
                        .taskId(taskId)//使用任务ID查询
                        .singleResult();
        //2:使用任务对象Task获取流程实例ID
        String processInstanceId = task.getProcessInstanceId();
        //3:使用流程实例ID,查询正在执行的执行对象表,返回流程实例对象
        ProcessInstance pi = runtimeService.createProcessInstanceQuery()//
                        .processInstanceId(processInstanceId)//使用流程实例ID查询
                        .singleResult();
        //4:使用流程实例对象获取BUSINESS_KEY
        String buniness_key = pi.getBusinessKey();
        //5:获取BUSINESS_KEY对应的主键ID,使用主键ID,查询请假单对象(LeaveBill.1)
        String id = "";
        if(StringUtils.isNotBlank(buniness_key)){
            //截取字符串,取buniness_key小数点的第2个值
            id = buniness_key.split("\\.")[1];
        }
        //查询请假单对象
        //使用hql语句:from LeaveBill o where o.id=1
        LeaveBill leaveBill = leaveBillDao.findLeaveBillById(Long.parseLong(id));
        return leaveBill;
    }
    
    /**二:已知任务ID,查询ProcessDefinitionEntiy对象,从而获取当前任务完成之后的连线名称,并放置到List<String>集合中*/
    @Override
    public List<String> findOutComeListByTaskId(String taskId) {
        //返回存放连线的名称集合
        List<String> list = new ArrayList<String>();
        //1:使用任务ID,查询任务对象
        Task task = taskService.createTaskQuery()//
                    .taskId(taskId)//使用任务ID查询
                    .singleResult();
        //2:获取流程定义ID
        String processDefinitionId = task.getProcessDefinitionId();
        //3:查询ProcessDefinitionEntiy对象
        ProcessDefinitionEntity processDefinitionEntity = (ProcessDefinitionEntity) repositoryService.getProcessDefinition(processDefinitionId);
        //使用任务对象Task获取流程实例ID
        String processInstanceId = task.getProcessInstanceId();
        //使用流程实例ID,查询正在执行的执行对象表,返回流程实例对象
        ProcessInstance pi = runtimeService.createProcessInstanceQuery()//
                    .processInstanceId(processInstanceId)//使用流程实例ID查询
                    .singleResult();
        //获取当前活动的id
        String activityId = pi.getActivityId();
        //4:获取当前的活动
        ActivityImpl activityImpl = processDefinitionEntity.findActivity(activityId);
        //5:获取当前活动完成之后连线的名称
        List<PvmTransition> pvmList = activityImpl.getOutgoingTransitions();
        if(pvmList!=null && pvmList.size()>0){
            for(PvmTransition pvm:pvmList){
                String name = (String) pvm.getProperty("name");
                if(StringUtils.isNotBlank(name)){
                    list.add(name);
                }
                else{
                    list.add("默认提交");
                }
            }
        }
        return list;
    }



    /**获取批注信息,传递的是当前任务ID,获取历史任务ID对应的批注*/
    @Override
    public List<Comment> findCommentByTaskId(String taskId) {
        List<Comment> list = new ArrayList<Comment>();
        //使用当前的任务ID,查询当前流程对应的历史任务ID
        //使用当前任务ID,获取当前任务对象
        Task task = taskService.createTaskQuery()//
                .taskId(taskId)//使用任务ID查询
                .singleResult();
        //获取流程实例ID
        String processInstanceId = task.getProcessInstanceId();
//        //使用流程实例ID,查询历史任务,获取历史任务对应的每个任务ID
//        List<HistoricTaskInstance> htiList = historyService.createHistoricTaskInstanceQuery()//历史任务表查询
//                        .processInstanceId(processInstanceId)//使用流程实例ID查询
//                        .list();
//        //遍历集合,获取每个任务ID
//        if(htiList!=null && htiList.size()>0){
//            for(HistoricTaskInstance hti:htiList){
//                //任务ID
//                String htaskId = hti.getId();
//                //获取批注信息
//                List<Comment> taskList = taskService.getTaskComments(htaskId);//对用历史完成后的任务ID
//                list.addAll(taskList);
//            }
//        }
        list = taskService.getProcessInstanceComments(processInstanceId);
        return list;
    }
准备表单数据

  //获取当前活动的id  例如: <userTask id="usertask3" > 中的id

 

posted @ 2016-11-14 10:07  SKYisLimit  阅读(2066)  评论(0)    收藏  举报