# 组织机构接口(IWFOMService)
# 接口功能描述
从BPS 6.0版本开始提供该接口,本套组织机构增强了通用性,不再硬性规定有什么类型的参与者。
一个公司的组织模型中,参与者是可以区分出类型的,所有参与者可以按照类型分成若干类。如:机构类型、员工类型等。并且,参与者之间存在"父子"关系。每一个参与者可以包含多个不同类型的子参与者,同时也可以从属于多个不同类型的父参与者。比如:员工类型的参与者就是机构类型参与者的子参与者。在多种参与者中,必定存在一个叶子参与者(基本参与者),叶子参与者不再包含其他的子参与者。
BPS的组织机构支持参与者交集计算。对于集合类型的参与者,可以进行交集计算。比如:机构A和角色B的交集参与者,就是在机构A内属于角色B的参与者的集合。
通过实现该组织模型接口,可以根据需要实现树状的、网状的、矩阵类型等等多种组织模型。
注意
- 参与者ID中只能出现字母、数字、减号(-)、下划线(_)。不能出现除此之外的其他字符;
- 可以通过BPS管理监控->配置管理->组织机构,配置用户自己实现的接口类;
- 实现组织机构时,所有返回List的方法不允许返回null值 ,List里面也不允许有null值,否则运行时会出现空指针异常;
# getParticipantTypes:获取参与者类型列表
# 【功能说明】
获取所有参与者类型的列表。用户通过该方法描述自己的组织机构里有哪些类型的参与者,以及这些参与者类型之间的关系。
BPS引擎调用该方法的频度很高,建议将返回的List缓存起来以提高性能。
# 【实现说明】
参数说明 无。
返回值说明
java.util.List < com.primeton.workflow.api.ParticipantType>:每个参与者类型对应一个ParticipantType,封装到List中返回出来。
ParticipantType中需要定义的属性如下:
属性名 | 类型 | 描述 |
---|---|---|
prefix | char | 前缀,如:P-个人;R-角色;O-机构;Z-岗位 |
code | String | 类型编码 |
displayName | String | 显示名称 |
description | String | 描述 |
showAtRootArea | boolean | 是否在参与者选择的根区域显示 |
priority | int | 显示优先级 |
leafParticipant | boolean | 是否叶子参与者。叶子参与者可以作为工作项的最终执行者 |
juniorParticipantTypeCodes | List<String> | 查询所有下级参与者类型 |
jointParticipantType | boolean | 是否是组合类型(虚参与者) |
jointTypeCodeList | List<String> | 组合类型的组合id列表 |
# getParticipantType:获取指定参与者类型
# 【功能说明】
获取指定参与者类型。该方法描述了某个参与者类型的详细信息。比如一个机构类型的参与者,是否有子参与者,是否是最终执行者。
BPS引擎调用该方法的频度很高,建议将返回的List缓存起来以提高性能。
# 【实现说明】
- 参数说明
类型 | 名称 | 数据类型 | 参数描述 |
---|---|---|---|
参数 | typeCode | String | 参与者类型ParticipantType的code属性值 |
- 返回值说明 com.primeton.workflow.api.ParticipantType:每个参与者类型对应一个ParticipantType,封装到List中返回出来。
# findRootParticipants:获取某类型参与者的根参与者
# 【功能说明】
获取某个类型的根参与者。该方法描述了某个类型相应的根参与者。比如输入一个机构的typeCode,该方法应该返回根机构的列表。
注意
实现时:
- 如果该类型的showAtRootArea属性为false,应该返回null。否则,返回的值也无法在刷新组织机构树时刷新出来。
- 根可能有多个。
# 【实现说明】
- 参数说明
类型 | 名称 | 数据类型 | 参数描述 |
---|---|---|---|
参数 | typeCode | String | 参与者类型ParticipantType的code属性值 |
- 返回值说明 java.util.List<com.eos.workflow.omservice.WFParticipant>:根参与者列表。
# getParticipants:获取某类型的所有参与者
# 【功能说明】
获取某个类型的所有参与者。该方法描述了某个类型的所有参与者。比如输入一个机构的typeCode,该方法应该返回所有机构的列表。
# 【实现说明】
- 参数说明
类型 | 名称 | 数据类型 | 参数描述 |
---|---|---|---|
参数 | typeCode | String | 参与者类型ParticipantType的code属性值 |
- 返回值说明 java.util.List<com.eos.workflow.omservice.WFParticipant>:参与者对象列表。
# findParticipantByID:根据ID获取某个类型的参与者信息
# 【功能说明】
根据ID获取某个类型的参与者信息。比如输入一个机构的typeCode和一个机构ID,该方法应该返回指定机构类型的参与者信息。
# 【实现说明】
- 参数说明
类型 | 名称 | 数据类型 | 参数描述 |
---|---|---|---|
参数1 | typeCode | String | 参与者类型ParticipantType的code属性值 |
参数2 | participantID | String | 即要查询参与者的ID |
- 返回值说明 com.eos.workflow.omservice.WFParticipant:查询出来的参与者对象。
# getAllChildParticipants:查询所有下级参与者
# 【功能说明】
查询所有下级参与者。对于指定的参与者,该方法需要返回该参与者的各种不同类型的子参与者。
# 【实现说明】
- 参数说明
类型 | 名称 | 数据类型 | 参数描述 |
---|---|---|---|
参数1 | typeCode | String | 参与者类型ParticipantType的code属性值 |
参数2 | participantID | String | 即要查询参与者的ID |
- 返回值说明 List<com.eos.workflow.omservice.WFParticipant>:查询出来的参与者对象列表。
# getChildParticipants:查询某个参与者的指定类型的子参与者
# 【功能说明】
查询某个参与者的指定类型的子参与者。比如输入一个机构的typeCode、一个机构ID和一个机构类型的typeCode,该方法应该返回指定机构的子机构的信息。
# 【实现说明】
- 参数说明
类型 | 名称 | 数据类型 | 参数描述 |
---|---|---|---|
参数1 | typeCode | String | 参与者类型ParticipantType的code属性值 |
参数2 | participantID | String | 即要查询参与者的ID |
参数3 | childCode | String | 即需要返回的子参与者的参与者类型ParticipantType的code属性值 |
- 返回值说明 List<com.eos.workflow.omservice.WFParticipant>:查询出来的参与者对象列表。
# getAllParentParticipants:查询所有的上级参与者
# 【功能说明】
查询所有的上级参与者。在实现的时候,应该将指定参与者的所有父参与者查询出来,并返回。
# 【实现说明】
- 参数说明
类型 | 名称 | 数据类型 | 参数描述 |
---|---|---|---|
参数1 | typeCode | String | 参与者类型ParticipantType的code属性值 |
参数2 | participantID | String | 即要查询参与者的ID |
- 返回值说明 List<com.eos.workflow.omservice.WFParticipant>:查询出来的参与者对象列表。
# getParentParticipants:查询某个参与者的指定类型的父参与者
# 【功能说明】
查询某个参与者的指定类型的父参与者。比如输入一个机构的typeCode、一个机构ID和一个机构类型的parentCode,该方法应该返回指定机构的父机构的详细信息。
# 【实现说明】
- 参数说明
类型 | 名称 | 数据类型 | 参数描述 |
---|---|---|---|
参数1 | typeCode | String | 参与者类型ParticipantType的code属性值 |
参数2 | participantID | String | 即要查询参与者的ID |
参数3 | parentCode | String | 即需要返回的父参与者的参与者类型ParticipantType的code属性值 |
- 返回值说明 List<com.eos.workflow.omservice.WFParticipant>:查询出来的参与者对象列表。
# getJointChildParticipant:查询交集类型参与者的所有下属参与者
# 【功能说明】
查询交集类型参与者的所有下属参与者。查询到的参与者不一定全是叶子参与者。比如:机构+角色,可能查询到一系列岗位。
# 【实现说明】
- 参数说明
类型 | 名称 | 数据类型 | 参数描述 |
---|---|---|---|
参数1 | jointParticipantType | String | 即参与者类型ParticipantType的code属性值,其类型为交集参与者类型(例如:position)。 |
参数2 | participantIDList | List<String> | 即交集的参与者ID列表(例如:rolea和depta)。 |
- 返回值说明 List<com.eos.workflow.omservice.WFParticipant>:查询出来的参与者对象。
# getParticipantScope:获取某个参与者的参与范围
# 【功能说明】
获取某个参与者的参与范围。某个参与者可以有一定的参与范围,该参与范围决定了该参与者对直接属于哪些参与者的任务有权限。比如:tiger属于角色a,tiger对分给参与者"tiger"和参与者"角色a"的任务都有权限。该参与者对所有参与范围内的参与者的直接工作项有权限。只需要对叶子参与者类型实现该方法。
在调用getParticipantScope的时候,如果需要包括复杂类型参与者,拼出来的ID请与getJointParticipantID拼出来的结构一致。
注意
实现时: 该方法返回的列表中至少要包含参与者自己。
# 【实现说明】
- 参数说明
类型 | 名称 | 数据类型 | 参数描述 |
---|---|---|---|
参数1 | typeCode | String | 即参与者类型ParticipantType的code属性值 |
参数2 | participantID | String | 即要查询参与者的ID |
- 返回值说明 List<com.eos.workflow.omservice.WFParticipant>:查询出来的参与者对象列表。
# 工作日历接口(ITimeLimitCalculator
# 接口功能描述
每个任务都有自己的时限,过了这个时限而未完成就是超时任务,BPS提供了一套默认的这类日历时间的简单算法,如果用户需要按照自己的方式计算超时和超时提醒的时间,也可以自己扩展。BPS提供了工作日历的接口用以扩展用户自定义的工作日历。如果需要自定义工作日历,需要做以下操作:
- 实现该工作日历的接口;
- 修改具体应用目录下的\work\system\com.primeton.workflow.core\META-INF\contribution.eosinf文件,在"timelimit_calculator_provider"中配置第一步实现类的路径。
相关联的功能包括,流程(或工作项)超时触发事件,提醒触发事件和邮件提醒功能。
# getFinalTime:计算流程或者工作项的最终期限
# 【功能说明】
计算流程或者工作项的最终期限。
# 【实现说明】
- 参数说明
类型 | 名称 | 数据类型 | 参数描述 |
---|---|---|---|
参数1 | startTime | long | 流程(或者活动)开始时间 |
参数2 | limitNumber | long | 设置的时间限制 |
参数3 | context | TimeLimitContext | 工作日历的上下文 |
- 返回值说明 返回计算后的最终期限。
# 【参考案例】
缺省实现为:finalTime = startTime + limitnum。如下:
public long getFinalTime(long startTime,long limitnum, TimeLimitContext context)
{
return startTime +limitnum;
}
# 【其他说明】
关于TimeLimitContext: 如果需要针对不同的实例计算方式不同的时候,用户可以通过该对象获取到当前流程等相关信息,具体有下列方法:
- getTimeLimitType() 获取时间限制的类型,返回枚举类型的{ PROCINST,WORKITEM }
- getCurrentProcessInst() 获取当前的流程实例
- getCurrentWFActivityInst() 获取当前的活动实例
- getCurrentWFWorkItem() 获取当前的工作项
# getRemindTime:计算超时预警的时间
# 【功能说明】
计算超时预警的时间。
# 【实现说明】
- 参数说明
类型 | 名称 | 数据类型 | 参数描述 |
---|---|---|---|
参数1 | finalTime | long | 流程(或者活动)最终时限 |
参数2 | preNumber | long | 需要提前提醒的时间数 |
参数3 | context | TimeLimitContext | 工作日历的上下文 |
- 返回值说明 返回long类型的超时预警时间。
# 【参考案例】
缺省实现为:remindTime = finalTime - preTime。如下:
public long getRemindTime(long finalTime, long preNumber, TimeLimitContext context)
{
return finalTime - preNumber;
}
# 【其他说明】
关于TimeLimitContext参见getFinalTime:计算流程或者工作项的最终期限 (opens new window)。
# 业务权限控制接口(IWFPermissionService)
BPS运行环境提供两个UI应用组件,分别是"BPS Workspace"、"BPS Work Client"。为了给这两个应用组件提供相应的权限控制能力,BPS提供接口com.eos.workflow.omservice.IWFPermissionService。该接口可以由用户实现,接口提供验证用户密码以及判断用户权限的功能。
IWFPermissionService.java
package com.eos.workflow.omservice;
import java.util.List;
import java.util.Map;
public interface IWFPermissionService {
/**
* 验证用户密码
* @param userID 用户id
* @param pwd 密码,可能是加密过的数据
* @param attributes 验证时需要传递的其他扩展属性
*/
public boolean validate(String userID,String pwd,Map attributes);
/**
* 判断用户是否具有某权限
* @param permType 权限类型。目前可以是 bpsclient 或者 bpsmanager
* @return 如有具有该权限,则返回true,否则返回false
*/
public boolean hasPermission(String userID,String permType);
/**
* 获取用户具有的权限列表
* @param userID
* @return 返回指定用户所具有的权限列表,包含所有角色(比如默认是6个)中的0个、1个或多个
*/
public List<String> getPermissionList(String userID);//获取用户权限列表
}
BPS Workspace和BPS Work Client的登录功能调用这些方法来实现。具体如下:
- BPS Work Client登录,先调用validate验证密码正确,再调用hasPermission(传入用户ID和客户端的权限常量bpsclient)判断当前用户是否具有访问客户端的权限。
- BPS Workspace登录,先调用validate验证密码正确,再调用hasPermission(传入用户ID和管理监控的权限常量bpsmanager)判断当前用户是否具有访问BPS管理监控的权限。
用户实现IWFPermissionService接口的方法:
- 用户可以自己实现该接口重新实现权限分配模型。权限实现类可以通过 BPS管理监控->配置管理->扩展配置 界面来配置。
- BPS 提供了默认的权限接口实现,可以通过配置文件来绑定用户和权限类型,用户如果只实现组织机构接口,不实现权限接口,也可以通过修改默认的权限配置文件来达到权限控制的目的。
默认的权限配置支持简单的"人------权限"绑定,配置文件内容如下:
bps-users.xml
<?xml version='1.0' encoding='UTF-8'?>
<bps-users>
<sysrole name="bpsclient"/>
<sysrole name="bpsadmin"/>
<sysrole name="bpsmanager"/>
<sysrole name="bpscustom"/>
<sysrole name="bpsconfig"/>
<sysrole name="bpsbizcat"/>
<user id="tiger" password="000000" sysroles="bpsclient|bpsmanager|bpscustom|bpsconfig|bpsbizcat"/>
<user id="goose" password="000000" sysroles="bpsclient|bpsmanager"/>
<user id="fish" password="000000" sysroles="bpsclient|bpscustom|bpsconfig"/>
<user id="snoppy" password="000000" sysroles="bpsclient|bpsconfig|bpsbizcat"/>
<user id="micky" password="000000" sysroles="bpsclient"/>
<user id="kitty" password="000000" sysroles="bpsclient"/>
</bps-users>