案例分享:钉钉数据集成到金蝶云星空
在本技术案例中,我们将探讨如何通过轻易云数据集成平台,实现钉钉付款申请单与金蝶云星空差旅费报销单的无缝对接。在实际操作过程中,面临着多种技术挑战,例如确保数据不漏单、大量数据的快速写入、定时可靠的数据抓取等。
首先,为了从钉钉系统中获取付款申请单的数据,我们使用了topapi/processinstance/get
API接口。该接口允许我们查询特定流程实例的信息。为了防止遗漏任何一个付款申请单,我们设计了一套机制来处理分页和限流问题,同时结合实时监控日志记录,以便随时掌握数据流动情况。
其次,在将获得的数据导入到金蝶云星空之前,需要仔细处理两者之间的数据格式差异。例如,钉钉返回的是结构化JSON,而金蝶云星空需要接受符合其数据库规范的格式。因此,我们采用轻易云提供的定制化数据映射功能,将每个字段精确转换。此外,通过批量处理API batchSave
,实现高效的大量数据写入,从而提升整体性能。
在整个集成过程中,还必须关注异常处理和错误重试机制。一旦发生网络波动或接口调用失败,可以自动进行错误重试,并详细记录每次操作日志。这不仅确保了系统稳定性,也为后续维护提供了重要依据。
最后,为进一步优化流程,我们设置了定时任务,利用轻易云平台提供的调度能力,每隔一段时间自动抓取最新的数据并执行转换和上传操作。这一切都保证了业务流程的顺畅运行,使得企业能够更加专注于核心运营环节,提高整体生产效率。
调用钉钉接口topapi/processinstance/get获取并加工数据
在数据集成过程中,调用源系统的API接口是关键的一步。本文将详细探讨如何通过轻易云数据集成平台调用钉钉接口topapi/processinstance/get
来获取并加工数据,以实现付款申请单对接差旅费报销单的业务需求。
API接口配置
首先,我们需要配置元数据以调用钉钉的topapi/processinstance/get
接口。以下是元数据配置的详细内容:
{
"api": "topapi/processinstance/get",
"effect": "QUERY",
"method": "POST",
"number": "number",
"id": "id",
"name": "number",
"idCheck": true,
"autoFillResponse": true,
"condition": [
[
{
"field": "单据类型",
"logic": "eqv2",
"value": "差旅费报销"
}
]
]
}
配置解析
- API路径:
api
字段指定了我们要调用的API路径,即topapi/processinstance/get
。 - 请求方式:
method
字段定义了请求方式为POST。 - 查询条件:
condition
字段定义了查询条件,这里我们设置了一个条件,要求“单据类型”必须等于“差旅费报销”。 - 自动填充响应:
autoFillResponse
字段设置为true,表示我们希望自动填充响应数据。 - ID校验:
idCheck
字段设置为true,确保每个请求都有唯一的ID进行校验。
数据请求与清洗
在调用API获取数据后,我们需要对返回的数据进行清洗和处理。以下是一个典型的数据清洗流程:
- 验证响应: 确保API返回的数据结构符合预期,并检查是否包含所有必要的字段。
- 过滤无效数据: 根据业务逻辑过滤掉不符合条件的数据。例如,如果某些记录缺少必要的字段或值不合法,则将其排除在外。
- 格式转换: 将数据转换为目标系统所需的格式。这可能包括日期格式转换、数值单位转换等。
数据转换与写入
经过清洗后的数据需要进一步转换并写入目标系统。在本案例中,我们将清洗后的差旅费报销单数据写入金蝶系统。以下是一个简化的示例代码片段,展示如何进行数据转换和写入:
def transform_and_write(data):
transformed_data = []
for record in data:
transformed_record = {
'BillNumber': record['number'],
'EmployeeID': record['employee_id'],
'Amount': float(record['amount']),
'Date': convert_date_format(record['date'])
}
transformed_data.append(transformed_record)
# 写入金蝶系统
write_to_kingdee(transformed_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]}"
def write_to_kingdee(data):
# 实现写入金蝶系统的逻辑
pass
实时监控与错误处理
在整个过程中,实时监控和错误处理至关重要。轻易云平台提供了实时监控功能,可以帮助我们跟踪每个步骤的数据流动和处理状态。一旦出现错误,可以及时捕获并进行处理。例如,如果API调用失败或返回的数据不符合预期,可以记录日志并发送告警通知。
通过以上步骤,我们可以高效地实现付款申请单对接差旅费报销单的数据集成过程,从而提升业务透明度和效率。
使用轻易云数据集成平台进行ETL转换并写入金蝶云星空API接口的技术案例
在数据集成生命周期的第二步中,我们需要将已经集成的源平台数据进行ETL转换,转为目标平台金蝶云星空API接口所能够接收的格式,最终写入目标平台。以下是详细的技术实现步骤。
元数据配置解析
我们使用的元数据配置如下:
{
"api": "batchSave",
"effect": "EXECUTE",
"method": "POST",
"idCheck": true,
"request": [
{"field":"FBillNo","label":"单据编号","type":"string","value":"{{单据编号}}"},
{"field":"FDate","label":"申请日期","type":"string","value":"{{extend.create_time}}"},
{"field":"FBillTypeID","label":"单据类型","type":"string","value":"CLFBX001_SYS","parser":{"name":"ConvertObjectParser","params":"FNumber"}},
{"field":"FExpenseOrgId","label":"费用承担组织","type":"string","value":"100","parser":{"name":"ConvertObjectParser","params":"FNumber"}},
{"field":"FExpenseDeptID","label":"费用承担部门","type":"string","value":"{{部门信息TextField-K2AD4O5B}}","parser":{"name":"ConvertObjectParser","params":"FNumber"},"default":"{{部门信息TextField-K2AD4O5B}}"},
{"field":"FOrgID","label":"申请组织","type":"string","value":"100","parser":{"name":"ConvertObjectParser","params":"FNumber"}},
{"field":"FProposerID","label":"申请人","type":"string","value": "_findCollection find FNumber from ba3a0784-6df8-3184-b7b3-a1e33d754f58 where FName={{联系人}}", "parser":{"name": "ConvertObjectParser", "params": "FSTAFFNUMBER"}},
{"field": "FRequestDeptID", "label": "申请部门", "type": "string", "value": "{{部门信息TextField-K2AD4O5B}}", "parser": {"name": "ConvertObjectParser", "params": "FNumber"}},
{"field": "FCONTACTUNITTYPE", "label": "往来单位类型", "type": "string", "value": "_function CASE '{{往来单位类型}}' WHEN '客户' THEN 'BD_Customer' WHEN '供应商' THEN 'BD_Supplier' WHEN '员工' THEN 'BD_Empinfo' WHEN '其他往来单位' THEN 'FIN_OTHERS' ELSE 900 END"},
{"field": "FCONTACTUNIT", "label": "往来单位", "type": "string", "value": "_function CASE '{{往来单位类型}}' WHEN '客户' THEN '{{【往来单位】客户TextField-K2AD4O5B}}' WHEN '供应商' THEN '{{【往来单位】供应商TextField-K2AD4O5B}}' WHEN '员工' THEN '{{员工信息TextField-K2AD4O5B}}' WHEN '其他往来单位' THEN '{{【往来单位】其他往来单位TextField-K2AD4O5B}}' ELSE 900 END",
"parser":{"name" : "ConvertObjectParser" ,"params" : "FNumber"}},
{"field" : "FCurrencyID" , "label" : "币别" , "type" : "string" , "value" : "_function CASE '{{币别}}' WHEN '人民币' THEN 'PRE001' WHEN '美元' THEN 'PRE007' ELSE ' ' END",
"parser":{"name" : "ConvertObjectParser" ,"params" : "FNumber"}},
{"field" : "FPaySettlleTypeID", "label" : "结算方式", "type" : "string", "value" : "JSFS01_SYS",
"parser":{"name" : "ConvertObjectParser ","params ": “FNumber”}},
{"field ":" FExchangeTypeID ",“ label ":" 汇率类型 ",“ type ":" string ",“ value ":" HLTX01_SYS ",
“ parser ":{" name ":" ConvertObjectParser "," params ":" FNumber “}},
{“ field ”:“ FCausa ”,“ label ”:“事由”,“ type ”:“ string ”,“ value ”:“ {{付款用途 }}”},
{“ field ”:“ FRealPay ”,“ label ”:“实报实付”,“ type ”:“ string ”,“ value ”:“ 1 “},
{“ field” :“ FEntity”,“ label” :“报销明细”,“ type” :“ array”,“ value” :“表格”,“ children” :[
{“ field” :“ FExpID”,“ label” :“费用项目”,“ type” :“ string”,“ value” :“ {{表格.费用项目信息TextField-K2AD4O5B }}”,
“ parser”:{“ name”: “ ConvertObjectParser”, “ params”: “ FNumber “}},
{“ field” :“ FInvoiceType”,“ label” :“发票类型”,“ type” :“ string”,“ value” : “ 1 “},
{“ field” :“ FTravelStartDate”,“ label” : “开始日期”,“ type”: “ string”, “ value”: “ {{表格.开始日期 }}”},
{“ field”: “ FTravelEndDate”, “ label”: “结束日期”, “ type”: “ string”, “ value”: “ {{表格.结束日期 }}”},
{“ field”: “ FTravelStartSite”, “ label”: “出发地”,
……
]}
],
otherRequest: [
{
field: FormId,
label:业务对象表单Id,
type:string,
describe:必须填写金蝶的表单ID如:PUR_PurchaseOrder,
value:ER_ExpReimbursement_Travel
},
{
field: Operation,
label:执行的操作,
type:string,
describe:执行的操作,
value:BatchSave
},
{
field:IsAutoSubmitAndAudit,
label:提交并审核,
type:bool,
describe:提交并审核,
value:false
},
{
field:IsVerifyBaseDataField ,
label:验证基础资料 ,
type:bool ,
describe:是否验证所有的基础资料有效性,布尔类,默认false(非必录) ,
value:false
}
],
operation:{
rowsKey:"array",
rows:1,
method:"batchArraySave"
}
}
数据转换与写入步骤
-
字段映射与解析:
FBillNo
、FDate
等字段直接从源数据中提取。FBillTypeID
、FExpenseOrgId
等字段需要通过ConvertObjectParser
进行解析。- 特殊字段如
FProposerID
通过查找集合中的匹配项进行转换。
-
条件判断与函数调用:
FCurrencyID
、FCONTACTUNITTYPE
等字段通过条件判断和函数调用实现动态映射。例如,币别为人民币时映射为PRE001
。
-
数组处理:
- 报销明细部分(即
FEntity
)为数组,需要逐个处理每个子字段,如费用项目、发票类型等。
- 报销明细部分(即
示例代码
以下是一个示例代码片段,用于将源数据转换为目标格式,并通过API接口写入金蝶云星空:
import requests
# 源数据示例
source_data = {
# 源数据内容...
}
# 转换后的目标数据结构
target_data = {
# 根据元数据配置生成...
}
# API请求头和URL
headers = {
'Content-Type': 'application/json',
}
url = 'https://api.kingdee.com/batchSave'
# 发起POST请求
response = requests.post(url, json=target_data, headers=headers)
if response.status_code == 200:
print("数据成功写入金蝶云星空")
else:
print(f"写入失败,错误码:{response.status_code}")
注意事项
- 确保所有必填字段都已正确映射和解析。
- 在实际操作中,需要根据具体业务需求调整字段映射和解析逻辑。
- 实时监控API请求结果,以便及时处理可能出现的问题。
通过上述步骤,我们可以高效地将源平台的数据经过ETL转换后写入到金蝶云星空,实现不同系统间的数据无缝对接。