案例分享:金蝶云星空数据集成到旺店通·企业奇门
在本次技术案例中,将详细介绍如何通过轻易云数据集成平台,实现金蝶直接调拨单数据对接到旺店通的其他入库,并进行后补批号操作。具体方案名称为“金蝶直接调拨单对接旺店通其他入库_后补批号ZJDB”。
金蝶云星空API——executeBillQuery的使用
首先,利用金蝶提供的executeBillQuery
API接口抓取调拨单的数据。为了确保数据不漏单,我们采取了定时可靠的抓取机制,通过配置周期性任务,在每个预设时间点自动调用该接口,获取最新的数据。同时,为解决分页和限流问题,每次请求都带有适当的分页参数和速率限制控制,以避免因超量请求导致接口响应失败。
数据格式转换与映射
由于金蝶云星空和旺店通·企业奇门之间存在明显的数据格式差异,我们使用了自定义映射规则来转换数据。例如,从金蝶调拨单导出的字段需要经过特定处理,才能适配到旺店通所需的字段规范。在实际操作中,这部分工作主要是通过平台内置的数据清洗与转化工具完成,使得上游系统输出的数据能够无缝对接至下游系统。
批量快速写入至旺店通·企业奇门
成功获取并正确转换后的数据,需要快速、稳定地写入至目标系统——即调用wdt.vip.wms.stockinout.order.push
API。为此,我们设计了高效、批量处理机制,大幅提升了大规模数据传输过程中的效率。这不仅保障了整体流程的一致性,还有效缩短了从源头到终端应用所需的时间。
异常处理及重试机制
在整个对接过程中,不可避免会遇到各种异常状况,比如网络故障或临时性API失效等。因此,本方案中特别强调错误捕获与重试机制。一旦某一批次操作出现问题,系统能迅速记录日志并触发相应策略重新执行,使得最终结果达到预期,而不会遗漏任何重要信息。
以上章节简要描述了从基础概念到关键步骤的一整套实现逻辑,下文将进一步探讨具体实现细节和优化措施。
调用金蝶云星空接口executeBillQuery获取并加工数据的技术实现
在数据集成的生命周期中,调用源系统接口获取数据是至关重要的一步。本文将详细探讨如何通过轻易云数据集成平台调用金蝶云星空的executeBillQuery
接口,以获取并加工调拨单数据。
接口配置与请求参数
首先,我们需要配置调用金蝶云星空接口的元数据。以下是关键的元数据配置项:
{
"api": "executeBillQuery",
"method": "POST",
"number": "FBillNo",
"id": "FBillEntry_FEntryID",
"pagination": {
"pageSize": 100
},
"idCheck": true,
"request": [
{"field":"FBillEntry_FEntryID","label":"FEntryID","type":"string","value":"FBillEntry_FEntryID"},
{"field":"FID","label":"实体主键","type":"string","value":"FID"},
{"field":"FBillNo","label":"单据编号","type":"string","value":"FBillNo"},
{"field":"FDocumentStatus","label":"单据状态","type":"string","value":"FDocumentStatus"},
{"field":"FStockOrgId_FNumber","label":"调入库存组织","type":"string","value":"FStockOrgId.FNumber"},
{"field":"FDate","label":"日期","type":"string","value":"FDate"},
{"field":"FBillTypeID_FNumber","label":"单据类型","type":"string","value":"FBillTypeID.FNumber"},
{"field":"FTransferBizType","label":"调拨类型","type":"string","value":"FTransferBizType"},
{"field":"FStockOutOrgId_FNumber","label":"调出库存组织","type":"string","value":"FStockOutOrgId.FNumber"},
{"field":"FTransferDirect","label":"调拨方向","type":"string","value":"FTransferDirect"},
{"field":"FNote","label":"备注","type":"","value":""},
// 更多字段配置...
],
"otherRequest": [
{"field": "Limit", "label": "最大行数", "type": "string", "describe": "金蝶的查询分页参数", "value": "{PAGINATION_PAGE_SIZE}"},
{"field": "FieldKeys", "label": "需查询的字段key集合", "type": "array", "describe": "",
"parser":{"name": "ArrayToString", "params": ","}},
{"field": "TopRowCount", "label": "",
"type": "",
"describe":"","value":"",
"parser":{"name":"","params":[]}},
// 更多其他请求配置...
]
}
请求构建与发送
根据上述元数据配置,我们需要构建一个POST请求来调用executeBillQuery
接口。以下是一个示例请求体:
{
"FormId": "STK_TransferDirect",
"FieldKeys": [
// 字段列表
...
],
// 分页参数
...
}
在实际操作中,我们会利用轻易云平台提供的可视化界面来填充这些参数,并自动生成请求体。
数据清洗与转换
获取到原始数据后,下一步是对数据进行清洗和转换。这一步骤包括但不限于:
- 字段映射:将金蝶返回的数据字段映射到目标系统所需的字段。
- 格式转换:例如,将日期格式从YYYY-MM-DD转换为目标系统所需的格式。
- 数据过滤:根据业务需求过滤掉不必要的数据记录。
以下是一个简单的数据清洗示例:
def clean_data(raw_data):
cleaned_data = []
for record in raw_data:
cleaned_record = {
'entry_id': record['FBillEntry_FEntryID'],
'bill_no': record['FBillNo'],
'status': record['FDocumentStatus'],
'stock_in_org': record['FStockOrgId_FNumber'],
'date': convert_date_format(record['FDate']),
# 更多字段处理...
}
cleaned_data.append(cleaned_record)
return cleaned_data
def convert_date_format(date_str):
# 假设原始日期格式为 YYYY-MM-DD,需要转换为 DD/MM/YYYY
parts = date_str.split('-')
return f"{parts[2]}/{parts[1]}/{parts[0]}"
数据写入目标系统
最后一步是将清洗后的数据写入目标系统。这通常涉及调用目标系统的API接口,确保数据能够无缝对接。例如:
def write_to_target_system(cleaned_data):
for record in cleaned_data:
response = requests.post('TARGET_SYSTEM_API_URL', json=record)
if response.status_code != 200:
log_error(response.text)
通过上述步骤,我们可以高效地实现从金蝶云星空获取调拨单数据,并将其加工后写入目标系统。这不仅提高了数据处理效率,还确保了数据的一致性和准确性。
使用轻易云数据集成平台实现金蝶直接调拨单对接旺店通其他入库_后补批号ZJDB
在数据集成生命周期的第二步,我们将已经集成的源平台数据进行ETL转换,转为目标平台旺店通·企业奇门API接口所能够接收的格式,并最终写入目标平台。以下是详细的技术实现过程。
元数据配置解析
在本案例中,我们使用了如下元数据配置:
{
"api": "wdt.vip.wms.stockinout.order.push",
"method": "POST",
"idCheck": true,
"operation": {
"method": "merge",
"field": "FBillNo,FMaterialId_FNumber,FDestStockId_FNumber,FDestLot",
"bodyName": "spec_list",
"bodySum": ["FQty"],
"header": ["FBillNo"],
"body": ["FMaterialId_FNumber", "FDestStockId_FNumber", "FQty", "FDestLot"]
},
"request": [
{"field":"api_outer_no","label":"接口外部单号","type":"string","describe":"调用本接口时推送的唯一单据编号,避免重复推送数据","value":"{FBillNo}-{{spec_list.FMaterialId_FNumber}}-{{spec_list.FDestStockId_FNumber}}-{{spec_list.FDestLot}}"},
{"field":"warehouse_no","label":"仓库编号","type":"string","describe":"代表仓库所有属性的唯一编码,用于仓库区分,ERP内支持自定义(ERP仓库界面设置);本接口仓库编号对应的仓库类型必须为委外仓类型。【例如: 3京东仓储 4科捷 5百世物流 6 SKU360 7通天晓 8中联网仓 9顺丰仓储 10网仓2号 11奇门仓储 12旺店通仓储 13心怡仓储 14力威仓储 15京东沧海 16云集仓储 )】","value":"{{spec_list.FDestStockId_FNumber}}"},
{"field":"order_type","label":"出入类型","type":"string","describe":"可选值:1(出库);2(入库)","value":"2"},
{"field":"logistics_fee","label":"邮资","type":"string","describe":"物流或者快递运输货物产生的费用,默认为0"},
{"field":"other_fee","label":"其他费用","type":"string","describe":"其他费用,默认为0"},
{"field":"province","label":"省","type":"string","describe":"省份名称,直辖市注意输入值为“北京”不是“北京市”,“北京市”在city参数内输入"},
{"field":"city","label":"市","type":"string","describe":"市名称"},
{"field":"district","label":"县(区)","type":"string","describe":"区县名称"},
{"field":"address","label":"详细地址","type":"string","describe":"地址详情描述 ,例如 xx街道XX小区xx号楼xx单元401"},
{"field":"contact","label":"联系人","type":"","describe":"","value":"","required":true},
{"field":""},
{"field":"","label":"","type":"","describe":"","value":"","required":true},
{"field":"","label":"","type":"","describe":"","value":"","required":true},
数据转换与写入步骤
-
数据合并与清洗:
- 首先,我们需要将金蝶直接调拨单的数据进行合并和清洗。根据元数据配置中的
operation
字段,我们将FBillNo
,FMaterialId_FNumber
,FDestStockId_FNumber
,FDestLot
四个字段作为合并依据,并对FQty
字段进行汇总。 - 合并后的数据结构体以
spec_list
命名,用于后续的数据转换。
- 首先,我们需要将金蝶直接调拨单的数据进行合并和清洗。根据元数据配置中的
-
构建请求体:
- 根据元数据配置中的
request
字段,我们需要构建请求体。 - 请求体包含了多个字段,如
api_outer_no
,warehouse_no
,order_type
, 等等。这些字段通过模板字符串从合并后的数据中提取相应的值。
- 根据元数据配置中的
-
货品明细节点处理:
- 在请求体中,有一个重要的节点是
goods_list
,它表示入库单货品列表节点。 - 每个货品明细包含多个字段,如
spec_no
,num
,position_no
,price
,batch_no
, 等等。这些字段同样通过模板字符串从合并后的数据中提取相应的值。
- 在请求体中,有一个重要的节点是
-
发送请求:
- 最后,将构建好的请求体通过HTTP POST方法发送到旺店通·企业奇门API接口。
- API接口路径为:
wdt.vip.wms.stockinout.order.push
示例代码
以下是一个示例代码片段,用于展示如何实现上述步骤:
import requests
import json
# 合并和清洗后的数据
merged_data = {
'FBillNo': '12345',
'spec_list': [
{
'FMaterialId_FNumber': 'MAT001',
'FDestStockId_FNumber': 'WH001',
'FQty': '100',
'FDestLot': 'LOT001'
}
# 更多记录...
]
}
# 构建请求体
request_body = {
'api_outer_no': f"{merged_data['FBillNo']}-{merged_data['spec_list'][0]['FMaterialId_FNumber']}-{merged_data['spec_list'][0]['FDestStockId_FNumber']}-{merged_data['spec_list'][0]['FDestLot']}",
'warehouse_no': merged_data['spec_list'][0]['FDestStockId_FNumber'],
'order_type': '2',
'logistics_fee': '0',
'other_fee': '0',
# 更多字段...
}
# 构建goods_list节点
goods_list = []
for item in merged_data['spec_list']:
goods_item = {
'spec_no': item['FMaterialId_FNumber'],
'num': item['FQty'],
# 更多字段...
'batch_no': item['FDestLot']
}
goods_list.append(goods_item)
request_body['goods_list'] = goods_list
# 发起HTTP POST请求
response = requests.post(
url='https://api.wangdiantong.com/wdt.vip.wms.stockinout.order.push',
headers={'Content-Type': 'application/json'},
data=json.dumps(request_body)
)
# 打印响应结果
print(response.json())
通过以上步骤和代码示例,我们可以将金蝶直接调拨单的数据成功转换并写入到旺店通·企业奇门API接口,实现系统间的数据无缝对接。