全面解析钉钉数据整合到金蝶云星空的关键技术

  • 轻易云集成顾问-姚缘
### Ioan_新借款单(费用申请单)V4.0:钉钉数据集成到金蝶云星空的技术实现 在实际业务环境中,如何高效地将钉钉中的各类申请表、审批记录等数据集成到企业内部系统,如金蝶云星空,是每个信息化管理团队急需解决的问题。本文将详细探讨Ioan_新借款单(费用申请单)V4.0方案的具体实施过程,包括API接口调用、数据转换和异常处理等关键技术要点。 首先,我们使用了钉钉的数据获取API `v1.0/yida/processes/instances` 定时可靠地抓取最新的申请单据,通过轻易云数据集成平台支持自定义的数据转换逻辑,将这些原始数据进行标准化处理。由于不同系统间存在格式差异,通过平台提供的可视化设计工具,直接在界面上配置并映射两者之间的数据结构,使得复杂的数据转换操作直观且易于管理。 为确保大量数据能够快速和无遗漏地写入金蝶云星空,我们利用其批量写入API `batchSave` 实现高吞吐量的数据写入能力;这一性能特性不仅提升了整体处理速度,同时保证了业务连续性。此外,为应对钉钉接口可能出现的分页及限流问题,实现了一套完整的分页抓取与重试机制,以确保所有需要同步的信息都能准确无误地传输至目标系统。 实时监控是另一个至关重要的环节。通过集中监控和告警系统,我们能够实时跟踪每次任务执行状态,一旦发现异常情况,立即发出告警信息并启动错误重试机制。这种做法有效避免因临时故障造成的数据丢失或重复,提高整个流程运行的稳定性和可靠性。同时,对于非预期类型或内容格式不符的数据,可以通过事前自定义规则进行质量检测,并自动筛查掉问题条目,从源头上保障最终进入金蝶云星空数据库中的信息准确度。 本篇文章开端即从技术细节切入,为您剖析如何通过优化配对及流线型操作,在短时间内完成两个大型企业应用之间高效安全、灵活可拓展的数据整合任务。接下来我们会逐步深入分析具体步骤,以便更好理解全流程中涉及到的重要技术实现与最佳实践。 ![金蝶与MES系统接口开发配置](https://pic.qeasy.cloud/D26.png~tplv-syqr462i7n-qeasy.image) ### 调用钉钉接口获取并加工数据 在数据集成的生命周期中,调用源系统接口是至关重要的一步。本文将详细探讨如何通过轻易云数据集成平台调用钉钉接口`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等。具体字段如下: ```json [ {"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获取数据时,需要特别注意以下几个关键点: 1. **分页处理**:通过`pageNumber`和`pageSize`字段控制每次请求的数据量,确保能够处理大规模数据。 2. **时间过滤**:使用`createFromTimeGMT`和`createToTimeGMT`字段过滤指定时间范围内的数据。这里使用了函数 `_function DATE_FORMAT(DATE_ADD(NOW(),INTERVAL - 25 DAY),'%Y-%m-%d 00:00:00')` 来动态计算起始时间。 3. **状态过滤**:通过`instanceStatus`和`approvedResult`字段过滤已完成且审批通过的实例。 #### 数据转换与写入 在获取到原始数据后,需要对其进行必要的清洗和转换,以便后续写入目标系统。以下是一些常见的数据清洗操作: 1. **字段映射**:将源系统中的字段映射到目标系统所需的字段。例如,将钉钉中的`processInstanceId`映射为目标系统中的唯一标识符。 2. **格式转换**:将日期、金额等字段转换为目标系统所需的格式。例如,将日期格式从"yyyy-MM-dd HH:mm:ss"转换为"MM/dd/yyyy"。 3. **数据过滤**:根据业务需求过滤掉不必要的数据。例如,只保留审批通过的记录。 #### 实际案例 假设我们需要集成一个新借款单(费用申请单),以下是具体步骤: 1. **配置API请求参数**: ```json { ... {"field": "formUuid", ... } ``` 2. **调用API获取数据**: ```python 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() ``` 3. **清洗和转换数据**: ```python cleaned_data = [] for item in data['data']: cleaned_item = { 'id': item['processInstanceId'], 'title': item['title'], ... } cleaned_data.append(cleaned_item) ``` 4. **写入目标系统**: ```python 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接口](https://pic.qeasy.cloud/S14.png~tplv-syqr462i7n-qeasy.image) ### 使用轻易云数据集成平台将源数据转换并写入金蝶云星空API接口 在数据集成的生命周期中,第二步是将已经集成的源平台数据进行ETL转换,并转为目标平台所能够接收的格式。本文将详细探讨如何通过轻易云数据集成平台,将源数据转换为金蝶云星空API接口所需的格式,并最终写入目标平台。 #### 配置元数据与API接口 在轻易云数据集成平台中,我们使用以下元数据配置来实现与金蝶云星空API接口的对接: ```json { "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 ``, ``, ``, ``, ``, ``, ``, ``, ``, ``, ``, ``, `` {`` {`` {`` {`` {`` {`` {`` {`` { { { { { { { { { { { { { { { { { { ``` #### 数据转换与写入过程 1. **单据编号(FBillNo)**:使用 `{serialNumberField_lgek80ou}` 字段生成唯一的单据编号,并附加后缀“(FYSQ)”。 2. **日期(FDate)**:通过 `_function FROM_UNIXTIME( ( {dateField_lgfwstn8} / 1000 ) ,'%Y-%m-%d' )` 将 Unix 时间戳转换为标准日期格式。 3. **申请组织(FOrgID)**:根据 `{selectField_lgfwstml}` 的值选择相应的组织编码,使用条件表达式 `_function case '{selectField_lgfwstml}' when '是' then '{{tableField_lgek80p9.textField_lgfwstky}}' when '否' then '{textField_lgfwstmo}' end`。 4. **申请人(FStaffID)**:直接映射 `{textField_lhh040dd}` 字段值,并通过 ConvertObjectParser 转换为金蝶系统识别的员工编号。 5. **申请部门(FDeptID)**:同样使用 ConvertObjectParser,将 `{tableField_lgek80p9.textField_lgfwstkz}` 转换为金蝶系统中的部门编号。 6. **事由(FReason)**:简单映射 `{textareaField_lgfwstli}` 字段值。 7. **币别、结算方式、付款组织、费用承担组织和部门等字段**:这些字段均通过 ConvertObjectParser 转换为金蝶系统中的相应编码,如 PRE001、JSFS04_SYS 等。 8. **明细字段处理**:对于数组类型的明细字段,如费用项目(FExpenseItemID)、费用承担部门(FEntryCostDeptID)、金额(FOrgAmount)、备注(FRemark),我们使用嵌套结构进行处理,确保每个子字段都能正确映射和转换。 #### 提交与审核 最后,我们通过设置以下参数实现自动提交并审核: ```json { "FormId": "ER_ExpenseRequest", "Operation": "BatchSave", "IsAutoSubmitAndAudit": true, "IsVerifyBaseDataField": false } ``` 这些配置确保了数据在写入金蝶云星空后能够自动提交并进行审核,从而简化了流程,提高了效率。 通过上述步骤,我们成功地将源平台的数据转换为金蝶云星空API接口所需的格式,并顺利写入目标平台。这一过程充分展示了轻易云数据集成平台在ETL转换和异构系统集成中的强大能力。 ![企业微信与OA系统接口开发配置](https://pic.qeasy.cloud/T18.png~tplv-syqr462i7n-qeasy.image)