《Activiti/Flowable  深入BPM工作流》-组任务的办理流程是什么?

 

 

 

    《Activiti/Flowable  深入BPM工作流》-组任务的办理流程是什么?

 

 

一. 问题

         组任务的办理流程是什么?

 

 

二. 详情

第一步:查询组任务

指定候选人,查询该候选人当前的待办任务。

候选人不能办理任务。

第二步:让候选人去拾取(claim)任务

该组任务的所有候选人都能拾取。

将候选人的组任务,变成个人任务。原来候选人就变成了该任务的负责人。

问题:  如果拾取后不想办理该任务怎么办?

解答: 需要将已经拾取的个人任务归还到组里边,将个人任务变成了组任务。

第三步:查询个人任务

         查询方式同个人任务部分,根据 assignee 查询用户负责的个人任务。

第四步:办理个人任务

 

 

1. 部署流程定义

 // 新的请假流程定义的部署
    public static void main(String[] args) {
        // 1. 得到 processEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        // 得到 RepositoryService
        RepositoryService repositoryService = processEngine.getRepositoryService();

        // 部署
        Deployment deploy = repositoryService.createDeployment()
                .addClasspathResource("holiday.bpmn")
//                .addClasspathResource("studentHoliday.png")
                .name("请假流程2020-5-20")
                .deploy();

        System.out.println(deploy.getId());
        System.out.println(deploy.getName());
        System.out.println(deploy.getKey());
    }

 

2. 启动流程定义

// 启动流程实例,同时还要设置流程变量的值
    public static void main(String[] args) {
        // 1. 得到 processEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        // 2.得到 RuntimeService
        RuntimeService runtimeService = processEngine.getRuntimeService();

        // 3.流程定义的key问题并进行启动
        String processDefinitionKey = "myProcess_1";
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess_1");

        // 4.输出实例信息;
        System.out.println(processInstance.getName());
        System.out.println(processInstance.getProcessDefinitionId());
        System.out.println(processInstance.getId());
    }

 

3. 处理任务,到下一步,部门经理

 // 处理任务: 任务查询是否存在再执行
    public static void main(String[] args) {
        // 1. 得到 processEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        // 2.得到 TaskService
        TaskService taskService = processEngine.getTaskService();

        // 3. 查询当前用户是否有任务
        String key = "myProcess_1";
        Task task = taskService.createTaskQuery()
                .processDefinitionKey(key)
                .singleResult();

        // 4. 判断task!=null,说明当前用户有任务
        if (task != null) {
            taskService.complete(task.getId());
            System.out.println("用户任务执行完成");
            System.out.println(task.getId());
        }
    }

 

任务成功执行完毕如下:

 

4. 查询候选用户的组任务

// 4.根据候选人查询组任务
    public  void findGroupTaskList() {
        // 流程定义key
        String key = "myProcess_1";
        // 任务候选人
        String candidateUser = "zhangsan";
        // 创建 TaskService
        TaskService taskService = ProcessEngines.getDefaultProcessEngine().getTaskService();
        // 查询任务
        List<Task> list = taskService.createTaskQuery()
                .processDefinitionKey(key)
                .taskCandidateUser(candidateUser)
                .list();

        // 流程信息的输出展示
        if (!list.isEmpty()) {
            for (Task task : list) {
                System.out.println("===============================");
                System.out.println("流程实例id:" + task.getProcessInstanceId());
                System.out.println("任务id:" + task.getId());
                System.out.println("任务负责人:" + task.getAssignee());
                System.out.println("任务名称:" + task.getName());
            }
        }
    }

成功运行结果如下:

 

5. 让候选人去拾取(claim)任务

// 5. 让候选人去拾取(claim)任务
    public static void claimTask() {

        TaskService taskService = ProcessEngines.getDefaultProcessEngine().getTaskService();
        String key = "myProcess_1";
        String candidateUsers = "zhangsan";

        // 先查询是否有任务,校验用户是否有资格
        Task task = taskService.createTaskQuery()
                .processDefinitionKey(key)
                .taskCandidateUser(candidateUsers)
                .singleResult();

        if (task != null) {
            // 拾取主任务
            taskService.claim(task.getId(), candidateUsers);
            System.out.println("该任务拾取成功!");
        }
    }

如果任务拾取成功显示如下:

 

查看部门经理的assignee,之前是空, 目前已经确认,给 "zhansan" 了. "zhansan"由候选人变成了执行人.

任务拾取的核心:    TaskService.claim(taskId, candidateUser); 目的就是将候选人转化为执行人, 让assignee有值.

 

 

6.  用户查询个人代办任务(候选人查询自己的任务,候选人已经转换成执行人了.)

    这里的核心是用taskAssignee(userId);进行查询, userId还是candidateUser, 但是candidateUser实际已经编程执行人了, 所以查询的时候方法是用taskAssignee()来进行查询.

// 6. 用户查询个人代办任务
    public static void findPersonalTaskList(){
        // 流程定义key
        String key = "myProcess_1";
        // 任务候选人
        String candidateUser = "zhangsan";
        // 创建 TaskService
        TaskService taskService = ProcessEngines.getDefaultProcessEngine().getTaskService();
        // 查询任务
        List<Task> list = taskService.createTaskQuery()
                .processDefinitionKey(key)
                .taskAssignee(candidateUser)
                .list();

        // 流程信息的输出展示
        if (!list.isEmpty()) {
            for (Task task : list) {
                System.out.println("===============================");
                System.out.println("流程实例id:" + task.getProcessInstanceId());
                System.out.println("任务id:" + task.getId());
                System.out.println("任务负责人:" + task.getAssignee());
                System.out.println("任务名称:" + task.getName());
            }
        }
    }

 

7. 用户办理个人任务.

// 7.用户办理个人任务
    public static void completeTask() {
        // 任务Id
        String taskId = "";
        ProcessEngines.getDefaultProcessEngine().getTaskService()
                .complete(taskId);
        System.out.println("完成任务:" + taskId);
    }

 

优化--(判断有没有权限)

 // 7. 当前用户完成自己的任务 
    public static void completeTask() {
        TaskService taskService = ProcessEngines.getDefaultProcessEngine().getTaskService();
        String key = "myProcess_1";
        String candidateUsers = "zhangsan";

        // 先查询是否有任务,校验用户是否有资格
        Task task = taskService.createTaskQuery()
                .processDefinitionKey(key)
                .taskAssignee(candidateUsers)
                .singleResult();

        if (task != null) {
            // 完成任务
            taskService.complete(task.getId());
            System.out.println("完成任务:" + task.getId());
        }

 

小结:   

组任务的办理流程和任务的交接流程如下:

   第一步:查询组任务

指定候选人,查询该候选人当前的待办任务。

 

   第二步:让候选人去拾取(claim)任务

 

   第三步:查询个人任务

       

  第四步:办理个人任务

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章