任务分配
来源:互联网 发布:马克思资本论 知乎 编辑:程序博客网 时间: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());}}}
- 任务分配
- 任务分配
- 任务分配
- 任务的详细分配
- ACM 任务分配问题
- 【任务分配】解题报告
- 项目经理如何分配任务
- linux---任务分配(PBS)
- hadoop任务分配
- 项目经理如何分配任务
- 任务分配及管理
- 项目经理如何分配任务
- TYVJ 1431 分配任务
- 分配任务第一天
- [CODEVS 1301] 任务分配
- 任务分配问题
- 任务分配问题
- FairScheduler源码任务分配
- android 创建的删除快捷图标
- 杭电1004
- eclipse最有用快捷键整理
- 发明家的原创时代
- 【蓝桥杯】【基础练习02】【十六进制转八进制】
- 任务分配
- Git Internal #1:内容管理
- JVM优化之逃逸分析
- raised exception "Index out of Bounds"
- Scons构建RT-Thread开发环境
- WordPress主题 DUX原版 Pro Plus 小清新CMS主题带用户中心[更新至1.4]
- 删除录音文件 广播通知更新媒体库
- 10021---Creating a Code Base for Your Project
- 使用命令解锁用户。命令为:alter user username account unlock;