多系统主数据治理(MDM, Master Data Management)场景,尤其在企业办公协同平台(如泛微 e-cology、蓝凌 MK、致远 A8/A6 等)集成中超级关键。
实现目标
将 泛微(Weaver) 和 蓝凌(Landray) 系统中的枚举类型主数据(如部门状态、岗位级别、业务分类等)自动/定期同步至 致远(Seeyon) 系统,确保多平台数据一致性。
常见实现方式
- 接口对接
- 泛微/蓝凌提供 RESTful API 或 WebService 接口导出枚举数据。
- 致远提供接收接口(或通过数据库直写、中间表等方式写入)。
- 中间通过调度服务(如定时任务、ETL 工具、自研同步服务)完成数据拉取与推送。
- 中间库/消息队列
- 三方系统通过共享数据库表或 Kafka/RabbitMQ 等消息中间件解耦。
- 枚举变更时发布事件,致远消费并更新本地缓存或数据库。
- 统一主数据平台(推荐)
- 引入 MDM 平台作为“唯一可信源”,各系统从 MDM 订阅枚举数据。
- 避免点对点集成,提升可维护性。
关键注意事项
- 枚举编码一致性:确保三端使用一样的 code(而非仅名称),避免映射错乱。
- 增量同步 vs 全量同步:提议支持增量(带时间戳或版本号),减少性能开销。
- 冲突处理机制:如同一 code 在不同系统含义不同,需建立映射表或标准化规范。
- 日志与监控:记录每次同步结果,失败时告警,支持人工干预。
- 权限与安全:API 调用需鉴权(如 Token、IP 白名单),敏感数据脱敏。
- 接口对接代码实现
致远的表分枚举项和枚举值
CtpEnumItem item=new CtpEnumItem();
item.setId(id);
item.setEnumItemCode(code);
item.setDescription(name);
item.setShowvalue(name);
if(res.get(“sortnumber”)!=null)
{long Sortnumber=Long.parseLong(res.get(“sortnumber”).toString());
item.setSortnumber(Sortnumber);}
if(res.get(“enumvalue”)!=null)
{String Enumvalue=Long.toString(Long.valueOf(res.get(“enumvalue”).toString()));
item.setEnumvalue(Enumvalue);
}
if(!fParentId.equals(“”))
sql=” select * from ctp_enum_item where code ='”+fParentId.toString()+”' “;
else {
if(baseCode.equals(“1003”) && fParentId.equals(“”))
}
Map res1=获取现有枚举;
// System.out.println(“sql res1:”+JSONUtil.toJSONString(res1));
LOG.info(“sql res1:”+JSONUtil.toJSONString(res1));
if(res1 !=null && !res1.isEmpty())
{
long pid=Long.parseLong(res1.get(“ref_enumid”).toString());
int level_num=Integer.parseInt(res1.get(“level_num”).toString());
level_num++;
ParentId=Long.parseLong(res1.get(“id”).toString());
if(fParentId.equals(“”))
ParentId=0;
item.setParentId(ParentId);
item.setRefEnumid(pid);
item.setLevelNum(level_num);
Map res2=现有枚举值;
if(res2 !=null && !res2.isEmpty())
{
long num=Long.parseLong(res2.get(“num”).toString());
if(num>1)
{
errmsg.put(“errorMsgs”, name+”同级有一样的名称,是不能增加档案和枚举!”);
LOG.info(JSONUtil.toJSONString(errmsg));
return (JSONUtil.toJSONString(errmsg));
}
}
}
if(boDataStatus.equals(“ENABLE”)){
item.setState(1);
item.setOutputSwitch(1);
LOG.info(“setState(1)setOutputSwitch(1)”+boDataStatus );
}else {
item.setState(0);
item.setOutputSwitch(1);
LOG.info(“setState(0)setOutputSwitch(1)”+boDataStatus );
}
List<CtpEnumItem> listItems=new ArrayList<CtpEnumItem>();
listItems.add(item);
enumManagerNew.updateEnumItemCache(listItems);

