ETL转换与数据同步:旺店通到金蝶云案例分析

  • 轻易云集成顾问-曹润
### 旺店通·企业奇门数据集成到金蝶云星空案例分享 在实际业务场景中,销售退货同步是一个关键环节。本文将聚焦于如何通过轻易云数据集成平台,实现旺店通·企业奇门的数据高效、可靠地集成到金蝶云星空,其中方案名称为:销售退货同步_后补批号RK。在这个案例中,我们使用了wdt.stockin.order.query.refund获取旺店通的退货订单数据,并通过batchSave API接口实现快速写入到金蝶云星空。 首先,通过定时任务抓取旺店通·企业奇门API wdt.stockin.order.query.refund的数据,以确保不会有任何订单遗漏。这需要特别注意分页和限流问题,通过对API请求进行合理划分,保证每次请求都能成功并获得预期返回结果。同时,为应对大量数据处理需求,我们设计了批量写入机制,将获取到的退货订单一次性导入至金蝶云星空,提高整体效率。 其次,对于两者之间的数据结构差异,在映射过程中我们进行了精细化的定制。确保每个字段准确无误地对接,这一步骤尤为关键,因为稍有不慎就可能导致系统间的信息不同步。此外,在整个过程中还设置了全面的异常处理与错误重试机制,一旦出现意外情况,即可自动重发直至成功,有效保障了数据传输过程中的稳定性和可靠性。 最后,对各个环节实施实时监控与日志记录,使操作透明化,每一笔交易都有迹可循,从而进一步提升业务透明度和控制能力。 以上就是本项目技术方案开头部分,接下来将详细介绍具体实施步骤及代码示例(待续)。 ![金蝶与CRM系统接口开发配置](https://pic.qeasy.cloud/D16.png~tplv-syqr462i7n-qeasy.image) ### 调用旺店通·企业奇门接口wdt.stockin.order.query.refund获取并加工数据 在数据集成的生命周期中,调用源系统接口是至关重要的一步。本文将深入探讨如何通过轻易云数据集成平台调用旺店通·企业奇门接口`wdt.stockin.order.query.refund`,并对获取的数据进行初步加工。 #### 接口调用配置 首先,我们需要配置元数据以便正确调用接口。以下是元数据配置的详细内容: ```json { "api": "wdt.stockin.order.query.refund", "method": "POST", "number": "order_no", "id": "order_no", "pagination": { "pageSize": 50 }, "request": [ {"field":"start_time","label":"开始时间","type":"datetime","value":"{{LAST_SYNC_TIME|datetime}}"}, {"field":"end_time","label":"结束时间","type":"datetime","value":"{{CURRENT_TIME|datetime}}"}, {"field":"status","label":"状态","type":"string","describe":"入库单状态 10已取消20编辑中30待审核60待结算80已完成(默认查询80已完成单据)"}, {"field":"shop_no","label":"店铺编号","type":"string"}, {"field":"src_order_no","label":"退换单号","type":"string"}, {"field":"stockin_no","label":"入库单号","type":"string"}, {"field":"time_type","label":"时间类型","type":"int","describe":"0:最后修改时间,1:创建时间 2:预入库单关联时间 默认为0"}, {"field":"shop_no","label":"店铺编号","type":"string","describe":"代表店铺所有属性的唯一编码,用于店铺区分,ERP内支持自定义(ERP店铺界面设置),用于获取指定店铺单据数据信息"}, {"field":"shop_nos","label":"店铺编号(批量)","type":"string","describe":"批量指定店铺获取(多个店铺编号之间用英文逗号隔开,最多指定20个店铺)"} ], "otherRequest": [ {"field": "page_size", "label": "分页大小", "type": "string", "value": "{PAGINATION_PAGE_SIZE}"}, {"field": "page_no", "label": "页号", "type": "string", "value": "{PAGINATION_START_PAGE}"} ] } ``` #### 请求参数解析 在请求参数中,我们需要特别注意以下几个字段: - `start_time` 和 `end_time`:这两个字段用于指定查询的时间范围,分别取值为上次同步时间和当前时间。 - `status`:用于过滤入库单的状态,默认查询已完成的单据。 - `shop_no` 和 `shop_nos`:用于指定需要查询的店铺编号,可以是单个或多个。 - `time_type`:用于指定时间类型,例如最后修改时间、创建时间等。 #### 数据请求与清洗 在发起请求后,我们会收到一组原始数据。这些数据可能包含冗余信息或格式不一致的问题,因此需要进行清洗和初步加工。以下是一个简单的数据清洗示例: ```python import requests import json from datetime import datetime # 配置请求参数 url = 'https://api.wangdian.cn/openapi2/wdt.stockin.order.query.refund' headers = {'Content-Type': 'application/json'} payload = { 'start_time': '2023-01-01T00:00:00', 'end_time': datetime.now().strftime('%Y-%m-%dT%H:%M:%S'), 'status': '80', 'shop_no': 'SHOP123', 'time_type': 0, 'page_size': 50, 'page_no': 1 } # 发起请求 response = requests.post(url, headers=headers, data=json.dumps(payload)) data = response.json() # 数据清洗示例 cleaned_data = [] for item in data['orders']: cleaned_item = { 'order_no': item['order_no'], 'shop_no': item['shop_no'], 'status': item['status'], # 添加其他需要的字段 } cleaned_data.append(cleaned_item) print(cleaned_data) ``` #### 分页处理 由于接口返回的数据可能非常庞大,我们需要进行分页处理。通过设置`page_size`和`page_no`参数,可以逐页获取数据并进行处理。 ```python def fetch_all_data(): page_no = 1 all_data = [] while True: payload['page_no'] = page_no response = requests.post(url, headers=headers, data=json.dumps(payload)) data = response.json() if not data['orders']: break all_data.extend(data['orders']) page_no += 1 return all_data all_orders = fetch_all_data() print(f"Total orders fetched: {len(all_orders)}") ``` 以上代码展示了如何通过分页机制获取所有订单数据,并将其存储在一个列表中。 #### 数据转换与写入 在完成数据清洗后,我们可以根据业务需求对数据进行进一步转换,并将其写入目标系统。例如,将订单数据转换为目标系统所需的格式,并通过API或数据库连接写入目标系统。 ```python def transform_and_write(data): transformed_data = [] for item in data: transformed_item = { # 转换为目标系统所需格式 'order_id': item['order_no'], 'store_id': item['shop_no'], # 添加其他转换逻辑 } transformed_data.append(transformed_item) # 写入目标系统(示例) target_url = 'https://target-system/api/orders' for item in transformed_data: response = requests.post(target_url, headers=headers, data=json.dumps(item)) if response.status_code != 200: print(f"Failed to write order {item['order_id']}") transform_and_write(cleaned_data) ``` 通过上述步骤,我们成功实现了从旺店通·企业奇门接口获取、清洗、转换并写入数据到目标系统的全过程。这不仅提高了数据处理效率,还确保了数据的一致性和准确性。 ![电商OMS与WMS系统接口开发配置](https://pic.qeasy.cloud/S17.png~tplv-syqr462i7n-qeasy.image) ### 使用轻易云数据集成平台进行销售退货数据同步至金蝶云星空API接口 在数据集成生命周期的第二步,我们需要将已经集成的源平台数据进行ETL转换,最终写入目标平台金蝶云星空API接口。本文将详细探讨如何利用轻易云数据集成平台配置元数据,将销售退货信息同步到金蝶云星空。 #### 配置元数据 首先,我们需要配置元数据以适应金蝶云星空API接口的要求。以下是具体的配置细节: ```json { "api": "batchSave", "method": "POST", "idCheck": true, "operation": { "rowsKey": "array", "rows": 1, "method": "batchArraySave" }, "request": [ { "field": "FBillTypeID", "label": "单据类型", "type": "string", "describe": "单据类型", "parser": { "name": "ConvertObjectParser", "params": "FNumber" }, "value": "XSTHD01_SYS" }, { "field": "FBillNo", "label": "单据编号", "type": "string", "describe": "单据编号", "value": "{order_no}" }, { ... } ], ... } ``` #### 数据字段解析与转换 在配置过程中,关键在于如何解析和转换各个字段,使其符合金蝶云星空API的格式要求。以下是一些重要字段及其解析方法: - **FBillTypeID**: 单据类型,使用`ConvertObjectParser`进行解析,将内部编码转换为金蝶系统识别的编码。 - **FBillNo**: 单据编号,直接从源数据中提取。 - **FSaleOrgId**: 销售组织,通过查找表获取对应的组织编码。 - **FDate**: 日期,直接映射源数据中的日期字段。 - **FStockOrgId**: 库存组织,固定值为100。 - **FRetcustId**: 退货客户,通过`ConvertObjectParser`解析客户编码。 - **FHeadNote**: 备注信息,直接从源数据中提取。 #### 明细信息处理 对于明细信息(FEntity),我们需要处理每一条记录中的多个字段: ```json { ... { "field":"FEntity", ... { ... { ... { ... { ... { ... { ... { ... { ... { ... {"field":"FLot","label":"批次","type":"string","describe":"基础资料","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"_function CASE '_findCollection find FIsBatchManage from 4ae4b66a-79ab-3a6d-8f33-723f326a42d0 where FNumber={{details_list.goods_no}} _endFind' WHEN 'false' THEN '' ELSE '{{details_list.batch_no}}' END","parent":"FEntity"}, {"field":"FNote","label":"备注","type":"string","describe":"文本","value":"{{details_list.remark}}","parent":"FEntity"}, {"field":"FOrderNo","label":"订单单号","type":"string","describe":"文本","value":"{{details_list.tid}}","parent":"FEntity"}, {"field":"F_QKZI_Text2","label":"临时批号","type":"string","describe":"文本","value":"{{details_list.batch_no}}","parent":"FEntity"} } } } } } } } } } }, ... } ``` 其中,每个字段都需要根据具体业务需求进行相应的转换和解析。例如: - **FLot**: 批次,根据物料编码查询是否启用批次管理,如果启用则填入批次号,否则为空。 - **FNote**: 明细备注,直接映射源数据中的备注字段。 #### 财务信息处理 财务信息(SubHeadEntity)部分也需要特别关注: ```json { ... {"field":"SubHeadEntity", ...} } ``` 其中包括结算组织等重要财务字段,这些字段同样需要通过查找表或固定值进行赋值。 #### 最终请求生成 所有配置完成后,系统会生成一个完整的请求体,并通过POST方法提交到金蝶云星空API接口。以下是一个简化示例: ```json { ... { ..., {"FormId", ...}, {"Operation", ...}, {"IsAutoSubmitAndAudit", ...}, {"IsVerifyBaseDataField", ...}, {"SubSystemId", ...} } } ``` 通过这种方式,我们可以确保所有的数据都符合目标系统的要求,并且能够顺利写入金蝶云星空,实现销售退货数据的无缝同步。 以上就是利用轻易云数据集成平台进行销售退货同步至金蝶云星空API接口的一些关键技术点和配置方法,希望能为相关技术人员提供有价值的参考。 ![如何开发金蝶云星空API接口](https://pic.qeasy.cloud/T28.png~tplv-syqr462i7n-qeasy.image)