当前位置: 首页 > news >正文

[转]activiti5用户任务分配

用户任务分配办理人:
1.用户任务可以直接分配给一个用户,这可以通过humanPerformer元素定义。 humanPerformer定义需要一个 resourceAssignmentExpression
来实际定义用户
eg:

<userTask id='theTask' name='important task' >
    <humanPerformer>
      <resourceAssignmentExpression>
        <formalExpression>kermit</formalExpression>
      </resourceAssignmentExpression>
    </humanPerformer>
  </userTask>

 

   任务只有一个用户的时候在activiti中,用户叫做执行者。 拥有执行者的task不会出现在其他人的任务列表中, 只能出现执行者的个人任务列表中。

   直接分配给用户的任务可以通过TaskService像下面这样获取:

         List<Task> tasks = taskService.createTaskQuery().taskAssignee("kermit").list();

2.任务也可以加入到人员的候选人员列表中。需要使用potentialOwner元素。 用法和humanPerformer元素类似,注意它需要指定表达式中的每个
项目是人员还是群组 (引擎猜不出来)。
eg:
 

 <userTask id='theTask' name='important task' >
    <potentialOwner>
      <resourceAssignmentExpression>
        <formalExpression>user(kermit), group(management)</formalExpression>
      </resourceAssignmentExpression>
    </potentialOwner>
  </userTask>

 


  分配给候选用户列表或组的任务可以通过TaskService像下面这样获取:
       

List<Task> tasks = taskService.createTaskQuery().taskCandidateUser("kermit").list();
       //List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup("kermit").list();

 此时对应办理人必须拾取任务,方能办理成功,任务被其中一个人拾取后,其他人不可见此任务

  任务拾取方法:  

 processEngine.getTaskService().claim(taskId, userId);

  ps: 如果没有显示指定设置的是用户还是群组, 引擎会默认当做群组处理。所以下面的设置与使用group(accountancy)效果一样。

  

 <formalExpression>accountancy</formalExpression>

 

3.Activiti对任务分配的扩展

当分配不复杂时,用户和组的设置非常麻烦。 为避免复杂性,可以使用用户任务的自定义扩展。

    assignee属性:这个自定义扩展可以直接把用户任务分配给指定用户。

  

  <userTask id="theTask" name="my task" activiti:assignee="kermit" />

 

    它和使用上面定义的humanPerformer 效果完全一样。

    candidateUsers属性:这个自定义扩展可以为任务设置候选人。  

  <userTask id="theTask" name="my task" activiti:candidateUsers="kermit, gonzo" />

 

    它和使用上面定义的potentialOwner 效果完全一样。 注意它不需要像使用potentialOwner通过user(kermit)声明, 因为这个属性只能用于人员。

    candidateGroups属性:这个自定义扩展可以为任务设置候选组。

 

 <userTask id="theTask" name="my task" activiti:candidateGroups="management, accountancy" />

 

  

 ps:这三个属性都可以通过流程变量动态指定值,多值需要用逗号隔开

 
 
 4. 如果上面的方式还不满足需求,还可以使用创建事件的任务监听器 来实现自定义的分配逻辑:

<userTask id="task1" name="My task" >
  <extensionElements>
    <activiti:taskListener event="create" class="org.activiti.MyAssignmentHandler" />
  </extensionElements>
</userTask>

 

DelegateTask会传递给TaskListener的实现, 通过它可以设置执行人,候选人和候选组:

public class MyAssignmentHandler implements TaskListener {

  public void notify(DelegateTask delegateTask) {
    // Execute custom identity lookups here

    // and then for example call following methods:
    delegateTask.setAssignee("kermit");
    delegateTask.addCandidateUser("fozzie");
    delegateTask.addCandidateGroup("management");
    ...
  }

}

 

5. 使用spring时,可以使用表达式 把任务监听器设置为spring代理的bean, 让这个监听器监听任务的创建事件。
 下面的例子中,执行者会通过调用ldapService这个spring bean的findManagerOfEmployee方法获得。 
 流程变量emp会作为参数传递给bean。

<userTask id="task" name="My Task" activiti:assignee="${ldapService.findManagerForEmployee(emp)}"/>

也可以用来设置候选人和候选组:

<userTask id="task" name="My Task" activiti:candidateUsers="${ldapService.findAllSales()}"/>

ps:注意方法返回类型只能为String或Collection<String> (对应候选人和候选组):

public class FakeLdapService {

  public String findManagerForEmployee(String employee) {
    return "Kermit The Frog";
  }

  public List<String> findAllSales() {
    return Arrays.asList("kermit", "gonzo", "fozzie");
  }

}

 

转载于:https://www.cnblogs.com/firebata/p/4689436.html

相关文章:

  • 数据结构:链表 链表按结点中第j个数据属性排序(冒泡排序法)
  • 批处理命令调用WINRAR对文件进行压缩
  • 线段树+树状数组+贪心 HDOJ 5338 ZZX and Permutations
  • 批处理命令拷贝文件
  • 我4年前写的第一个ruby程序
  • c# 调用c DLL 所传参数不正确
  • 离职那天我们复员——Leo网上答疑53
  • Spark工作机制-调度与任务分配
  • DT大数据梦工厂 第74讲
  • TCP SYN-Cookie背后的人和事
  • Unity3D NGUI 点击穿透问题的解决方案
  • C++ VS C#(4):枚举,结构体
  • 字节对齐问题 --- 莫名其妙的crash
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • 物联网系统设计初稿
  • (三)从jvm层面了解线程的启动和停止
  • .pyc 想到的一些问题
  • Angular4 模板式表单用法以及验证
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • ECMAScript入门(七)--Module语法
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • golang 发送GET和POST示例
  • Java多线程(4):使用线程池执行定时任务
  • java概述
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • php中curl和soap方式请求服务超时问题
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 讲清楚之javascript作用域
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 自动记录MySQL慢查询快照脚本
  • Hibernate主键生成策略及选择
  • python最赚钱的4个方向,你最心动的是哪个?
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • #define
  • #include
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (阿里云万网)-域名注册购买实名流程
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)ssm考生评分系统 毕业设计 071114
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .NET Core引入性能分析引导优化
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .Net程序帮助文档制作
  • .net知识和学习方法系列(二十一)CLR-枚举
  • /boot 内存空间不够
  • @Transactional类内部访问失效原因详解
  • []串口通信 零星笔记
  • [BZOJ1178][Apio2009]CONVENTION会议中心