Activiti 學習筆記14:工作流定義的角色組

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

一、流程圖

這裡寫圖片描述
流程圖中任務節點的配置:
這裡寫圖片描述
分配任務負責的組
使用 candidate groups 屬性指定 任務負責組
程式碼:

<userTask id=“usertask1” name=“審批” activiti:candidateGroups=“部門經理”>
</userTask> 

其中部門經理表示一個使用者組的角色

二、測試程式碼

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

    /** 部署流程定義(從inputStream) */
    @Test
    public void deploymentProcessDefinition_inputStream() {
        InputStream inputStreamBpmn = this.getClass().getResourceAsStream("task.bpmn");
        InputStream inputStreamPng = this.getClass().getResourceAsStream("task.png");
        Deployment deployment = processEngine.getRepositoryService()// 與流程定義和部署物件相關的Service
                .createDeployment()// 建立一個部署物件
                .name("任務")// 新增部署的名稱
                .addInputStream("task.bpmn", inputStreamBpmn)//
                .addInputStream("task.png", inputStreamPng)//
                .deploy();// 完成部署
        System.out.println("部署ID:" + deployment.getId());//
        System.out.println("部署名稱:" + deployment.getName());//
        /** 新增使用者角色組 */
        IdentityService identityService = processEngine.getIdentityService();//
        // 建立角色
        identityService.saveGroup(new GroupEntity("總經理"));
        identityService.saveGroup(new GroupEntity("部門經理"));
        // 建立使用者
        identityService.saveUser(new UserEntity("張三"));
        identityService.saveUser(new UserEntity("李四"));
        identityService.saveUser(new UserEntity("王五"));
        // 建立使用者和角色的關聯關係
        identityService.createMembership("張三", "部門經理");
        identityService.createMembership("李四", "部門經理");
        identityService.createMembership("王五", "總經理");
        System.out.println("新增組織機構成功");
    }

    /** 啟動流程例項 */
    @Test
    public void startProcessInstance() {
        // 流程定義的key
        String processDefinitionKey = "task";
        ProcessInstance pi = processEngine.getRuntimeService()// 與正在執行的流程例項和執行物件相關的Service
                .startProcessInstanceByKey(processDefinitionKey);// 使用流程定義的key啟動流程例項,key對應helloworld.bpmn檔案中id的屬性值,使用key值啟動,預設是按照最新版本的流程定義啟動
        System.out.println("流程例項ID:" + pi.getId());// 流程例項ID
        System.out.println("流程定義ID:" + pi.getProcessDefinitionId());// 流程定義ID
    }

    /** 查詢當前人的個人任務 */
    @Test
    public void findMyPersonalTask() {
        String assignee = "小A";
        List<Task> list = processEngine.getTaskService()// 與正在執行的任務管理相關的Service
                .createTaskQuery()// 建立任務查詢物件
                /** 查詢條件(where部分) */
                .taskAssignee(assignee)// 指定個人任務查詢,指定辦理人
                // .taskCandidateUser(candidateUser)//組任務的辦理人查詢
                /** 排序 */
                .orderByTaskCreateTime().asc()// 使用建立時間的升序排列
                /** 返回結果集 */
                .list();// 返回列表
        if (list != null && list.size() > 0) {
            for (Task task : list) {
                System.out.println("任務ID:" + task.getId());
                System.out.println("任務名稱:" + task.getName());
                System.out.println("任務的建立時間:" + task.getCreateTime());
                System.out.println("任務的辦理人:" + task.getAssignee());
                System.out.println("流程例項ID:" + task.getProcessInstanceId());
                System.out.println("執行物件ID:" + task.getExecutionId());
                System.out.println("流程定義ID:" + task.getProcessDefinitionId());
                System.out.println("########################################################");
            }
        }
    }

    /** 查詢當前人的組任務 */
    @Test
    public void findMyGroupTask() {
        String candidateUser = "李四1";
        List<Task> list = processEngine.getTaskService()// 與正在執行的任務管理相關的Service
                .createTaskQuery()// 建立任務查詢物件
                /** 查詢條件(where部分) */
                .taskCandidateUser(candidateUser)// 組任務的辦理人查詢
                /** 排序 */
                .orderByTaskCreateTime().asc()// 使用建立時間的升序排列
                /** 返回結果集 */
                .list();// 返回列表
        if (list != null && list.size() > 0) {
            for (Task task : list) {
                System.out.println("任務ID:" + task.getId());
                System.out.println("任務名稱:" + task.getName());
                System.out.println("任務的建立時間:" + task.getCreateTime());
                System.out.println("任務的辦理人:" + task.getAssignee());
                System.out.println("流程例項ID:" + task.getProcessInstanceId());
                System.out.println("執行物件ID:" + task.getExecutionId());
                System.out.println("流程定義ID:" + task.getProcessDefinitionId());
                System.out.println("########################################################");
            }
        }
    }

    /** 完成我的任務 */
    @Test
    public void completeMyPersonalTask() {
        // 任務ID
        String taskId = "7504";
        processEngine.getTaskService()// 與正在執行的任務管理相關的Service
                .complete(taskId);
        System.out.println("完成任務:任務ID:" + taskId);
    }

    /** 查詢正在執行的任務辦理人表 */
    @Test
    public void findRunPersonTask() {
        // 任務ID
        String taskId = "6204";
        List<IdentityLink> list = processEngine.getTaskService()//
                .getIdentityLinksForTask(taskId);
        if (list != null && list.size() > 0) {
            for (IdentityLink identityLink : list) {
                System.out.println(identityLink.getTaskId() + "   " + identityLink.getType() + "   "
                        + identityLink.getProcessInstanceId() + "   " + identityLink.getUserId());
            }
        }
    }

    /** 查詢歷史任務的辦理人表 */
    @Test
    public void findHistoryPersonTask() {
        // 流程例項ID
        String processInstanceId = "6201";
        List<HistoricIdentityLink> list = processEngine.getHistoryService()//
                .getHistoricIdentityLinksForProcessInstance(processInstanceId);
        if (list != null && list.size() > 0) {
            for (HistoricIdentityLink identityLink : list) {
                System.out.println(identityLink.getTaskId() + "   " + identityLink.getType() + "   "
                        + identityLink.getProcessInstanceId() + "   " + identityLink.getUserId());
            }
        }
    }

    /** 拾取任務,將組任務分給個人任務,指定任務的辦理人欄位 */
    @Test
    public void claim() {
        // 將組任務分配給個人任務
        // 任務ID
        String taskId = "7504";
        // 分配的個人任務(可以是組任務中的成員,也可以是非組任務的成員)
        String userId = "張三";
        processEngine.getTaskService()//
                .claim(taskId, userId);
    }

三、分配任務負責的組(IdentityService)

/**在部署流程定義和啟動流程例項的中間,設定組任務的辦理人,向Activiti表中存放組和使用者的資訊*/
IdentityService identityService = processEngine.getIdentityService();//認證:儲存組和使用者資訊
identityService.saveGroup(new GroupEntity("部門經理"));//建立組
identityService.saveGroup(new GroupEntity("總經理"));//建立組
identityService.saveUser(new UserEntity(“小張”));//建立使用者
identityService.saveUser(new UserEntity("小李")); //建立使用者
identityService.saveUser(new UserEntity("小王")); //建立使用者
identityService.createMembership("小張", "部門經理");//建立組和使用者關係
identityService.createMembership("小李", "部門經理");//建立組和使用者關係
identityService.createMembership(“小王”, “總經理”);//建立組和使用者關係

表結構介紹:

act_id_group:角色組表
act_id_user:使用者表:
act_id_membership:使用者角色表

指定組任務的辦理人,查詢組任務

String userId = “張三”;//張三,李四可以查詢結果,王五不可以,因為他不是部門經理角色
List<Task> list = processEngine.getTaskService()//
                .createTaskQuery()//
                .taskCandidateUser(userId)//指定組任務查詢
                .list();

四、activiti 小結

這裡寫圖片描述

演示程式碼下載:http://download.csdn.net/detail/xunzaosiyecao/9630841

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

相關文章