ETL技术:如何高效集成管易云数据至金蝶云星空

  • 轻易云集成顾问-何语琴
### 管易云·奇门到金蝶云星空的数据集成技术案例分享 在数字化业务系统中,数据的高效对接和实时同步是保持企业运营流畅不可或缺的一环。本案例将详细探讨通过轻易云数据集成平台,实现管易云·奇门发货单(API: gy.erp.trade.deliverys.get)与金蝶云星空销售出库单(API: batchSave)的无缝衔接。 为确保数据不漏单,我们设计了一套定时可靠的数据抓取机制。首先,通过调用管易云·奇门接口 `gy.erp.trade.deliverys.get` 定期获取待处理的发货单数据。同时,为了应对分页和限流问题,我们实现了基于游标分页的请求策略,以确保一次能够完整获取所有相关数据。这一过程中,平台支持的数据质量监控和异常检测功能发挥了重要作用,它能及时发现并处理可能存在的数据问题,从而保证我们所采集到的数据准确性和完整性。 下一步是将获取到的发货单数据批量写入金蝶云星空系统,其中涉及到了复杂的数据转换逻辑。由于两套系统之间的数据格式差异较大,我们利用自定义数据映射规则,将管易云·奇门端所特有的信息字段转化为适配金蝶端结构的内容。例如,将订单状态、商品明细等信息精准地对应起来,使得原始业务逻辑得到完全保留。此外,针对这些转换操作,我们设置了多级日志记录和实时监控机制,一方面便于追踪每个步骤是否正常运行;另一方面,在出现错误时,可以迅速定位并重试失败任务,从而提升整体稳定性。 为了进一步增强系统性能,并满足高吞吐量环境下的大量数据快速写入需求,本方案采用了批量提交模式。当本次采集中累积达到一定数量后会统一调用 `batchSave` API 向金蝶进行推送,不仅提高了API调用效率,还减少了网络传输开销。此外,上述整流程中的每一个步骤都被纳入轻松配置的平台可视化工具进行管理,这使整个过程变得透明且便捷,为维护人员提供更好的体验。 综上所述,本案例展示了一系列技术手段,包括定时抓取、分页控制、自定义映射、实时监控及批量提交等,通过精心设计使得管易云·奇门与金蝶云星空两大不同体系间实现完美融合。该实践不仅提升了供应链管理效率,也为其他类似业务场景提供了一份可靠参考解决方案。 ![用友与CRM系统接口开发配置](https://pic.qeasy.cloud/D2.png~tplv-syqr462i7n-qeasy.image) ### 调用管易云·奇门接口gy.erp.trade.deliverys.get获取并加工数据 在数据集成生命周期的第一步,我们需要从源系统获取数据并进行初步加工。本文将详细介绍如何通过调用管易云·奇门接口`gy.erp.trade.deliverys.get`来实现这一目标,并对数据进行必要的清洗和转换。 #### 接口调用配置 首先,我们需要配置接口调用的元数据。根据提供的元数据配置,接口`gy.erp.trade.deliverys.get`采用POST方法进行请求,主要用于查询发货单信息。以下是请求参数的详细配置: ```json { "api": "gy.erp.trade.deliverys.get", "effect": "QUERY", "method": "POST", "number": "code", "id": "code", "name": "code", "formatResponse": [ { "old": "delivery_statusInfo.delivery_date", "new": "delivery_date_new", "format": "date" } ], "idCheck": true, "request": [ {"field":"start_create","label":"创建时间开始段","type":"string","describe":"创建时间开始段"}, {"field":"end_create","label":"创建时间结束段","type":"string","describe":"创建时间结束段"}, {"field":"start_delivery_date","label":"发货时间开始段","type":"string","describe":"发货时间开始段","value":"_function SUBTIME( '{{LAST_SYNC_TIME|datetime}}' ,'00:30:00')"}, {"field":"end_delivery_date","label":"发货时间结束段","type":"string","describe":"发货时间结束段","value":"{{CURRENT_TIME|datetime}}"}, {"field":"start_modify_date","label":"修改时间开始段","type":"string","describe":"修改时间开始段"}, {"field":"end_modify_date","label":"修改时间结束段","type":"string","describe":"修改时间结束段"}, {"field":"delivery","label":"发货状态","type":"string","describe":"发货状态","value":"1"}, {"field":"del","label":"返回是否作废的单据","type":"string","describe":"返回是否作废的单据"} ], "otherRequest": [ {"field": "page_no", "label": "页号", "type": "string", "describe": "默认1", "value": "{PAGINATION_START_PAGE}"}, {"field": "page_size", "label": "分页大小", "type": "string", "describe": "{PAGINATION_PAGE_SIZE}", "value": "{PAGINATION_PAGE_SIZE}"} ], ... } ``` #### 请求参数详解 1. **基本请求参数**: - `start_create` 和 `end_create`:用于指定查询的创建时间范围。 - `start_delivery_date` 和 `end_delivery_date`:用于指定查询的发货时间范围。其中,`start_delivery_date`通过函数计算得到,表示从上次同步时间减去30分钟。 - `start_modify_date` 和 `end_modify_date`:用于指定查询的修改时间范围。 - `delivery`:固定值为1,表示只查询已发货状态的数据。 - `del`:用于指定是否返回作废单据。 2. **分页参数**: - `page_no`:页号,默认值为1。 - `page_size`:分页大小,根据实际需求设置。 #### 数据清洗与转换 在获取到原始数据后,需要对部分字段进行格式转换和重命名。例如,将原始字段`delivery_statusInfo.delivery_date`转换为新的字段名`delivery_date_new`,并将其格式化为日期类型。这一步可以通过配置中的`formatResponse`字段来实现: ```json "formatResponse":[ { "old": "delivery_statusInfo.delivery_date", "new": "delivery_date_new", "format": "date" } ] ``` #### 条件过滤与补偿机制 为了确保数据的一致性和完整性,我们还需要设置条件过滤和补偿机制: 1. **条件过滤**: 配置中定义了两个条件过滤规则,用于排除特定店铺和仓库的数据: ```json { ... “condition_bk”: [[{"field”:”shop_code”,"logic”:”neqv2”,"value”:”H112"}],[{"field”:”warehouse_code”,"logic”:”neqv2”,"value”:”0104"}]], ... } ``` 2. **补偿机制**: 为了处理可能出现的数据遗漏情况,可以设置定时任务(crontab)来定期检查并补偿遗漏的数据: ```json { ... “omissionRemedy”: { “crontab”: “1 */8 * * *”, “takeOverRequest”: [ {"field”:”start_delivery_date”,"value”:”{{HOURE_AGO_s12|datetime}}”,"type”:”string”,"label”:”接管字段”,...}, {"field”:”end_delivery_date”,"value”:”{{CURRENT_TIME|datetime}}”,...} ] } ... } ``` 通过以上步骤,我们可以高效地从管易云·奇门接口获取所需的发货单数据,并对其进行必要的清洗和转换,为后续的数据处理和写入奠定基础。 ![用友与外部系统接口集成开发](https://pic.qeasy.cloud/S10.png~tplv-syqr462i7n-qeasy.image) ### 数据集成与转换:将源平台数据ETL至金蝶云星空API接口 在数据集成的生命周期中,ETL(提取、转换、加载)是关键步骤之一。本文将详细探讨如何使用轻易云数据集成平台,将已经集成的源平台数据转换为金蝶云星空API接口所能接收的格式,并最终写入目标平台。 #### 元数据配置解析 我们将通过一个具体的元数据配置示例,逐步讲解如何进行数据转换和写入操作。以下是一个典型的元数据配置: ```json { "api": "batchSave", "effect": "EXECUTE", "method": "POST", "idCheck": true, "request": [ { "field": "FBillTypeID", "label": "单据类型", "type": "string", "describe": "单据类型", "parser": { "name": "ConvertObjectParser", "params": "FNumber" }, "value": "XSCKD01_SYS" }, ... ], ... } ``` #### 核心字段解析与转换 1. **单据类型(FBillTypeID)**: - 类型:字符串 - 描述:单据类型 - 转换器:`ConvertObjectParser` - 参数:`FNumber` - 固定值:`XSCKD01_SYS` 2. **发货组织(FStockOrgId)**: - 类型:字符串 - 描述:组织 - 转换器:`ConvertObjectParser` - 参数:`FNumber` - 映射关系:从源平台字段 `warehouse_code` 映射到目标字段 `659bd820efcc0234516e8f42` 3. **销售组织(FSaleOrgId)**: - 类型:字符串 - 描述:组织 - 转换器:`ConvertObjectParser` - 参数:`FNumber` - 动态值计算: ```sql _function case when '{shop_code}' = 'x01' and '{warehouse_code}' in ('095','0361','001','034','055','017','008') then '107' when '{shop_code}' ='x01' and '{warehouse_code}' in ('063','062','054') then '105' when '{shop_code}' ='099' and '{warehouse_code}' in ('034','0361','0103') then '115' else '{shop_code}' END ``` 4. **货主类型(FOwnerTypeIdHead)**: - 类型:字符串 - 描述:多类别基础资料列表 - 固定值:`BD_OwnerOrg` 5. **货主(FOwnerIdHead)**: - 类型:字符串 - 描述:多类别基础资料 - 转换器:`ConvertObjectParser` - 参数:`FNumber` - 动态值计算: ```sql _function CASE WHEN '{warehouse_code}' IN ('0106', '0105', ...) AND '{owner_org}' IN ('102', '103') THEN '{owner_org}' ELSE '{warehouse_code}' END ``` #### 明细信息处理 明细信息是ETL过程中的重要部分,涉及多个字段和复杂的逻辑处理。 1. **物料编码(FMaterialID)**: - 类型:字符串 - 描述:基础资料 - 转换器:`ConvertObjectParser` - 参数:`FNumber` - 查询方式: ```sql _mongoQuery 38049d14-52b6-3935-9504-bf60a0c3a5ff findField=content.FNumber where={"content.FSpecification":{"$eq":"{details_sku_code}"}} ``` 2. **实发数量(FRealQty)**: ```sql _function case when '{details_sku_code}' in ('配件', 'M001CJ01', ...) then '0' else '{details_qty}' end ``` 3. **含税单价(FTaxPrice)**: ```sql _function ({details_amount_after}+{details_post_fee})/{details_qty} ``` 4. **是否赠品(FIsFree)**: ```sql _function case '{details_amount_after}' when '' then 'true' when '0' then 'true' else 'false' end ``` 5. **税率%(FEntryTaxRate)**: ```sql _function case when '{shop_code}' = 'x01' and '{warehouse_code}' in ('095', ...) then '0.13' else '{shop_code}' END ``` 6. **仓库(FStockId)**: ```json { "type": "string", "describe": "基础资料", "parser": { "name": "ConvertObjectParser", "params": "FNumber" }, "value": "{warehouse_code}" } ``` #### 请求体构建与发送 在完成所有字段的映射和转换后,构建最终请求体并发送到金蝶云星空API接口: ```json { ... // 构建请求体内容,包括header和body部分。 ... } ``` 通过以上步骤,我们能够高效地将源平台的数据经过ETL处理后,成功写入金蝶云星空API接口,实现不同系统间的数据无缝对接。 ![泛微OA与ERP系统接口开发配置](https://pic.qeasy.cloud/T8.png~tplv-syqr462i7n-qeasy.image)