zoukankan      html  css  js  c++  java
  • activiti 7 + springboot2(十二)组任务

    (一)Candidate-users候选人

    在流程定义中在任务结点的assignee固定设置任务负责人,在流程定义时将参与者固定设置在.bpmn文件中,如果临时任务负责人变更则需要修改流程定义,系统可扩展性差。针对这种情况可以给任务设置多个候选人,可以从候选人中选择参与者来完成任务。

    在流程图中任务节点的配置中设置candidate-users(候选人),多个候选人之间用逗号分开。 

        

    (二)办理组任务

    1)启动任务 

        /**
         * 启动一个实例
         */
        @Test
        public void startProcessInstance() {
            //启动流程实例,同时还要设置流程定义的变量值
            ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess_1");
            System.out.println("流程实例id:" + processInstance.getProcessInstanceId());
        }

    数据库里生成下一个执行任务

     

    2)执行填写请假单任务 

        /**
         * 填请假单任务执行
         */
        @Test
        public void step1(){
            Task task = taskService.createTaskQuery()
                    .processDefinitionKey("myProcess_1")
                    .taskAssignee("张三")
                    .singleResult();
    
            if(task!=null){
                taskService.complete(task.getId());
                System.out.println("用户任务执行完毕...");
            }
        }

    查看下一步任务, 可以看出都还未指定执行人。

     

     3)用户查询组任务 

        /**
         * 用户查询组任务
         */
        @Test
        public void findGroupTaskList() {
            String processDefinitionKey = "myProcess_1";
            String candidateUser = "李四";
    
            List<Task> list = taskService.createTaskQuery()
                    .processDefinitionKey(processDefinitionKey)
                    .taskCandidateUser(candidateUser)//设置候选用户
                    .list();
    
            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());
            }
        }

     

     4)用户拾取组任务

        /**
         * 用户拾取组任务,该任务变为自己的个人任务
         */
        @Test
        public void claimTask() {
            String taskId = "61184f94-390e-11ea-af99-30b49ec7161f";
            String userId = "李四";
    
            //校验该用户有没有拾取任务的资格
            Task task = taskService.createTaskQuery().taskId(taskId)
                    .taskCandidateUser(userId).singleResult();//根据候选人查询
    
            if (task != null) {
                taskService.claim(taskId, userId);
                System.out.println("任务拾取成功");
            }
        }

    查看数据库,该任务的执行人已经变更为李四

     5)处理个人任务 

        /**
         * 部门经理完成审批
         */
        @Test
        public void step2() {
            Task task = taskService.createTaskQuery().processDefinitionKey("myProcess_1")
                    .taskAssignee("李四").singleResult();
    
            if (task != null) {
                Holiday holiday = new Holiday();
                holiday.setDays(4F);
                //初始化一些参数
                Map<String, Object> map = new HashMap<>();
                map.put("holiday", holiday);
    
                taskService.complete(task.getId(), map);//完成任务时,设置流程变量的值
                System.out.println("用户任务执行完毕...");
            }
        }

    请假天数大于3天,所以任务流转到总经理审批

     6)归还组任务 

        /**
         * 归还组任务,由个人任务变为组任务,还可以进行任务交接
         */
        @Test
        public void setAssigneeToGroupTask() {
            String taskId = "61184f94-390e-11ea-af99-30b49ec7161f";
            String userId = "李四";
    
            //校验userId是否是taskId的负责人,如果是负责人才可以归还组任务
            Task task = taskService.createTaskQuery().taskId(taskId)
                    .taskAssignee(userId).singleResult();
            if (task != null) {
                //如果设置为null,归还组任务,该任务没有负责人
                taskService.setAssignee(taskId, null);
            }
        }

    也可以通过 setAssignee 方法将任务委托给其它用户负责,注意被委托的用户可以不是候选人(不建议这样使用)

     7)任务交接

        /**
         * 任务交接,前提要保证当前用户是这个任务的负责人,这时候他才可以有权限去将任务交接给其他候选人
         */
        @Test
        public void setAssigneeToCandidateUser() {
            String taskId = "61184f94-390e-11ea-af99-30b49ec7161f";
            String userId = "李四";
    
            //校验userId是否是taskId的负责人,如果是负责人才可以归还组任务
            Task task = taskService.createTaskQuery().taskId(taskId)
                    .taskAssignee(userId).singleResult();
    
            if (task != null) {
                //将此任务交给其它候选人办理该任务
                String candidateUser = "王五";
                //根据候选人和组任务id查询,如果有记录说明该候选人有资格拾取该任务
                Task task1 = taskService.createTaskQuery().taskCandidateUser(candidateUser).singleResult();
                if (task1 != null) {
                    taskService.setAssignee(taskId, candidateUser);
                }
            }
        }

    源码  https://download.csdn.net/download/zsg88/12109868

     

  • 相关阅读:
    2020年“3D视觉工坊”视频号最受欢迎视频 Top 10!
    缓存一致性解决方案杂谈
    Mybatis的@Param注解在多参数时候不写,可以正确执行。
    Redis设计与实现之简单动态字符串
    YApi mac上部署
    拖拽方式生成Vue用户界面
    终于可以愉快的撸Java异步代码了!
    Windows 取证之ShellBags
    初识Fastjson漏洞(环境搭建及漏洞复现)
    mongo-express 远程代码执行漏洞分析
  • 原文地址:https://www.cnblogs.com/zsg88/p/12205897.html
Copyright © 2011-2022 走看看