从旺店通退换货到用友BIP:技术解析与实践案例

  • 轻易云集成顾问-吴伟
### 退换货生成销售退货(线上)-p:从旺店通·企业奇门到用友BIP数据集成技术解析 在电商与ERP系统的无缝对接中,确保业务运营过程中各个环节的数据流畅与一致性是关键。本文将重点解析如何通过轻易云数据集成平台,将旺店通·企业奇门的退换货数据高效、安全地集成到用友BIP系统,为企业实现更为精确和及时的销售退货处理提供技术支持。 首先,我们要解决的是如何调用并定时可靠地抓取旺店通·企业奇门接口`wdt.refund.query`中的数据。这就需要我们处理接口的分页和限流问题,以防止因请求过多而导致的数据漏单状况。同时,还必须确保在大量数据快速写入到用友BIP过程中,不会出现性能瓶颈或异常。 针对不同平台的数据格式差异,通过定制化的数据映射对接来进行有效转换显得至关重要。此外,实现实时监控与日志记录也有助于即时发现并解决潜在的问题,从而保障整个数据处理过程的稳定运行。当发生错误时,我们还需通过设立完善的异常处理与错误重试机制来最大程度地减少影响,确保最终的数据完整性和一致性。 以下内容将具体探讨上述技术细节,并通过实际案例展示这些方案如何高效应用于“退换货生成销售退货(线上)-p”这个场景中,使读者能够深入了解整个系统对接及集成流程。 ![钉钉与CRM系统接口开发配置](https://pic.qeasy.cloud/D22.png~tplv-syqr462i7n-qeasy.image) ### 调用旺店通·企业奇门接口wdt.refund.query获取并加工数据 在数据集成的生命周期中,调用源系统接口是至关重要的一步。本文将详细探讨如何通过轻易云数据集成平台调用旺店通·企业奇门接口`wdt.refund.query`,获取并加工退换货数据。 #### 接口概述 `wdt.refund.query`接口用于查询退换货订单信息。该接口采用POST请求方式,支持分页查询,并且可以根据不同的条件进行过滤。以下是元数据配置中的关键字段和参数: - **api**: `wdt.refund.query` - **method**: `POST` - **number**: `refund_no` - **id**: `refund_id` - **pagination**: `{"pageSize":40}` - **idCheck**: `true` - **beatFlat**: `["refund_order_list"]` #### 请求参数详解 请求参数决定了我们能够获取到的数据范围和精度。以下是主要的请求参数及其配置: 1. **process_status**(退换单处理状态) - 类型:string - 描述:退换单处理状态,例如70表示部分到货,90表示已完成。 - 示例值:70, 90 2. **time_type**(时间类型) - 类型:string - 描述:0表示最后更新时间,1表示结算时间。 - 默认值:0 3. **start_time**(开始时间) - 类型:string - 描述:按最后修改(结算)时间增量获取数据,格式为yyyy-MM-dd HH:mm:ss。 - 示例值:{{LAST_SYNC_TIME|datetime}} 4. **end_time**(结束时间) - 类型:string - 描述:按最后修改时间(结算)增量获取数据,格式为yyyy-MM-dd HH:mm:ss。 - 示例值:{{CURRENT_TIME|datetime}} 5. **page_size**(分页大小) - 类型:string - 描述:每页返回的数据条数,范围1~40。 - 默认值:40 6. **shop_no**(店铺编号) - 类型:string - 描述:店铺编号,用于过滤特定店铺的数据。 7. **page_no**(页号) - 类型:string - 描述:分页查询的页码,不传值默认从0页开始。 8. **refund_no**(Erp内退换单编号) - 类型:string - 描述:ERP内退换单编号,可以不传时间字段。 9. **src_refund_no**(平台原始退换单号) - 类型:string - 描述:平台原始退换单号,可以不传时间字段。 10. **trade_no**(系统订单编号) - 类型:string - 描述:系统订单编号,可以不传时间字段。 11. **tid**(原始单号) - 类型:string - 描述:原始单号,可以不传时间字段。 #### 条件过滤与逻辑运算 元数据配置中定义了多个条件过滤逻辑,用于精确筛选所需的数据。例如: ```json "condition":[[ {"field":"process_status","logic":"egt","value":"70","strictMode":true}, {"field":"type","logic":"eq","value":2}, {"field":"shop_no","logic":"neqv2","value":"SJ002"}, {"field":"shop_no","logic":"neqv2","value":"SJ004"}, {"field":"shop_no","logic":"neqv2","value":"SJ005"}, {"field":"shop_no","logic":"neqv2","value":"SJ006"}, {"field":"shop_no","logic":"neqv2","value":"SJ007"}, {"field":"shop_no","logic":"neqv2","value":"SJ010"} ]] ``` 上述条件表示: - `process_status`大于等于70且严格模式下有效。 - `type`等于2。 - 排除特定的店铺编号如SJ002, SJ004等。 #### 数据请求与清洗 在调用接口后,我们会得到一个包含多个退换货订单信息的JSON响应。为了确保数据的准确性和一致性,需要对这些数据进行清洗和转换。例如: 1. 检查每个订单的`refund_id`是否唯一,以避免重复记录。 2. 对返回的数据进行扁平化处理,将嵌套结构展开为平面结构,例如将`refund_order_list`中的每个子项提取出来作为独立记录。 #### 实际案例操作步骤 1. 配置API请求参数: ```json { "api": "wdt.refund.query", "method": "POST", "request": { "process_status": "70", "time_type": "0", "start_time": "{{LAST_SYNC_TIME|datetime}}", "end_time": "{{CURRENT_TIME|datetime}}", "page_size": "40", "page_no": "0" } } ``` 2. 发起API请求并接收响应: ```json { "response": { "total_count": 100, "refund_order_list": [ { "refund_id": "12345", "refund_no": "R20231001", ... }, ... ] } } ``` 3. 数据清洗与转换: ```python def clean_data(response): cleaned_data = [] for order in response['refund_order_list']: if check_unique(order['refund_id']): cleaned_data.append(flatten(order)) return cleaned_data def check_unique(refund_id): # 检查ID是否唯一的逻辑实现 pass def flatten(order): # 扁平化处理逻辑实现 pass ``` 通过上述步骤,我们能够高效地从旺店通·企业奇门接口获取并处理退换货订单信息,为后续的数据集成和分析奠定基础。 ![打通钉钉数据接口](https://pic.qeasy.cloud/S2.png~tplv-syqr462i7n-qeasy.image) ### 数据转换与写入用友BIPAPI接口的技术实现 在数据集成生命周期中,将源平台的数据转换为目标平台所能接收的格式是关键步骤之一。本文将详细探讨如何利用轻易云数据集成平台,将退换货生成销售退货的数据转换为用友BIPAPI接口能够接收的格式,并最终写入目标平台。 #### API接口配置 首先,我们需要配置API接口,确保数据能够正确传输到用友BIP。根据元数据配置,我们使用`/yonbip/sd/vouchersalereturn/singleSave`作为目标API,采用POST方法进行数据提交。 ```json { "api": "/yonbip/sd/vouchersalereturn/singleSave", "method": "POST" } ``` #### 数据请求与清洗 在数据请求阶段,我们需要确保从源系统获取的数据是完整且准确的。以下是部分关键字段及其描述: - `refund_no`: 退货单号 - `shop_no`: 店铺编号 - `remark`: 备注 - `modified`: 修改时间 - `actual_refund_amount`: 实际退款金额 - `warehouse_no`: 仓库编号 - `tid`: 原始单号 这些字段将在后续的数据转换过程中被映射到目标系统所需的字段中。 #### 数据转换与写入 接下来,我们进入数据转换阶段。我们需要将源数据映射到用友BIPAPI接口所需的格式。以下是部分关键字段及其映射规则: 1. **表头字段映射** ```json { "resubmitCheckKey": "{refund_no}", "code": "{refund_no}", "salesOrgId": "_findCollection find mapping_sale_org from 4769a428-14c4-33b8-91fd-e8da3b39d5cb where shop_no={shop_no}", "transactionTypeId": "1480261131563434158", "agentId": "_findCollection find mapping_customer from 4769a428-14c4-33b8-91fd-e8da3b39d5cb where shop_no={shop_no}", "vouchdate": "{modified}", "remark": "{remark}" } ``` 2. **表体字段映射** 表体字段涉及到退货商品的详细信息,需要逐一映射: ```json { "saleReturnDetails": [ { "productId": "{{refund_order_list.refund_order_list_spec_no}}", "skuId": "{{refund_order_list.refund_order_list_spec_no}}", "stockId": "{warehouse_no}", "subQty": "{{refund_order_list.refund_order_list_refund_num}}", "oriTaxUnitPrice": "_function round((round({{refund_order_list.refund_order_list_refund_order_amount}},2)/{{refund_order_list.refund_order_list_refund_num}}),2)", "oriUnitPrice": "_function round((round({{refund_order_list.refund_order_list_refund_order_amount}},2)/{{refund_order_list.refund_order_list_refund_num}})/1.13,2)", "oriSum": "_function round({{refund_order_list.refund_order_list_refund_order_amount}},2)", ... } ] } ``` 3. **计算字段** 在表体字段中,有些字段需要通过计算得出。例如: ```json { "oriTaxUnitPrice": "_function round((round({{refund_order_list.refund_order_list_refund_order_amount}},2)/{{refund_order_list.refund_order_list_refund_num}}),2)", "oriUnitPrice": "_function round((round({{refund_order_list.refund_order_list_refund_num}},2)/1.13,2)" } ``` #### 提交数据 完成数据转换后,通过POST方法将数据提交到用友BIPAPI接口: ```json { "url": "/yonbip/sd/vouchersalereturn/singleSave", "method": "POST", ... } ``` #### 审批流程 最后,为了确保数据的有效性和合规性,可以调用审批接口进行审核: ```json { "url": "/yonbip/sd/vouchersalereturn/approve", ... } ``` 通过以上步骤,我们实现了从源系统获取数据、清洗并转换为目标系统所需格式,最终成功写入用友BIP平台。这一过程不仅提高了数据处理效率,也确保了业务流程的透明和可追溯性。 ![金蝶与MES系统接口开发配置](https://pic.qeasy.cloud/T4.png~tplv-syqr462i7n-qeasy.image)