借助轻易云集成平台完成ETL并写入旺店通WMS

  • 轻易云集成顾问-钟家寿
### 金蝶云星空数据集成到旺店通WMS的技术实现 在企业运营过程中,数据的高效整合和流转至关重要。本文将分享一个实际运行的系统对接集成案例:退料申请单=>CRTH出库单创建OK-1,其中涉及金蝶云星空的数据通过executeBillQuery接口抓取,并批量写入到旺店通WMS系统中。此方案旨在确保整个流程中的操作透明、实时监控、高效处理。 首先,我们使用金蝶云星空提供的API executeBillQuery来获取退料申请单的数据。在调用此接口时,需要特别注意分页和限流问题,以保证数据完整性并避免超时错误。例如,可以设置合理的分页参数,每次请求较小的数据量来防止服务器负载过高。同时,通过定时任务机制定期可靠地抓取新生成或更新的数据,确保不漏单。 其次,对于从金蝶云星空拉取的大量数据,我们必须解决其与旺店通WMS之间的数据格式差异。这一步需要进行必要的数据转换与映射,以符合目标系统要求。具体来说,在轻易平台中配置相应的规则,对不同字段进行有效转换,如时间格式、数值型单位等,使得每一条记录都能被正确识别和处理。 而后,在完成数据清洗及格式调整后,利用轻易的平台,将这些整理好的数据批量写入旺店通WMS。这一过程通过调用WDT_WMS_STOCKOUT_CREATE接口实现,这里我们需要注意一些关键点,如API调用频率限制以及如何快速且安全地传输大量记录。在这个节点上,实现错误重试机制显得尤为重要,它能够自动捕捉异常情况并及时重试提交未成功处理的信息,从而提升整体稳定性。 为了提高对整个集成过程的可追溯性,我们应用了实时监控功能,对每一次请求响应都详细记录日志,包括成功数量、失败详情及重试结果等信息。这不仅方便后续排查,也保障了业务连续性。 最后,为了适配企业特有需求,还需针对不同业务逻辑做一些个性化调整,例如根据业务类型自定义输出字段映射规则,这样能够更好满足其操作习惯与管理方式,使得系统协同运作更加顺畅。 ![打通用友BIP数据接口](https://pic.qeasy.cloud/D10.png~tplv-syqr462i7n-qeasy.image) ### 调用金蝶云星空接口executeBillQuery获取并加工数据的技术实现 在数据集成生命周期的第一步中,调用源系统接口以获取数据是至关重要的。本文将详细探讨如何通过轻易云数据集成平台调用金蝶云星空接口`executeBillQuery`来获取退料申请单的数据,并进行初步加工。 #### 接口配置与调用 首先,我们需要配置接口的元数据,以便正确地调用金蝶云星空的`executeBillQuery`接口。以下是元数据配置的关键部分: ```json { "api": "executeBillQuery", "method": "POST", "number": "FBillNo", "id": "FEntity_FEntryID", "pagination": { "pageSize": 100 }, "idCheck": true, "request": [ {"field":"FEntity_FEntryID","label":"FEntity_FEntryID","type":"string","value":"FEntity_FEntryID"}, {"field":"FBillNo","label":"单据编号","type":"string","value":"FBillNo"}, {"field":"FID","label":"FID","type":"string","value":"FID"}, {"field":"FDocumentStatus","label":"单据状态","type":"string","value":"FDocumentStatus"}, {"field":"FBillTypeID_Fnumber","label":"单据类型","type":"string","value":"FBillTypeID.Fnumber"}, {"field":"FDate","label":"申请日期","type":"string","value":"FDate"}, {"field":"FPURCHASEORGID_Fnumber","label":"采购组织","type":"string","value":"FPURCHASEORGID.Fnumber"}, {"field":"FRMTYPE","label":"退料类型","type":"string","value":"FRMTYPE"}, {"field":"FAPPORGID_Fnumber","label":"申请组织","type":"string","value":"FAPPORGID.Fnumber"}, {"field":"FAPPDEPTID_Fnumber","label":"申请部门","type":"string","value":"FAPPDEPTID.Fnumber"} ], "otherRequest": [ {"field": "Limit", "label": "最大行数", "type": "string", "describe": "金蝶的查询分页参数", "value": "{PAGINATION_PAGE_SIZE}"}, {"field": "StartRow", "label": "开始行索引", "type": "string", "describe": "金蝶的查询分页参数", "value": "{PAGINATION_START_ROW}"}, {"field": "FilterString", "label": "过滤条件", "type": "string", "value": "FApproveDate>='{{MINUTE_AGO_30|datetime}}' and F_JZJ_WMSSTOCK.F_JZJ_CheckBox=1" }, {"field": "FieldKeys", "label": "需查询的字段key集合", "type": "array", "parser": {"name": "ArrayToString", "params": "," } }, {"field": "FormId", "label": "业务对象表单Id", "type": "string", "value": "PUR_MRAPP" } ] } ``` #### 数据请求与清洗 在实际操作中,首先需要构建请求体并发送HTTP POST请求到金蝶云星空API。请求体包含了分页参数、过滤条件以及需要查询的字段集合。 ```python import requests import json url = 'https://api.kingdee.com/executeBillQuery' headers = {'Content-Type': 'application/json'} payload = { 'FormId': 'PUR_MRAPP', 'FieldKeys': ','.join([ 'FBillNo', 'FID', 'FDocumentStatus', 'FBillTypeID.Fnumber', 'FDate', 'FPURCHASEORGID.Fnumber', 'FRMTYPE', 'FAPPORGID.Fnumber', 'FAPPDEPTID.Fnumber' ]), 'FilterString': ( f"FApproveDate>='{(datetime.datetime.now() - datetime.timedelta(minutes=30)).strftime('%Y-%m-%d %H:%M:%S')}' " f"and F_JZJ_WMSSTOCK.F_JZJ_CheckBox=1" ), 'Limit': 100, 'StartRow': 0 } response = requests.post(url, headers=headers, data=json.dumps(payload)) data = response.json() ``` #### 数据转换与写入 获取到原始数据后,需要对其进行清洗和转换,以便后续处理。在这个过程中,可以利用Python Pandas库进行数据处理。 ```python import pandas as pd # 将返回的数据转换为DataFrame df = pd.DataFrame(data) # 清洗和转换数据,例如将日期字符串转换为日期对象 df['申请日期'] = pd.to_datetime(df['申请日期']) # 根据业务需求进行进一步的数据处理,如计算、过滤等 df_filtered = df[df['单据状态'] == '审核通过'] ``` #### 实时监控与调试 在整个过程中,实时监控和调试是确保数据准确性的关键。可以通过日志记录和异常处理机制来实现。 ```python import logging logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) try: response = requests.post(url, headers=headers, data=json.dumps(payload)) response.raise_for_status() data = response.json() except requests.exceptions.RequestException as e: logger.error(f'HTTP Request failed: {e}') except Exception as e: logger.error(f'An error occurred: {e}') else: logger.info('Data fetched successfully') ``` 通过上述步骤,我们可以高效地从金蝶云星空获取退料申请单的数据,并进行初步加工,为后续的数据集成打下坚实基础。这一过程不仅提高了业务透明度,还显著提升了数据处理效率。 ![用友BIP接口开发配置](https://pic.qeasy.cloud/S17.png~tplv-syqr462i7n-qeasy.image) ### 使用轻易云数据集成平台进行ETL转换并写入旺店通WMSAPI接口 在数据集成的生命周期中,第二步是将已经集成的源平台数据进行ETL(Extract, Transform, Load)转换,使其符合目标平台的要求。本文将重点介绍如何使用轻易云数据集成平台将退料申请单的数据转换为旺店通WMSAPI接口所能接收的格式,并最终写入目标平台。 #### 元数据配置解析 元数据配置是实现ETL转换的关键。以下是我们需要配置的元数据: ```json { "api": "WDT_WMS_STOCKOUT_CREATE", "method": "POST", "idCheck": true, "operation": { "method": "merge", "field": "FBillNo,FDate,F_JZJ_WMSSTOCK", "bodyName": "details", "bodySum": ["FMRAPPQTY"], "header": ["FBillNo", "FDate", "F_JZJ_WMSSTOCK"], "body": ["FMATERIALID_Fnumber", "FEntity_FEntryID", "FMRAPPQTY"] }, "request": [ { "label": "出库单信息", "field": "deliveryOrder", "type": "object", "children": [ {"parent": "deliveryOrder", "label": "出库单号", "field": "deliveryOrderCode", "type": "string", "value":"{FBillNo}"}, {"parent": "deliveryOrder", "label": "出库单类型", "field":"orderType","type":"string","value":"CGTH"}, {"parent":"deliveryOrder","label":"出库单创建时间","field":"createTime","type":"string","value":"{FDate}"}, {"parent":"deliveryOrder","label":"仓库编码","field":"warehouseCode","type":"string","value":"{F_JZJ_WMSSTOCK}"} ] }, { "label":"单据信息", "field":"orderLines", "type":"array", "value":"details", ... ``` #### 数据请求与清洗 在数据请求与清洗阶段,我们从源平台获取退料申请单的数据,并对其进行初步清洗和验证。确保数据完整性和准确性是这一阶段的核心任务。 #### 数据转换与写入 1. **定义API接口和请求方法**:首先,我们需要定义目标平台的API接口和请求方法。在这里,我们使用`POST`方法向`WDT_WMS_STOCKOUT_CREATE`接口发送请求。 2. **标识字段映射关系**:根据元数据配置,定义好字段映射关系。例如,将源平台中的`FBillNo`映射为目标平台中的`deliveryOrderCode`,`FDate`映射为`createTime`等。 3. **构建请求体**: - **出库单信息**:包括出库单号、出库单类型、创建时间和仓库编码。 - **单据信息**:包括商家编码、单据行号和应发商品数量。 请求体示例如下: ```json { ... { label: '出库单信息', field: 'deliveryOrder', type: 'object', children: [ { parent: 'deliveryOrder', label: '出库单号', field: 'deliveryOrderCode', type: 'string', value: '{FBillNo}' }, { parent: 'deliveryOrder', label: '出库单类型', field: 'orderType', type: 'string', value: 'CGTH' }, { parent: 'deliveryOrder', label: '出库单创建时间', field: 'createTime', type: 'string', value: '{FDate}' }, { parent: 'deliveryOrder', label: '仓库编码', field: 'warehouseCode', type: 'string', value: '{F_JZJ_WMSSTOCK}' } ] }, ... ``` 4. **处理订单行信息**:我们需要遍历每个订单行,提取并转换相关字段。例如: ```json { label:'orderLine', field:'orderLine', type:'array', children:[ { parent:'orderLine', label:'商家编码', field:'itemCode', type:'string', value:'{{details.FMATERIALID_Fnumber}}' }, { parent:'orderLine', label:'单据行号', field:'orderLineNo', type:'string', value:'{{details.FEntity_FEntryID}}' }, { parent:'orderLine', label:'应发商品数量', field:'planQty', type:'string', value:'{{details.FMRAPPQTY}}' } ] } ``` 5. **发送请求并处理响应**:最后,将构建好的请求体通过HTTP POST方法发送到目标API接口,并处理返回的响应结果。确保成功写入后,可以进行相应的日志记录和状态更新。 #### 技术要点总结 - **字段映射与转换**:确保每个字段都能正确映射并转换到目标格式。 - **请求体构建**:根据元数据配置,精确构建API请求体。 - **错误处理与日志记录**:在实际操作中,需注意异常情况的处理,并做好日志记录以便后续排查。 通过以上步骤,我们可以高效地将退料申请单的数据转换并写入到旺店通WMS系统,实现不同系统间的数据无缝对接。 ![电商OMS与WMS系统接口开发配置](https://pic.qeasy.cloud/T13.png~tplv-syqr462i7n-qeasy.image)