任务分配

</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、在类里为变量赋值 ,并加入流程(类似个人任务变量赋值)

                        

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

                     

@Test
	public 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 )查询用户持有组任务:

@Test
	public 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">@Test
	public void returnTask(){
		processEngine.getTaskService().setAssignee("62504", null);
		processEngine.getTaskService().claim("62504", "小B");
	}

             

            (4)  删除候选人

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

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

        @Test
	public 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)查询历史任务的办理人               

     @Test
	public 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());
			}
		}
	}

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值