金蝶生产补料单与旺店通其他出库单数据集成案例
在系统集成领域,跨平台的数据对接常常面临着复杂的技术挑战。本文将详细解析如何将金蝶云星空的生产补料单数据无缝集成到旺店通·企业奇门中的其他出库单。本次分享包括API接口调用、分页和限流处理、以及异常处理机制。
调用金蝶云星空接口——executeBillQuery
首先,我们需要通过金蝶云星空提供的API接口executeBillQuery
定时可靠地抓取生产补料单的数据。为了确保不漏单,需要配置合适的调度任务,并针对金蝶云星空 API 的特性进行优化。例如,可以利用其分页功能来分批次拉取大规模数据,同时需谨慎应对可能出现的限流问题,通过添加重试逻辑来增强可用性。
# 示例代码:调用executeBillQuery API
import requests
def fetch_bom_data(api_url, params):
response = requests.post(api_url, json=params)
data = response.json()
return data['result'] # 假设返回结果字段名为 'result'
params = {
"formId": "PRD_MOENTRY",
"fieldKeys": ["FBillNo", "FMaterialID", "FQty"],
# 分页参数,例如:
"pageIndex": 1,
"pageSize": 100
}
data = fetch_bom_data("https://api.kingdee.com/executeBillQuery", params)
快速写入至旺店通·企业奇门—wdt.stockout.order.push
获取到原始数据后,需要将这些信息写入到旺店通·企业奇门中对应的模块。我们使用wdt.stockout.order.push
API实现这一操作。在此过程中,需特别注意两者之间的数据格式差异,通过定制化数据映射解决转换问题,以确保所有字段正确匹配和完整传递。同时,还要考虑批量上传的大量数据如何快速且高效地推送至目的系统。
# 示例代码:调用wdt.stockout.order.push API
def push_stockout_order(api_url, headers, payload):
response = requests.post(api_url, headers=headers, json=payload)
if response.status_code != 200:
raise Exception(f"Push failed: {response.text}")
push_payload = {
# 构造符合 wd.tockout.order.push 数据结构的 payload
}
push_stockout_order("https://api.wangdian.cn/wdt.stockout.order.push", headers={"Authorization":"Bearer token"}, payload=push_payload)
异常处理与错误重试机制
在实际运行过程中
调用金蝶云星空接口executeBillQuery获取并加工数据
在数据集成的生命周期中,第一步是从源系统获取数据。本文将详细探讨如何通过轻易云数据集成平台调用金蝶云星空接口executeBillQuery
来获取生产补料单的数据,并进行初步加工。
接口配置与调用
首先,我们需要配置和调用金蝶云星空的executeBillQuery
接口。该接口采用POST方法,主要用于查询特定业务对象的数据。在本案例中,我们的目标是获取生产补料单的数据。
以下是元数据配置中的关键字段:
- FormId: 业务对象表单Id,必须填写金蝶的表单ID,如:
PRD_FeedMtrl
。 - FieldKeys: 需查询的字段key集合,格式如:
FPOOrderEntry_FEntryId, FPurchaseOrgId.FNumber
。 - FilterString: 过滤条件,用于筛选符合条件的数据。
- Limit和StartRow: 分页参数,用于控制查询结果的行数和起始位置。
请求参数构建
根据元数据配置,我们需要构建请求参数。以下是一个示例请求参数:
{
"FormId": "PRD_FeedMtrl",
"FieldKeys": "FID,FBillNo,FPrdOrgId.FNumber,FStockOrgId.FNumber,FDate,FBillType.FNumber,FCurrId,FTransferBizType,FSTOCKERID,FIsCrossTrade,FVmiBusiness,FIsOwnerTInclOrg,FEntity_FEntryID,FPPBOMEntryId,FMaterialId.FNumber,FMaterialName,FSpecification,FAPPQty,FActualQty,FStockId.FNumber,FMoId,FMoBillNo,FMoEntryId,FMoEntrySeq,FStockStatusId,FOwnerTypeId,FOwnerId.FNumber,FParentOwnerTypeId,FParentOwnerId,FParentMaterialId.FNumber,FDocumentStatus",
"FilterString": "FApproveDate>='{{LAST_SYNC_TIME|dateTime}}' and FDocumentStatus='C' and FMATERIALID.F_POIH_Combo = 1",
"Limit": "{PAGINATION_PAGE_SIZE}",
"StartRow": "{PAGINATION_START_ROW}",
"TopRowCount": true
}
数据请求与清洗
通过上述请求参数,我们可以向金蝶云星空发送请求并获取生产补料单的数据。接下来,需要对返回的数据进行清洗和初步加工,以便后续处理。
-
字段映射与转换:
- 将返回的数据字段映射到目标系统所需的字段。例如,将
FMaterialId.FNumber
映射为物料编码,将FAPPQty
映射为申请数量等。 - 对某些字段进行必要的格式转换,例如日期格式、数值类型等。
- 将返回的数据字段映射到目标系统所需的字段。例如,将
-
数据过滤与验证:
- 根据业务需求,对返回的数据进行进一步过滤。例如,只保留状态为“已审核”的单据。
- 验证关键字段是否存在或符合预期格式。例如,确保每条记录都有有效的实体主键(FID)和单据编号(FBillNo)。
-
错误处理与日志记录:
- 对于无法解析或不符合预期的数据,记录错误日志并跳过这些记录,以确保整体流程的稳定性。
- 将成功处理和失败处理的记录分别统计,以便后续分析和优化。
示例代码
以下是一个示例代码片段,用于调用接口并处理返回的数据:
import requests
import json
# 构建请求参数
payload = {
"FormId": "PRD_FeedMtrl",
"FieldKeys": "FID,FBillNo,...", # 完整字段列表
"FilterString": "FApproveDate>='2023-01-01' and FDocumentStatus='C'",
"Limit": 100,
"StartRow": 0,
"TopRowCount": True
}
# 设置请求头
headers = {
'Content-Type': 'application/json'
}
# 调用接口
response = requests.post('https://api.kingdee.com/executeBillQuery', headers=headers, data=json.dumps(payload))
# 检查响应状态
if response.status_code == 200:
data = response.json()
# 数据清洗与转换
cleaned_data = []
for record in data['Result']:
cleaned_record = {
'实体主键': record['FID'],
'单据编号': record['FBillNo'],
'生产组织': record['FPrdOrgId.FNumber'],
# 更多字段映射...
}
cleaned_data.append(cleaned_record)
# 后续处理...
else:
print(f"Error: {response.status_code}, {response.text}")
通过以上步骤,我们成功调用了金蝶云星空的接口并对返回的数据进行了初步加工,为后续的数据转换与写入奠定了基础。
轻易云数据集成平台生命周期的第二步:ETL转换与写入目标平台
在数据集成过程中,ETL(提取、转换、加载)是关键的一环。在本案例中,我们将重点讨论如何将已经集成的源平台数据通过ETL转换,转为目标平台旺店通·企业奇门API接口所能够接收的格式,并最终写入目标平台。
元数据配置解析
元数据配置是实现数据转换和写入的基础。以下是针对金蝶生产补料单到旺店通其他出库单的数据集成方案的详细解析:
{
"api": "wdt.stockout.order.push",
"method": "POST",
"idCheck": true,
"operation": {
"method": "merge",
"field": "FBillNo",
"bodyName": "details",
"bodySum": [],
"header": ["FBillNo", "FDate", "FStockId", "FNote", "FSupplierId"],
"body": ["FMaterialId", "FActualQty", "FPrice", "FEntryNote"]
},
"request": [
{"field":"outer_no","label":"接口外部单号","type":"string","describe":"调用本接口时推送的唯一单据编号,避免重复推送数据","value":"{FBillNo}"},
{"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":"{FStockId}"},
{"field":"logistics_fee","label":"邮资","type":"string","describe":"物流或者快递运输货物产生的费用,默认为0"},
{"field":"other_fee","label":"其他费用","type":"string","describe":"其他费用"},
{"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":"string","describe":"联系人姓名"},
{"field":"mobile","label":"手机号","type":"string","describe":"手机号"},
{"field":"telno","label":"固话","type":"string","describe":"固定电话号码"},
{"field":"is_check","label":"是否审核","type":"string","describe":"1.自动审核 0.不自动审核 默认1", "value": "1"},
{
"field": "detail_list",
"label": "货品明细节点",
"type": "array",
"describe": "入库单货品列表节点",
"value": "details",
"children":[
{"field": "spec_no", "label": "商家编码", "type": string, describe: ERP内单品唯一编码(SKU),代表单品(SKU)所有属性,并且为库存量出入计算最小单元。SKU概念介绍, 单击这里, value: {FMaterialId}},
{"field": num, label: 入库数量, type: string, describe: 入库数量, value: {FActualQty}},
{"field": position_no, label:货位编号, type:string, describe:商品在仓库内的位置编号,不传此参数,读ERP配置【入库开单货位优先级配置】,来决定取默认货位、上一次入库货位、ZANCUN货位其中一个货位。},
{"field": batch_no, label:批次, type:string, describe:货品批次编号(需要传客户端中存在的批次编号)},
{"field" :remark,label :备注,type :string , describe :货品明细备注},
{ field :price,label :价格,type :string}
]
},
{ field:"reason", label:"其他出库原因", type:"string", value:"工厂生产领用"}
],
otherRequest:[{"field" :"stockout_info" , label :"stockout_info" , type :"string"}]
}
数据请求与清洗
在ETL过程中,首先需要从源系统(金蝶生产补料单)提取数据,并进行必要的数据清洗。清洗后的数据需要符合目标系统(旺店通·企业奇门)的要求。
- 字段映射:确保源系统中的字段正确映射到目标系统中的字段。例如,将
FBillNo
映射到outer_no
。 - 数据格式:确保数据格式符合目标系统要求。例如,将日期格式化为目标系统可接受的格式。
- 缺失值处理:处理源系统中可能存在的缺失值,以确保数据完整性。
数据转换与写入
接下来是将清洗后的数据进行转换,并通过API接口写入目标系统。
-
构建请求体:
- 根据元数据配置构建请求体。
- 将源系统中的字段值填充到请求体中相应的位置。
{ outer_no: "{FBillNo}", warehouse_no: "{FStockId}", logistics_fee: "", other_fee:"", province:"", city:"", district:"", address:"", contact:"", mobile:"", telno:"", is_check:"1", detail_list:[ { spec_no:"{FMaterialId}", num:"{FActualQty}", position_no:"", batch_no:"", remark:"", price:"" } ], reason:"工厂生产领用" }
-
发送请求:
- 使用HTTP POST方法将构建好的请求体发送到目标API接口
wdt.stockout.order.push
。 - 确保请求头和认证信息正确设置,以便成功调用API。
- 使用HTTP POST方法将构建好的请求体发送到目标API接口
-
处理响应:
- 接收并解析API响应。
- 根据响应结果进行后续处理,例如记录日志或错误处理。
实践案例
假设我们从金蝶生产补料单中提取了一条记录,其字段如下:
{
FBillNo: 'BL123456',
FDate: '2023-10-01',
FStockId: 'WDT001',
FNote: '生产补料',
FSupplierId: 'SUP001',
details:[
{
FMaterialId:'MAT001',
FActualQty:'100',
FPrice:'10.5',
FEntryNote:''
}
]
}
根据上述元数据配置和提取的数据,我们构建出如下请求体:
{
outer_no: 'BL123456',
warehouse_no: 'WDT001',
logistics_fee: '',
other_fee:'',
province:'',
city:'',
district:'',
address:'',
contact:'',
mobile:'',
telno:'',
is_check:'1',
detail_list:[
{
spec_no:'MAT001',
num:'100',
position_no:'',
batch_no:'',
remark:'',
price:'10.5'
}
],
reason:'工厂生产领用'
}
通过HTTP POST方法将该请求体发送到wdt.stockout.order.push
API接口,即可完成从金蝶生产补料单到旺店通其他出库单的数据集成。
总结
通过上述步骤,我们实现了从金蝶生产补料单到旺店通其他出库单的数据ETL转换和写入。这不仅提高了业务流程的自动化程度,也保证了数据的一致性和准确性。在实际操作中,还需根据具体业务需求进行定制化调整,以满足不同场景下的数据集成需求。