本实践方案是基于业务流程应用平台,流程流转及审批数据存储在关系型数据库中,申请单/审批单文档存储在MongoDB中。
有统计需求,统计表含关系型数据库和MongoDB两者内容,如下表所示。
上述表单内容含义:是对业务全景简明描述。
业务统计基于MongoDB数据源,对于缺少的流程数据,在流程结束时,更新流程相关信息到MongoDB数据库中。
如果涉及到流程实时数据的查询、统计,因为在途流程数据相对较少,可以采用基于MongoDB查询结果集合中在办的单子,按文档ID到Oracle 数据中查询流程和待办任务数据。
例如:第1章节中的表,有“流程状态”字段,此状态需要到Oracle中流程待办任务中获取,设计时序图如下。
此Webservice配置到流程结束环节入口。
如果不要查询文档流转状态,则可以不配置此服务,不必增加系统负担。
在文档中追加key为”STATUS”。
按批量方式处理,调用一次Webservice。
此方案是基于早期关系型数据库逻辑,把MongoDB做为文档,从MongoDB中提取关键统计信息项目到关系型数据库相关附表中,再进行统计。
下表为系统中业务流程实例主表。
create table BIZ_INFO_INSTANCE ( BIZ_INSTANCEID VARCHAR2(50) not null, BIZ_RVSN_NUMBER VARCHAR2(50) not null, INFO_ID VARCHAR2(50) not null, WKFL_ID VARCHAR2(50) not null, MONGO_BO_ID VARCHAR2(50) not null, BO_TITLE VARCHAR2(500) not null, MONGO_ATTACH_IDS VARCHAR2(500), WKFL_NAME VARCHAR2(500), REMINDER_COUNT INTEGER, BPM_PROCESS_INSTANCE VARCHAR2(50), CREATEBY VARCHAR2(50) not null, DEPT_ID VARCHAR2(50) not null, COMPANY_ID VARCHAR2(50) not null, STATUS INTEGER not null, START_DATE DATE, END_DATE DATE, EXPIREDTIME_HR INTEGER, EXPIRED_DELAY_HR INTEGER, TENANT_DN VARCHAR2(150), ...... )
新建附加表,用于存储从MongoDB中提取查询统计数据。
create table BIZ_INFO_INSTANCE_EXPENSES
(
BIZ_INSTANCEID VARCHAR2(50) not null, /* 流程实例ID */
BIZ_RVSN_NUMBER VARCHAR2(50) not null, /* 业务定义编号*/
INFO_ID VARCHAR2(50) not null, /* 业务定义ID */
MONGO_BO_ID VARCHAR2(50) not null,
BO_TITLE VARCHAR2(500) not null,
COMPANY_ID VARCHAR2(50) not null,
SCHEMENAME VARCHAR2(500), /* 方案名称 */
TARGETCUSTOMER VARCHAR2(500), /* 目标客户 */
STANDARD_TYPE VARCHAR2(500), /* 申请类型 */
BEGAINTIME VARCHAR2(20), /* 方案开始时间 */
OVSERTIME VARCHAR2(20), /* 方案结束时间 */
EXPENCES_TYPE VARCHAR2(500), /* 资费类型(ZF_TYPE) */
SALE_PRICE VARCHAR2(500), /* 给客户的价格(GKHDJG) */
DISCOUNT VARCHAR2(500), /* 折扣(ZK) */
NEWTIME VARCHAR2(20), /* 资费申请时间 */
BUSINESSTYPE_L1 VARCHAR2(500), /* 业务类别_一级(YIJI) */
BUSINESSTYPE_L2 VARCHAR2(500), /* 业务类别_二级(ERJI) */
APPLICANT VARCHAR2(500), /* 申请人(SDEPT) */
TENANT_DN VARCHAR2(150),
EXT1 VARCHAR2(500),
EXT2 VARCHAR2(500),
EXT3 VARCHAR2(500),
EXT4 VARCHAR2(500),
EXT5 VARCHAR2(500),
constraint PK_BIZ_INFO_INSTANCE_EXPENSES primary key (BIZ_INSTANCEID)
)
获取数据使用现有Webservice —— FindMongoById。
验证测试脚本
select * from biz_info_instance t where t.biz_instanceid = '875f0269-64ff-11e5-fcea-fde22e8156b4'
获取如下内容:
<SOAP:Envelope xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP:Body>
<FindMongoById xmlns="http://unicom.com/common/attachment" preserveSpace="no" qAccess="0" qValues="">
<oid>56e26e8c84ae8c6dfbdad008</oid>
<collection>ZFSP</collection>
</FindMongoById>
</SOAP:Body>
</SOAP:Envelope>
使用“Test Webservice Tools”工具。
<data>
<FindMongoByIdResponse xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://unicom.com/common/attachment" preserveSpace="no" qAccess="0" qValues="">
<tuple>
<old>
<findMongoById>
<findMongoById>{ "_id" : { "$oid" : "56e26e8c84ae8c6dfbdad008"} , "schemeName" : "ESS侧固话单产品资费" , "beginTime" : "2016-03-30" , "overTime" : "2050-12-30" , "dk" : "" , "BZZF" : "" , "GKHDJG" : "" , "zk" : "" , "autoNo" : "S**20160001" , "outTime" : "2050-12-30" , "sdept" : "***分公司市场营销部" , "newTime" : "2016-03-11" , "developmentGoals" : "6万户" , "Income" : "年增量180万元" , "stockIncome" : "0" , "ARPU" : "5" , "tariffExecutionNumber" : "" , "ZQKH" : false , "SWKH" : false , "JYKH" : false , "JIATKH" : true , "GRKH" : true , "zf_Type" : "固话" , "standard_Type" : "地市延期" , "imposed" : "全部地区" , "description" : "针对光改平移纯语音固话公众用户,......" , "promotionalReasons" : "针对光改平移固话纯语音公众用户,推广......" , "comparisonOfCompetition" : "无" , "exclusiveProducts" : "无" , "anticipatedTarget" : "6万户固话纯语音公众用户" , "priorCondition" : "无" , "overallSituation" : "年增量收入测算,......" , "countermeasures" : "预发展用户均为光改平移老用户,固话......" , "possibleRisk" : "无" , "datetimePicker" : "2016-03-11" , "yiji" : "\\\"0\\\"" , "erji" : "\\\"0\\\"" , "opinoin" : [ { "prop0" : "流程申请表" , "prop1" : "周**" , "prop2" : "同意" , "prop3" : "2016-03-11 15:21:01"}]}</findMongoById>
</findMongoById>
</old>
</tuple>
</FindMongoByIdResponse>
</data>
查询MongoDB数据Webservice源生代码如下:
// MongoDb通过ID查询的方法
public static String findMongoById(String oid, String collection) {
// 获取指定的collection
DBCollection coll = MongoDBUtil.getCollection(collection);
BasicDBObject queryCondition = new BasicDBObject();
queryCondition.put("_id", new ObjectId(oid));
DBObject returnValue = coll.findOne(queryCondition);
String value = "";
if (returnValue != null) {
if (returnValue.toMap().size() > 0) {
value = returnValue.toString();
} else {
value = "";
}
} else {
value = "";
}
return value;
}
通过上文简明分析,初步结论是采用“2.1”章节的方案。
实施情况,待续……