泛微OA与金蝶云星空的高效数据集成实践:FD004方案解析
在此次案例中,我们将分享一个成功的数据集成实例,即如何通过轻易云平台,将泛微OA-Http系统中的费用报销单据无缝对接到金蝶云星空,并生成对应的其他应付单。该方案命名为“FD004-对个费用报销 泛微=>金蝶其他应付单--501”,实现了企业跨系统的数据流动、处理和同步。
数据获取与接口调用
首先,我们需要从泛微OA-Http系统中抓取相关费用报销数据,使用其提供的API接口/api/workflow/paService/getWorkflowRequest
进行定时可靠的数据获取。为保证不漏抓任何一条记录,同时考虑到分页和限流问题,采用批量请求策略是关键之一。
数据转换与映射
由于泛微OA-Http与金蝶云星空之间存在显著的API结构差异,需要自定义数据转换逻辑来适配各自特定业务需求。例如,对获取到的原始JSON数据,需要经过格式调整和字段映射,以符合金蝶云星空写入格式要求。
高吞吐量数据写入
然后,通过轻易云平台提供的大量并行处理能力,将预处理后的费用报销数据批量快速地写入至金蝶云星空。这里我们利用了其专用API batchSave
进行大批次高效写入,从而确保即使在大量交易数据情况下,也能保持较高的数据同步时效性。
集中监控与异常处理
整个过程中,集中监控和告警机制发挥了关键作用。从任务状态实时跟踪,到性能指标监测,再到异常事件自动告警,使得运维团队能够及时发现并解决潜在问题。此外,错误重试机制被应用于各种边缘情况,如网络故障或服务端未响应等情形下,通过多次尝试最大程度降低因意外导致的数据损失风险。
这仅是本案例的一部分展开内容。在后续章节里,我们将进一步探讨具体流程、技术细节及最佳实践方法,包括如何打通泛微OA—> Http API 与 金蝶云星空—> batchSave API 之间复杂却必要的信息交换环节。
调用泛微OA-Http接口/api/workflow/paService/getWorkflowRequest获取并加工数据
在轻易云数据集成平台的生命周期中,调用源系统接口是至关重要的第一步。本文将深入探讨如何通过泛微OA-Http接口/api/workflow/paService/getWorkflowRequest
获取并加工数据,以实现对个费用报销数据的集成。
接口调用与元数据配置
首先,我们需要理解元数据配置中的各个字段及其作用:
{
"api": "/api/workflow/paService/getWorkflowRequest",
"effect": "QUERY",
"method": "GET",
"number": "requestId",
"id": "requestId",
"name": "id",
"idCheck": true,
"request": [
{"field": "workflowId", "label": "e9流程id", "type": "string", "value": "501"},
{"field": "workflowIdList", "label": "workflowIdList中间方案ID", "type": "string",
"value":"2356388e-8c49-35b3-bb7e-1eca1a8617d5"}
],
"autoFillResponse": true,
"condition_bk":[
[{"field":"workflowMainTableInfo.bxlx","logic":"eqv2","value":"实报实销"}],
[{"field":"workflowMainTableInfo.bxlx","logic":"eqv2","value":"Actual Expense"}]
],
"condition":[
[{"field":"workflowMainTableInfo.bxlx","logic":"eqv2","value":"实报实销"}],
[{"field":"workflowMainTableInfo.bxlx","logic":"eqv2","value":"Actual Expense"}]
]
}
API接口调用
通过上述配置,我们可以确定API的调用方式为GET请求,目标是获取特定workflowId
和workflowIdList
的数据。具体步骤如下:
-
构建请求URL:根据元数据中的API路径和请求参数,构建完整的URL。
base_url = 'http://example.com/api/workflow/paService/getWorkflowRequest' params = { 'workflowId': '501', 'workflowIdList': '2356388e-8c49-35b3-bb7e-1eca1a8617d5' }
-
发送HTTP GET请求:
import requests response = requests.get(base_url, params=params) if response.status_code == 200: data = response.json() # 后续处理逻辑 else: print(f"Error: {response.status_code}")
数据过滤与清洗
根据元数据配置中的条件,我们需要对返回的数据进行过滤和清洗。条件包括:
workflowMainTableInfo.bxlx
字段值为“实报实销”或“Actual Expense”。
假设返回的数据结构如下:
{
"data": [
{
"requestId": "12345",
...
"workflowMainTableInfo": {
...
"bxlx": "实报实销"
}
},
...
]
}
我们可以使用以下代码进行过滤:
filtered_data = [item for item in data['data'] if item['workflowMainTableInfo']['bxlx'] in ['实报实销', 'Actual Expense']]
数据转换与写入
在完成数据过滤后,需要将数据转换为目标系统所需的格式,并写入到目标系统。此过程涉及到字段映射和格式转换。
假设目标系统需要的数据格式如下:
{
"expenseReports": [
{
...
// 转换后的字段
}
]
}
可以使用以下代码进行转换:
expense_reports = []
for item in filtered_data:
expense_report = {
'id': item['requestId'],
...
# 更多字段映射
}
expense_reports.append(expense_report)
# 将转换后的数据写入目标系统(例如,通过另一个API)
target_api_url = 'http://example.com/api/targetSystem'
response = requests.post(target_api_url, json={'expenseReports': expense_reports})
if response.status_code == 200:
print("Data successfully written to target system.")
else:
print(f"Error: {response.status_code}")
通过以上步骤,我们实现了从泛微OA系统获取费用报销数据,并经过清洗、转换后写入到目标系统的全过程。这不仅展示了轻易云平台在处理异构系统集成中的强大能力,也提供了一个详细的技术案例供参考。
使用轻易云数据集成平台将源数据转换并写入金蝶云星空API接口
在数据集成的生命周期中,ETL(提取、转换、加载)是至关重要的一步。本文将详细探讨如何使用轻易云数据集成平台,将已经集成的源平台数据进行ETL转换,转为金蝶云星空API接口所能够接收的格式,并最终写入目标平台。
API接口配置与元数据解析
在本案例中,我们将使用金蝶云星空的batchSave
API接口来实现数据写入。以下是该接口的元数据配置:
{
"api": "batchSave",
"effect": "EXECUTE",
"method": "POST",
"idCheck": true,
"operation": {
"rowsKey": "array",
"rows": 1,
"method": "batchArraySave"
},
"request": [
{"field":"FBillTypeID","label":"单据类型","type":"string","describe":"单据类型\n其他应付单-QTYFD01_SYS\n费用报销其他应付单-QTYFD02 SYS","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"QTYFD01_SYS"},
{"field":"FBillNo","label":"单据编号","type":"string","describe":"单据编号"},
{"field":"FDATE","label":"业务日期","type":"string","describe":"业务日期","value":"{{workflowMainTableInfo.sqrq}}"},
{"field":"FCONTACTUNITTYPE","label":"往来单位类型","type":"string","describe":"往来单位类型\n部门-BD_Department\n员工-BD_Empinfo\n其他往来单位-FIN-OTHERS\n供应商-BD-Supplier\n客户-BD-Customer","value":"BD_Empinfo"},
{"field":"FCONTACTUNIT","label":"往来单位","type":"string","describe":"往来单位","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"_findCollection find workcode from c0198816-9822-38f3-b995-fc700a9925e7 where id={{workflowMainTableInfo.skmc_FV}}"},
{"field":"FCURRENCYID","label":"币别","type":"string","describe":"币别","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"_findCollection find FNumber from 5740d4e3-ebe8-3548-9635-f35e1fdc983b where FCODE={{workflowMainTableInfo.bberp}}"},
{"field":"FSETTLEORGID","label":"结算组织","type":"string","describe":"结算组织","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"{{workflowMainTableInfo.sqgs}}", "mapping":{"target": "65af7024d24198113013f21e", "direction": "positive"}},
{"field": "FPURCHASEORGID", "label": "采购组织", "type": "string", "describe": "采购组织", "parser":{"name": "ConvertObjectParser", "params": "FNumber"}, "value": "{{workflowMainTableInfo.sqgs}}", "mapping":{"target": 65af7024d24198113013f21e, direction: positive}},
{"field": FPAYORGID, label: 付款组织, type: string, describe: 付款组织, parser:{name: ConvertObjectParser, params: FNumber}, value: {{workflowMainTableInfo.sqgs}}, mapping:{target: 65af7024d24198113013f21e, direction: positive}},
{"field": FDEPARTMENTID, label: 申请部门, type: string, value: {{workflowMainTableInfo.sqbm_FV}}, parser:{name: ConvertObjectParser, params: FNumber}},
{"field": FPURCHASEDEPTID, label: 采购部门, type: string, value: {{workflowMainTableInfo.sqbm_FV}}, parser:{name: ConvertObjectParser, params: FNumber}},
{"field": FRemarks, label: 备注, type:string , describe:"备注" , value:"{{workflowMainTableInfo.bzsm}}"},
{"field" : FMAINBOOKSTDCURRID,label : 本位币,type : string , describe : 本位币 , parser : { name : ConvertObjectParser , params : FNumber }, value : {{ workflowMainTableInfo . sqgs }} , mapping : { direction : positive , target : 6583e449fa47d430a92d274a }},
{"field" : FEXCHANGETYPE,label : 汇率类型,type : string , describe : 汇率类型 , parser : { name : ConvertObjectParser , params : FNumber }, value :"HLTX01_SYS"},
{"field" :"FACCNTTIMEJUDGETIME" ,"label" :"到期日计算日期" ,"type" :"string" ,"describe" :"到期日计算日期" ,"value" :"{{ workflowMainTableInfo . sqrq }}"},
{"field" :"FBUSINESSTYPE" ,"label" :"业务类型" ,"type" :"string" ,"describe" :"业务类型" ,"value" :"OTHER"},
{"field" :"F_WDW_OANO ","label ":"自定义单号 ","type ":"string ","value ":"{{ workflowMainTableInfo . lcbh }}"},
{" field ":" F_XDW_PAYMENT "," label ":"预付款 "," type ":" string "," value ":"{{ workflowMainTableInfo . cjzk }}"}
],
otherRequest:[{" field ":" FormId "," label ":"业务对象表单Id "," type ":" string "," describe ":"必须填写金蝶的表单 ID 如:PUR_PurchaseOrder "," value ":" AP_OtherPayable "} ,
{ field:" Operation ", label:" 执行的操作 ", type:" string ", describe:"111", value:" BatchSave "} ,
{ field:" IsAutoSubmitAndAudit ", label:" 提交并审核 ", type:" bool ", describe:"111", value:" false "} ,
{ field:" IsVerifyBaseDataField ", label:" 验证基础资料 ", type:" bool ", describe:"是否验证所有的基础资料有效性,布尔类,默认 false (非必录)", value:true}
]
}
数据转换与映射
在此配置中,每个字段都有其特定的属性和描述。例如,FBillTypeID
字段表示单据类型,其值为QTYFD01_SYS
。通过使用ConvertObjectParser
解析器,可以将源数据中的某些字段转换为目标系统所需的格式。
以下是几个关键字段的解析和映射示例:
-
业务日期(FDATE):
{ "field": "FDATE", "label": "业务日期", "type": "string", "describe": "业务日期", "value": "{{workflowMainTableInfo.sqrq}}" }
在这个配置中,
{{workflowMainTableInfo.sqrq}}
表示从源系统获取的业务日期,将其直接映射到目标系统中的FDATE
字段。 -
往来单位(FCONTACTUNIT):
{ "field": "FCONTACTUNIT", "label": "往来单位", ... ... ... ... ...