数据集成与ETL转换:从金蝶销售订单到管易云订单

  • 轻易云集成顾问-贺强
### 金蝶销售订单=>管易订单【网易互客】:技术实现开篇 在本次案例中,我们将详细介绍如何通过轻易云数据集成平台,将金蝶云星空的销售订单数据无缝对接到管易云,实现高效、可靠的数据传输与处理。 首先,针对金蝶云星空数据的获取,需要利用其API接口`executeBillQuery`进行定时抓取。这一过程需要确保每个获取周期内的数据完整性和准确性。为了防止漏单现象,我们设置了精确的定时任务,同时结合分页处理和限流策略,保证每次调用均能顺利返回全部所需数据。 接着,为了将大量从金蝶云星空获取到的数据快速写入管易云,我们利用批量数据写入的方式,通过调用管易云API `gy.erp.trade.add`,能够显著提升执行效率,并降低网络传输时间。实现批量集成不仅要求我们对两端系统的数据格式差异认真处理,还需要定义一套有效的数据映射规则,以确保转换后的信息能够被目标系统正确识别和操作。 在这一过程中,对常见接口异常情况进行预判并设计可靠重试机制也是关键环节之一。当出现请求错误或服务器繁忙等问题时,即刻触发相应重试逻辑,从而维持整体流程的稳定运行。此外,通过实时监控工具以及详尽日志记录功能,可以随时查看各步骤执行状态,这不仅有助于排除潜在问题,还为后续维护提供了宝贵参考。 总之,本案例展示了一系列关于接口调用、分页管理、异常反馈及实时监控等方面的技术手段,旨在构建一个高效且可靠的数据集成方案。 ![打通企业微信数据接口](https://pic.qeasy.cloud/D9.png~tplv-syqr462i7n-qeasy.image) ### 调用金蝶云星空接口executeBillQuery获取并加工数据 在数据集成的生命周期中,调用源系统接口获取数据是至关重要的一步。本文将详细探讨如何通过轻易云数据集成平台调用金蝶云星空的`executeBillQuery`接口,获取销售订单数据并进行初步加工。 #### 接口配置与请求参数 首先,我们需要配置接口的元数据,以确保能够正确调用和解析返回的数据。以下是`executeBillQuery`接口的元数据配置: ```json { "api": "executeBillQuery", "method": "POST", "number": "FBillNo", "id": "FSaleOrderEntry_FEntryID", "pagination": { "pageSize": 500 }, "idCheck": true, "request": [ {"field":"FSaleOrderEntry_FEntryID","label":"FSaleOrderEntry_FEntryID","type":"string","value":"FSaleOrderEntry_FEntryID"}, {"field":"FID","label":"FID","type":"string","value":"FID"}, {"field":"FBillNo","label":"单据编号","type":"string","value":"FBillNo"}, {"field":"FDocumentStatus","label":"单据状态","type":"string","value":"FDocumentStatus"}, {"field":"FSaleOrgId_FNumber","label":"销售组织","type":"string","value":"FSaleOrgId.FNumber"}, {"field":"FDate","label":"日期","type":"string","value":"FDate"}, {"field":"FCustId_FNumber","label":"客户","type":"string","value":"FCustId.FNumber"}, {"field":"FCustId_FName","label":"客户名称","type":"string","value":"FCustId.FName"} // ...其他字段省略 ], "otherRequest": [ {"field": "Limit", "label": "最大行数", "type": "int", "describe": "金蝶的查询分页参数", "value": "500"}, {"field": "StartRow", "label": "开始行索引", "type": "int", "describe": "金蝶的查询分页参数"}, {"field": "TopRowCount", "label": "返回总行数", "type": "int", "describe": "金蝶的查询分页参数"}, {"field": "FilterString", "label": "过滤条件", "type": "string", "describe": "示例写法 FSupplierId.FNumber = 'VEN00010' and FApproveDate>=", "value": "FApproveDate>='{{LAST_SYNC_TIME|datetime}}' AND F_BCYS_BillType1 in ('定金单','全款单','礼品单','未收款单','历史订单') and FRecConditionId.fnumber = '3快递物流'" }, {"field": "FieldKeys", "label": "需查询的字段key集合", "type": "array", "describe": "金蝶分录主键ID格式:FPOOrderEntry_FEntryId,其它格式 FPurchaseOrgId.FNumber", "parser": {"name": "ArrayToString", "params": "}" }, {"field": "FormId", "label": "业务对象表单Id", "type": "string", "describe": "必须填写金蝶的表单ID如:PUR_PurchaseOrder", "value": SAL_SaleOrder" } ] } ``` #### 请求示例 根据上述元数据配置,我们可以构建一个请求体来调用`executeBillQuery`接口。以下是一个示例请求体: ```json { "FormId": "{{FormId}}", "_FieldKeys_":["FID", ,"FBillNo" ,"FDocumentStatus" ,"FSaleOrgId.FNumber" ,"FDate" ,"FCustId.FNumber" ,"FCustId.FName"], "_FilterString_":["{{FilterString}}"], "_Limit_":["{{Limit}}"], "_StartRow_":["{{StartRow}}"] } ``` 在这个请求体中,`FormId`指定了业务对象表单ID,`FieldKeys`列出了需要查询的字段集合,`FilterString`定义了过滤条件,`Limit`和`StartRow`用于分页控制。 #### 数据处理与转换 一旦成功获取到数据,我们需要对其进行初步加工和转换,以便后续处理。以下是一个简单的数据处理示例: ```python import json # 假设我们已经从API获取到了响应数据 response_data = """ { ... } """ # 将响应数据解析为JSON对象 data = json.loads(response_data) # 提取所需字段并进行初步加工 processed_data = [] for entry in data['Result']['Response']['Data']: processed_entry = { '销售订单编号': entry['FBillNo'], '客户编号': entry['FCustId']['FNumber'], '客户名称': entry['FCustId']['FName'], '销售组织': entry['FSaleOrgId']['FNumber'], '日期': entry['FDate'], '单据状态': entry['FDocumentStatus'] # ...其他字段处理 } processed_data.append(processed_entry) # 输出处理后的数据 print(json.dumps(processed_data, indent=2, ensure_ascii=False)) ``` 在这个示例中,我们从响应数据中提取了几个关键字段,并进行了初步加工。实际应用中,可以根据具体需求对更多字段进行处理。 #### 异常处理与日志记录 在调用API和处理数据过程中,异常处理和日志记录同样重要。以下是一个简单的异常处理示例: ```python try: response = requests.post(api_url, json=request_body) response.raise_for_status() except requests.exceptions.RequestException as e: print(f'API请求失败: {e}') else: data = response.json() if data.get('Result', {}).get('Response', {}).get('Status', '') == 'Success': # 正常处理逻辑 pass else: print(f'API返回错误: {data}') ``` 通过这种方式,可以有效捕获和记录API调用过程中的异常情况,确保系统稳定运行。 以上就是通过轻易云数据集成平台调用金蝶云星空接口获取并加工销售订单数据的详细步骤。在实际项目中,可以根据具体需求进一步优化和扩展这些操作。 ![金蝶云星空API接口配置](https://pic.qeasy.cloud/S21.png~tplv-syqr462i7n-qeasy.image) ### 数据集成与ETL转换:金蝶销售订单至管易云订单 在数据集成生命周期的第二步,我们将已经从源平台(金蝶)集成的数据进行ETL转换,转为目标平台(管易云)API接口所能够接收的格式,并最终写入目标平台。以下是详细的技术实现过程。 #### API接口配置与请求参数 我们使用的API接口是`gy.erp.trade.add`,通过POST方法提交数据。为了确保数据准确无误,我们需要对数据进行必要的清洗和转换。以下是具体的元数据配置和请求参数: ```json { "api": "gy.erp.trade.add", "method": "POST", "idCheck": true, "operation": { "method": "merge", "field": "FBillNo", "bodyName": "reftables", "header": [ "FSalerId_FNumber", "FBillNo", "FSOStockId_Fnumber", ... ], ... }, ... } ``` #### 数据字段映射与转换 在将数据写入目标平台之前,需要对各字段进行映射和转换。以下是关键字段及其转换逻辑: 1. **店铺代码 (`shop_code`)** ```json {"field":"shop_code","label":"店铺代码","type":"string","value":"HUKE163"} ``` 2. **会员代码 (`vip_code`)** ```json {"field":"vip_code","label":"会员代码","type":"string","value":"_findCollection find new_id from aca0e273-c1e3-32de-881f-e66536a69466 where FNumber={FSalerId_FNumber}"} ``` 3. **平台单号 (`platform_code`)** ```json {"field":"platform_code","label":"平台单号","type":"string","value":"{FBillNo}"} ``` 4. **仓库代码 (`warehouse_code`)** ```json {"field":"warehouse_code","label":"仓库代码","type":"string","value":"_function case '{FSOStockId_Fnumber}' when '' then 'CK00001' else '{FSOStockId_Fnumber}'end"} ``` 5. **拍单时间 (`deal_datetime`)** ```json {"field":"deal_datetime","label":"拍单时间","type":"string","value":"_function DATE_FORMAT('{FDate}','%Y-%m-%d %h:%i:%s')"} ``` 6. **收货人信息** - 收货人姓名 (`receiver_name`) ```json {"field":"receiver_name","label":"收货人","type":"string","value":"{FCustId_FName}"} ``` - 手机号码 (`receiver_mobile`) ```json {"field":"receiver_mobile","label":"手机号码","type":"string","value":"_function case when '{F_VYVH_Combo}'='是' and '{F_VYVH_Text}' !=' ' then '{F_VYVH_Text}' when '{F_VYVH_Text5}'= ' ' then '{FLinkPhone}' else '{F_VYVH_Text5}' end"} ``` 7. **商品明细 (`details`)** - 商品代码 (`item_code`) ```json {"field":"item_code","label":"商品代码","type":"string","value":"{{reftables.FMaterialId_Fnumber}}"} ``` - 实际单价 (`price`) ```json {"field":"price","label":"实际单价","type":"string","value":"{{reftables.FTaxPrice}}"} ``` 8. **支付明细 (`payments`)** - 支付方式 (`pay_type_code`) ```json {"field":"pay_type_code","label":"支付方式","type":"string","value":"_function case when '{F_hKFKFS}' like '%代收货款%' then 'cod' else 'onlinepay' end"} ``` 9. **是否货到付款 (`cod`)** ```json {"label":"是否货到付款","field":"cod","type":"string","value":"_function case when '{F_hKFKFS}' like '%代收货款%' then 'true' else 'false' end"} ``` #### 数据写入 在完成上述字段映射和转换后,我们将数据通过POST请求写入管易云API接口。以下是示例请求体: ```json { "shop_code": "HUKE163", "vip_code": "...", "platform_code": "...", ... } ``` 通过这种方式,我们可以确保从金蝶系统获取的销售订单数据经过清洗、转换后,能够准确无误地写入到管易云系统中,实现不同系统间的数据无缝对接。这不仅提高了数据处理效率,还保证了业务流程的连续性和准确性。 ![如何对接金蝶云星空API接口](https://pic.qeasy.cloud/T5.png~tplv-syqr462i7n-qeasy.image)