将旺店通数据ETL转换并写入金蝶云星空的步骤详解

  • 轻易云集成顾问-谢楷斌
### 旺店通·旗舰奇门调拨出库单数据集成到金蝶云星空的技术实现 在本次案例中,我们将详细探讨如何通过轻易云数据集成平台,将旺店通·旗舰奇门中的调拨出库单数据(API接口:wdt.wms.stockout.transfer.querywithdetail)高效、安全地集成到金蝶云星空(API接口:batchSave)。这个过程涉及多个重要技术环节,包括分页和限流处理、数据格式差异转换、高效的数据批量写入以及异常处理等。 首先,需要解决的是如何可靠地抓取旺店通·旗舰奇门接口的数据。我们采用定时任务机制,确保每隔一段时间准确且全面地获取最新的调拨出库单信息。在这过程中,通过实时监控与日志记录,可以随时掌握数据抓取情况,一旦出现问题能够及时调整。 其次,面对大量的业务数据,为了快速写入至金蝶云星空,我们设计了批量化的数据提交策略。这不仅提升传输效率,还能有效减少系统压力。同时,在对接过程中,要特别注意两端系统的数据格式差异。为此,我们构建了一套灵活的映射关系,并在存储前进行必要的数据转换,以保证无缝对接。 另外,由于API调用可能会受限速影响,分页请求是必不可少的一步。本方案就此设计了较为完善的分段拉取逻辑,有效防止因超载导致请求失败。同时,为确保整个过程的稳定性,对所有API调用均加入错误重试机制,最大程度降低因网络波动或其他不可抗力导致的数据丢失风险。 最后,对于已经成功推送到金蝶云星空的数据,同样需要进行状态跟踪及审计。一套完善且透明化的数据操作日志,可帮助我们回溯并审查每个环节,大幅提高整体流程安全性和合规性。在实战中,这些措施不仅显著提高了系统联动效率,也大大增强了可靠性的保障。 ![企业微信与OA系统接口开发配置](https://pic.qeasy.cloud/D8.png~tplv-syqr462i7n-qeasy.image) ### 调用旺店通·旗舰奇门接口获取并加工数据 在数据集成的生命周期中,调用源系统接口是至关重要的一步。本文将详细探讨如何通过轻易云数据集成平台调用旺店通·旗舰奇门接口`wdt.wms.stockout.transfer.querywithdetail`,并对获取的数据进行初步加工。 #### 接口概述 接口`wdt.wms.stockout.transfer.querywithdetail`主要用于查询调拨出库单的详细信息。该接口采用POST请求方式,支持多种查询参数和分页功能,以确保数据查询的灵活性和高效性。 #### 元数据配置 以下是该接口的元数据配置: ```json { "api": "wdt.wms.stockout.transfer.querywithdetail", "method": "POST", "number": "order_no", "id": "stockout_id", "idCheck": true, "request": [ { "field": "params", "label": "查询参数", "type": "object", "describe": "查询参数", "children": [ { "field": "start_time", "label": "开始时间", "type": "string", "describe": "起始时间,若无出库单号或调拨单号,则为必填。", "value": "{{LAST_SYNC_TIME|datetime}}", "parent": "params" }, { "field": "end_time", "label": "结束时间", "type": "string", "describe": "结束时间,上同开始时间", "value": "{{CURRENT_TIME|datetime}}", "parent": "params" }, { ... } ] }, ... ], ... } ``` #### 请求参数解析 1. **params**: 查询参数对象,包含多个子字段: - **start_time**: 起始时间,格式为字符串。通常使用上次同步时间(`{{LAST_SYNC_TIME|datetime}}`)作为起点。 - **end_time**: 结束时间,格式为字符串。通常使用当前时间(`{{CURRENT_TIME|datetime}}`)作为终点。 - **warehouse_no**: 仓库编号,用于指定查询的仓库。 - **src_order_no**: 调拨单号,可选参数。 - **stockout_no**: 出库单号,可选参数。 - **position**: 是否按照货位分组,默认值为"0"(否)。 - **status**: 出库单状态,默认值为"110"(已完成)。 2. **pager**: 分页对象,包含两个子字段: - **page_size**: 每页记录数,默认值为50。 - **page_no**: 页码,从0开始计数。 #### 数据请求与清洗 在调用接口后,我们会得到一个包含调拨出库单详细信息的响应数据。接下来需要对这些数据进行清洗和初步加工,以便后续的数据转换与写入操作。 1. **校验数据完整性** 确保每条记录都包含必要的字段,如`order_no`和`stockout_id`。如果某些记录缺失关键字段,可以选择丢弃或记录日志以便后续处理。 2. **转换时间格式** 将响应中的日期时间字段转换为统一的格式,例如ISO8601标准。这有助于后续的数据处理和分析。 3. **过滤无效数据** 根据业务需求过滤掉不符合条件的数据。例如,只保留状态为“已完成”的出库单记录。 4. **分页处理** 如果响应数据量较大,需要根据分页信息进行多次请求,并合并所有页的数据。 #### 示例代码 以下是一个示例代码片段,用于调用接口并处理响应数据: ```python import requests import json from datetime import datetime # 配置请求参数 params = { 'start_time': datetime.now().strftime('%Y-%m-%d %H:%M:%S'), 'end_time': datetime.now().strftime('%Y-%m-%d %H:%M:%S'), 'warehouse_no': 'WH001', 'status': '110' } pager = { 'page_size': 50, 'page_no': 0 } # 发起POST请求 response = requests.post( url='https://api.example.com/wdt.wms.stockout.transfer.querywithdetail', headers={'Content-Type': 'application/json'}, data=json.dumps({'params': params, 'pager': pager}) ) # 处理响应数据 if response.status_code == 200: data = response.json() for record in data['records']: # 校验并清洗数据 if 'order_no' in record and 'stockout_id' in record: # 转换时间格式 record['start_time'] = datetime.strptime(record['start_time'], '%Y-%m-%d %H:%M:%S').isoformat() record['end_time'] = datetime.strptime(record['end_time'], '%Y-%m-%d %H:%M:%S').isoformat() # TODO: 更多清洗逻辑 else: print(f"Error: {response.status_code}") ``` 通过上述步骤,我们可以高效地从旺店通·旗舰奇门系统中获取所需的调拨出库单详细信息,并对其进行初步加工,为后续的数据转换与写入做好准备。这一过程不仅提高了数据集成的效率,也确保了数据质量和一致性。 ![用友BIP接口开发配置](https://pic.qeasy.cloud/S9.png~tplv-syqr462i7n-qeasy.image) ### 使用轻易云数据集成平台将数据转换并写入金蝶云星空API 在数据集成生命周期的第二阶段,我们需要将已经集成的源平台数据进行ETL转换,转为目标平台金蝶云星空API接口所能够接收的格式,并最终写入目标平台。本文将详细探讨如何通过轻易云数据集成平台实现这一过程。 #### 元数据配置解析 元数据配置是整个ETL过程的核心。以下是针对调拨出库单的数据写入金蝶云星空API的元数据配置: ```json { "api": "batchSave", "method": "POST", "idCheck": true, "operation": { "rowsKey": "array", "rows": 20, "method": "batchArraySave" }, "request": [ {"field":"FBillNo","label":"单据编号","type":"string","describe":"单据编号","value":"{order_no}"}, {"field":"FBillTypeID","label":"单据类型","type":"string","describe":"单据类型","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"DBCKD"}, {"field":"FStockOrgId","label":"库存组织","type":"string","describe":"组织","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"100"}, {"field":"FPickOrgId","label":"领用组织","type":"string","describe":"组织","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"100"}, {"field":"FStockDirect","label":"库存方向","type":"string","describe":"下拉列表","value":"1"}, {"field":"FDate","label":"日期","type":"string","describe":"日期","value":"{{consign_time|datetime}}"}, {"field":"FCustId","label":"客户","type": "string", "describe": "基础资料", "parser":{"name": "ConvertObjectParser", "params": "FNumber"}}, {"field": "FDeptId", "label": "领料部门", "type": "string", "describe": "基础资料", "parser":{"name": "ConvertObjectParser", "params": "FNumber"}, "value": "BM000032"}, {"field": "FPickerId", "label": "领料人", "type": "string", "describe": "基础资料", ... ``` #### 数据转换与写入流程 1. **字段映射与解析**: - **FBillNo(单据编号)**:直接映射为源数据中的`order_no`。 - **FBillTypeID(单据类型)**:使用`ConvertObjectParser`解析器,将固定值`DBCKD`转换为目标系统可识别的格式。 - **FStockOrgId(库存组织)**和**FPickOrgId(领用组织)**:同样使用`ConvertObjectParser`解析器,将固定值`100`转换。 - **FDate(日期)**:通过模板引擎将源数据中的时间字段`consign_time`格式化为目标系统所需的日期格式。 2. **明细信息处理**: - **FEntity(明细信息)**:这是一个数组结构,包含多个子字段,如物料编码、实发数量、发货仓库等。 - **FMaterialId(物料编码)**:使用模板引擎从源数据中提取`detail_list.spec_no`并进行转换。 - **FQty(实发数量)**:直接映射为源数据中的`detail_list.goods_count`。 - **FAmount(总成本)**和**FPrice(成本价)**:根据业务需求计算或直接映射。 3. **特殊字段处理**: - **FOwnerTypeIdHead(货主类型)**和**FOwnerIdHead(货主)**:这些字段需要使用解析器进行多类别基础资料转换。 - **备注字段处理**:例如,`FNote`和明细中的备注字段,需要从源数据中提取相应内容并进行多行文本处理。 4. **请求参数构建与发送**: 根据上述配置,构建最终的请求参数,并通过HTTP POST方法调用金蝶云星空API接口: ```json { ... { field: 'FormId', label: '业务对象表单Id', type: 'string', describe: '必须填写金蝶的表单ID如:PUR_PurchaseOrder', value: 'STK_MisDelivery' }, { field: 'IsAutoSubmitAndAudit', label: '提交并审核', type: 'bool', value: true }, { field: 'IsVerifyBaseDataField', label: '验证基础资料', type: 'bool', describe: '是否验证所有的基础资料有效性,布尔类,默认false(非必录)', value: true }, { field: 'Operation', label: '执行的操作', type: 'string', value: 'Save' } } ``` #### 数据校验与错误处理 在实际操作中,还需要对每个字段进行严格的数据校验,以确保所有必填项都已正确填写,并且所有基础资料都能被目标系统识别。如果出现错误,应及时捕获并记录日志,以便后续排查和修正。 通过上述步骤,我们可以高效地将已经集成的源平台数据进行ETL转换,并成功写入到金蝶云星空API接口,从而实现不同系统间的数据无缝对接。 ![如何对接用友BIP接口](https://pic.qeasy.cloud/T26.png~tplv-syqr462i7n-qeasy.image)