</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()); } } }