FoxBPM组织机构集成方案及示例代码
fixflow从6.0版本开始,从新命名FoxBPM,采用全新的包名org.foxbpm
foxbpm作为fixflow的新版本,不仅重新改善了底层架构,也改善了很多自开源以来用户反馈的问题,比如组织机构的集成就是其中的改善之一,本文章主要介绍下foxbpm最新的组织集成方案。
用过fixflow集成的用户大概都知道,原有的组织结构集成提供了可视化界面,通过配置sql语句和字段名就可以实现表结构的组织机构集成,但是对于复杂的组织机构或者像LDAP这种组织机构,虽然说了扩展组织机构的实现类,但是并没有提供很好的文档或说明,而新版本组织机构完全被抽象成接口,引擎提供默认的基于au_userinfo(用户)、au_group_relation(人和组映射)、au_orginfo(部门)、au_roleinfo(角色)这4张表的实现。
组织机构代码分析
关于组织机构的接口存放在org.foxbpm.engine.identity包下,如图:
- GroupDefinition:组定义,如“部门,角色”等,接口中提供查询组信息的各种接口
- Group:组的TO
- UserDefinition:用户的抽象,包含用户的所有抽象接口
- User:用户的抽象接口(TO接口)
接口上写有详细注释,以及接口被引擎使用到的地方,都有详细注释,写对应实现时,可以参考注释和默认实现来写自己的组织结构实现,部门接口代码如:
public interface GroupDefinition { /** * 获取用户所在的组集合 * <p>使用场景:获取用户共享任务时使用,如taskQuery.taskCandidateUser("admin")</p> * @param userId * @return */ List<Group> selectGroupByUserId(String userId); /** * 获取所有的组信息(如:所有角色信息) * <p>使用场景:设计器表达式编辑器上,选择组织机构时使用<p> * @return */ List<GroupEntity> selectAllGroup(); /** * 获取所有的组和人员的关系映射(如所有的角色对照) * <p>暂时没用到</p> * @return */ List<GroupRelationEntity> selectAllRelation(); /** * 获取组类型 * <p>匹配对应实现</p> * @return */ String getType(); /** * 获取组名称(如:“部门”,“角色”) * <p>使用场景:设计器获取“用户,部门,角色 等”类型场景,如选发起人时表达式类型选项</p> * @return */ String getName(); /** * 获取组下的所有人员ID * <p>使用场景:自动发送邮件 连接上使用,给相关处理人发送邮件</p> * @param groupId * @return */ List<String> selectUserIdsByGroupId(String groupId); /** * 获取指定组编号的所有子组(包含自身) * <p>使用场景:选择部门作为处理人时,可选择子部门</p> * @param groupId * @return */ List<Group> selectChildrenByGroupId(String groupId); /** * 根据组编号获取组对象 * <p>使用场景:获取部门信息时</p> * @param groupId * @return */ Group selectGroupByGroupId(String groupId); }
引擎提供的默认实现在org.foxbpm.engine.impl.identity包下,结构如下:
主要类介绍:
- UserDefinitionImpl:用户管理的实现
- GroupDeptImpl:部门的实现
- GroupRoleImpl:角色的实现
注:在foxbpm或fixflow中,是没有部门角色概念的,只有组的概念,"部门"一种组(groupType:dept)"角色"也是一种组(groupType:role)
集成方法介绍
介绍两种常用的集成方法
- 直接修改mybatis的xml文件,在foxbpm-engine/src/main/resource/mybatis/mapping/下的user.xml(用户)、role.xml(角色)、dept.xml(部门),修改文件中对应的sql语句即可。这种方法适合简单基于表的组织机构实现。
- 实现自己的UserDefinition和GroupDefinition接口,然后通过spring的方式注入或者通过引擎启动时修改配置类注入自己的组织机构实现。
spring注入配置示例:
<!-- 流程引擎配置 --> <bean id="processEngineConfigurationSpring" class="org.foxbpm.engine.spring.ProcessEngineConfigurationSpring"> <!-- 这里可能还有其他配置 --> <property name="userDefinition" ref="userDefinition" /> <property name="groupDefinitions"> <list> <bean class="org.foxbpm.engine.impl.identity.GroupDeptImpl"/> <bean class="org.foxbpm.engine.impl.identity.GroupRoleImpl"/> </list> </property> </bean> <bean id="userDefinition" class="org.***.UserDefinitionImpl"/>
非spring,引擎启动修改配置代码示例:
ProcessEngineConfigurationImpl processEngineConfigurationImpl = new ProcessEngineConfigurationImpl(); //设置用户实现 processEngineConfigurationImpl.setUserDefinition(userDefinition); //设置部门,角色实现 processEngineConfigurationImpl.getGroupDefinitions().add(deptImpl); processEngineConfigurationImpl.getGroupDefinitions().add(roleImpl); processEngineConfigurationImpl.buildProcessEngine();
这段代码多用在非spring环境下,系统启动时初始化引擎使用
总结
虽然没有了fixflow5.2版本的可视化配置界面,但是新版本给了集成人员更高的*,让集成人员更好理解,更容易调错误,简单结构直接改sql语句,复杂结构写接口实现。
我最近也在做foxbpm与开发平台的集成工作,开发平台有自己的组织机构,并且不是简单的基于二维表的组织机构,我直接把接口给了项目经理,让他安排人写对应实现,反正注释很清楚,结果很轻松的就做好了组织机构的集成!
最后附上新版本的git地址:https://github.com/FoxBPM/FoxBPM 目前尚在研发中,尚未发布稳定版本