Activiti 學習筆記 小結

衣舞晨風發表於2016-09-16

這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述

/**更新請假狀態,啟動流程例項,讓啟動的流程例項關聯業務*/
    @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);

    }

這裡寫圖片描述

/**二:已知任務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;
    }

批註部分:
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述

    /**指定連線的名稱完成任務*/
    @Override
    public void saveSubmitTask(WorkflowBean workflowBean) {
        //獲取任務ID
        String taskId = workflowBean.getTaskId();
        //獲取連線的名稱
        String outcome = workflowBean.getOutcome();
        //批註資訊
        String message = workflowBean.getComment();
        //獲取請假單ID
        Long id = workflowBean.getId();

        /**
         * 1:在完成之前,新增一個批註資訊,向act_hi_comment表中新增資料,用於記錄對當前申請人的一些稽核資訊
         */
        //使用任務ID,查詢任務物件,獲取流程流程例項ID
        Task task = taskService.createTaskQuery()//
                        .taskId(taskId)//使用任務ID查詢
                        .singleResult();
        //獲取流程例項ID
        String processInstanceId = task.getProcessInstanceId();
        /**
         * 注意:新增批註的時候,由於Activiti底層程式碼是使用:
         *      String userId = Authentication.getAuthenticatedUserId();
                CommentEntity comment = new CommentEntity();
                comment.setUserId(userId);
              所有需要從Session中獲取當前登入人,作為該任務的辦理人(稽核人),對應act_hi_comment表中的User_ID的欄位,不過不新增稽核人,該欄位為null
             所以要求,新增配置執行使用Authentication.setAuthenticatedUserId();新增當前任務的稽核人
         * */
        Authentication.setAuthenticatedUserId(SessionContext.get().getName());
        taskService.addComment(taskId, processInstanceId, message);
        /**
         * 2:如果連線的名稱是“預設提交”,那麼就不需要設定,如果不是,就需要設定流程變數
         * 在完成任務之前,設定流程變數,按照連線的名稱,去完成任務
                 流程變數的名稱:outcome
                 流程變數的值:連線的名稱
         */
        Map<String, Object> variables = new HashMap<String,Object>();
        if(outcome!=null && !outcome.equals("預設提交")){
            variables.put("outcome", outcome);
        }

        //3:使用任務ID,完成當前人的個人任務,同時流程變數
        taskService.complete(taskId, variables);
        //4:當任務完成之後,需要指定下一個任務的辦理人(使用類)-----已經開發完成

        /**
         * 5:在完成任務之後,判斷流程是否結束
            如果流程結束了,更新請假單表的狀態從1變成2(稽核中-->稽核完成)
         */
        ProcessInstance pi = runtimeService.createProcessInstanceQuery()//
                        .processInstanceId(processInstanceId)//使用流程例項ID查詢
                        .singleResult();
        //流程結束了
        if(pi==null){
            //更新請假單表的狀態從1變成2(稽核中-->稽核完成)
            LeaveBill bill = leaveBillDao.findLeaveBillById(id);
            bill.setState(2);
        }
    }
    /**獲取批註資訊,傳遞的是當前任務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,查詢歷史批註資訊*/
    @Override
    public List<Comment> findCommentByLeaveBillId(Long id) {
        //使用請假單ID,查詢請假單物件
        LeaveBill leaveBill = leaveBillDao.findLeaveBillById(id);
        //獲取物件的名稱
        String objectName = leaveBill.getClass().getSimpleName();
        //組織流程表中的欄位中的值
        String objId = objectName+"."+id;

        /**1:使用歷史的流程例項查詢,返回歷史的流程例項物件,獲取流程例項ID*/
//      HistoricProcessInstance hpi = historyService.createHistoricProcessInstanceQuery()//對應歷史的流程例項表
//                      .processInstanceBusinessKey(objId)//使用BusinessKey欄位查詢
//                      .singleResult();
//      //流程例項ID
//      String processInstanceId = hpi.getId();
        /**2:使用歷史的流程變數查詢,返回歷史的流程變數的物件,獲取流程例項ID*/
        HistoricVariableInstance hvi = historyService.createHistoricVariableInstanceQuery()//對應歷史的流程變數表
                        .variableValueEquals("objId", objId)//使用流程變數的名稱和流程變數的值查詢
                        .singleResult();
        //流程例項ID
        String processInstanceId = hvi.getProcessInstanceId();
        List<Comment> list = taskService.getProcessInstanceComments(processInstanceId);
        return list;
    }

    /**1:獲取任務ID,獲取任務物件,使用任務物件獲取流程定義ID,查詢流程定義物件*/
    @Override
    public ProcessDefinition findProcessDefinitionByTaskId(String taskId) {
        //使用任務ID,查詢任務物件
        Task task = taskService.createTaskQuery()//
                    .taskId(taskId)//使用任務ID查詢
                    .singleResult();
        //獲取流程定義ID
        String processDefinitionId = task.getProcessDefinitionId();
        //查詢流程定義的物件
        ProcessDefinition pd = repositoryService.createProcessDefinitionQuery()//建立流程定義查詢物件,對應表act_re_procdef 
                    .processDefinitionId(processDefinitionId)//使用流程定義ID查詢
                    .singleResult();
        return pd;
    }

    /**
     * 二:檢視當前活動,獲取當期活動對應的座標x,y,width,height,將4個值存放到Map<String,Object>中
         map集合的key:表示座標x,y,width,height
         map集合的value:表示座標對應的值
     */
    @Override
    public Map<String, Object> findCoordingByTask(String taskId) {
        //存放座標
        Map<String, Object> map = new HashMap<String,Object>();
        //使用任務ID,查詢任務物件
        Task task = taskService.createTaskQuery()//
                    .taskId(taskId)//使用任務ID查詢
                    .singleResult();
        //獲取流程定義的ID
        String processDefinitionId = task.getProcessDefinitionId();
        //獲取流程定義的實體物件(對應.bpmn檔案中的資料)
        ProcessDefinitionEntity processDefinitionEntity = (ProcessDefinitionEntity)repositoryService.getProcessDefinition(processDefinitionId);
        //流程例項ID
        String processInstanceId = task.getProcessInstanceId();
        //使用流程例項ID,查詢正在執行的執行物件表,獲取當前活動對應的流程例項物件
        ProcessInstance pi = runtimeService.createProcessInstanceQuery()//建立流程例項查詢
                    .processInstanceId(processInstanceId)//使用流程例項ID查詢
                    .singleResult();
        //獲取當前活動的ID
        String activityId = pi.getActivityId();
        //獲取當前活動物件
        ActivityImpl activityImpl = processDefinitionEntity.findActivity(activityId);//活動ID
        //獲取座標
        map.put("x", activityImpl.getX());
        map.put("y", activityImpl.getY());
        map.put("width", activityImpl.getWidth());
        map.put("height", activityImpl.getHeight());
        return map;
    }

本文部分內容整理自itcast講義,在此表示感謝。
作者:jiankunking 出處:http://blog.csdn.net/jiankunking

相關文章