物料主数据从ERP到CRM:一条增量同步策略的实战拆解
这个策略解决什么问题
物料主数据从ERP推到CRM,看起来是基础资料同步里最朴素的一类。但我们一次实际项目中遇到过:上线3个月后两边物料数对不上,CRM里冒出几十条ERP里已经停用的"僵尸料",销售拿着错误型号给客户报价。
这条策略的核心价值就一句话:用时间窗增量把ERP里的物料变更按节奏推到CRM,保证两边主数据在'编码、名称、型号'等关键字段上长期一致,并且停用/修改能及时回流。
数据流向与字段映射
整体流向是单向的:源系统(KIS私有云物料)→ 轻易云数据集成平台 → 目标系统(小满OKKICRM产品)。
源端通过RESTful查询接口按时间窗拉取变更,平台做映射、清洗、去重后,调目标端的执行接口写入。下面是这次项目里我们重点对照的核心字段:
| 业务含义 | 源端字段(KIS) | 目标字段(小满) | 备注 |
|---|---|---|---|
| 物料编码 | FNumber | product_no | 双方唯一标识,建映射时以源为准 |
| 物料名称 | FName | name | 名称变更要可追溯 |
| 规格型号 | FModel | model | CRM里销售最关心 |
| 毛重 | FGrossWeight | package_gross_weight | 单位需在映射里统一 |
| 净重 | FNetWeight | package_net_weight | 同上 |
这里要特别说一句:编码映射集中管理是轻易云客户最常用的应对模式之一。所有KIS编码和小满产品ID的对应关系落在平台映射表里,后续无论谁改、哪边改,都不会乱。
在轻易云上如何配置
我们用轻易云(Qeasy)做这件事的时候,配置分三块:
源端配置。注册KIS私有云的API,调用物料列表查询接口。请求体里带四个关键参数:账套标识(AccountDB)、分页大小(ItemsOfPage,默认10)、当前页(CurrentPage)、以及时间窗(StartDate / EndDate)。这里SourceTimeStart和SourceTimeEnd用平台内置变量 ${LAST_SYNC_TIME} 和 ${CURRENT_TIME} 自动取窗,不要手写时间戳。
映射配置。把源字段按上面的对照表挂到目标字段上。轻易云里直接用 {{FNumber}}、{{FName}} 这种占位符引用源字段。idCheck 开 true,平台会根据编码判断是新建还是更新,避免重复插入。
目标端配置。注册小满OKKICRM的产品写入接口,method是POST,effect是EXECUTE。注意小满接口里 product_id 是平台自动维护的映射主键,不需要手工填。
另外两个开关值得点出来:buildModel = false 表示不自动建模型,靠我们手写的映射;autoFillResponse = false 表示响应不自动回填,保持映射表由平台统一管理。
实施步骤
我们通常把物料同步拆成三段式推进:
第一步:全量起点。首次上线前,用一个不带时间窗的查询把ERP里所有物料一次性推到CRM,建立初始映射表。这一步只在初始化时跑一次,后续不再触发。
第二步:增量切换。起点建好后,把 SourceTimeStart 切到 ${LAST_SYNC_TIME},调度跑起来。这次项目里我们配的是 0-59/45 7-20 * * *,也就是工作日7点到20点之间每45分钟一轮。上班时间密集同步,下班和周末停,典型的'增量与全量双轨'——全量负责初始化,增量负责日常变更。
第三步:调度收敛。稳定运行一两周后,观察实际变更量。如果变更稀疏,可以把频率降到每2小时或更低;如果变更密集且要求实时,再考虑事件触发。不要一上来就配高频,这是另一个常见翻车点。
踩坑复盘
几次项目下来,这条策略上典型的坑有这几个:
-
时间窗字段格式不对。KIS接口要求
T分隔的ISO时间,平台变量默认是空格分隔。务必用_function REPLACE('{{LAST_SYNC_TIME|datetime}}',' ','T')显式转一次,否则源端会直接拒收。 -
分页太小漏数据。ItemsOfPage 默认 10 在物料量大的企业根本不够。一次客户现场我们改成 100 才稳定。改完之后必须重新核对总条数和分页次数。
-
单位不统一。KIS里重量单位是克,小满期望公斤或磅。这种字段映射不是字符串对字符串那么简单,一定要在映射脚本里做单位换算,或者提前在两边规范好单位字典。
-
停用物料没回流。增量只看变更时间,如果源端把物料停用但没改时间戳,CRM这边就一直以为是有效料。稳妥的做法是单独跑一个停用状态校准任务,每周一次全量对一遍状态字段。
-
依赖关系没声明。物料同步如果和销售订单同步存在上下游(比如订单要带产品ID),一定要在轻易云的依赖配置里把 depends_on 标好,否则顺序乱了目标端会拒单。这次素材里这条策略 depends_on 是空数组,是独立的基础资料同步,但下游策略要明确依赖它。
适用场景与不适用场景
适用:ERP与CRM之间物料主数据需要长期保持一致、变更频率不算极端(分钟级)的企业;私有化部署、对数据出域敏感的场景。
不适用:需要实时秒级同步的高频变更场景——这种应该走事件驱动;纯展示用的物料信息(无编码映射需求)——直接API拉取更轻;以及源端本身没有可靠时间戳字段的系统。