ETL实战:从互客到金蝶云的销售订单数据转换及写入

  • 轻易云集成顾问-林峰
### 案例分享:互客销售订单集成到金蝶云星空 在现代企业的日常运营中,高效的数据集成方案显得尤为重要。本文将通过一个实际案例,详细介绍如何利用轻易云数据集成平台,将网易互客的销售订单数据高效、安全地集成到金蝶云星空中。 首先,我们需要解决的是从网易互客获取销售订单数据的问题。鉴于该系统提供了丰富的API接口,我们选择使用`openapi/trade/searchTrades`接口来抓取所需的数据。这一过程涉及处理分页和限流问题,需要确保在高并发情况下也能稳定运行。 接下来,在轻易云平台上配置相关任务,通过可视化的设计工具,定义从网易互客到金蝶云星空的数据流。在这一过程中,自定义数据转换逻辑至关重要,因为我们需要将两者之间不同格式的数据进行映射,并保证所有必要字段都准确传递。 为了实现对接,我们采用了以下关键技术点: 1. **定时可靠抓取**:定期调用`openapi/trade/searchTrades`接口,从网易互客系统拉取最新的销售订单信息,以防止任何漏单情况发生。 2. **批量写入能力**:通过金蝶云星空提供的`batchSave` API,实现大批量数据快速导入,大幅提升业务处理效率。 3. **实时监控与告警**:集中监控和告警系统可以实时跟踪每个步骤的数据状态与性能,当出现异常时,及时触发告警机制,以便迅速应对。 4. **错误处理与重试机制**:针对网络波动或API限制等可能引起的问题,我们配置了自动重试策略,确保即使在特殊情况下,也能尽可能完成任务。 5. **数据质量监控**:通过设置检测规则,对接收到的数据进行严格验证,一旦发现异常立即处理,确保最终进入金蝶云星空中的数据高度准确、无误。 通过以上方案,成功实现了从网易互客到金蝶云星空销售订单的一键式、高效、可靠同步,为企业的信息化管理打下坚实基础。在后续章节中,将深入探讨具体流程及各环节的重要细节和注意事项。 ![金蝶云星空API接口配置](https://pic.qeasy.cloud/D4.png~tplv-syqr462i7n-qeasy.image) ### 调用网易互客接口openapi/trade/searchTrades获取并加工数据 在轻易云数据集成平台的生命周期中,调用源系统接口是至关重要的一步。本文将深入探讨如何通过调用网易互客的`openapi/trade/searchTrades`接口获取销售订单数据,并对其进行初步加工处理。 #### 接口配置与请求参数 首先,我们需要配置元数据以便正确调用接口。以下是元数据配置的关键部分: ```json { "api": "openapi/trade/searchTrades", "method": "POST", "number": "tid", "id": "tid", "idCheck": true, "formatResponse": [ {"old": "dealTime", "new": "dealTime_new", "format": "dateTime"}, {"old": "createTime", "new": "createTime_new", "format": "dateTime"} ], "condition": [ [{"field": "showTradeStatus", "logic": "neq", "value": "4"}] ], ... } ``` 该配置定义了API的基本信息,包括请求方法为POST、主键字段为`tid`,以及需要格式化的响应字段。 #### 请求参数详解 在请求参数部分,我们需要特别注意以下几个字段: - `source`: 表示订单来源,值为2表示销售创建。 - `page` 和 `pageSize`: 分别表示查询的具体页码和每页展示的订单数量。 - `timeRanges`: 用于限制时间范围查询,包括时间类型、开始时间和结束时间。 具体配置如下: ```json { ... "request": [ {"field": "source", "label": "订单来源", "type": "string", ...}, {"field": "page", ...}, {"field": "pageSize", ...}, { "field": "timeRanges", ... "children":[ {"field":"timeType","label":"时间类型","type":"string","..."}, {"field":"startTime","label":"开始时间","type":"string","..."}, {"field":"endTime","label":"结束时间","type":"string","..."} ] } ] } ``` 其中,`startTime` 和 `endTime` 使用了函数 `_function REPLACE(unix_timestamp(current_timestamp(3))-72000,'.','')` 来动态生成当前时间戳,确保查询的是最近的数据。 #### 数据清洗与转换 获取到原始数据后,需要对其进行清洗和转换。根据元数据配置,我们需要格式化两个日期字段: - `dealTime` 转换为 `dealTime_new` - `createTime` 转换为 `createTime_new` 格式化操作可以通过平台内置的日期转换功能来实现,确保日期格式统一且易于后续处理。 此外,还需根据条件过滤掉不符合要求的数据。例如,过滤掉交易状态为4(已取消)的订单: ```json "condition":[[{"field":"showTradeStatus","logic":"neq","value":"4"}]] ``` #### 实践案例 假设我们需要获取最近两天内由销售创建的所有有效订单,并将其导入金蝶系统。具体步骤如下: 1. **配置请求参数**: - 设置 `source` 为2(销售创建)。 - 设置 `page` 为1,`pageSize` 为10。 - 设置 `timeRanges` 的 `timeType` 为1(下单时间),并动态生成最近两天的开始和结束时间。 2. **发送请求**: - 使用POST方法调用网易互客接口,并传递上述参数。 3. **处理响应数据**: - 对响应中的日期字段进行格式化。 - 根据条件过滤掉无效订单。 4. **写入目标系统**: - 将清洗后的数据写入金蝶系统,实现销售订单的无缝对接。 通过以上步骤,我们能够高效地从网易互客获取并加工销售订单数据,为后续的数据集成打下坚实基础。 ![打通用友BIP数据接口](https://pic.qeasy.cloud/S23.png~tplv-syqr462i7n-qeasy.image) ### 使用轻易云数据集成平台将互客销售订单转换并写入金蝶云星空API接口 在数据集成的生命周期中,ETL(抽取、转换、加载)过程是将源平台的数据转换为目标平台可接受格式的关键步骤。本文将详细介绍如何使用轻易云数据集成平台,将互客销售订单的数据通过ETL过程转换为金蝶云星空API接口所能接收的格式,并最终写入目标平台。 #### 配置元数据 在开始具体的ETL操作之前,需要配置好元数据。以下是用于将互客销售订单数据转换为金蝶销售订单格式的元数据配置: ```json { "api": "batchSave", "method": "POST", "idCheck": true, "operation": { "method": "batchArraySave", "rows": 1, "rowsKey": "array" }, "request": [ {"field":"FBillNo","label":"单据编号","type":"string","value":"{tid}"}, {"field":"FSaleOrgId","label":"销售组织","type":"string","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"100"}, {"field":"FDate","label":"日期","type":"string","value":"{createTime_new}"}, {"field":"FCustId","label":"客户","type":"string","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"{buyerCid}"}, {"field":"FBillTypeID","label":"单据类型","type":"string","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"_function case '{{单据类型(必选)}}' when '定金单' then 'XSDD12_SYS' when '全款单' then 'XSDD13_SYS' when '礼品单' then 'XSDD14_SYS' when '未收款单' then 'XSDD15_SYS' end"}, {"field":"FNote","label":"备注","type":"string","value":"{remark}"}, {"field":"FLinkMan","label":"收货人姓名","type":"string","value":"_function case '{{物流订单客户姓名}}' when '' then '{buyerNick}' else '{{物流订单客户姓名}}' end"}, {"field":"FLinkPhone","label":"联系电话","type":"string","value":"_function case '{{物流订单客户电话}}' when '' then '{buyerMobile}' else '{{物流订单客户电话}}' end"}, {"field":"FReceiveAddress","label":"联系地址","type":"string","value":"_function case '{{物流订单客户地址}}' when '' then '{buyerAddress}' else '{{物流订单客户地址}}' end"}, { "field": "FSaleOrderEntry", "label": "订单明细", "type": "array", "children": [ {"field": "FMaterialId", "label": "物料编码", "type": "string", "parser":{"name": "ConvertObjectParser", "params": "FNumber"}, "value": "{{orders.outerId}}", "parent": "FSaleOrderEntry"}, {"field": "FQty", "label": "销售数量", "type": "string", "value": "{{orders.quantity}}", "parent": "FSaleOrderEntry"}, {"field": "FPrice", "label": "单价", "type": "string", "value": "_function case '{{orders.payPrice}}' when '0' then '{{orders.price}}'/100 else '{{orders.payPrice}}'/100 end", "parent": "FSaleOrderEntry" }, {"field": "FTaxPrice", "label": "含税单价", "type": "string", "value": "_function case '{{orders.payPrice}}' when '0' then '{{orders.price}}'/100 else '{{orders.payPrice}}'/100 end", "parent": "FSaleOrderEntry" }, {"field": "FSettleOrgIds", "label": "结算组织", "type": "string", "parser":{ "name": "ConvertObjectParser", "params": "FNumber" }, "value": ``` ![打通用友BIP数据接口](https://pic.qeasy.cloud/T23.png~tplv-syqr462i7n-qeasy.image)