zoukankan      html  css  js  c++  java
  • Activiti(四)任务组

    一:需求

    在流程定义中在任务结点的  assignee  固定设置任务负责人,在流程定义时将参与者固定设置在.bpmn 文件中,如果临时任务负责人变更则需要修改流程定义,系统可扩展性差。

    针对这种情况可以给任务设置多个候选人,可以从候选人中选择参与者来完成任务。

    流程简介

    第一步:查询组任务

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

    第二步:拾取(claim)任务

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

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

        如果拾取后不想办理该任务?

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

    第三步:查询个人任务

      查询方式同个人任务部分,根据assignee 查询用户负责的个人任务。第四步:办理个人任务

    二:设置任务候选人

    三:实现

    3.1前置方法

        ProcessEngine processEngine;
    
        @Before
        public void connection() {
            ProcessEngineConfiguration processEngineConfigurationFromResource = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
            processEngine = processEngineConfigurationFromResource.buildProcessEngine();
        }

    3.2流程部署

    //1.流程部署
        @Test
        public void createDeployment() {
            System.out.println(processEngine);
            RepositoryService repositoryService = processEngine.getRepositoryService();
            Deployment deployment = repositoryService.createDeployment()
                    .addClasspathResource("holiday.bpmn")
                    .name("请假流程-组任务")
                    .key("myHoliday")
                    .deploy();
            System.out.println(deployment.getName());
            System.out.println(deployment.getKey());
            System.out.println(deployment.getId());
        }

    3.3创建流程实例

     //2.创建流程实例
        @Test
        public void startProcessInstance() {
            RuntimeService runtimeService = processEngine.getRuntimeService();
            //动态指定任务执行人
            Map assigneesMap = new HashMap();
            //请假人
            assigneesMap.put("tianyan", "tianyan");
            //部门经理
            assigneesMap.put("douying", "douying");
            assigneesMap.put("guo", "guo");
            assigneesMap.put("xuediao", "xuediao");
            //人事
            assigneesMap.put("fenghe", "fenghe");
            //设置请假天数
    
            //赋值并启动
            ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess_1", assigneesMap);
            System.out.println(processInstance.getName());
            System.out.println(processInstance.getDeploymentId());
            System.out.println(processInstance.getActivityId());
        }

    3.4单人任务查询和处理任务

     //3.单人任务查询和处理任务
        @Test
        public void findPersonalTaskList() {
            TaskService taskService = processEngine.getTaskService();
            List<Task> list = taskService.createTaskQuery()
                    .processDefinitionKey("myProcess_1")
                    .taskAssignee("fenghe").list();
    
            Iterator<Task> iterator = list.iterator();
            while (iterator.hasNext()) {
                Task next = iterator.next();
                System.out.println(next);
                //4.处理任务
                processEngine.getTaskService().complete(next.getId());
                System.out.println("完成任务");
            }
        }

    3.5.组任务查询

    @Test
        public void findGroupTaskList() {
            TaskService taskService = processEngine.getTaskService();
            //任务没被拾取之前,任何候选人都可以查看
            List<Task> list = taskService.createTaskQuery().processDefinitionKey("myProcess_1").taskCandidateUser("douying").list();
            Iterator<Task> iterator = list.iterator();
            while (iterator.hasNext()) {
                Task next = iterator.next();
                System.out.println(next);
            }
    
        }

    3.6任务拾取

    @Test
        //5.任务拾取
        public void claimTask() {
            TaskService taskService = processEngine.getTaskService();
            Task task = taskService.createTaskQuery()//
                    .taskId("7502")
                    .taskCandidateUser("douying")//douying拾取任务
                    .singleResult();
            if (task != null) {
                taskService.claim("7502", "douying");
                System.out.println("任务拾取成功");
            }
        }

    3.7归还任务or交接任务

     //6.归还任务or交接任务
        @Test
        public void setAssigneeToGroupTask() {
            // 查询任务使用TaskService
            TaskService taskService = processEngine.getTaskService();
            // 当前待办任务
            String taskId = "7502";
            // 任务负责人
            String userId = "douying";
            // 校验userId是否是taskId的负责人,如果是负责人才可以归还组任务
            Task task = taskService.createTaskQuery().taskId(taskId)
                    .taskAssignee(userId).singleResult();
            if (task != null) {
                // 如果设置为null,归还组任务,该任务没有负责人,可以指定给其他的候选人(不存在的候选人也可以)
                taskService.setAssignee(taskId, null);
            }
        }

     

  • 相关阅读:
    模板嵌套类别名作为函数返回类型,可能会提示的编译错误
    不能将“this”指针从“const SqQueue<ElementType>”转换为“SqQueue<ElementType> &
    与左侧的 圆括号“(”(位于“e:大二上课程课件、作业和答案数据结构chapter4sqstacksqstackmysqstack.h(23)”)匹配之前遇到文件结束
    operator <<”不明确
    此声明没有类型说明符
    设计模式一责任链模式
    设计模式一静态代理模式
    设计模式一原型模式
    设计模式一观察者模式
    设计模式一备忘录模式
  • 原文地址:https://www.cnblogs.com/yjc1605961523/p/12655108.html
Copyright © 2011-2022 走看看