Ioan_新借款单(费用申请单)V4.0:钉钉数据集成到金蝶云星空的技术实现
在实际业务环境中,如何高效地将钉钉中的各类申请表、审批记录等数据集成到企业内部系统,如金蝶云星空,是每个信息化管理团队急需解决的问题。本文将详细探讨Ioan_新借款单(费用申请单)V4.0方案的具体实施过程,包括API接口调用、数据转换和异常处理等关键技术要点。
首先,我们使用了钉钉的数据获取API v1.0/yida/processes/instances
定时可靠地抓取最新的申请单据,通过轻易云数据集成平台支持自定义的数据转换逻辑,将这些原始数据进行标准化处理。由于不同系统间存在格式差异,通过平台提供的可视化设计工具,直接在界面上配置并映射两者之间的数据结构,使得复杂的数据转换操作直观且易于管理。
为确保大量数据能够快速和无遗漏地写入金蝶云星空,我们利用其批量写入API batchSave
实现高吞吐量的数据写入能力;这一性能特性不仅提升了整体处理速度,同时保证了业务连续性。此外,为应对钉钉接口可能出现的分页及限流问题,实现了一套完整的分页抓取与重试机制,以确保所有需要同步的信息都能准确无误地传输至目标系统。
实时监控是另一个至关重要的环节。通过集中监控和告警系统,我们能够实时跟踪每次任务执行状态,一旦发现异常情况,立即发出告警信息并启动错误重试机制。这种做法有效避免因临时故障造成的数据丢失或重复,提高整个流程运行的稳定性和可靠性。同时,对于非预期类型或内容格式不符的数据,可以通过事前自定义规则进行质量检测,并自动筛查掉问题条目,从源头上保障最终进入金蝶云星空数据库中的信息准确度。
本篇文章开端即从技术细节切入,为您剖析如何通过优化配对及流线型操作,在短时间内完成两个大型企业应用之间高效安全、灵活可拓展的数据整合任务。接下来我们会逐步深入分析具体步骤,以便更好理解全流程中涉及到的重要技术实现与最佳实践。
调用钉钉接口获取并加工数据
在数据集成的生命周期中,调用源系统接口是至关重要的一步。本文将详细探讨如何通过轻易云数据集成平台调用钉钉接口v1.0/yida/processes/instances
来获取并加工数据。
API 接口配置
首先,我们需要了解API接口的基本配置。根据提供的元数据配置,API接口采用POST方法,主要字段如下:
api
:v1.0/yida/processes/instances
method
:POST
number
:title
id
:processInstanceId
idCheck
: true
请求参数包含分页信息、应用ID、用户ID、语言、表单ID等。具体字段如下:
[
{"field":"pageNumber","label":"分页页码","type":"string","describe":"分页页码","value":"{PAGINATION_START_PAGE}"},
{"field":"pageSize","label":"分页大小","type":"string","describe":"分页大小","value":"{PAGINATION_PAGE_SIZE}"},
{"field":"appType","label":"应用ID","type":"string","describe":"应用ID","value":"APP_WTSCMZ1WOOHGIM5N28BQ"},
{"field":"systemToken","label":"应用秘钥","type":"string","describe":"应用秘钥","value":"IS866HB1DXJ8ODN3EXSVD750RBTK2X72R8MELL4"},
{"field":"userId","label":"用户的userid","type":"string","describe":"用户的userid","value":"16000443318138909"},
{"field":"language","label":"语言","type":"string","describe":"语言,取值:zh_CN:中文(默认值)en_US:英文"},
{"field":"formUuid","label":"表单ID","type":"string","describe":"表单ID","value":"FORM-3C866TC1BRT9L2XMCY5N4DXDM51B2HLXGEEGLF"},
{"label": "条件", "field": "searchFieldJson", "type": "object", "children": [
{"parent": "searchFieldJson", "label": "流水号", "field": "serialNumberField_lgek80ou", "type": "string"}
]},
{"field": "originatorId", "label": "根据流程发起人工号查询", "type": "string", "describe": "根据流程发起人工号查询"},
{"field": "createFromTimeGMT", "label": "创建时间起始值", "type": "string", "describe": "创建时间起始值",
"value": "_function DATE_FORMAT(DATE_ADD(NOW(),INTERVAL - 25 DAY),'%Y-%m-%d 00:00:00')"},
{"field": "createToTimeGMT", "label": "创建时间终止值", "type": "string",
"describe": "创建时间终止值",
"value": "{{CURRENT_TIME|datetime}}"},
{"field": "modifiedFromTimeGMT",
"label":
...
数据请求与清洗
在调用API获取数据时,需要特别注意以下几个关键点:
- 分页处理:通过
pageNumber
和pageSize
字段控制每次请求的数据量,确保能够处理大规模数据。 - 时间过滤:使用
createFromTimeGMT
和createToTimeGMT
字段过滤指定时间范围内的数据。这里使用了函数_function DATE_FORMAT(DATE_ADD(NOW(),INTERVAL - 25 DAY),'%Y-%m-%d 00:00:00')
来动态计算起始时间。 - 状态过滤:通过
instanceStatus
和approvedResult
字段过滤已完成且审批通过的实例。
数据转换与写入
在获取到原始数据后,需要对其进行必要的清洗和转换,以便后续写入目标系统。以下是一些常见的数据清洗操作:
- 字段映射:将源系统中的字段映射到目标系统所需的字段。例如,将钉钉中的
processInstanceId
映射为目标系统中的唯一标识符。 - 格式转换:将日期、金额等字段转换为目标系统所需的格式。例如,将日期格式从"yyyy-MM-dd HH:mm:ss"转换为"MM/dd/yyyy"。
- 数据过滤:根据业务需求过滤掉不必要的数据。例如,只保留审批通过的记录。
实际案例
假设我们需要集成一个新借款单(费用申请单),以下是具体步骤:
-
配置API请求参数:
{ ... {"field": "formUuid", ... }
-
调用API获取数据:
import requests url = 'https://oapi.dingtalk.com/v1.0/yida/processes/instances' headers = {'Content-Type': 'application/json'} payload = { ... 'formUuid': 'FORM-3C866TC1BRT9L2XMCY5N4DXDM51B2HLXGEEGLF', ... } response = requests.post(url, json=payload, headers=headers) data = response.json()
-
清洗和转换数据:
cleaned_data = [] for item in data['data']: cleaned_item = { 'id': item['processInstanceId'], 'title': item['title'], ... } cleaned_data.append(cleaned_item)
-
写入目标系统:
target_url = 'https://target-system/api/write' for item in cleaned_data: response = requests.post(target_url, json=item, headers=headers) if response.status_code != 200: print(f'Failed to write item {item["id"]}')
通过上述步骤,我们实现了从钉钉获取新借款单(费用申请单)并将其写入目标系统的全过程。这一过程不仅提高了数据处理效率,还确保了数据的一致性和准确性。
使用轻易云数据集成平台将源数据转换并写入金蝶云星空API接口
在数据集成的生命周期中,第二步是将已经集成的源平台数据进行ETL转换,并转为目标平台所能够接收的格式。本文将详细探讨如何通过轻易云数据集成平台,将源数据转换为金蝶云星空API接口所需的格式,并最终写入目标平台。
配置元数据与API接口
在轻易云数据集成平台中,我们使用以下元数据配置来实现与金蝶云星空API接口的对接:
{
"api": "batchSave",
"method": "POST",
"idCheck": true,
"operation": {
"method": "batchArraySave",
"rows": 1,
"rowsKey": "array"
},
"request": [
{"field":"FBillNo","label":"单据编号","type":"string","value":"{serialNumberField_lgek80ou}(FYSQ)"},
{"field":"FDate","label":"日期","type":"string","value":"_function FROM_UNIXTIME( ( {dateField_lgfwstn8} \/ 1000 ) ,'%Y-%m-%d' )"},
{"field":"FOrgID","label":"申请组织","type":"string","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"_function case '{selectField_lgfwstml}' when '是' then '{{tableField_lgek80p9.textField_lgfwstky}}' when '否' then '{textField_lgfwstmo}' end"},
{"field":"FStaffID","label":"申请人","type":"string","parser":{"name":"ConvertObjectParser","params":"FSTAFFNUMBER"},"value":"{textField_lhh040dd}"},
{"field":"FDeptID","label":"申请部门","type":"string","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"{{tableField_lgek80p9.textField_lgfwstkz}}"},
{"field":"FReason","label":"事由","type":"string","value":"{textareaField_lgfwstli}"},
{"field":"FCurrencyID","label":"币别","type":"string","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"PRE001"},
{"field":"FSettleTypeID","label":"结算方式","type":"string","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"JSFS04_SYS"},
{"field":"FPayOrgID","label":"付款组织","type":"string","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"{textField_lgfwstmo}"},
{"field\":\"FCostOrgID\",\"label\":\"费用承担组织\",\"type\":\"string\",\"parser\":{\"name\":\"ConvertObjectParser\",\"params\":\"FNumber\"},\"value\":\"{{tableField_lgek80p9.textField_lgfwstky}}\"},
{"field\":\"FCostDeptID\",\"label\":\"费用承担部门\",\"type\":\"string\",\"parser\":{\"name\":\"ConvertObjectParser\",\"params\":\"FNumber\"},\"value\":\"{{tableField_lgek80p9.textField_lgfwstkz}}\"},
{"field\":\"FIsBorrow\",\"label\":\"申请借款\",\"type\":\"string\",\"value\":\"true\"},
{"field\":\"FTOCONTACTUNITTYPE\",\"label\":\"往来单位类型\",\"type\":\"string\",\"value\":\"BD_Empinfo\"},
{"field\":\"FTOCONTACTUNIT\",\"label\":\"往来单位\",\"type\":\"string\",\"parser\":{\"name\":\"ConvertObjectParser\",\"params\":\"FNumber\"},\"value\":\"{textField_lhh040dd}\"},
{"field\":\"FLocCurrencyID\",\"label\":\"本位币\",\"type\":\"string\",\"parser\":{\"name\":\"ConvertObjectParser\",\"params\":\"FNumber\"},\"value\":\"PRE001\"},
{"field\": \" FExchangeRate \", \" label \": \" 汇率 \", \" type \": \" string \", \" value \": \" 1 \"},
{"field\": \" FExchangeTypeID \", \" label \": \" 汇率类型 \", \" type \": \" string \", \" parser \": {\" name \": \" ConvertObjectParser \", \" params \": \" FNumber \" }, \" value \": \" HLTX01_SYS \" },
{"field\": \" FBillTypeID \", \" label \": \" 单据类型 \", \" type \": \" string \", \" parser \": {\" name \": \" ConvertObjectParser \", \" params \": \" FNumber \" }, \" value \": `` FYSQ001_SYS `` },
{`` field``:````FBankName``,`` label``:````银行名称``,`` type``:`` `` string ``, `` value ``: `` { select Field _lg fwstmq } `` },
{ `` field ``: `` FBankAcctName ``, `` label ``: `` 账户名 ``, `` type ``: `` string ``, `` value ``: `` { select Field _lg fwstmp } `` },
{ `` field ``, ``, ``, ``, ``, ``, ``, ``, ``, ``, ``, ``, ``
{``
{``
{``
{``
{``
{``
{``
{``
{
{
{
{
{
{
{
{
{
{
{
{
{
{
{
{
{
{
数据转换与写入过程
-
单据编号(FBillNo):使用
{serialNumberField_lgek80ou}
字段生成唯一的单据编号,并附加后缀“(FYSQ)”。 -
日期(FDate):通过
_function FROM_UNIXTIME( ( {dateField_lgfwstn8} / 1000 ) ,'%Y-%m-%d' )
将 Unix 时间戳转换为标准日期格式。 -
申请组织(FOrgID):根据
{selectField_lgfwstml}
的值选择相应的组织编码,使用条件表达式_function case '{selectField_lgfwstml}' when '是' then '{{tableField_lgek80p9.textField_lgfwstky}}' when '否' then '{textField_lgfwstmo}' end
。 -
申请人(FStaffID):直接映射
{textField_lhh040dd}
字段值,并通过 ConvertObjectParser 转换为金蝶系统识别的员工编号。 -
申请部门(FDeptID):同样使用 ConvertObjectParser,将
{tableField_lgek80p9.textField_lgfwstkz}
转换为金蝶系统中的部门编号。 -
事由(FReason):简单映射
{textareaField_lgfwstli}
字段值。 -
币别、结算方式、付款组织、费用承担组织和部门等字段:这些字段均通过 ConvertObjectParser 转换为金蝶系统中的相应编码,如 PRE001、JSFS04_SYS 等。
-
明细字段处理:对于数组类型的明细字段,如费用项目(FExpenseItemID)、费用承担部门(FEntryCostDeptID)、金额(FOrgAmount)、备注(FRemark),我们使用嵌套结构进行处理,确保每个子字段都能正确映射和转换。
提交与审核
最后,我们通过设置以下参数实现自动提交并审核:
{
"FormId": "ER_ExpenseRequest",
"Operation": "BatchSave",
"IsAutoSubmitAndAudit": true,
"IsVerifyBaseDataField": false
}
这些配置确保了数据在写入金蝶云星空后能够自动提交并进行审核,从而简化了流程,提高了效率。
通过上述步骤,我们成功地将源平台的数据转换为金蝶云星空API接口所需的格式,并顺利写入目标平台。这一过程充分展示了轻易云数据集成平台在ETL转换和异构系统集成中的强大能力。