本实践的系统平台是以业务流程为核心的办公流程能力平台,服务于全省,为全省业务流程重组提供信息化解决方案和管理支撑服务。
系统用户范围为全省,以省公司本部及13地市分公司为公司组织单元。多数流程业务在公司内部运行,部分流程业务是在全省垂直管理范围内运行。
本实践是基于OpenText Cordys BOP 4.3产品实现的。
在此PaaS平台上,提供统一的组织结构服务,注册用户及其租户划分,是通过平台LDap来管理,也就是说,租户划分在平台层面解决。
组织机构服务,主要是自行开发来实现,并与租户对应。功能比较简单,而麻烦体现在业务实施上,例如:哈尔滨市分公司有两个,一个是以省公司本部部门方式参与垂直管理;另一个是哈尔滨市分公司租户,是以公司方式存在的。
在组织机构信息中:
上图举例中,此系统用户(李**)身跨两个租户,分别在默认租户“哈尔滨市分公司”,以及参与垂直管理的省公司租户中。
参考Gartner所提出的7种多租户模型,现系统已经支持第六种模型称为“Shared Everything”,即全共享,以及第七种模型称为“Custom Multitenancy”,即定制化的多租户。
按分公司的维度,部署多租户模型。
在系统平台上,多租户是以“Organization”来体现。除了系统的system租户外,又建了16个租户,包括省公司本部、13个地市、维护中心和集成公司。
Service Groups,Service Containers部署在System租户下,方便其他租户共享使用。
http://IP地址/home/HLJ/******/home/index.html
其中,“/home”是系统默认主目录,“/HLJ”是黑龙江租户,“/******
”是自定义公司名称简写,“/home/index.html”是系统主页地址。
按独立提供流程服务模式设计,所有流程服务都部署到system租户下,将来,将适当考虑部分流程部署到其自身应用租户下。
流程服务可以单独提供工作流服务,其所对应的数据库是独立的MySQL数据库,与业务数据库无关。
参考Gartner所提出的7种多租户模型,现系统已经支持第六种模型称为“Shared Everything”,即全共享,以及第七种模型称为“Custom Multitenancy”,即定制化的多租户。
在数据库设计中,租户隔离是通过系统平台实现逻辑隔离,具体技术体现为在数据库表的字段中,有租户DN标识字段:
系统平台,包括流程服务,使用MySQL数据库;
业务系统使用Oracle及MongoDB数据库。
跨租户人员登录处理
登录时,首先使用默认租户,这里一般是指其所属地市公司。
/**
* 返回当前的组织对象
* @returns {{}}
*/
getCurrentOrganization: function () {
var currentOrganization = {};
$.each($.cordys.utils.formatCustomObject(userDetail['organizaitons']['company']), function (orgIndex, org) {
if (org['company_dn'] == currentOrganizationDn)
currentOrganization = org;
});
return currentOrganization;
},
跨租户流程衔接是通过跨租户接口人,也就是参与垂直管理地市接口人接到待办任务后,按业务规则转到本人默认租户下,再启动流程。这里涉及到两个技术点:
上图是地市接口人打开待转地市的传阅任务单,而下面的代码片段是要处理并识别出须要转地市的待阅任务。其中:
function DO_TransformToProcess2() {
//通过业务编码区分,省公司还是地市的流程
var biz_rsvn_numer = window.bizInfoInstance['BIZ_RVSN_NUMBER'];
// 获取用户角色信息
if (biz_rsvn_numer === 'LCSP') {
//获取用户的角色 判断网省公司发布 还是 地市分公司 发布
if(vv_V_TEST){
$.cordys.utils.sendCordysAjax({
method: "GetFormByNameAndOrgDn",
namespace: "http://unicom.com/workflow",
parameters: {
formName: '省公司流程审批发布流程_省公司传阅',
orgDn: window.localStorage.currentUserTenantdn
}
}).done(function (response) {
response = $.cordys.utils.formatCordysAjaxQueryEntity(response);
var roleCode;
if (response.length) {
roleCode = 'ZHDB';
window.open('workflow_wrapper.htm?formID=' + response[0]['FORMUID'] + '&roleCode=' + roleCode + '&bizRvsnNumber=' + window.bizInfoInstance['BIZ_RVSN_NUMBER'] + '&mongoBoId=' + window.bizInfoInstance['MONGO_BO_ID']);
} else {
alert('没有查询到指定的流程!')
}
});
}else{
$.cordys.utils.sendCordysAjax({
method: "GetFormByNameAndOrgDn",
namespace: "http://unicom.com/workflow",
parameters: {
formName: '省公司流程审批发布流程_地市传阅',
orgDn: window.localStorage.currentUserTenantdn
}
}).done(function (response) {
response = $.cordys.utils.formatCordysAjaxQueryEntity(response);
var roleCode;
if (response.length) {
if (/rjdb/i.test(window.localStorage.currentUserTenantdn.split(',')[0].split('o=')[1])) {
roleCode = 'ZHDB';
} else {
roleCode = window.localStorage.currentUserTenantdn.split(',')[0].split('o=')[1].toLocaleUpperCase() + '_DSZHDB';
}
window.open('workflow_wrapper.htm?formID=' + response[0]['FORMUID'] + '&roleCode=' + roleCode + '&bizRvsnNumber=' + window.bizInfoInstance['BIZ_RVSN_NUMBER'] + '&mongoBoId=' + window.bizInfoInstance['MONGO_BO_ID']);
} else {
alert('没有查询到指定的流程!')
}
});
}
获取待办任务与租户DN无关,按用户帐号获取。
在此平台生态环境上,为每个租户建立开发租户、测试租户。其中,流程建模、表单快速开发都是按租户进行管理。
租户管理员部署自己租户流程。