使用轻易云平台进行ETL转换并对接旺店通API

  • 轻易云集成顾问-张妍琪
### 用友BIP数据集成到旺店通·企业奇门的技术实现方案 在本技术案例中,我们将详细探讨如何高效地将用友BIP的数据集成到旺店通·企业奇门系统,以解决YS其他出库数据对接云仓的问题。本次实施方案主要涉及以下几个关键点:确保集成过程中数据不漏单、大量数据的快速写入、定时抓取和批量处理等环节。 #### 确保用友BIP数据不漏单 为了保证在与旺店通·企业奇门进行数据对接时,用友BIP系统中的YS其他出库记录不会遗漏,我们采用了实时监控与日志记录机制。通过调用`/yonbip/scm/othoutrecord/list` API接口,能够及时获取最新的业务出库记录,并配合轻易云平台实时监控功能,实现每一条记录都被精准捕获并处理。 #### 大量数据快速写入到旺店通·企业奇门 当从用友BIP成功获取大量YS其他出库数据后,需要高效、稳定地将其传输至旺店通·企业奇门。在这个步骤中,通过调用 `wdt.vip.wms.stockinout.order.push` API接口,可以确保大批量的数据迅速且无误地写入,削减延迟和资源消耗。同时,为进一步优化性能,本方案设计了批量处理策略,每次提交指定数量的数据包,提高整体上传效率。 #### 定时可靠的抓取用友BIP接口数据 基于任务调度器,我们设置了定期任务来自动抓取用友BIP新生成的业务出库单信息。这样不仅提升了系统自动化程度,还能减少人为干预可能带来的错误风险。此外,这种机制还能有效平衡服务器负载,避免因过于频繁请求导致API限流或分页问题发生。 #### 处理分页与限流问题 由于API请求限制,当我们需要连续拉取大量数据信息时,不可避免会遇到分页及限流挑战。为应对此类情况,在每次调用 `/yonbip/scm/othoutrecord/list` 获取几十万条库存出库详情时,通过合理使用offset参数以及引入重试机制,有效规避被限流情形。同时结合缓存策略,大幅提高获取速度及响应率。 总之,本案例展示的不仅是基本流程,更包含了一系列针对实际应用场景下的问题解决方法,如异常处理与错误重试机制、自定义映射规则对接、不同格式间转换等等。这些技术细节将在本文余下章节得到详尽阐述。 ![钉钉与ERP系统接口开发配置](https://pic.qeasy.cloud/D21.png~tplv-syqr462i7n-qeasy.image) ### 调用用友BIP接口获取并加工数据的技术案例 在数据集成的生命周期中,调用源系统接口是至关重要的一步。本文将详细探讨如何通过轻易云数据集成平台调用用友BIP接口`/yonbip/scm/othoutrecord/list`,并对获取的数据进行加工处理。 #### 接口调用配置 首先,我们需要配置API调用的元数据。以下是该接口的基本配置: ```json { "api": "/yonbip/scm/othoutrecord/list", "method": "POST", "number": "code", "id": "othOutRecords_id", "idCheck": true, "formatResponse": [ {"old": "id", "new": "new_id", "format": "string"}, {"old": "warehouse", "new": "new_warehouse", "format": "string"}, {"old": "othOutRecords_id", "new": "new_othOutRecords_id", "format": "string"} ], ... } ``` #### 请求参数设置 在请求参数部分,我们需要根据业务需求设置相关字段。例如,分页参数、日期范围、仓库名称等。以下是一些关键请求参数的配置: ```json { "request": [ {"field": "pageIndex", "label": "页码", "type": "string", "describe": "例:1 默认值:1", "value":"1"}, {"field": "pageSize", "label":"每页数","type":"string","describe":"例:10 默认值:10","value":"500"}, {"field":"isSum","label":"查询表头","type":"string","describe":"例:false 默认值:false"}, {"field":"code","label":"单据编码","type":"string"}, {"field":"open_vouchdate_begin","label":"开始日期","type":"string"}, {"field":"open_vouchdate_end","label":"结束日期","type":"string"}, ... ] } ``` #### 数据过滤条件 为了确保获取的数据符合业务需求,可以使用过滤条件。例如,以下是一些常见的过滤条件配置: ```json { "simpleVOs":[ { "field1":{ ... {"field":"field","label":"查询字段","type":"string","parent":"params","value":"auditTime"}, {"field":"op","label":"比较符","type":"string","parent":"params","value":"egt"}, {"field":"value1","label":"值1","type":"string","describe":"","value":"{{LAST_SYNC_TIME|datetime}}"} } }, { ... {"field2":{ ... {"field":"field","label":"查询字段","type":"string","parent":"params","value":"org"}, {"field":"op","label":"比较符","type":"string","parent":"params","value":"neq"}, {"field":"value1","label":"","type":"","describe":"","value":"","parent":"","value1":"","describe":"","value2":"","expr1":"","expr2":"","column":"","condition":[]} }} } ] } ``` #### 响应数据格式化 为了便于后续的数据处理和写入,需要对响应数据进行格式化。例如,将原始字段名转换为新的字段名,并指定数据类型: ```json { ... { "formatResponse":[ {"old": "id", "new": "new_id", "format" : "string"}, {"old" : "warehouse", "new" : "new_warehouse", "format" : "string"}, {"old" : "othOutRecords_id", "new" : "new_othOutRecords_id", "format" : "string"} ] } } ``` #### 实际操作步骤 1. **配置API调用**:在轻易云平台上创建一个新的API调用任务,输入上述元数据配置。 2. **设置请求参数**:根据业务需求填写具体的请求参数,如页码、每页数量、日期范围等。 3. **添加过滤条件**:根据业务逻辑添加必要的过滤条件,以确保获取的数据准确无误。 4. **格式化响应数据**:设置响应数据格式化规则,将原始字段名转换为新的字段名,并指定相应的数据类型。 5. **执行任务**:运行API调用任务,获取并处理数据。 通过上述步骤,我们可以成功调用用友BIP接口`/yonbip/scm/othoutrecord/list`,并对获取的数据进行有效的加工处理,为后续的数据转换与写入奠定基础。这一过程不仅提高了数据处理效率,还确保了数据的一致性和准确性。 ![金蝶与WMS系统接口开发配置](https://pic.qeasy.cloud/S7.png~tplv-syqr462i7n-qeasy.image) ### 使用轻易云数据集成平台进行ETL转换并写入旺店通·企业奇门API接口 在数据集成生命周期的第二步,我们需要将已经集成的源平台数据进行ETL转换,转为目标平台旺店通·企业奇门API接口所能够接收的格式,并最终写入目标平台。以下是具体的技术实现过程。 #### 元数据配置解析 我们使用以下元数据配置来完成ETL转换: ```json { "api": "wdt.vip.wms.stockinout.order.push", "effect": "EXECUTE", "method": "POST", "idCheck": true, "operation": { "method": "merge", "field": "new_warehouse,code", "bodyName": "details", "bodySum": ["othOutRecords_qty"], "header": ["new_warehouse", "omsOutWarehouse", "code", "memo", "bustype_name"], "body": ["product_cCode", "othOutRecords_product_cCode", "othOutRecords_qty", "othOutRecords_memo"] }, "request": [ {"field": "api_outer_no", "label": "外部单号", "type": "string", "describe": "外部单号", "value": "{code}"}, {"field": "warehouse_no", "label": "仓库编码", "type": "string", "describe": "仓库编码", "value": "{omsOutWarehouse}"}, {"field": "order_type", "label": "出入类型", "type": string, describe: 可选值:1(出库);2(入库),"value":"1"}, {"field":"is_check","label":"是否审核","type":"string","describe":"是否审核","value":"1"}, {"field":"remark","label":"备注","type":"string","describe":"备注","value":"YS{bustype_name}-{memo}"}, {"field":"goods_list","label":"货品明细节点","type":"array","describe":"货品明细节点","value":"details","children":[{"field":"spec_no","label":"商家编码","type":"string","describe":"商家编码","value":"{{details.othOutRecords_product_cCode}}"},{"field":"num","label":"入库数量","type":"string","describe":"入库数量","value":"{{details.othOutRecords_qty}}"},{"field":"price","label":"原价","type":"string"},{"field":"remark","label":"备注","type:"string,"value:"{{details.othOutRecords_memo}}"}]} ], otherRequest: [{"field:"stockin_info,"label:"stockin_info,"type:"string,"describe:"111"}] } ``` #### 数据转换与写入步骤 1. **数据请求与清洗**: - 在此阶段,我们从源系统获取原始数据,并进行必要的数据清洗和预处理。这一步骤确保了后续的数据转换能够顺利进行。 2. **数据转换**: - 使用元数据配置中的`operation`部分,我们将源数据字段映射到目标API所需的字段。 - `method`指定了合并操作,`field`定义了用于合并的关键字段,`bodyName`指定了子节点名称,`bodySum`定义了需要汇总的字段。 - `header`和`body`分别定义了需要映射的头部和子节点字段。 3. **构建请求体**: - 根据元数据配置中的`request`部分,我们构建API请求体。 - 每个字段都有明确的映射规则,例如,外部单号(api_outer_no)映射到源数据中的{code}字段,仓库编码(warehouse_no)映射到{omsOutWarehouse}字段等。 - 特别注意货品明细节点(goods_list)的构建,其中包括商家编码、入库数量、备注等信息。 4. **发送请求**: - 使用HTTP POST方法,将构建好的请求体发送到旺店通·企业奇门API接口。 - 确保在发送前进行了必要的ID检查(idCheck: true),以避免重复提交或数据冲突。 5. **处理响应**: - 接收到目标系统的响应后,根据响应状态和内容进行相应处理。 - 如果成功,则记录日志并更新相关状态;如果失败,则捕获错误信息并进行相应处理,如重试或报警。 #### 示例代码 以下是一个简化的Python示例代码,用于展示如何使用上述元数据配置完成ETL转换并调用目标API: ```python import requests import json # 源数据示例 source_data = { 'code': '123456', 'omsOutWarehouse': 'WH001', 'bustype_name': '销售出库', 'memo': '订单123456', 'details': [ {'othOutRecords_product_cCode': 'P001', 'othOutRecords_qty': 10, 'othOutRecords_memo': '无'}, {'othOutRecords_product_cCode': 'P002', 'othOutRecords_qty': 5, 'othOutRecords_memo': '无'} ] } # 构建请求体 request_body = { 'api_outer_no': source_data['code'], 'warehouse_no': source_data['omsOutWarehouse'], 'order_type': '1', 'is_check': '1', 'remark': f"YS{source_data['bustype_name']}-{source_data['memo']}", 'goods_list': [ { 'spec_no': item['othOutRecords_product_cCode'], 'num': item['othOutRecords_qty'], 'price': '', 'remark': item['othOutRecords_memo'] } for item in source_data['details'] ] } # 调用目标API response = requests.post( url='https://api.wangdian.cn/wdt/vip/wms/stockinout/order/push', headers={'Content-Type': 'application/json'}, data=json.dumps(request_body) ) # 处理响应 if response.status_code == 200: print('Data successfully pushed to WDT API') else: print(f'Failed to push data: {response.text}') ``` 通过上述步骤和示例代码,我们可以高效地将源平台的数据经过ETL转换后写入旺店通·企业奇门API接口,实现不同系统间的数据无缝对接。 ![轻易云数据集成平台金蝶集成接口配置](https://pic.qeasy.cloud/T30.png~tplv-syqr462i7n-qeasy.image)