用友BIPAPI接口数据集成与转换实战

  • 轻易云集成顾问-曹润
### 系统对接集成案例分享:旺店通·企业奇门数据集成到用友BIP 在电子商务快速发展的背景下,如何高效、准确地处理退换货订单成为了各个企业关注的焦点。具体而言,将旺店通·企业奇门所生成的销售退货数据无缝集成到用友BIP系统中,是一个典型且复杂的技术挑战。本文聚焦于实际运行的方案“退换货生成销售退货(线下)-p”,详细探讨相关技术细节与实现方法。 首先,确保在从旺店通获取数据时不漏单至关重要。因此,我们通过定时抓取机制调用企业奇门接口`wdt.refund.query`,实时监控并记录每一次查询操作。同时,为保证大量数据能快速、高效地写入到用友BIP,我们采用批量提交策略,并灵活运用了分页和限流机制,有效避免了网络拥堵和服务器压力过大等问题。 为了应对不同系统间的数据格式差异,我们设计并实现了一套自适应的数据映射模型,使得从旺店通获取的原始退款信息能够自动转换为符合用友BIP API `/yonbip/sd/vouchersalereturn/singleSave`要求的数据格式。在此过程中,不可忽视的是异常处理与错误重试机制,它们保障了整个流程的可靠性,即便遇到意外情况也能迅速恢复正常。 总之,通过精巧设计和严格验证,这一解决方案不仅提高了业务效率,还大幅减少了手动干预,从而提升整体运营水平。接下来将深入探讨具体步骤及代码实现细节,希望能为类似需求提供参考路径。 ![打通金蝶云星空数据接口](https://pic.qeasy.cloud/D13.png~tplv-syqr462i7n-qeasy.image) ### 调用旺店通·企业奇门接口wdt.refund.query获取并加工数据 在数据集成的生命周期中,调用源系统接口是至关重要的一步。本文将详细探讨如何通过轻易云数据集成平台调用旺店通·企业奇门接口`wdt.refund.query`,并对获取的数据进行初步加工。 #### 接口调用配置 首先,我们需要配置接口调用的元数据。根据提供的元数据配置,`wdt.refund.query`接口使用POST方法,主要参数如下: - `process_status`: 退换单处理状态 - `time_type`: 时间类型(0为最后更新时间,1为结算时间) - `start_time`: 开始时间 - `end_time`: 结束时间 - `page_size`: 分页大小(默认40) - `shop_no`: 店铺编号 - `page_no`: 页号(默认从0页开始) - 其他可选参数包括:`refund_no`, `src_refund_no`, `trade_no`, `tid` #### 数据请求与清洗 在调用接口时,我们需要设置请求条件,以确保获取的数据符合业务需求。以下是具体的请求条件配置: ```json { "process_status": {"logic": "egt", "value": "70", "strictMode": true}, "type": {"logic": "eq", "value": 2}, "shop_no": {"logic": "eq", "value": "SJ002"} } ``` 上述条件表示我们希望获取处理状态大于等于70且类型为2,并且店铺编号为SJ002的退换货记录。类似的条件可以根据不同的店铺编号和类型进行组合。 #### 数据转换与写入 在获取到原始数据后,需要对数据进行清洗和转换,以便后续处理和写入目标系统。以下是一个简单的数据清洗示例: ```python def clean_data(raw_data): cleaned_data = [] for record in raw_data: cleaned_record = { "refund_id": record.get("refund_id"), "refund_no": record.get("refund_no"), "process_status": record.get("process_status"), "shop_no": record.get("shop_no"), # 添加其他需要的字段 } cleaned_data.append(cleaned_record) return cleaned_data ``` 在这个函数中,我们提取了原始记录中的`refund_id`, `refund_no`, `process_status`, 和`shop_no`字段,并将其存储到新的列表中。 #### 分页处理 由于接口返回的数据可能会非常庞大,因此分页处理是必要的。在元数据配置中,分页大小已经设置为40。我们可以通过循环调用接口来处理分页数据: ```python def fetch_all_data(): page_no = 0 all_data = [] while True: response = call_api(page_no=page_no, page_size=40) data = response.get("data") if not data: break all_data.extend(data) page_no += 1 return all_data ``` 在这个函数中,我们通过循环不断增加页号来获取所有分页数据,直到没有更多数据返回为止。 #### 实际应用案例 假设我们需要获取某一时间段内所有符合条件的退换货记录,并将其写入到目标数据库中,可以按照以下步骤进行: 1. **设置时间范围**:确定开始时间和结束时间。 2. **调用接口**:使用上述分页处理函数获取所有符合条件的数据。 3. **数据清洗**:对原始数据进行清洗和转换。 4. **写入数据库**:将清洗后的数据写入目标数据库。 ```python start_time = "2023-01-01 00:00:00" end_time = "2023-01-31 23:59:59" raw_data = fetch_all_data(start_time=start_time, end_time=end_time) cleaned_data = clean_data(raw_data) # 假设有一个函数write_to_db用于写入数据库 write_to_db(cleaned_data) ``` 通过以上步骤,我们可以高效地从旺店通·企业奇门接口获取所需的退换货记录,并进行相应的数据处理和存储。这不仅提高了数据集成的效率,也确保了数据的一致性和准确性。 ![打通用友BIP数据接口](https://pic.qeasy.cloud/S24.png~tplv-syqr462i7n-qeasy.image) ### 用友BIPAPI接口数据集成技术案例:退换货生成销售退货 在轻易云数据集成平台的生命周期中,数据转换与写入是关键步骤之一。本文将详细探讨如何将已经集成的源平台数据进行ETL转换,并转为用友BIPAPI接口所能够接收的格式,最终写入目标平台。 #### 数据转换与写入配置 1. **API接口配置** 目标平台用友BIP的API接口配置如下: ```json { "api": "/yonbip/sd/vouchersalereturn/singleSave", "method": "POST", "idCheck": true, "BIPAudit": "/yonbip/sd/vouchersalereturn/approve" } ``` 2. **请求头配置** 请求头部分主要包含单据编码、销售组织、交易类型等信息。以下是具体字段及其值的配置: ```json [ {"field":"resubmitCheckKey","label":"保证请求的幂等性","type":"string","value":"{refund_no}"}, {"field":"code","label":"单据编码","type":"string","value":"{refund_no}"}, {"field":"salesOrgId","label":"销售组织","type":"string","value":"_findCollection find mapping_sale_org from 4769a428-14c4-33b8-91fd-e8da3b39d5cb where shop_no={shop_no}"}, {"field":"transactionTypeId","label":"交易类型","type":"string","value":"1480261131563434158"}, {"field":"agentId","label":"客户","type":"string","value":"_findCollection find mapping_customer from 4769a428-14c4-33b8-91fd-e8da3b39d5cb where shop_no={shop_no}"} // 其他字段略... ] ``` 3. **请求体配置** 请求体部分包括表头和表体信息,表头信息主要包括退货单的基本信息,如退货金额、仓库编号等;表体信息则包括每个退货商品的详细信息。以下是具体字段及其值的配置: ```json { "header": ["refund_no", "shop_no", "remark", "modified", "actual_refund_amount", "warehouse_no", "tid"], "body": [ {"field": "refund_order_list_spec_no", "value": "{{refund_order_list.refund_order_list_spec_no}}"}, {"field": "refund_order_list_refund_num", "value": "{{refund_order_list.refund_order_list_refund_num}}"}, {"field": "refund_order_list_refund_order_amount", "value": "{{refund_order_list.refund_order_list_refund_order_amount}}"}, // 其他字段略... ] } ``` 4. **数据转换逻辑** 在数据转换过程中,需要进行一些计算和格式化处理。例如,含税成交价、无税单价、含税金额等字段需要根据原始数据进行计算: ```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_order_amount}},2)/{{refund_order_list.refund_order_list_refund_num}})/1.13,2)", // 其他计算字段略... } ``` 5. **幂等性保证** 为了确保请求的幂等性,需要设置`resubmitCheckKey`,该值由客户端生成,并且必须是全局唯一的,长度不能超过32位: ```json { "resubmitCheckKey": "{refund_no}" } ``` 6. **提交与审核** 最后,将转换后的数据通过POST方法提交到用友BIPAPI接口,并调用审核接口进行审核: ```json { "method": "POST", "url": "/yonbip/sd/vouchersalereturn/singleSave", // 提交的数据内容略... } { "method": "POST", "url": "/yonbip/sd/vouchersalereturn/approve", // 审核的数据内容略... } ``` 通过以上步骤,我们实现了从源平台到用友BIP目标平台的数据ETL转换与写入。每个环节都需要严格按照元数据配置进行,以确保数据准确无误地传输和处理。 ![电商OMS与WMS系统接口开发配置](https://pic.qeasy.cloud/T10.png~tplv-syqr462i7n-qeasy.image)