将金蝶数据写入钉钉API接口的ETL转换案例

  • 轻易云集成顾问-潘裕
### 金蝶云星空到钉钉的数据集成案例分享 在系统集成的复杂环境中,如何高效、精确地将金蝶云星空的数据无缝对接到钉钉,是众多企业面临的一大技术难题。本案例中,我们采用了轻易云数据集成平台,以【资料】金蝶&钉钉—银行账号为方案名称,全面解析了此类系统对接的解决方案。 首先,为避免数据遗漏,我们通过定时可靠的抓取机制调用金蝶云星空接口`executeBillQuery`获取所需数据,并利用批量处理的方法,将大量业务信息快速写入至钉钉接口`topapi/processinstance/create`。在操作过程中,处理分页和限流问题是关键一环,通过智能调度和分块处理来确保每次请求都能成功返回完整的数据包。 此外,两套系统间的数据格式差异也需要特别关注。在这个项目中,我们使用自定义映射规则,将金蝶云星空中的字段与对应的钉钉字段精准匹配,实现了数据格式转换的一致性。同时,对于常见的API调用异常情况,我们设计并实现了一套完善的错误重试机制,确保即便是在网络波动或服务端响应不及时等异常情况下,也不会丢失任何关键信息。 实时监控与日志记录功能贯穿整个实施过程,每一次数据传输及转换步骤都会产生详尽的日志文件,这些文件不仅帮助我们追踪运行状态,还为排查潜在问题提供了坚实保障。这种全方位监控极大提升了业务透明度,为后续深入优化奠定基础。 ![泛微OA与ERP系统接口开发配置](https://pic.qeasy.cloud/D16.png~tplv-syqr462i7n-qeasy.image) ### 调用金蝶云星空接口executeBillQuery获取并加工数据 在数据集成的生命周期中,调用源系统接口获取数据是至关重要的一步。本文将详细探讨如何通过轻易云数据集成平台调用金蝶云星空的`executeBillQuery`接口来获取银行账号相关的数据,并进行初步加工。 #### 接口配置与调用 首先,我们需要配置和调用金蝶云星空的`executeBillQuery`接口。根据提供的元数据配置,我们可以看到该接口使用POST方法进行请求,且主要参数包括表单ID、查询条件、分页参数等。 ```json { "api": "executeBillQuery", "effect": "QUERY", "method": "POST", "number": "FNumber", "id": "FBANKACNTID", "idCheck": true, "request": [ {"field":"FBANKACNTID","label":"FBANKACNTID","type":"string","describe":"111","value":"FBANKACNTID"}, {"field":"FDocumentStatus","label":"FDocumentStatus","type":"string","describe":"111","value":"FDocumentStatus"}, {"field":"FForbidStatus","label":"FForbidStatus","type":"string","describe":"111","value":"FForbidStatus"}, {"field":"FName","label":"FName","type":"string","describe":"111","value":"FName"}, {"field":"FNumber","label":"FNumber","type":"string","describe":"111","value":"FNumber"}, {"field":"FDescription","label":"FDescription","type":"string","describe":"111","value":"FDescription"}, {"field":"FCreateOrgId_Fnumber","label":"FCreateOrgId_Fnumber","type":"string","describe":"111","value":"FCreateOrgId.Fnumber"}, {"field":"FUseOrgId_Fnumber","label":"FUseOrgId_Fnumber","type":"string","describe":"111","value":"FUseOrgId.Fnumber"}, {"field":"FCreateDate","label":"FCreateDate","type":"string","describe":"111","value":"FCreateDate"}, {"field":...} ], "otherRequest": [ {"field": "Limit", "label": "Limit", "type": "string", "describe": "金蝶的查询分页参数", "value": "{PAGINATION_PAGE_SIZE}"}, {"field": "StartRow", "label": "StartRow", "type": "string", "describe": "金蝶的查询分页参数", "value": "{PAGINATION_START_ROW}"}, {"field":...} ], ... } ``` #### 请求参数解析 1. **FormId**: 表单ID,必须填写金蝶的表单ID,如`CN_BANKACNT`。 2. **FieldKeys**: 查询字段主键ID,如`FBANKACNTID`。 3. **FilterString**: 查询条件字符串,例如 `FSupplierId.FNumber = 'VEN00010' and FApproveDate>='{{LAST_SYNC_TIME|dateTime}}'`。 4. **Limit** 和 **StartRow**: 分页参数,用于控制每次查询的数据量和起始行。 #### 请求示例 以下是一个具体的请求示例: ```json { "FormId": "CN_BANKACNT", "FieldKeys": ["FBANKACNTID", ...], "FilterString": "FSupplierId.FNumber = 'VEN00010' and FApproveDate>='2023-01-01'", ... } ``` 在实际操作中,我们可以利用轻易云平台提供的可视化界面来配置这些参数,并通过API调用获取所需的数据。 #### 数据加工与清洗 获取到原始数据后,需要对其进行初步加工和清洗,以便后续的数据转换与写入。以下是一些常见的数据清洗步骤: 1. **字段映射**:将原始字段名映射为目标系统所需的字段名。 2. **数据格式转换**:将日期、金额等字段转换为统一格式。 3. **缺失值处理**:填补或删除缺失值,以保证数据完整性。 例如,对于银行账号数据,可以进行如下处理: ```python def clean_data(raw_data): cleaned_data = [] for record in raw_data: cleaned_record = { 'BankAccountID': record['FBANKACNTID'], 'AccountName': record['FName'], 'AccountNumber': record['FNumber'], 'CreationDate': convert_date(record['FCreateDate']), ... } cleaned_data.append(cleaned_record) return cleaned_data ``` #### 实时监控与日志记录 在整个数据请求与清洗过程中,实时监控和日志记录是确保数据处理透明度和可追溯性的关键。轻易云平台提供了强大的监控功能,可以实时查看API调用状态、数据流动情况以及处理结果。 通过上述步骤,我们可以高效地从金蝶云星空获取银行账号相关的数据,并进行初步加工,为后续的数据转换与写入打下坚实基础。这不仅提高了业务流程的透明度和效率,也为企业决策提供了可靠的数据支持。 ![金蝶与SCM系统接口开发配置](https://pic.qeasy.cloud/S8.png~tplv-syqr462i7n-qeasy.image) ### 使用轻易云数据集成平台进行ETL转换:将金蝶数据写入钉钉API接口 在数据集成的生命周期中,ETL(Extract, Transform, Load)转换是关键的一步。本文将详细探讨如何使用轻易云数据集成平台,将从金蝶系统获取的数据转换为钉钉API接口所能接收的格式,并最终写入钉钉系统。 #### 钉钉API接口元数据配置解析 首先,我们需要理解钉钉API接口的元数据配置,以便正确地进行数据映射和转换。以下是我们将使用的元数据配置: ```json { "api": "topapi/processinstance/create", "effect": "EXECUTE", "method": "POST", "idCheck": true, "request": [ { "field": "process_code", "label": "钉钉表单id", "type": "string", "describe": "process_code在审批流程编辑页面的URL网址中获取。", "value": "PROC-F2209A4F-8932-433A-9022-778C0995F4C5" }, { "field": "originator_user_id", "label": "发起人userid", "type": "string", "describe": "审批实例发起人的userid。", "value": "0911101641848981" }, { "field": "dept_id", "label": "发起人所属部门id", "type": "string", "describe": "发起人所在的部门,如果发起人属于根部门,传-1。", "value": "-1" }, { "field": "form_component_values", "label": "表单控件", "type": "object", ... } ] } ``` #### 数据请求与清洗 在进行ETL转换之前,我们首先需要从金蝶系统请求所需的数据,并进行必要的清洗和预处理。这一步骤通常包括以下几个环节: 1. **请求数据**:通过轻易云平台设置与金蝶系统的连接,发送请求以获取所需的数据。 2. **清洗数据**:对获取到的数据进行清洗,去除冗余信息,确保数据格式的一致性和完整性。 #### 数据转换 接下来,我们进入关键步骤——将清洗后的数据转换为符合钉钉API接口要求的格式。以下是具体的转换过程: 1. **映射字段**:根据元数据配置,将金蝶系统中的字段映射到钉钉API接口所需的字段。例如: - 金蝶系统中的银行账号字段映射到`form_component_values`中的`银行账号`。 - 金蝶系统中的银行名称字段映射到`form_component_values`中的`银行名称`。 2. **构建请求体**:根据映射关系构建POST请求体。假设从金蝶系统获取的数据如下: ```json { "_metadata_":{ "_data_":[ {"FNumber":"1234567890", "FName":"中国银行"} ] } } ``` 我们需要将其转换为如下格式: ```json { "process_code":"PROC-F2209A4F-8932-433A-9022-778C0995F4C5", "originator_user_id":"0911101641848981", "dept_id":"908684802", "form_component_values":[ { "name":"银行账号", "value":"1234567890" }, { "name":"银行名称", "value":"中国银行" } ] } ``` 3. **处理复杂对象**:对于复杂对象(如嵌套结构),需要递归地进行字段映射和转换。例如,`form_component_values`是一个包含多个子对象的数组,需要分别处理每个子对象。 #### 数据写入 最后一步是将转换后的数据通过POST请求写入到钉钉系统中。这一步骤包括: 1. **发送请求**:使用轻易云平台提供的HTTP客户端功能,发送POST请求至指定的API端点(`topapi/processinstance/create`)。 2. **检查响应**:接收并解析响应,检查是否有错误发生,并根据需要进行错误处理或重试。 #### 实际操作示例 以下是一个实际操作示例代码片段,用于展示如何实现上述步骤: ```python import requests import json # 从金蝶系统获取的数据 kingdee_data = { "_metadata_":{ "_data_":[ {"FNumber":"1234567890", "FName":"中国银行"} ] } } # 构建POST请求体 dingding_request_body = { 'process_code': 'PROC-F2209A4F-8932-433A-9022-778C0995F4C5', 'originator_user_id': '0911101641848981', 'dept_id': '908684802', 'form_component_values': [ {'name': '银行账号', 'value': kingdee_data["_metadata_"]["_data_"][0]["FNumber"]}, {'name': '银行名称', 'value': kingdee_data["_metadata_"]["_data_"][0]["FName"]} ] } # 将请求体转为JSON格式 dingding_request_json = json.dumps(dingding_request_body) # 设置请求头 headers = {'Content-Type': 'application/json'} # 发送POST请求至钉钉API端点 response = requests.post('https://oapi.dingtalk.com/topapi/processinstance/create', headers=headers, data=dingding_request_json) # 检查响应状态码及内容 if response.status_code == 200: print("Data successfully written to DingTalk") else: print("Failed to write data to DingTalk: ", response.text) ``` 通过上述步骤和代码示例,我们可以高效地完成从金蝶系统到钉钉API接口的数据ETL转换,实现不同系统间的数据无缝对接。这不仅提高了业务流程的自动化程度,也大幅提升了工作效率。 ![打通钉钉数据接口](https://pic.qeasy.cloud/T30.png~tplv-syqr462i7n-qeasy.image)