使用 IBM Business Process Manager V8 设计并实现一个自定义收件箱和 My Team Performance 任务列表

本文介绍了一种在 IBM® Business Process Manager V8 中创建自定义收件箱和 My Team Performance 任务列表的方法。您可使用本文中实现的功能来执行更多收件箱和任务列表自定义。

Prashant P. Atgur, BPM 解决方案架构师, IBM

Prashant P. Atgur 在架构和实现涉及 SOA、BPM 和 BRMS 的技术解决方案方面拥有超过 12 年经验。他是一位认证企业架构师,曾领导过包括 IT 变革、应用程序合理化和企业架构在内的多项工作。他曾与业务领导和执行 IT 团队密切合作,制定了企业的 IT 战略。



Ernese Norelus, IT 咨询专家, IBM

Ernese Norelus 是位于新加坡的 IBM ASEAN Software Services 团队的一名 IBM 认证 IT 咨询专家。他的工作职责是向客户提供咨询服务,帮助他们定义复杂业务问题的 IT 解决方案。他拥有超过 12 年的 IT 从业经验。



2013 年 10 月 14 日

简介

IBM Business Process Manager (IBM BPM) 提供了一些有用的功能来管理业务流程,包括流程参与者的收件箱。尽管建议您尽可能地使用开箱即用的功能,但在某些情形下,默认的实现可能无法满足您的要求。在这种情况下,您可能需要设计并实现一个自定义收件箱。本文为这种自定义收件箱提供了一种设计方法和示例实现。类似地,默认的 My Team Performance 为团队经理提供了一种监视分配给其团队的任务的好方法。但是,在某些情况下,用户可能希望自定义 My Team Performance 任务列表的实现。本文还演示了如何执行这种自定义。

在 IBM BPM 中实现的一个业务流程中,所有用户任务都显示在参与者的收件箱中。Inbox 任务列表是在确定工作分配和任务流的过程中的一个最关键的组件。Process Portal 中提供的默认实现显示了分配给用户或该用户所属的所有角色的所有任务。

本文的 下载 部分提供了 IBM BPM V8 中的示例流程应用程序的示例 TWX 导出文件。您必须使用 Process Admin 控制台创建必要的用户和用户组,然后才能运行示例代码,如 为示例场景创建用户和组 中所述。

可能需要自定义收件箱任务列表的场景示例

在某些情况下,IBM BPM 收件箱功能可能无法满足您的特定要求。以下是两个这类场景的示例:

  • 组织已有一个员工门户

    在这种情况下,组织已有一个经过深入开发并得到广泛应用的员工门户。组织的战略目标是使这个门户成为所有员工活动的一站式服务点。使用 IBM BPM 实现的流程可很好地用于从此门户发起的活动。

    流程参与者(常常也是此组织的员工)不希望学习使用另一个用户界面来执行其流程工作,他们更愿意从自己熟悉的员工门户查看收件箱任务列表和其他信息。

  • 需要广泛的自定义

    需要对开箱即用的 IBM BPM 收件箱执行重要的自定义。从本质上讲,这些自定义不是装饰性的,是功能性的。这方面的一个示例是涉及到审计任务的流程。例如,只要流程参与者单击收件箱中的 “Audit Task”,他们就会被定向到详细的审计步骤。根据这些步骤是否在参与者的权限范围内,他们可以向自己或其他人分配任务。这种类型的自定义可能需要实现一个自定义收件箱。

设计方法对比

可采用多种方法来设计和实现自定义收件箱。表 1 给出了这些方法的优缺点。在本文中,我们将使用 JavaScript™ API 方法。

表 1. 设计方法对比
方法优点缺点
REST-API
  • 可从外部图形用户界面使用
  • 干净的、公开的界面
REST API 安全模型比 JavaScript API 更严格。用户仅可在分配给他们或他们的小组的任务上工作
WebAPI 可由外部应用程序使用比 JavaScript API 更严格的安全模型,是该安全模型的功能子集
JavaScript API(本文中使用)与 REST-API 和 WebAPI 相比,具有更全面的功能需要将这些自定义实现为 IBM BPM 中的服务,并且可以通过 REST-API 或公开的 Web 服务从外部调用它们

为示例场景创建用户和组

本文中将使用的示例场景包含以下组和用户,您需要在运行 示例流程应用程序 之前创建他们。有关如何管理用户的信息,请参阅 Business Process Manager 信息中心中的 管理 IBM BPM 中的用户

  • Service_Agents:这个组包含将从流程接收任务的服务代理。这个组中有三个服务代理:Service_Agent1、Service_Agent2 和 Service_Agent3。
  • Temp_Service_Agents:为了证明这种机制同样适用于嵌套的组,我们在 Service_Agents 组中添加了一个名为 Temp_Service_Agents 的组。这个组有一个名为 Temp_Service_Agent1 的服务代理,如图 1 所示。
    图 1. Service_Agents 和 Temp_Service_Agents 组
    Service_Agents 和 Temp_Service_Agents 组
  • Service_Supervisors:这个组包含充当 Service_Agents 的主管或 “团队经理” 的用户,如图 2 所示。这个组中有一个用户,名为 Service_Supervisor1。
    图 2. Service_Supervisors 组
    Service_Supervisors 组

图 3 显示了 IBM BPM Process Admin 控制台中的示例场景的用户分层结构。

图 3. 用户分层结构
用户分层结构

创建一个流程来生成用户任务

图 4 显示了一个用于生成用户任务的非常简单的流程。

图 4. 任务生成流程示例
任务生成流程示例

与此任务关联的参与者组称为 PG_Service_Agents,如图 5 所示。

图 5. PG_Service_Agents 组
PG_Service_Agents 组

我们希望将所有任务路由到 Service_Agents 组,所以您需要将该组添加到 PG_Service_Agents 参与者组中,如图 6 所示。

图 6. 将 Service_Agents 添加到 PG_Service_Agents 中
将 Service_Agents 添加到 PG_Service_Agents 中

这会将任务路由到 Service_Agents 组的成员。请记住,Service_Agents 组中有三个独立的成员和一个嵌套组。

注意:在运行示例代码时,可多次运行这个流程并将任务分配给不同的用户,以便每个用户的收件箱中都有一些任务。


在收件箱中获取用户的任务

一个典型的开箱即用的收件箱包含以下任务,如图 7 所示:

  • 分配给该用户的任务
  • 分配该用户所属的所有组的任务
图 7. 收件箱任务
收件箱任务

第一项(获取分配给该用户的任务)非常简单。第二项(获取分配给该用户所属的所有组的任务)稍微复杂一点。要确定在组级别存在的任务,首先需要确定该用户所属的所有组。幸运的是,JavaScript TWSearch API 提供了获取此列表的简单方法。

在流程 Get Custom Inbox for User(如图 8 所示)中,流程活动 get user’s Inbox level task 会在内部调用 System Service 来获取用户的收件箱级任务。

图 8. 获取用户的收件箱级任务
获取用户的收件箱级任务

清单 1 给出了在 Search for Users Inbox General System 服务中实现的使用 JavaScript API 搜索用户收件箱的代码。

清单 1. 搜索用户收件箱的 JavaScript API
// 1. SET SEARCH COLUMNS
var col1 = new TWSearchColumn();
col1.name = TWSearchColumn.ProcessInstanceColumns.Name
col1.type = TWSearchColumn.Types.ProcessInstance;
//set other search columns as needed

// 2. SET SEARCH CONDITION
var searchCondition2 = new TWSearchCondition();
searchCondition2.column = mySearchCol2;
//set the criteria for seach
searchCondition2.operator = TWSearchCondition.Operations.Equals;
searchCondition2.value = “New_or_Received”;

// 3. EXECUTE SEARCH IN THE CONTEXT OF SPECIFIED USER
var results = search.execute("user:"+tw.local.searchUserName, 20, 0);

// 4. ITERATE OVER RESULTS TO POPULATE LOCAL VARS
for (var i=0; i<results.rows.length; i++)
{
	var prashaTask =  new tw.object.PrashaTaskDataType();
	prashaTask.processInstanceName = 
	                    results.rows[i].values[0];
	prashaTask.processDefinitionName =  
	                    results.rows[i].values[1];
}// FOR

/** COMPLETE CODE CAN BE FOUND IN THE ATTACHED FILES **/

获取分配给组员的任务

如果需要查找分配给同一组中作为用户的个人的任务,该怎么办?默认收件箱不会为我们提供有关分配给组员的任务的信息。要获取一个组员的收件箱列表,可执行以下步骤:

  1. 找到用户的组员(他们可能来自许多组)
  2. 对于每个组员,可查找分配给该组员的任务列表。

图 9 显示了一个用于查找分配给组员的任务的示例流程。

图 9. 查找分配给组员的任务
查找分配给组员的任务

清单 2(在 General System 服务中实现)查找用户所属的所有角色,而对于每个角色,可查找该角色中的其他用户。有关的完整代码,请下载 附加的 TWX 文件

清单 2. 查找组员用户
function addUsersFromRole( myrole ) {
  var twRole = tw.system.org.findRoleByName(myrole);
  if ( twRole != null ) {
    for ( var i = 0; i < twRole.users.listLength; i++ ) {
        // don't add logged in user
        if (!( tw.local.userName == twRole.users[i].name ) ) {
          tw.local.allUsersInGroup.insertIntoList
              (tw.local.allUsersInGroup.listLength,  
               twRole.users[i].name);
          log.info("add users from role, added USER :" 
                   + twRole.users[i].name);
        }
     }//for
  }//if /** COMPLETE CODE CAN BE FOUND IN THE ATTACHED FILES **/

获取嵌套组

在一些情形中,一个组可能不仅包含个人用户,还包含另一个嵌套组。在这类情形中,您需要编写代码来遍历这些嵌套组并查找其中的用户。清单 3 显示了完成此任务所需的代码。

清单 3. 查找嵌套组中的用户
function addUsersFromRoleDeepTraverse( myrole ) {
 var twRole = tw.system.org.findRoleByName(myrole);

 if ( twRole != null ) {
    for ( var i = 0; i < twRole.users.listLength; i++ ) {
        // don't add logged in user
        if (!( tw.local.userName == twRole.users[i].name ) ) {
           
           tw.local.allUsersInGroup.insertIntoList
                (tw.local.allUsersInGroup.listLength, 
                 twRole.users[i].name);
          log.info("add users from role, added USER :" + 
                    twRole.users[i].name);
        }
     }//for
     
     // now get the roles included in this role
     if ( twRole.roles != null ) {
         // if roles found iterate recursively
        for ( var i = 0; i < twRole.roles.listLength; i++ ) {     
            addUsersFromRoleDeepTraverse( twRole.roles[i].name );
        }//for
     } else {
         // no more child roles return from here.
         return;
     }
  }//if /** COMPLETE CODE CAN BE FOUND IN THE ATTACHED FILES **/
}//function

注意:要小心地使用递归逻辑,尤其在用户组中存在循环引用时。

查找分配给用户的任务

获取用户的所有组员后,获取分配给他们的任务就很简单了,可使用 清单 1 中所示的 JavaScript API 来完成此操作。


创建一个自定义的 My Team Performance 任务列表

现在,让我们看看如何构建一个自定义的 My Team Performance 任务列表。这比常规的收件箱任务列表要复杂一些。在这种情况下,用户应属于 “Team Manager 组”。以下步骤描述了获取组成 My Team Performance 的任务的一种方法。

  1. 查找 Team Manager 管理的所有团队。
  2. 对于每个团队,获取:
    • 组级别上的任务列表
    • 用户列表
  3. 对于每个用户,获取分配给该用户的所有任务。

图 10 显示了一个获取 My Team Performance 的任务的示例流程。

图 10. 获取 My Team Performance
获取 My Team Performance

查找一个 Team Manager 用户管理的团队

一个主管用户可以是一个或多个团队的 Team Manager。我们的第一个任务是找出用户是 Team Manager 的所有组。为此,可使用以下 JavaScript 代码:

var twTeamsManaged = tw.system.org.findRoleByName(userRole).managedTeamRoles;

此调用成功后,twTeamsManaged 将拥有该用户管理的团队(或组)列表。然后可以迭代该列表,获取其中每个组的用户列表,以及分配给每个角色或用户的任务。

获取一个组中的用户列表

要获取某个给定组中的用户列表,需要执行一个简单的 API 调用。此调用可返回某个给定组的所有用户,如清单 4 所示。请记住,您需要迭代这个组列表,以便获取所有用户,并增量地将他们添加到最终的用户列表中。

清单 4. 获取一个组中的用户列表
var twRole = tw.system.org.findRoleByName(myrole);
  if ( twRole != null ) {
    for ( var i = 0; i < twRole.users.listLength; i++ ) {
        // don't add logged in user
        if (!( tw.local.userName == twRole.users[i].name ) ) {          
     
           tw.local.allUsersInGroup.insertIntoList(
                   w.local.allUsersInGroup.listLength, 
                                   twRole.users[i].name);
        }//if

获取分配给每个角色的任务

可使用一个 JavaScript API 简单搜索来获得分配给每个用户或角色的任务,该搜索类似于 清单 1 中使用的搜索,其中使用了一个通用系统服务来获取用户的收件箱任务列表。


整合所有服务和流程

可以看到,此解决方案有多个服务和流程。在本节中,我们将了解如何将这些功能汇总在一起形成解决方案。

解决方案中使用的流程

解决方案中包含以下流程:

  1. Sample Process for Task Generation:此流程用于生成示例任务并将它分配给不同的用户。
  2. Get Custom Inbox For User:此流程包含使用 JavaScript API 获取用户收件箱的详细信息的逻辑。
  3. Get Tasks Assigned to All Peers:此流程包含获取分配给选定用户的同事的任务的逻辑。
  4. Get Custom My Team Performance for User:此流程获取输入作为拥有 Team Manager 权利的用户,检索分配给所有下级的任务,以显示自定义的 My Team Performance。

变量定义

因为自定义收件箱检索或自定义 My Team Performance 检索需要一种对象结构来存储任务详细信息,所以您需要定义一个复杂的业务对象来存储它的内容。图 11 显示了为此用途而创建的复杂的对象类型定义。

图 11. 复杂的业务对象
复杂的业务对象

示例复杂对象拥有必要的字段,用于捕获显示自定义收件箱以及自定义 My Team Performance 所需的信息。

图 12. Get Custom Inbox for User 流程的变量
Get Custom Inbox for User 流程的变量

使用 REST 客户端启动流程

因为我们的想法是让客户端通过 REST API 调用这些流程,让我们看看如何使用 IBM BPM 随带的 REST 客户端完成此任务。REST 客户端的 URL 是:http://<hostname:port>/bpmrest-ui/(默认端口为 9080)。

注意:尽管我们在示例中使用了 REST UI 客户端,这些流程实际上可以使用任何 REST 客户端调用。

为此,您需要公开流程起点来选择用户,以便可以使用 REST 客户端调用它。这是使用流程的 Overview 选项卡来实现的。要启动流程,需要在 REST 客户端中设置以下字段(参见图 13):

  1. 将 BPD ID 设置为您的流程的 BPDID。您可使用 Process Designer 的 System ID 字段,在流程的 Overview 选项卡上找到 BPDID。
  2. userName 参数的值设置为 { “userName”: “Service_Agent1”},以便检索用户的收件箱内容。
  3. 单击 Execute Call

图 13 启动一个流程来获取自定义收件箱的内容。您可以使用一种类似技术来启动其他流程。

图 13. 设置 BPM REST 客户端中需要的字段
设置 BPM REST 客户端中需要的字段

请注意图 13 中的 piid 字段。此字段是您刚启动的流程的实例 ID。您需要使用此流程实例 ID 获取用户收件箱的内容。

流程运行完成后,您可使用 REST 客户端获取自定义收件箱的内容。内容显示为 JSON 格式。您可以使用您选择的实用程序将 JSON 转换为 Java 对象或其他任何您想要的格式。

要获取收件箱的内容,请执行以下操作:

  1. 在浏览器中打开 REST 客户端。
  2. 在左侧导航窗格中选择 Process API => Current State
  3. 指定上一节中的流程实例 ID 并单击 Execute Call。用户收件箱的内容会在输出变量 userInboxTaskList 中返回,如图 14 中屏幕右侧所示。
    图 14. REST 客户端中显示的结果
    REST 客户端中显示的结果

可采用一种类似方式检索分配给组员的自定义 My Team Performance 和任务。


结束语

本文提供了一些构建块,可组合和增强这些构建块来轻松地设计和实现进一步的收件箱和任务列表定制。重用这些资产的能力不仅节省了宝贵的开发周期,还可以帮助开发团队将精力集中在实现实际的业务流程上。

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=WebSphere
ArticleID=948190
ArticleTitle=使用 IBM Business Process Manager V8 设计并实现一个自定义收件箱和 My Team Performance 任务列表
publish-date=10142013