金蝶采购入库-吉客云入库申请单数据集成案例分享
在本次技术案例中,我们将探讨如何通过轻易云数据集成平台,高效实现金蝶云星空的数据与吉客云的无缝对接。本方案旨在从金蝶云星空系统自动抓取采购入库相关数据,并生成相对应的吉客云入库申请单,实现两大系统间的数据协同。
数据抓取和接口调用
首先,我们需要确保从金蝶云星空获取到准确且完整的采购入库数据。为此,使用了executeBillQuery
API接口,通过定时任务可靠地抓取最新的采购订单信息。关键技术点包括处理分页返回的大量记录,同时应对API接口可能遇到的限流问题,以避免漏单情况发生。
<api name="executeBillQuery">
<parameter key="billType" value="purchaseIn"/>
<parameter key="pageNumber" value="1"/>
...
</api>
数据格式转换与映射
一个重要的环节是处理来自金蝶云星空和要写入吉客云之间的数据格式差异。我们采用了轻易云中的格式转换功能,对ERP系统输出的数据进行清洗、规范化处理,再按照吉客云所需字段一一映射。这不仅简化了后续操作,还极大降低了因数据不匹配引发错误的问题。
Map<String, Object> kingdeeData = fetchKingdeeData();
Map<String, Object> mappedData = mapToGekeFormat(kingdeeData);
批量写入至吉客云
完成数据准备后,通过批量提交方式,将整理好的数据快速写入到吉客云。调用erp.storage.stockincreate
API,即可高效创建多个库存记录,有效提升数据处理效率。同时设置合理重试机制以应对偶发异常,确保整个流程稳定运行。
{
"api": "erp.storage.stockincreate",
"data": [
{
"itemCode": "...",
"quantity": ...,
...
},
...
]
}
这只是整个解决方案的一部分,通过细致设计各个环节及其联动性,为企业提供了一套从采集、转化、再到存储的一体化高效解决路径。在下一步内容中,我们将详细解析每个步骤具体实现细节以及注意事项,帮助您更深入理解该集成方案背后的技术逻辑。
调用金蝶云星空接口executeBillQuery获取并加工数据
在数据集成的生命周期中,调用源系统接口获取数据是至关重要的一步。本文将详细探讨如何通过轻易云数据集成平台调用金蝶云星空的executeBillQuery
接口,以获取采购入库单的数据,并进行必要的加工处理。
接口配置与调用
首先,我们需要配置调用金蝶云星空接口的元数据。以下是元数据配置的关键部分:
{
"api": "executeBillQuery",
"method": "POST",
"number": "FBillNo",
"id": "FInStockEntry_FEntryId",
"pagination": {
"pageSize": 500
},
"idCheck": true,
"request": [
{"field":"FInStockEntry_FEntryId","label":"id","type":"string","value":"FInStockEntry_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":"FOwnerTypeIdHead","label":"货主类型","type":"string","value":"FOwnerTypeIdHead"},
{"field":"FOwnerIdHead_FNumber","label":"货主","type":"string","value":"FOwnerIdHead.FNumber"}
],
"otherRequest": [
{"field": "Limit", "label": "最大行数", "type": "string", "describe": "金蝶的查询分页参数", "value": "{PAGINATION_PAGE_SIZE}"},
{"field": "StartRow", "label": "开始行索引", "type": "string", "describe": "金蝶的查询分页参数", "value": "{PAGINATION_START_ROW}"},
{"field": "FilterString",
"label": "过滤条件",
"type": "string",
"describe":
`示例写法 FSupplierId.FNumber = 'VEN00010' and FApproveDate>=`,
`value`: `FApproveDate>='{{LAST_SYNC_TIME|dateTime}}' and FBillTypeID.FNumber in ('RKD01_SYS','RKD03_SYS') and FMaterialId.FISsale=1`
},
{"field":
`FieldKeys`,
`label`: `需查询的字段key集合`,
`type`: `array`,
`describe`: `金蝶分录主键ID格式:FPOOrderEntry_FEntryId,其它格式 FPurchaseOrgId.FNumber`,
`parser`: {
`name`: `ArrayToString`,
`params`: ","
}
},
{"field":
`FormId`,
`label`: `业务对象表单Id`,
`type`: `string`,
`describe`: `必须填写金蝶的表单ID如:PUR_PurchaseOrder`,
`value`: `"STK_InStock"`
}
]
}
数据请求与清洗
在配置好元数据后,我们通过轻易云平台发起HTTP POST请求,调用executeBillQuery
接口。请求体包含了我们需要查询的字段和过滤条件。例如,我们可以通过以下过滤条件来筛选特定时间段内已审核的采购入库单:
{
FilterString: `"FApproveDate>='2023-01-01' and FBillTypeID.FNumber in ('RKD01_SYS','RKD03_SYS') and FMaterialId.FISsale=1"`
}
在接收到返回的数据后,需要对其进行清洗和转换。清洗过程包括去除无效数据、标准化字段格式等。例如,将日期字段统一转换为标准日期格式,确保后续处理的一致性。
数据转换与写入
清洗后的数据需要进一步转换,以符合目标系统的数据结构要求。例如,将金蝶云星空返回的数据映射到吉客云入库申请单所需的字段格式。以下是一个简单的数据映射示例:
{
吉客云字段: 金蝶云星空字段,
入库申请单编号: FBillNo,
入库日期: FDate,
收料组织: FStockOrgId_FNumber,
单据状态: FDocumentStatus,
}
完成数据转换后,通过轻易云平台将处理后的数据写入目标系统(如吉客云)。这一步通常涉及调用目标系统的API接口,并确保数据写入成功。
实时监控与错误处理
在整个过程中,实时监控和错误处理至关重要。轻易云平台提供了全面的监控功能,可以实时跟踪每个环节的数据流动和处理状态。一旦出现错误,如网络故障或数据格式不匹配,可以及时捕获并进行相应处理,确保数据集成过程顺利进行。
通过上述步骤,我们实现了从金蝶云星空获取采购入库单数据,并将其加工后写入吉客云系统。这不仅提高了业务透明度和效率,也为企业提供了可靠的数据支持。
使用轻易云数据集成平台进行ETL转换并写入吉客云API接口
在数据集成生命周期的第二阶段,我们需要将已经集成的源平台数据进行ETL转换,转为目标平台吉客云API接口所能够接收的格式,并最终写入目标平台。本文将详细介绍如何使用轻易云数据集成平台配置元数据,实现这一过程。
配置元数据
首先,我们需要根据提供的元数据配置,定义请求参数和字段映射。以下是元数据配置的详细内容:
{
"api": "erp.storage.stockincreate",
"effect": "EXECUTE",
"method": "POST",
"idCheck": true,
"request": [
{"field":"vendCode","label":"供应商编码","type":"string","describe":"供应商编码","value":"{FSupplierId_FNumber}"},
{"field":"applyDepartCode","label":"部门编码","type":"string","describe":"部门编号和公司编号 要同时填否则部门信息会有偏差","value":"{FStockDeptId_FNumber}"},
{"field":"applyCompanyCode","label":"入库公司编码","type":"string","describe":"公司编号和部门编号 要同时填否则公司信息会有偏差"},
{"field":"inWarehouseCode","label":"仓库编码","type":"string","describe":"仓库编码","value":"{FStockId_FNumber}"},
{"field":"inType","label":"入库类型","type":"string","describe":"入库类型 101=采购入库 102=调拨入库 103=盘盈入库 104=其他入库","value":"104"},
{"field":"relDataId","label":"关联单据编号","type":"string","describe":"可随机,保证不重复即可","value":"{FBillNo}"},
{"field":"applyUserName","label":"申请人姓名","type":"string","describe":"超级用户","value":"{FCreatorId_FName}"},
{"field":"applyDate","label":"申请时间","type":"string","describe":"申请时间","value":"{FDate}"},
{"field":"memo","label":"备注","type":"string","describe":"备注","value":"{FBillNo}"},
{"field":"operator","label":"制单人","type": "string", "describe": "制单人", "value": "{FCreatorId_FName}"},
{"field": "source", "label": "写死:OPEN", "type": "string", "describe": "写死:OPEN", "value": "OPEN"},
{
"field": "stockInDetailViews",
"label": "入库申请单明细",
"type": "array",
"describe": "入库申请单明细",
"value": "FInStockEntry",
"children": [
{"field": "outSkuCode",
"label": "货品编号",
"type":
string,
describe:
匹配货品信息的外部货品编号(按skuId>outSkuCode>skuBarcode匹配顺序,必传一个),
value: {{FInStockEntry.FMaterialId_FNumber}}},
{"field" : relDetailId, label : 关联实际业务明细表的id, type : string, describe : 关联实际业务明细表的id},
{ field: skuCount, label: 入库数量, type: string, describe: 入库数量, value: {{FInStockEntry.FRealQty}}},
{ field: isCertified, label: 是否正品, type: string, describe: 是否正品,1是0否, value: 1},
{ field: skuPrice, label: 入库价格, type: string, describe: 入库价格, value: {{FInStockEntry.FTaxPrice}}},
{ field: totalAmount, label: 入库金额, type: string, describe: 入库金额, value: {{FInStockEntry.FAllAmount}}},
{ field : isBatch , label : isBatch , type : string , value : _function IF( '{{FInStockEntry.FLot_FNumber}}' <> '', 1 , 0 ) },
{
field : batchList,
label : batchList,
type : array,
children : [
{ field : productionDate , label : productionDate , type : string , value : _function DATE_SUB(DATE_FORMAT(RIGHT('{{FInStockEntry.FLot_FNumber}}' , 8),'%Y-%m-%d'),INTERVAL 1094 DAY) },
{ field : batchNo , label : batchNo , type : string , value : {{FInStockEntry.FLot_FNumber}} },
{ field : quantity , label : quantity , type : string , value : {{FInStockEntry.FRealQty}} },
{ field : expirationDate , label : expirationDate , type : string , value : _function DATE_FORMAT(RIGHT('{{FInStockEntry.FLot_FNumber}}' , 8),'%Y-%m-%d') }
]
}
]
}
],
operation:{
method:"merge",
field:"FBillNo",
bodyName:"FInStockEntry",
bodySum:["FQty"],
header:["FBillNo",,"FSupplierId_FNumber",,"FStockId_FNumber",,"FCreatorId_FName",,"FDate"],
body:["FMaterialId_FNumber",,"FRealQty",,"FTaxPrice",,"FAllAmount",,"FLot_FNumber"]
}
}
数据转换与写入
在ETL过程中,我们需要将源平台的数据按照上述配置进行转换,并通过POST方法将其写入吉客云API接口。以下是具体步骤:
-
定义请求参数:
vendCode
: 对应供应商编码{FSupplierId_FNumber}
applyDepartCode
: 对应部门编码{FStockDeptId_FNumber}
applyCompanyCode
: 对应公司编码inWarehouseCode
: 对应仓库编码{FStockId_FNumber}
inType
: 固定值104
relDataId
: 对应关联单据编号{FBillNo}
applyUserName
: 对应申请人姓名{FCreatorId_FName}
applyDate
: 对应申请时间{FDate}
memo
: 对应备注{FBillNo}
operator
: 对应制单人{FCreatorId_FName}
source
: 固定值OPEN
-
定义明细字段:
- 明细字段包括货品编号、关联实际业务明细表ID、入库数量、是否正品、入库价格、入库金额等。
-
处理批次信息:
- 如果存在批次号,则需要处理批次相关信息,包括生产日期、批次号、数量和有效期。
-
调用API接口:
- 使用POST方法,将转换后的数据发送到吉客云API接口
erp.storage.stockincreate
。
- 使用POST方法,将转换后的数据发送到吉客云API接口
以下是一个示例代码片段,展示如何使用Python实现这一过程:
import requests
import json
# 定义请求头
headers = {
'Content-Type': 'application/json'
}
# 定义请求体
payload = {
'vendCode': source_data['FSupplierId_FNumber'],
'applyDepartCode': source_data['FStockDeptId_FNumber'],
'applyCompanyCode': source_data['company_code'],
'inWarehouseCode': source_data['FStockId_FNumber'],
'inType': '104',
'relDataId': source_data['FBillNo'],
'applyUserName': source_data['FCreatorId_FName'],
'applyDate': source_data['FDate'],
'memo': source_data['FBillNo'],
'operator': source_data['FCreatorId_FName'],
'source': 'OPEN',
}
# 添加明细字段
stock_in_detail_views = []
for entry in source_data['FInStockEntry']:
detail = {
'outSkuCode': entry['FMaterialId_FNumber'],
'relDetailId': entry['relDetail_id'],
'skuCount': entry['FRealQty'],
'isCertified': '1',
'skuPrice': entry['FTaxPrice'],
'totalAmount': entry['FAllAmount']
# 批次处理
if entry.get('FLot_FNumber'):
detail.update({
'isBatch': '1',
'batchList': [{
'productionDate': calculate_production_date(entry['FLot_FNumber']),
'batchNo': entry['FLot_FNumber'],
'quantity': entry['FRealQty'],
'expirationDate': calculate_expiration_date(entry['FLot_FNumber'])
}]
})
else:
detail.update({'isBatch':'0'})
stock_in_detail_views.append(detail)
payload.update({'stockInDetailViews' stock_in_detail_views})
# 调用API接口
response = requests.post('https://api.jikekyun.com/erp.storage.stockincreate', headers=headers,data=json.dumps(payload))
# 检查响应状态码
if response.status_code ==200:
print('数据成功写入吉客云')
else:
print(f'请求失败,状态码:{response.status_code}')
以上代码展示了如何根据元数据配置,将源平台的数据转换为吉客云API接口所需的格式,并通过POST方法将其写入目标平台。通过这种方式,可以实现不同系统间的数据无缝对接,提高业务效率。