用友BIP数据集成到旺店通·企业奇门案例分享:采购订单(红字)=>采购退料单-p
在本次技术案例中,我们将重点讨论如何高效地实现用友BIP系统中的采购订单(红字)数据与旺店通·企业奇门的采购退料单的数据对接。该解决方案旨在确保数据传输过程中的准确性、及时性和可靠性。
集成需求分析
首先,我们需要从用友BIP系统获取特定条件下的采购订单(红字)信息,并通过API接口/yonbip/scm/purchaseorder/list
进行实时抓取。随后,这些数据将按照业务规则转化为旺店通·企业奇门所需的格式,通过API接口wdt.purchase.return.push
批量写入。
数据获取与处理策略
为了保证集成过程中不漏单且不引起性能瓶颈,采用了以下关键措施:
-
分页和限流处理:由于用友BIP接口存在分页限制,需要针对大批量数据进行分页抓取,同时考虑到限流问题,在每次请求之间设置合理间隔,以避免触发API调用限制。
-
实时监控与日志记录:对整个数据处理过程进行实时监控,并详细记录日志。一旦出现错误或异常情况,可以快速定位并解决问题,确保数据完整传输。
-
定时任务调度:设计并实现定时任务,每隔固定时间段自动执行一次全流程操作,保证最新的数据能够及时同步至旺店通·企业奇门。
-
异常处理与重试机制:集成过程中难免会遇到网络抖动或服务临时不可用等情况,为此加入了全面的异常捕捉逻辑及重试机制,对于失败的操作会按照预设次数和间隔再次尝试,最大程度提高成功率。
数据格式转换与映射
由于用友BIP和旺店通·企业奇门两者的数据结构存在差异,我们必须对原始返回的数据做适当的数据转换和映射。如统一字段名称、调整数值精度等工作必不可少。同时,还要根据业务需求自定义一些必要字段,从而满足目标系统对于输入参数的严格要求。在这一过程中使用了灵活易懂的数据映射工具,提高开发效率及可维护性。
本文接下来将详细介绍具体实施步骤,包括如何调用上述两个核心API进行有效通讯,以及应对此类复杂场景中的实际代码示例。我们着力于让整套方案具备良好的鲁棒性,同时保留尽可能高的性能表现。
调用用友BIP接口获取并加工采购订单数据
在数据集成的生命周期中,第一步是调用源系统接口获取数据,并对其进行初步加工。本文将详细探讨如何通过轻易云数据集成平台调用用友BIP接口/yonbip/scm/purchaseorder/list
来获取采购订单数据,并进行相应的数据清洗和转换。
接口调用配置
首先,我们需要配置API请求的元数据。根据提供的元数据配置,我们可以看到该接口使用POST方法,以下是具体的请求参数:
- 页码 (pageIndex): 默认值为1。
- 每页数 (pageSize): 默认值为1000。
- 查询表头 (isSum): 默认值为false。
- 查询条件 (simpleVOs):
- 过滤条件1: 查询字段为
totalQuantity
,比较符为elt
(小于等于)。 - 过滤条件2: 查询字段为
auditTime
,比较符为egt
(大于等于),值为上次同步时间。 - 过滤条件3: 查询字段为
org
,比较符为eq
(等于),值为特定组织ID1553156871271481351
。
- 过滤条件1: 查询字段为
- 排序字段 (queryOrders):
- 排序条件字段为
id
,顺序为asc
(正序)。
- 排序条件字段为
数据请求与清洗
在完成API调用配置后,我们需要发送请求并处理返回的数据。以下是一个示例请求体:
{
"pageIndex": "1",
"pageSize": "1000",
"isSum": "false",
"simpleVOs": {
"field1": {
"field": "totalQuantity",
"op": "elt"
},
"field2": {
"field": "auditTime",
"op": "egt",
"value1": "{{LAST_SYNC_TIME|datetime}}"
},
"field3": {
"field": "org",
"op": "eq",
"value1": "1553156871271481351"
}
},
"queryOrders": [
{
"field": "id",
"order": "asc"
}
]
}
数据格式转换
为了确保数据能被目标系统正确识别和处理,我们需要对返回的数据进行格式转换。根据元数据配置中的 formatResponse
字段,我们需要将返回的数据字段进行重命名和格式化。例如:
- 将返回的
id
字段重命名为new_id
- 将
purchaseOrders_id
重命名为new_purchaseOrders_id
- 将
headFreeItem.define1
重命名为new_headFreeItem
- 将
vendor
重命名为new_vendor
- 将
warehouse
重命名为new_warehouse
以下是一个示例转换后的数据结构:
{
"new_id": "<string>",
"new_purchaseOrders_id": "<string>",
"new_headFreeItem": "<string>",
"new_vendor": "<string>",
"new_warehouse": "<string>"
}
实际应用案例
假设我们从用友BIP接口获取到如下原始数据:
{
"id": 12345,
"purchaseOrders_id": 67890,
"headFreeItem.define1": null,
"vendor": {
// Vendor details
},
"warehouse": {
// Warehouse details
}
}
经过格式转换后,最终的数据结构如下:
{
"new_id": "12345",
"new_purchaseOrders_id": "67890",
"new_headFreeItem": "",
// Assuming vendor and warehouse are complex objects, they would be handled accordingly.
}
通过上述步骤,我们成功地调用了用友BIP接口获取采购订单数据,并进行了必要的数据清洗和格式转换,为后续的数据处理和写入打下了坚实的基础。这种全透明可视化的操作方式,不仅提升了业务透明度,还极大提高了效率。
轻易云数据集成平台ETL转换至旺店通·企业奇门API接口的技术案例
在数据集成生命周期的第二阶段,我们需要将已经集成的源平台数据进行ETL转换,转为目标平台——旺店通·企业奇门API接口所能够接收的格式,并最终写入目标平台。以下是一个详细的技术案例,展示如何使用轻易云数据集成平台完成这一过程。
元数据配置解析
首先,我们需要了解元数据配置中的各个字段及其作用:
{
"api": "wdt.purchase.return.push",
"method": "POST",
"idCheck": true,
"operation": {
"method": "merge",
"field": "vendor,warehouse,code,new_headFreeItem,new_memo",
"bodyName": "detail_list",
"header": ["new_vendor", "new_warehouse", "code", "new_headFreeItem", "new_memo", "vendor_code"],
"body": ["product_cCode", "purchaseOrders_subQty", "listOriSum", "oriTaxUnitPrice", "listOriSum", "new_purchaseOrders_memo", "listTaxRate", "oriUnitPrice"]
},
...
}
这里定义了API接口wdt.purchase.return.push
,采用POST请求方法,并启用了ID检查(idCheck: true
)。操作部分指定了合并(merge
)方法,将源数据中的特定字段映射到目标API请求中。
请求参数解析与映射
元数据配置中定义了多个请求参数,每个参数都包含字段名、标签、类型、描述和值等信息。例如:
{
"field": "provider_no",
...
"value": "{vendor_code}"
},
{
...
}
这些参数将源数据中的字段映射到目标API的请求参数中。具体来说,provider_no
对应源数据中的vendor_code
,这确保了供应商编号能够正确传递给目标系统。
明细列表节点处理
一个关键部分是处理明细列表节点(detail_list
),这是一个数组类型的数据节点,包含采购退货单所有货品明细属性信息:
{
...
{
"field": "spec_no",
...
"value": "{{detail_list.product_cCode}}"
},
{
...
}
]
每个子节点代表采购退货单中的一个属性,例如商品编码(spec_no
)、退货数量(num
)、单价(price
)等。这些子节点通过模板语法从源数据中提取相应的值。
数据转换逻辑实现
在ETL过程中,我们需要实现以下关键步骤:
- 提取与清洗:从源系统提取原始数据,并进行必要的数据清洗和预处理。
- 转换:根据元数据配置,将清洗后的数据转换为目标系统所需的格式。
- 写入:将转换后的数据通过API接口写入目标系统。
以下是一个示例代码片段,展示如何实现这些步骤:
import requests
import json
# 提取与清洗
source_data = get_source_data() # 假设这是从源系统获取的数据
cleaned_data = clean_data(source_data) # 数据清洗
# 转换
transformed_data = transform_data(cleaned_data, metadata_config) # 根据元数据配置进行转换
# 写入
api_url = 'https://api.wangdian.cn/erp/openapi2/wdt.purchase.return.push'
headers = {'Content-Type': 'application/json'}
response = requests.post(api_url, headers=headers, data=json.dumps(transformed_data))
if response.status_code == 200:
print("Data successfully written to target system.")
else:
print(f"Failed to write data: {response.text}")
转换函数示例
具体的转换函数可能如下所示:
def transform_data(data, config):
transformed = {}
for field in config['request']:
transformed[field['field']] = evaluate_expression(field['value'], data)
detail_list = []
for item in data['detail_list']:
detail_item = {}
for field in config['request'][5]['children']:
detail_item[field['field']] = evaluate_expression(field['value'], item)
detail_list.append(detail_item)
transformed['detail_list'] = detail_list
return transformed
def evaluate_expression(expression, context):
# 简单实现模板表达式解析,可以使用更复杂的模板引擎如Jinja2
return expression.format(**context)
上述代码展示了如何根据元数据配置将源数据转换为目标API所需的格式,并通过POST请求将其写入目标系统。通过这种方式,我们能够实现不同系统间的数据无缝对接,确保业务流程顺畅高效。