旺店通·企业奇门数据集成到用友BIP:退货入库对接YS销售出库(红字) 实践分享
在企业信息系统中,不同平台间的数据对接往往是一个复杂且关键的过程。本篇文章将聚焦于一个实际运行的案例,即如何将旺店通·企业奇门中的退货入库数据高效、可靠地集成到用友BIP系统,具体方案名称为“退货入库对接YS销售出库(红字)-v”。本文提供了一些实践经验和技术要点,供大家参考。
首先,我们使用了旺店通·企业奇门提供的API接口wdt.stockin.order.query.refund
来定时抓取退货入库的数据。为了确保数据不漏单并增加数据获取的成功率,在设计过程中我们重点考虑了接口调用的限流和分页处理,并制定了异常处理与错误重试机制。这些措施有效避免了由于网络波动或其他因素导致的数据丢失情况。
此外,为解决大量数据快速写入用友BIP的问题,我们深入研究并运用了其API /yonbip/scm/salesout/mergeSourceData/save
。通过批量操作提高写入效率,同时结合轻易云的平台特性,保证每个步骤在全生命周期内透明可视化,实现实时监控和日志记录。不仅如此,对于两者之间的数据格式差异,我们基于用友BIP的平台特性进行了定制化数据映射,以实现无缝衔接。
值得一提的是,该项目还采用了一系列定制化手段,对不同类型或者异常状态进行多层次、分类别地细致管理。例如,通过精确划分业务逻辑,保障涉及任何问题都能被迅速定位及自动修复,从而提高整个流程的信息一致性和可靠性。
综合以上所述,本次技术实践不仅展示了如何高效完成旺店通·企业奇门与用友BIP之间的数据集成,还提出了一套行之有效的方法论,可以为类似场景下其他系统间的数据对接提供有益借鉴。在后续内容中,我们将进一步解析各环节的具体实施细节,包括调用示例代码、配置策略等,以便更直观地了解整个集成过程。
调用旺店通·企业奇门接口wdt.stockin.order.query.refund获取并加工数据
在数据集成的生命周期中,调用源系统接口是至关重要的一步。本文将详细探讨如何通过轻易云数据集成平台调用旺店通·企业奇门接口wdt.stockin.order.query.refund
,并对获取的数据进行加工处理。
接口调用配置
首先,我们需要配置接口调用的元数据。根据提供的元数据配置,我们可以看到该接口采用POST方法,并且支持分页查询。以下是具体的配置细节:
- API名称:
wdt.stockin.order.query.refund
- 请求方法:
POST
- 分页大小: 50条记录
- 请求参数:
start_time
: 开始时间,格式为yyyy-MM-dd HH:mm:ss
end_time
: 结束时间,格式为yyyy-MM-dd HH:mm:ss
status
: 入库单状态,默认查询已完成单据(80)shop_no
: 店铺编号,用于区分不同店铺的数据page_size
: 每页返回的数据条数,范围1~50,默认40page_no
: 页号,从0页开始
请求参数设置
为了实现增量数据获取,我们需要动态设置start_time
和end_time
参数。通常情况下,这两个参数分别对应上次同步时间和当前时间:
{
"start_time": "{{LAST_SYNC_TIME|datetime}}",
"end_time": "{{CURRENT_TIME|datetime}}",
"status": "80",
"shop_no": "your_shop_no",
"page_size": "{PAGINATION_PAGE_SIZE}",
"page_no": "{PAGINATION_START_PAGE}"
}
其中,{{LAST_SYNC_TIME|datetime}}
和{{CURRENT_TIME|datetime}}
是平台内置的变量,用于动态获取上次同步时间和当前时间。
数据格式化与转换
在获取到原始数据后,需要对部分字段进行格式化处理。例如,将返回结果中的stockin_time
字段重新命名为stockin_time_new
并转换为日期格式:
"formatResponse": [
{
"old": "stockin_time",
"new": "stockin_time_new",
"format": "date"
}
]
这种转换确保了数据在后续处理阶段的一致性和可读性。
数据请求与清洗
通过上述配置,我们可以发起对源系统的请求,并获取相应的退货入库单据数据。在实际操作中,可以使用以下代码片段来实现这一过程:
import requests
import json
url = 'https://api.wangdian.cn/openapi2/wdt.stockin.order.query.refund'
headers = {'Content-Type': 'application/json'}
payload = {
'start_time': '2023-01-01 00:00:00',
'end_time': '2023-01-31 23:59:59',
'status': '80',
'shop_no': 'your_shop_no',
'page_size': 50,
'page_no': 0
}
response = requests.post(url, headers=headers, data=json.dumps(payload))
data = response.json()
# 数据清洗与转换
for record in data['orders']:
record['stockin_time_new'] = convert_to_date(record['stockin_time'])
其中,convert_to_date()
函数用于将字符串类型的日期转换为标准日期格式。
异常处理与重试机制
在实际操作中,还需要考虑网络异常、接口超时等问题。可以通过设置重试机制来提高数据请求的可靠性:
import time
def fetch_data_with_retry(url, headers, payload, retries=3):
for attempt in range(retries):
try:
response = requests.post(url, headers=headers, data=json.dumps(payload))
if response.status_code == 200:
return response.json()
else:
print(f"Error: {response.status_code}")
except Exception as e:
print(f"Exception occurred: {e}")
time.sleep(2 ** attempt) # 指数退避策略
return None
data = fetch_data_with_retry(url, headers, payload)
通过上述步骤,我们能够高效地调用旺店通·企业奇门接口获取退货入库单据,并对数据进行必要的清洗和转换,为后续的数据处理和分析奠定基础。
轻易云数据集成平台:将源平台数据转换为用友BIPAPI接口格式并写入目标平台
在数据集成生命周期的第二步中,我们需要将已经集成的源平台数据进行ETL转换,使其符合用友BIPAPI接口所能够接收的格式,并最终写入目标平台。本文将深入探讨如何利用轻易云数据集成平台完成这一任务,特别是通过配置元数据来实现这一过程。
API接口配置
首先,我们需要了解目标平台用友BIPAPI接口的具体配置要求。根据提供的元数据配置,API接口路径为/yonbip/scm/salesout/mergeSourceData/save
,请求方法为POST
。以下是详细的请求字段及其描述:
- mergeSourceData: 是否合并上游数据,值为
true
时,需要提供来源单据主表ID、来源单据行ID、单据转换规则和操作标识。 - vouchdate: 单据日期,例如
2020-11-30 00:00:00
。 - warehouse: 仓库ID或编码,例如
Z001
。 - bizFlow: 流程ID,例如
4420f835-f5e0-11ec-9896-6c92bf477043
。 - bizFlow_version: 流程版本,例如
V1.0
。 - code: 单据编号,例如
XSCK20201130000002
。 - bustype: 交易类型ID或编码,例如
A30001
。 - details: 销售出库单子表,包括数量、来源单据主表ID、来源单据行ID、批次号、单据转换规则、货位和操作标识等字段。
数据转换与写入
在轻易云数据集成平台中,我们可以通过配置ETL流程来实现上述字段的数据转换与写入。以下是关键步骤:
-
提取源数据
- 从源系统提取退货入库相关的数据。这些数据可能包括退货单编号、商品编号、数量等信息。
-
数据清洗与转换
- 根据业务需求,对提取的数据进行清洗和转换。例如,将退货数量转为负数以符合销售出库(红字)的要求:
{ "field": "qty", "label": "数量", "type": "string", "describe": "数量 示例:12", "value": "_function {{details_list.goods_count}}*(-1)" }
- 根据业务需求,对提取的数据进行清洗和转换。例如,将退货数量转为负数以符合销售出库(红字)的要求:
-
映射到目标字段
- 将清洗后的数据映射到用友BIPAPI接口所需的字段。例如,将源系统中的仓库编号映射到目标系统中的仓库字段:
{ "field": "warehouse", "label": "仓库id或编码", "type": "string", "describe": "仓库id或编码 示例:Z001", "value": "{warehouse_no}" }
- 将清洗后的数据映射到用友BIPAPI接口所需的字段。例如,将源系统中的仓库编号映射到目标系统中的仓库字段:
-
处理关联关系
- 处理与上游单据的关联关系。例如,通过查询获取来源单据主表ID和行ID:
{ "field": "sourceid", "label": "来源单据主表id", "type": "string", "describe": "来源单据主表id,如果有来源则必输", "value": "_findCollection find new_id from 0f0e68a8-e0e7-3b16-b5d0-a92181fac0a6 where code={src_order_no}" }, { "field": "sourceautoid", "label": "来源单据行id", "type": "string", "describe": "来源单据行id,有来源必输", "value": "_mongoQuery fa473892-f9ab-3980-849e-5ef4c61d75bb findField=content.new_saleReturnDetailId where={\"content.code\":{\"$eq\":\"{src_order_no}\"},\"content.skuCode\":{\"$eq\":\"{{details_list.goods_no}}\"},\"content.saleReturnDetailDefineCharacter.attrext50\":{\"$eq\":\"{{details_list.src_order_detail_id}}\"}}" }
- 处理与上游单据的关联关系。例如,通过查询获取来源单据主表ID和行ID:
-
构建请求体并发送请求
- 构建完整的请求体,包括所有必要字段和子表信息:
{ "mergeSourceData": true, ... "_status": "Insert" }
- 使用POST方法将请求体发送到用友BIPAPI接口路径。
- 构建完整的请求体,包括所有必要字段和子表信息:
实践案例
假设我们有一条退货入库记录,其退货单编号为"THRK20201130000001",商品编号为"SP001",数量为10,仓库编号为"Z001"。我们需要将其转换为销售出库(红字)记录并写入用友BIP系统。
-
提取源数据:
{ "src_order_no": "THRK20201130000001", ... }
-
数据清洗与转换:
{ ... {"field":"qty","value":"_function {{details_list.goods_count}}*(-1)"}, ... }
-
映射到目标字段:
{ ... {"field":"warehouse","value":"Z001"}, ... }
-
处理关联关系:
{ ... {"field":"sourceid","value":"_findCollection find new_id from ... where code={src_order_no}"}, {"field":"sourceautoid","value":"_mongoQuery ... findField=content.new_saleReturnDetailId where={...}"} ... }
-
构建请求体并发送请求:
{ ... "_status":"Insert" }
通过上述步骤,我们可以成功地将源平台的数据转换为用友BIPAPI接口所需的格式,并写入目标平台,实现了高效的数据集成。