案例分享:旺店通·旗舰版数据集成到金蝶云星空
在本文中,我们将详细探讨如何高效地实现旺店通·旗舰版与金蝶云星空的系统对接,特别是围绕“入库瞬时成本-生产入库单-1”方案的实施过程。该技术案例主要涵盖了API接口调用、数据格式转换、分页处理以及异常管理等关键步骤。
为了确保从旺店通·旗舰版获取的数据不漏单且快速写入金蝶云星空,我们利用statistic.StockinCollect.queryCostWithDetail API进行数据抓取,并通过batchSave API实现批量写入。这不仅优化了数据传输效率,还保证了数据的一致性和完整性。
具体而言,以下几个方面值得关注:
1. 定时可靠的数据抓取: 采用定时任务机制,从旺店通·旗舰版接口定期抓取最新的库存成本信息。通过合理配置调度频率和重试机制,有效避免漏单现象。
2. 批量写入及映射处理: 在大量数据需要导入金蝶云星空时,通过批量操作显著提升传输速度。同时,实现自定义的数据映射逻辑,以适应两套系统不同的数据格式要求。
3. 分页与限流策略: 由于API接口可能存在请求次数和响应时间限制,需要采取分页策略并设置合理的限流参数,保证每次请求都能成功返回所需的数据集。
4. 异常处理与监控日志: 建立异常捕获和错误重试机制,在出现接口调用失败或网络波动情况下自动重新尝试。同时,通过实时监控日志记录分析各个环节中的潜在问题,以便后续优化调整。
这一系列措施结合起来,不仅确保了整个对接过程的稳定性和可靠性,也为企业提供了一种高效而透明的数据集成解决方案。在接下来的部分中,我们将逐步深入解读具体实施细节,包括API参数配置、转换规则定义以及运行效果反馈等内容。
调用旺店通·旗舰版接口获取并加工数据
在数据集成生命周期的第一步中,调用源系统接口是关键的一环。本文将详细探讨如何通过轻易云数据集成平台调用旺店通·旗舰版的statistic.StockinCollect.queryCostWithDetail
接口获取并加工数据。
接口概述
接口名称:statistic.StockinCollect.queryCostWithDetail
请求方法:POST
主要功能:查询入库瞬时成本的详细信息
元数据配置解析
元数据配置是实现接口调用和数据处理的基础。以下是对元数据配置的详细解析:
{
"api": "statistic.StockinCollect.queryCostWithDetail",
"effect": "QUERY",
"method": "POST",
"number": "stockin_no",
"id": "stockin_id",
"name": "stockout_no",
"idCheck": true,
"request": [
{
"field": "params",
"label": "查询参数",
"type": "object",
"children": [
{
"field": "start_time",
"label": "开始时间",
"type": "string",
"describe": "起始时间(发货时间),若无出库单号则为必填。",
"value": "{{LAST_SYNC_TIME|datetime}}"
},
{
"field": "end_time",
"label": "结束时间",
"type": "string",
"describe": "结束时间(发货时间)",
"value": "{{CURRENT_TIME|datetime}}"
},
{
"field": "warehouse_no",
"label": "仓库编号",
"type": "string",
...
请求参数详解
start_time
和end_time
:这两个字段用于指定查询的时间范围,分别代表起始和结束时间。使用模板变量{{LAST_SYNC_TIME|datetime}}
和{{CURRENT_TIME|datetime}}
自动填充上次同步时间和当前时间。warehouse_no
:仓库编号,用于指定查询哪个仓库的数据。stockin_no
:入库单号,可以填写多个单号,使用英文逗号分隔。time_type
:时间查询类型,默认值为2,即按审核时间查询。
分页参数:
page_size
:每页返回的数据条数,默认设置为100。page_no
:页码,用于分页查询。
数据请求与清洗
在调用接口后,我们需要对返回的数据进行清洗和加工。以下是一个示例流程:
-
发送请求:
import requests import json url = 'https://api.wangdian.cn/openapi2/statistic.StockinCollect.queryCostWithDetail' headers = {'Content-Type': 'application/json'} payload = { 'params': { 'start_time': '2023-01-01T00:00:00', 'end_time': '2023-01-31T23:59:59', 'warehouse_no': 'WH001', 'stockin_no': '', 'time_type': '2' }, 'pager': { 'page_size': '100', 'page_no': '1' } } response = requests.post(url, headers=headers, data=json.dumps(payload)) data = response.json()
-
数据清洗: 获取到的数据可能包含多余或格式不一致的信息,需要进行清洗。例如,将日期格式统一、过滤掉无效记录等。
-
转换与写入: 清洗后的数据可以根据业务需求进行转换,然后写入目标系统或数据库。
实践案例
假设我们需要获取2023年1月某仓库的所有入库单瞬时成本,并将其写入本地数据库。具体步骤如下:
-
配置请求参数:
{ ... { ... { ... {"field":"start_time","value":"2023-01-01T00:00:00"}, {"field":"end_time","value":"2023-01-31T23:59:59"}, {"field":"warehouse_no","value":"WH001"} } } ... }
-
发送请求并处理响应:
# 上文代码中的请求部分
-
清洗和转换数据:
cleaned_data = [] for record in data['data']: if record['status'] == 'valid': cleaned_record = { 'stockin_id': record['stockin_id'], 'cost': float(record['cost']), ... } cleaned_data.append(cleaned_record) # 写入数据库
通过上述步骤,我们能够高效地从旺店通·旗舰版获取所需的入库瞬时成本数据,并进行必要的清洗和转换,为后续的数据处理打下坚实基础。
轻易云数据集成平台ETL转换与金蝶云星空API接口对接
在数据集成生命周期的第二步,我们将已经集成的源平台数据进行ETL转换,转为目标平台金蝶云星空API接口所能够接收的格式,并最终写入目标平台。本文将详细探讨如何利用轻易云数据集成平台配置元数据,实现这一过程。
API接口配置
我们使用金蝶云星空的batchSave
API接口,通过POST方法将处理后的数据写入目标系统。以下是元数据配置的具体细节:
{
"api": "batchSave",
"method": "POST",
"idCheck": true,
"operation": {
"rowsKey": "array",
"rows": 20,
"method": "batchArraySave"
},
"request": [
{"field":"FBillNo","label":"单据编号","type":"string","describe":"单据编号","value":"{stockin_no}"},
{"field":"FBillTypeID","label":"单据类型","type":"string","describe":"单据类型","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"QTRKD01_SYS"},
{"field":"FStockOrgId","label":"库存组织","type":"string","describe":"组织","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"100"},
{"field":"FStockDirect","label":"库存方向","type":"string","describe":"下拉列表","value":"1"},
{"field":"FDate","label":"日期","type":"string","describe":"日期","value":"{{check_time|datetime}}"},
{"field":"FDEPTID","label":"部门","type":"string","describe":"基础资料","value":"BM000032", "parser":{"name":"ConvertObjectParser", "params": "FNumber"}},
{"field": "FOwnerTypeIdHead", "label": "货主类型", "type": "string", "describe": "多类别基础资料列表", "value": "BD_OwnerOrg"},
{"field": "FOwnerIdHead", "label": "货主", "type": "string", "describe": "多类别基础资料", "parser":{"name": "ConvertObjectParser", "params": "FNumber"}, "value": "100"},
{"field": "FNOTE", "label": "备注", "type": "string", "describe": "多行文本"},
{
"field": "FEntity",
"label": "明细信息",
"type": "array",
children: [
{"field": "FMATERIALID", "label": "物料编码", "type": "string", "describe": "基础资料", "parser":{"name":
ConvertObjectParser, params: FNumber}, value: {{detail_list.spec_no}}, parent: FEntity},
{ field: FSTOCKID, label: 收货仓库, type: string, describe: 基础资料, parser:{name: ConvertObjectParser, params:FNumber}, value:{warehouse_no}, parent:FEntity},
{ field:FQty, label:实收数量, type:string, describe:数量, value:{{detail_list.num}}, parent:FEntity},
{ field:FPrice, label:成本价, type:string, describe:单价,parent:FEntity},
{ field:FEntryNote,label:备注,type:string, describe:多行文本,value:{{detail_list.remark}},parent:FEntity},
{ parent:FEntity,label:成本价(旺店通),field:F_TPRO_Decimal2,type:string,value:{{detail_list.checked_cost_price}}},
{ parent:FEntity,label:库存状态, field:FSTOCKSTATUSID,type:string,value:_function case '{defect}' when true then 'KCZT08_SYS' else 'KCZT01_SYS' end , parser:{name:
ConvertObjectParser , params : FNumber}},
{ field:F_UBGN_Decimal,label : 总成本(旺店通), type : string , value:_function {{detail_list.checked_cost_price}}*{{detail_list.num}}}
],
value : detail_list
},
{ label : 对应旺店通单据 , field : F_TPRO_Text6 , type : string , value : 入库瞬时成本-生产入库单 },
{ field : F_TPRO_Text5 , label : 操作人 , type : string , value : {operator_name}},
{ field : F_UBGN_LargeText , label : 备注(旺店通) , type : string , value : {remark}}
],
otherRequest:[
{ field:"FormId", label:"业务对象表单Id", type:"string", describe:"必须填写金蝶的表单ID如:PUR_PurchaseOrder", value:"STK_MISCELLANEOUS"},
{ field:"IsVerifyBaseDataField", label:"验证基础资料", type:"bool", describe:"是否验证所有的基础资料有效性,布尔类,默认false(非必录)", value:"false"},
{ field:"Operation", label:"执行的操作", type:"string", value:"Save"},
{ field:"IsAutoSubmitAndAudit", label:"提交并审核", type:"bool", value:"true"}
]
}
数据转换与写入
在ETL过程中,我们需要将源数据根据金蝶云星空API接口要求进行转换。以下是关键字段及其转换逻辑:
-
单据编号 (FBillNo):
- 从源数据字段
stockin_no
中提取。
- 从源数据字段
-
单据类型 (FBillTypeID):
- 固定值
QTRKD01_SYS
,通过ConvertObjectParser
转换为目标系统识别的格式。
- 固定值
-
库存组织 (FStockOrgId):
- 固定值
100
,同样通过ConvertObjectParser
转换。
- 固定值
-
日期 (FDate):
- 使用模板语言从源数据中的
check_time
字段提取,并转换为标准日期格式。
- 使用模板语言从源数据中的
-
部门 (FDEPTID):
- 固定值
BM000032
,通过ConvertObjectParser
转换。
- 固定值
-
明细信息 (FEntity):
- 包含多个子字段,如物料编码、收货仓库、实收数量等,这些字段均从源数据中的相应字段提取,并通过
ConvertObjectParser
或其他逻辑进行处理。
- 包含多个子字段,如物料编码、收货仓库、实收数量等,这些字段均从源数据中的相应字段提取,并通过
-
库存状态 (FSTOCKSTATUSID):
- 使用条件表达式
_function case '{defect}' when true then 'KCZT08_SYS' else 'KCZT01_SYS' end
根据源数据中的缺陷标识进行判断和转换。
- 使用条件表达式
-
总成本 (F_UBGN_Decimal):
- 使用计算表达式
_function {{detail_list.checked_cost_price}}*{{detail_list.num}}
动态计算总成本。
- 使用计算表达式
执行操作
在完成上述字段映射和转换后,我们通过以下操作参数完成数据写入:
- FormId:设置为
STK_MISCELLANEOUS
,表示业务对象表单ID。 - IsVerifyBaseDataField:设置为
false
,表示不验证所有基础资料有效性。 - Operation:设置为
Save
,表示执行保存操作。 - IsAutoSubmitAndAudit:设置为
true
,表示自动提交并审核。
小结
通过上述配置和转换逻辑,我们成功实现了将源平台的数据经过ETL处理后,通过金蝶云星空API接口写入目标系统。这一过程不仅确保了数据的一致性和准确性,还极大提升了业务流程的自动化水平。