ETL转换与金蝶云星空API接口集成

  • 轻易云集成顾问-胡秀丛
### 旺店通·旗舰奇门数据集成到金蝶云星空:技术案例 在本案例中,讨论了如何利用轻易云数据集成平台将旺店通·旗舰奇门的销售出库单数据无缝对接到金蝶云星空系统。具体方案名称为“旺店通销售出库单-金蝶销售出库单【20230515 分销商】”。该方案旨在确保数据流动顺畅、确保不漏单,并提升整体业务处理效率。 #### 调用旺店通·旗舰奇门接口wdt.wms.stockout.sales.querywithdetail 首先,需要从旺店通·旗舰奇门获取详细的销售出库单信息,调用接口`wdt.wms.stockout.sales.querywithdetail`即可实现这一操作。该过程需要特别注意分页和限流问题,以避免因调用频次过高造成的数据抓取失败。我们采用定时任务来可靠地抓取接口数据,保证每个批次的完整性和准确性。 #### 处理分页与限流问题 由于API调用限制,每次请求返回的数据量有限,需要通过合理设置分页参数以确保所有记录全覆盖。同时,对接过程中要考虑限流策略,通过合适时间间隔分段抓取大规模数据,从而有效防止请求被拒绝或拦截。 #### 数据格式转换与映射调整 在成功获取到原始数据后,由于两套系统的数据结构不同,需要进行必要的格式转换。例如,将字段名按需调整及类型匹配,同时完成基本的数据校验。这一步骤尤为关键,因为相应字段的不匹配可能导致后续写入失败甚至引发更严重的问题。因此,我们设计了一套自动化规则,对从源端(旺店通)抽取的数据进行实时监控并实施日志记录,使得整个流程透明且可追溯。 #### 批量写入金蝶云星空系统 对处理后的合规数据信息,通过调用金蝶云星空提供的BatchSave API批量导入目标数据库。在此过程中,为提高效率及减少误差率,我们采取了事务控制机制以及异常重试策略,以确保即便在遇到网络波动等不可抗因素时,也能够继续保持顺利执行。此外,还依据实际需求进行了定制化的数据映射配置,以满足客户特有场景下的业务逻辑要求。 本文开头部分介绍了整个对接流程中几项核心步骤与技术挑战,在随后的章节里,将会进一步深入探讨各环节中的细节实现方式,包括具体代码示例、调优技巧以及错误处理方法等内容。 ![钉钉与CRM系统接口开发配置](https://pic.qeasy.cloud/D15.png~tplv-syqr462i7n-qeasy.image) ### 调用旺店通·旗舰奇门接口获取并加工数据 在数据集成的生命周期中,第一步是从源系统调用API接口获取数据。本文将详细探讨如何通过轻易云数据集成平台调用旺店通·旗舰奇门接口`wdt.wms.stockout.sales.querywithdetail`,并对返回的数据进行初步加工。 #### 接口调用配置 首先,我们需要配置API接口的调用参数。根据提供的元数据配置,接口的请求方法为POST,主要参数包括分页参数和业务参数。 ```json { "api": "wdt.wms.stockout.sales.querywithdetail", "method": "POST", "number": "order_no", "id": "stockout_id", "idCheck": true, "request": [ { "field": "pager", "label": "分页参数", "type": "object", "children": [ { "field": "page_size", "label": "分页大小", "type": "string", "value": "50", "parent": "pager" }, { "field": "page_no", "label": "页号", "type": "string", "value": "1", "parent": "pager" } ] }, { "field": "params", ... } ], ... } ``` #### 分页参数 分页参数用于控制每次请求返回的数据量和页码。默认设置为每页50条记录,从第一页开始: - `page_size`: 每页记录数,默认为50。 - `page_no`: 页码,默认为1。 #### 业务参数 业务参数用于过滤和查询特定条件下的数据: - `start_time` 和 `end_time`: 查询时间范围,分别设置为30分钟前和当前时间。 - `status_type`: 出库单状态类型,默认为3(按照指定状态查询)。 - `status`: 出库单状态详细信息,默认为110。 - `warehouse_no`, `stockout_no`, `shop_nos`, `src_order_no`, `need_sn`, `position`: 其他可选过滤条件。 以下是业务参数的具体配置示例: ```json { ... { "field": "params", ... { ... { ... { ... { ... { ... { ... { ... { ... { ... { ... { ... { ..., {"field":"start_time","label":"开始时间","type":"string","value":"{{MINUTE_AGO_30|datetime}}","parent":"params"}, {"field":"end_time","label":"结束时间","type":"string","value":"{{CURRENT_TIME|datetime}}","parent":"params"}, {"field":"status_type","label":"出库单状态","type":"string","value":"3","parent":"params"}, {"field":"status","label":"出库单状态详细","type":"string","value":"110","parent":"params"} } } } } } } } } } } } } }, ... } ``` #### 数据请求与清洗 在完成API调用配置后,通过轻易云平台发起请求并获取响应数据。由于平台支持全异步处理,可以高效地进行大批量数据的请求与清洗。 1. **发起请求**:根据配置好的API参数,通过POST方法向`wdt.wms.stockout.sales.querywithdetail`接口发送请求。 2. **接收响应**:解析返回的数据结构,并进行初步清洗,例如去除无效字段、格式化日期等。 ```python import requests import json url = 'https://api.example.com/wdt.wms.stockout.sales.querywithdetail' headers = {'Content-Type': 'application/json'} payload = json.dumps({ 'pager': {'page_size': '50', 'page_no': '1'}, 'params': {'start_time': '2023-05-15T00:00:00Z', 'end_time': '2023-05-15T23:59:59Z', 'status_type': '3', 'status': '110'} }) response = requests.post(url, headers=headers, data=payload) data = response.json() # 初步清洗数据 cleaned_data = [] for record in data['records']: cleaned_record = {key: value for key, value in record.items() if key in ['order_no', 'stockout_id', 'status']} cleaned_data.append(cleaned_record) ``` #### 数据转换与写入 在完成数据清洗后,可以将其转换为目标系统所需的格式,并写入到相应数据库或文件中。这一步通常涉及字段映射、数据类型转换等操作。 ```python # 示例:将清洗后的数据写入到CSV文件 import csv with open('output.csv', mode='w') as file: writer = csv.writer(file) writer.writerow(['order_no', 'stockout_id', 'status']) for record in cleaned_data: writer.writerow([record['order_no'], record['stockout_id'], record['status']]) ``` 通过以上步骤,我们实现了从旺店通·旗舰奇门接口获取销售出库单数据,并进行了初步加工,为后续的数据处理和分析奠定了基础。在实际应用中,可以根据具体需求进一步优化和扩展这些操作。 ![企业微信与OA系统接口开发配置](https://pic.qeasy.cloud/S26.png~tplv-syqr462i7n-qeasy.image) ### 轻易云数据集成平台:ETL转换与金蝶云星空API接口集成案例 在数据集成的生命周期中,ETL(Extract, Transform, Load)转换是关键的一步。本文将深入探讨如何使用轻易云数据集成平台将源平台的数据转换为金蝶云星空API接口所能接收的格式,并最终写入目标平台。 #### 元数据配置解析 在本案例中,我们将通过元数据配置来实现数据的转换和写入。以下是我们需要处理的元数据配置: ```json { "api": "batchSave", "method": "POST", "idCheck": true, "operation": { "rowsKey": "array", "rows": 20, "method": "batchArraySave" }, "request": [ {"field":"FBillTypeID","label":"单据类型","type":"string","describe":"单据类型","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"XSCKD01_SYS"}, {"field":"FBillNo","label":"单据编号","type":"string","describe":"单据编号","value":"{order_no}"}, {"field":"FDate","label":"日期","type":"string","describe":"日期","value":"{consign_time}"}, {"field":"FSaleOrgId","label":"销售组织","type":"string","describe":"组织","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"100"}, {"field":"FCustomerID","label":"客户","type":"string","describe":"基础资料","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"{customer_no}"}, {"field":"FCarriageNO","label":"运输单号","type":"string","describe":"文本"}, {"field":"FStockOrgId","label":"发货组织","type":"string","describe":"组织","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"100"}, {"field":"FLinkPhone","label":"联系电话","type":"","describe":"","value":""}, {"field":"","label":"","type":"","describe":"","value":""}, ... ], ... } ``` #### 数据请求与清洗 首先,我们从源平台获取原始数据,并进行初步清洗。假设我们获取到的原始数据如下: ```json { "order_no": "SO123456", "consign_time": "2023-05-15", "customer_no": "CUST001", ... } ``` #### 数据转换 接下来,我们根据元数据配置进行数据转换。以下是几个关键字段的转换过程: 1. **单据类型(FBillTypeID)**: ```json { "field": "FBillTypeID", "value": "XSCKD01_SYS" } ``` 2. **单据编号(FBillNo)**: ```json { "field": "FBillNo", "value": "{order_no}" } ``` 转换后: ```json { "FBillNo": "SO123456" } ``` 3. **日期(FDate)**: ```json { "field": "FDate", "value": "{consign_time}" } ``` 转换后: ```json { "FDate": "2023-05-15" } ``` 4. **客户(FCustomerID)**: ```json { "field": "FCustomerID", ... ... ``` 5. **物料编码(FMaterialID)**: ```json { "field": “FMaterialID”, “value”: “{{details_list.goods_no}}” } ``` 转换后: ```json { “FMaterialID”: “MAT001” } ``` 6. **实发数量(FRealQty)**: ```json { "field”: “FRealQty”, “value”: “{goods_count}” } ``` 转换后: ```json { “FRealQty”: “10” } ``` 7. **含税单价(FTaxPrice)**: ```json { "field”: “FTaxPrice”, “value”: “{{details_list.market_price}}” } ``` 转换后: ```json { “FTaxPrice”: “100.00” } ``` 8. **仓库(FStockID)**: ```json { "field”: “FStockID”, “parser”:{"name”:“ConvertObjectParser”,“params”:“FNumber”}, “value”:"{warehouse_no}" } ``` 转换后: ```json { “FSockID”:"WH001" } ``` #### 数据写入 完成所有字段的转换后,我们将生成如下JSON对象,用于通过API接口写入金蝶云星空: ```json { "FormId”:"SAL_OUTSTOCK", "Operation”:"Save", "IsAutoSubmitAndAudit”:false, "IsVerifyBaseDataField”:true, "SubSystemId”:21, "Model”:{ ... //上面提到的所有字段及其值 } } ``` 通过HTTP POST请求,将上述JSON对象发送到金蝶云星空API接口`batchSave`,完成最终的数据写入。 #### 总结 本文详细解析了如何使用轻易云数据集成平台,将源平台的数据进行ETL转换,并通过金蝶云星空API接口实现数据写入。通过这种方式,可以确保不同系统间的数据无缝对接,实现高效、准确的数据集成。 ![金蝶与外部系统打通接口](https://pic.qeasy.cloud/T18.png~tplv-syqr462i7n-qeasy.image)