任务分配

来源:互联网 发布:马克思资本论 知乎 编辑:程序博客网 时间:2024/05/16 08:10

</pre>taskService.setAssignee(taskId,userId)与 taskService.claim(taskId,userId)区别:<p></p><p>1、setAssignee直接改变act_ru_task表中的task的Assignee,指派人非null时添加一条新纪录在act_hi_identitylink表中。</p><p>2、claim先查询任务是否被申领(即act_ru_task表中的Assignee是否为空),为空则与setAssignee相同;不为空报错误</p><p></p><pre name="code" class="java">       org.activiti.engine.ActivitiTaskAlreadyClaimedException: Task   is already claimed by someone else.
     

一、个人任务分配

         流程图

       

         第一种、直接在.bpmn文件中指定(不够灵活,少用)

                 1、点击流程图中需要指派的UserTask任务(如上图的审批),查看Properties视图

                 2、点击Main config,修改其中的Assign为指派人,如甲

                      

              

          第二种、通过流程变量指定

                   1、修改Asssign为变量,如     ${userID}   或   #{userID}

                         

                   2、在类里为变量赋值 

              Map<String,Object> variables = new LinkedHashMap<String,Object>();      variables.put("userID", "乙");
                   3、将变量加入流程(如该流程第一步就需要指定指派人,所以启动流程时就需要加入变量,

                                                         未指定报org.activiti.engine.ActivitiException: Unknown property used in expression: ${userID} 错误)                  

            ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(key,variables);

             第三种、使用监听类进行指定

                       1、新建类实现org.activiti.engine.delegate.TaskListener  接口,如             

      public class Handler implements TaskListener {     /**指定个人任务,也可指定组任务*/   @Override    public void notify(DelegateTask delegateTask) {   //个人任务通过setAssignee()方法指定办理人   delegateTask.setAssignee("丙");   }       }
                        2、复制类的路径

                              选中类定义名(如上Handler),按F2查看包名+类名,复制(如personal_task.Handler)

                        3、选中需要指派的任务,选择Properties中的listener,点击New,Event选择create,点击Select class,将路径复制进行查询并选择。


                

                    

                     第四种、通过Service接口指定(常用)

                     

            processEngine.getTaskService().setAssignee("52504", "丁");//act_hi_identitylink表原指派信息还在

                       或             

           processEngine.getTaskService().setAssignee("52504", null);//先将指派人赋空值   processEngine.getTaskService().claim("52504", "戊");//再申领任务

          任务指派后,可查看act_ru_task中任务的Assignee属性,确保修改成功。

           同时查看,act_hi_identitylink表,增加一条TYPE_为participant(参与者),TaskID为空,PROC_INST_ID关联流程实例ID的记录。


      二、组任务分配       

         PS、任务候选人间需用英文,隔开    

          第一种、直接在.bpmn文件中指定(不够灵活,少用)

                 1、点击流程图中需要指派的UserTask任务(如图中的审批),查看Properties视图

                 2、点击Main config,修改其中的Candidate users(comma separated)为候选人,如   小A,小B,小C,小D

                  


         

       第二种、通过流程变量指定

                   1、修改Candidate users(comma separated)为变量,如    ${userIDs}   或  #{userIDs}

                         

                   2、在类里为变量赋值 ,并加入流程(类似个人任务变量赋值)

                        

          第三种、在代码中分配(常用)

                     

@Testpublic void addCandidate(){        //添加候选人ID,一般外部传递List<String> userList = new ArrayList<String>();userList.add("小甲");userList.add("小乙");userList.add("小丙");String taskId = "67504";TaskService taskService = processEngine.getTaskService();if(null!=userList && userList.size()>0){for(String userId:userList){   taskService.addCandidateUser(taskId, userId);//每次只可添加一个候选人}}}

       第四种、使用监听类

                       1、新建类实现org.activiti.engine.delegate.TaskListener  接口,如   

   public class Handler implements TaskListener {<span style="white-space:pre"></span>/**指定个人任务,也可指定组任务*/<span style="white-space:pre"></span>@Override<span style="white-space:pre"></span>public void notify(DelegateTask delegateTask) {<span style="white-space:pre"></span>//组任务通过addCandidateUser()方法指定候选人<span style="white-space:pre"></span>delegateTask.addCandidateUser("大A");<span style="white-space:pre"></span>delegateTask.addCandidateUser("大B");<span style="white-space:pre"></span>}}
                      2、接着操作类似个人任务分配


        

      1、对于未分派的组任务,在act_ru_task表中的ASSIGNEE(指派人)为null,所有候选人都可通过查询组任务查看

      2、同时,每次任务的每个指派人都会在act_ru_identitylink表以及act_hi_identitylink 表中各生成两条数据,

           TYPE为participant的表示为流程参与者,所以PROC_INST_ID不为空,TASKID为空

           TYPE为candidate的表示未任务候选人,所以TASKID不为空,PROC_INST_IDPROC_INST_ID

       3、分派后的组任务,指定了处理人,变为个人任务,只有处理人可查看

       4、任务完成后,act_ru_identitylink表以及act_ru_task表中关于该任务记录消失


常用函数:

         (1 )查询用户持有组任务:

@Testpublic void findGroupTask(){TaskQuery taskQuery = processEngine.getTaskService().createTaskQuery();List<Task> list = taskQuery.taskCandidateUser("小A").list();if(null!=list && list.size()>=0){for(Task task : list){System.out.println("任务ID:"+task.getId() + "任务分派人:"+task.getAssignee());//未分派任务的Assignee为空}}}

            (2)指派组任务

                   可指派候选人,也可指派非候选人

        @Test<span style="white-space: pre;"></span>public void assignTask2(){<span style="white-space: pre;"></span>processEngine.getTaskService().claim("62504", "小B");<pre name="code" class="java"><span></span>//<span style="font-family: Arial, Helvetica, sans-serif;">或</span><span style="font-family: Arial, Helvetica, sans-serif;">processEngine.getTaskService().setAssignee("62504",</span><span style="font-family: Arial, Helvetica, sans-serif;">"小B"</span><span style="font-family: Arial, Helvetica, sans-serif;">);</span>
}
</pre><p></p><p>           (3)回退指派过的任务为组任务</p><p>                    </p><pre name="code" class="java">@Testpublic void returnTask(){processEngine.getTaskService().setAssignee("62504", null);processEngine.getTaskService().claim("62504", "小B");}

             

            (4)  删除候选人

        taskService.deleteCandidateUser(taskId, userId);
               只删除作为候选人,查询组任务不可见,不删除作为参与者。

          (5)查找某任务当前所有候选人

        @Testpublic void findCurPersonTask(){String taskId = "67504";List<IdentityLink> list = processEngine.getTaskService().getIdentityLinksForTask(taskId);if(null!=list && list.size()>0){for(IdentityLink identityLink:list){System.out.println("指派任务ID:"+identityLink.getTaskId()+"指派类型:"+identityLink.getType()+"任务候选人:"+identityLink                                                  .getUserId());}}}

           (6)查询历史任务的办理人               

     @Testpublic void findHistoryPersonTask(){String taskId = "67504"; List<HistoricIdentityLink> list = processEngine.getHistoryService().getHistoricIdentityLinksForTask(taskId);if(null!=list && list.size()>0){for(HistoricIdentityLink historicIdentityLink:list){System.out.println("指派任务ID:"+historicIdentityLink.getTaskId()+"指派类型:"+historicIdentityLink.getType()+"任务候选人                                                   :"+historicIdentityLink.getUserId());}}}

1 0
原创粉丝点击