金蝶采购订单同步至旺店通采购订单:技术集成案例分享
在企业日常运营中,系统间的数据集成是一个不可或缺的重要环节。本文将深入解析如何通过轻易云数据集成平台,实现金蝶云星空与旺店通·企业奇门之间的采购订单数据对接。本次案例重点展示了“金蝶采购订单同步至旺店通采购订单”的具体实现过程。
确保金蝶云星空数据不漏单
首先,需要确保从金蝶云星空获取到的每一条采购订单都能被准确无误地传递给旺店通·企业奇门。我们利用executeBillQuery接口来抓取金蝶云星空中的最新采购订单,借助定时任务功能,对该接口进行可靠调度,从而保证所有新生成的和更新过的采购单都能及时被捕获。
def fetch_kingdee_orders():
# 调用 executeBillQuery 接口获取新订单位据
response = requests.post('https://kingdee.api/executeBillQuery', data=payload)
if response.status_code == 200:
process_orders(response.json())
批量写入到旺店通·企业奇门
对于快速且大量的数据处理需求,在实际操作中,我们使用wdt.purchase.order.push接口将抓取到的多条批量购置单一次性写入到旺店通·企业奇门。这不仅提升了数据传输效率,还减少了网络请求次数,提高整体性能。
def push_to_wdt(orders):
for order in orders:
wdt_payload = map_kingdee_to_wdt(order)
response = requests.post('https://wdtong.api/wdt.purchase.order.push', data=wdt_payload)
# 错误重试机制
if not handle_response(response):
retry_push(wdt_payload)
数据格式差异处理及自定义映射
由于两个系统之间的数据结构存在一定差异,因此需要进行有效的数据格式转换,并且采用定制化的数据映射规则。在这里,自定义映射函数map_kingdee_to_wdt负责将从金蝶云星空获取到的信息转为适合于发送给旺店通·企业奇门API所需的格式。
def map_kingdee_to_wdt(kingdee_order):
return {
'purchaseOrderNo': kingdee_order['orderNo'],
'supplierName': kingdee_order['vendorName'],
'items': [
{'itemCode': item['code'],
'quantity': item['qty']}
for item in kingdee_order['lineItems']
]
}
此过程中还特别考虑到了分页和限流问题,通过合理设置请求频
调用金蝶云星空接口executeBillQuery获取并加工数据
在数据集成的生命周期中,调用源系统接口获取数据是至关重要的一步。本文将详细探讨如何通过轻易云数据集成平台调用金蝶云星空接口executeBillQuery
来获取采购订单数据,并进行初步加工处理。
接口调用配置
首先,我们需要配置调用金蝶云星空接口的元数据。以下是关键的元数据配置项:
- API:
executeBillQuery
- Method:
POST
- FormId:
PUR_PurchaseOrder
- FieldKeys: 需查询的字段key集合
- FilterString: 过滤条件
- Pagination: 分页参数,包括每页大小和起始行索引
具体的请求字段如下:
{
"api": "executeBillQuery",
"method": "POST",
"number": "FBillNo",
"id": "FPOOrderEntry_FEntryId",
"pagination": {"pageSize": 100},
"request": [
{"field": "FPOOrderEntry_FEntryId", "label": "FPOOrderEntry_FEntryId", "type": "string", "value": "FPOOrderEntry_FEntryId"},
{"field": "FID", "label": "FID", "type": "string", "value": "FID"},
{"field": "FBillNo", "label": "单据编号", "type": "string", "value": "FBillNo"},
// ...其他字段省略
],
// ...其他配置省略
}
请求参数解析
在实际操作中,我们需要根据业务需求设置具体的请求参数。以下是几个关键参数及其作用:
- FormId: 表示业务对象表单ID,这里为
PUR_PurchaseOrder
,即采购订单。 - FieldKeys: 查询字段集合,通过数组形式传递所有需要查询的字段。
- FilterString: 用于过滤条件,例如只查询最近同步时间之后的数据:
FApproveDate>='{{LAST_SYNC_TIME|datetime}}' and F_PRSH_Base_qtr1.Fnumber <> ''
。 - Pagination: 分页参数,确保每次请求的数据量适中,提高效率。
数据请求与清洗
在调用接口获取数据后,需要对返回的数据进行清洗和初步加工。以下是一个简单的数据清洗流程:
- 数据验证:检查返回的数据是否符合预期格式和内容。例如,确保所有必填字段都有值。
- 数据转换:将原始数据转换为目标系统所需的格式。例如,将日期格式从
YYYY-MM-DD
转换为目标系统所需的格式。 - 异常处理:对于不符合要求的数据,记录日志并进行相应处理,如丢弃或标记为异常。
以下是一个简单的数据清洗示例代码:
def clean_data(raw_data):
cleaned_data = []
for record in raw_data:
if not record.get('FBillNo') or not record.get('FDate'):
continue # 跳过无效记录
cleaned_record = {
'bill_no': record['FBillNo'],
'date': convert_date_format(record['FDate']),
'supplier': record['FSupplierId_FNumber'],
# ...其他字段处理
}
cleaned_data.append(cleaned_record)
return cleaned_data
def convert_date_format(date_str):
# 假设原始日期格式为YYYY-MM-DD,目标格式为MM/DD/YYYY
from datetime import datetime
date_obj = datetime.strptime(date_str, '%Y-%m-%d')
return date_obj.strftime('%m/%d/%Y')
数据转换与写入
完成数据清洗后,下一步是将数据转换为目标系统所需的格式,并写入目标系统。这一步通常涉及到不同系统间的数据映射和格式转换。
例如,将金蝶云星空中的采购订单同步到旺店通,需要根据旺店通的API规范进行相应的数据映射和转换。以下是一个简单的数据映射示例:
def map_to_target_system(cleaned_data):
mapped_data = []
for record in cleaned_data:
target_record = {
'order_number': record['bill_no'],
'order_date': record['date'],
'vendor_code': record['supplier'],
# ...其他字段映射
}
mapped_data.append(target_record)
return mapped_data
# 将映射后的数据写入目标系统(伪代码)
def write_to_target_system(mapped_data):
for record in mapped_data:
response = target_system_api.create_order(record)
if response.status_code != 200:
log_error(response)
通过上述步骤,我们可以实现从金蝶云星空获取采购订单数据,并将其同步到旺店通,实现不同系统间的数据无缝对接。
总结来说,通过合理配置元数据并结合轻易云平台强大的集成功能,可以高效地完成跨系统的数据集成任务。在实际应用中,还需要根据具体业务需求进行定制化开发,以确保集成过程顺利高效。
金蝶采购订单同步至旺店通采购订单的ETL转换技术案例
在数据集成生命周期的第二步中,我们需要将已经集成的源平台数据进行ETL(Extract, Transform, Load)转换,以便将其转为目标平台旺店通·企业奇门API接口所能够接收的格式,并最终写入目标平台。本文将深入探讨这一过程中的关键技术点和具体实现方法。
API接口配置与元数据解析
首先,我们需要了解目标平台的API接口配置及其元数据定义。根据提供的元数据配置,目标API为wdt.purchase.order.push
,请求方法为POST
。请求参数包括供应商编号、仓库编号、API单号等,采购明细节点则包含商家编码、采购量、采购价格等详细信息。
以下是元数据配置的关键部分:
{
"api": "wdt.purchase.order.push",
"method": "POST",
"idCheck": true,
"operation": {
"method": "merge",
"field": "FBillNo,FSupplierId_FNumber",
"bodyName": "details_list",
"bodySum": ["FQty"],
"header": ["FBillNo", "FSupplierId_FNumber", "F_PRSH_Base_qtr1_Fnumber"],
"body": ["FMaterialId_FNumber", "FQty", "FPrice", "FTaxPrice", "FEntryTaxRate"]
},
...
}
数据提取与转换
在ETL过程中,首先需要从金蝶系统中提取原始数据。假设我们已经通过轻易云平台完成了数据请求与清洗阶段,现在我们重点关注如何将这些数据转换为旺店通API所需的格式。
-
提取源数据: 从金蝶系统中提取采购订单相关的数据,包括订单号(FBillNo)、供应商编号(FSupplierId_FNumber)、物料编号(FMaterialId_FNumber)、数量(FQty)、价格(FPrice)等字段。
-
转换数据格式: 根据旺店通API的要求,对提取的数据进行格式转换。例如,将金蝶系统中的字段名映射到旺店通API所需的字段名,并进行必要的数据处理,如四舍五入、百分比计算等。
{ "provider_no": "{FSupplierId_FNumber}", "warehouse_no": "{F_PRSH_Base_qtr1_Fnumber}", ... "details_list": [ { "remark": "{FEntryNote}", ... "spec_no": "{{details_list.FMaterialId_FNumber}}", ... "tax": "_function round({{details_list.FEntryTaxRate}}/100,4)", ... } ] }
-
构建请求体: 将转换后的数据按照旺店通API的请求格式组织成JSON对象。例如:
{ "provider_no": "SUP12345", ... "details_list": [ { ... "spec_no": "MAT67890", ... "tax": 0.17, ... } ] }
数据写入目标平台
完成数据转换后,需要通过HTTP POST请求将数据写入旺店通·企业奇门平台。以下是一个示例代码片段,展示了如何使用Python发送HTTP POST请求:
import requests
import json
url = 'https://api.wangdian.cn/openapi2/wdt.purchase.order.push'
headers = {'Content-Type': 'application/json'}
data = {
'provider_no': 'SUP12345',
'warehouse_no': 'WH001',
'outer_no': 'PO123456',
'is_use_outer_no': '1',
'is_check': '1',
'contact': '张三',
'telno': '13800000000',
'receive_address': '北京市朝阳区XX路XX号',
'expect_arrive_time': '2023-10-01 10:00:00',
'other_fee': '0',
'post_fee': '0',
'details_list': [
{
'remark': '',
'prop1': '',
...
'spec_no': 'MAT67890',
...
'tax_price': 100.00
}
]
}
response = requests.post(url, headers=headers, data=json.dumps(data))
print(response.json())
数据校验与错误处理
在实际操作中,还需要对返回结果进行校验和错误处理,以确保数据成功写入目标平台。如果发生错误,应记录错误信息并采取相应措施进行修正。
if response.status_code == 200:
result = response.json()
if result['code'] == 0:
print('Data successfully written to Wangdian.')
else:
print(f"Error: {result['message']}")
else:
print(f"HTTP Error: {response.status_code}")
通过上述步骤,我们实现了从金蝶系统到旺店通·企业奇门平台的数据ETL转换和写入过程。这一过程不仅确保了不同系统间的数据无缝对接,还提升了业务流程的自动化和效率。