小满OKKICRM对接钉钉的实践案例:从数据获取到写入的全解析

  • 轻易云集成顾问-何语琴
### 小满OKKICRM数据集成到钉钉的技术案例分享:小满供应商=>钉钉 在本次系统对接集中,目标是实现小满OKKICRM的数据无缝集成到企业内部使用的钉钉平台。通过这一方案,我们将详细介绍如何利用轻易云数据集成平台有效处理大量数据的快速写入、分页和限流问题,实现数据格式转换与映射,从而保障数据完整性和一致性。 首先,对于从小满OKKICRM获取数据,我们调用了其API接口`/v1/company/list`。该接口支持分页查询,通过定时任务可靠地抓取最新的供应商信息,并按照业务逻辑进行批量处理。为了确保高效的数据提取和速度优化,特别注意处理了API接口在高并发场景下可能遇到的限流问题,并且设计了一套异常重试机制以保证任务运行稳定。 然后,对于将这些信息推送至钉钉,我们选用了其提供的数据写入API `topapi/processinstance/create` 进行操作。在这个环节中,最重要的是解决两者之间的数据格式差异。而为此特意构建了一套自定义的数据转换逻辑,以适配不同业务需求。同时,通过补充实时监控与日志记录功能,可以随时掌握每个步骤中的状态变化,有助于及时发现并修复潜在的问题,从而提高整体效率。 运用可视化的数据流设计工具,使整个流程不仅直观易懂,而且管理起来更加方便。此外,为了提升项目实施过程中的透明度及响应时间,还配置了集中式监控与告警系统,对所有关键节点进行实时跟踪,这样一来可以迅速检测出任何异常情况并触发相应措施,确保集成过程中不漏单、不丢单。 本文后续部分将具体阐述各个模块的技术实现细节,包括API调用参数设置、高吞吐量批量写入以及如何应对各种实际操作中遇到的问题等等,帮助大家全面了解该系统对接解决方案的全部过程。 ![打通用友BIP数据接口](https://pic.qeasy.cloud/D2.png~tplv-syqr462i7n-qeasy.image) ### 调用小满OKKICRM接口/v1/company/list获取并加工数据 在数据集成的生命周期中,调用源系统接口获取数据是至关重要的第一步。本文将深入探讨如何通过轻易云数据集成平台调用小满OKKICRM的`/v1/company/list`接口,并对获取的数据进行初步加工。 #### 接口调用配置 首先,我们需要配置API接口的元数据,以便平台能够正确地发起请求并处理响应。以下是元数据配置的详细说明: ```json { "api": "/v1/company/list", "method": "GET", "number": "基本信息公司名称", "id": "{{基本信息供货商档案名称}}{{owner.name}}{serial_id}{{基本信息供货商收款路线}}{name}", "idCheck": true, "autoFillResponse": true, "request": [ {"field":"start_index","label":"第几页","type":"string","describe":"第几页,默认 = 1","value":"1"}, {"field":"count","label":"每页记录数","type":"string","describe":"每页记录数,默认 = 20","value":"20"}, {"field":"removed","label":"是否查询已删除数据","type":"string","describe":"默认值: 0,设置=1时查询已删除的数据列表"}, {"field":"all","label":"查询所有客户","type":"string","describe":"默认值: 1,设置=1查询所有客户,设置=0只查询私海客户"}, {"field":"group_id","label":"客户分组ID","type":"string","describe":"设置客户分组ID后,只查询对应分组的客户", "value": "7769347527392"}, {"field":"date","label":"日期","type":"date","describe":"查询从此日期到今天为止有更新的客户列表"}, {"field":"start_time","label":"开始日期","type":"datetime", "value": "{{LAST_SYNC_TIME|datetime}}"}, {"field":"end_time","label":"结束日期", "type": "datetime", "value": "{{CURRENT_TIME|datetime}}"} ], "otherRequest": [ {"field": "info_api", "label": "详情接口", "type": "string", "value": "/v1/company/info"}, {"field": "info_key", "label": "详情主键", "type": "string", "value": "company_id"} ], "condition_bk":[ [{"field": "owner.name", "logic": "eqv2", "value": "张慧敏(22号)-产品研发员"}] ] } ``` #### 请求参数详解 - `start_index` 和 `count`:用于分页控制,分别表示从第几页开始和每页返回的记录数。 - `removed`:用于控制是否查询已删除的数据。 - `all`:用于控制是否查询所有客户。 - `group_id`:指定客户分组ID,仅返回该分组下的客户。 - `date`、`start_time` 和 `end_time`:用于时间范围过滤,确保只返回在指定时间范围内更新过的客户。 这些参数通过灵活配置,可以满足不同业务场景下的数据获取需求。 #### 数据请求与清洗 在发起API请求后,平台会自动处理响应数据。这一步包括解析响应内容、检查数据完整性以及初步清洗。例如: ```json { "_id": "{{基本信息供货商档案名称}}{{owner.name}}{serial_id}{{基本信息供货商收款路线}}{name}", "_source_system_id": "{{source_system_id}}", "_timestamp_sync_start_utc_datetime_utc_iso8601_str_utc_offset_00_00_00_000Z_utc_offset_00_00_00_000Z__iso8601_str__utc_offset__00_00__000Z__iso8601_str__utc_offset__00_00__000Z__iso8601_str__utc_offset__00_00__000Z", "_timestamp_sync_end_datetime_iso8601_str_iso8601_str_iso8601_str_iso8601_str_iso8601_str_iso8601_str_iso8601_str" } ``` 上述示例展示了如何生成唯一标识符 `_id`,确保每条记录在目标系统中的唯一性。此外,通过 `_timestamp_sync_start` 和 `_timestamp_sync_end` 字段,可以精确记录同步操作的时间戳,为后续的数据追踪和问题排查提供依据。 #### 数据转换与写入 在完成初步清洗后,需要对数据进行转换,以符合目标系统(如钉钉)的要求。具体操作包括字段映射、格式转换等。最终,将处理后的数据写入目标系统,实现无缝对接。 通过以上步骤,我们可以高效地调用小满OKKICRM接口获取并加工数据,为后续的数据集成奠定坚实基础。在实际应用中,根据业务需求灵活调整参数和处理逻辑,可以进一步提升集成效率和数据质量。 ![如何开发钉钉API接口](https://pic.qeasy.cloud/S28.png~tplv-syqr462i7n-qeasy.image) ### 轻易云数据集成平台:将源数据转换并写入钉钉API接口 在数据集成的生命周期中,第二步是将已经集成的源平台数据进行ETL转换,并转为目标平台所能接收的格式。本文将详细探讨如何通过轻易云数据集成平台,将小满供应商的数据转换并写入钉钉API接口。 #### 钉钉API接口元数据配置解析 我们将使用以下元数据配置来实现数据的转换和写入: ```json { "api": "topapi/processinstance/create", "method": "POST", "idCheck": true, "request": [ { "field": "process_code", "label": "审批流的唯一码", "type": "string", "describe": "process_code在审批流程编辑页面的URL网址中获取。", "value": "PROC-79A9A766-0193-4916-A702-3D134A93136B" }, { "field": "originator_user_id", "label": "发起人", "type": "string", "describe": "审批实例发起人的userid。", "value": "_mongoQuery 35d9f591-a5f9-3618-aac5-22772ae92e90 findField=content.userid where={\"content.name\":{\"$eq\":\"{{owner.0.name}}\"}}" }, { "field": "dept_id", "label": "发起人所在部门", "type": "string", "describe": "发起人所在的部门,如果发起人属于根部门,传-1。", "value": "_mongoQuery 35d9f591-a5f9-3618-aac5-22772ae92e90 findField=content.dept_id_list.0 where={\"content.name\":{\"$eq\":\"{{owner.0.name}}\"}}" }, { "field": "form_component_values", "label": "审批流表单参数", "type": "object", "children": [ { "field": "供货商档案名称", "label": "", ... } ... ] } ], ... } ``` #### 数据请求与清洗 首先,我们需要从小满供应商系统中提取相关的数据。假设我们已经完成了数据请求和清洗阶段,现在需要将这些清洗后的数据进行转换,以适应钉钉API接口的要求。 #### 数据转换与写入 1. **设置API基本信息**: - API路径:`topapi/processinstance/create` - 请求方法:`POST` - ID检查:`true` 2. **配置请求参数**: - `process_code`: 固定值 `"PROC-79A9A766-0193-4916-A702-3D134A93136B"` - `originator_user_id`: 使用MongoDB查询获取用户ID。 ```json "_mongoQuery 35d9f591-a5f9-3618-aac5-22772ae92e90 findField=content.userid where={\"content.name\":{\"$eq\":\"{{owner.0.name}}\"}}" ``` - `dept_id`: 使用MongoDB查询获取部门ID。 ```json "_mongoQuery 35d9f591-a5f9-3618-aac5-22772ae92e90 findField=content.dept_id_list.0 where={\"content.name\":{\"$eq\":\"{{owner.0.name}}\"}}" ``` - `form_component_values`: 表单参数,其中包含供货商档案名称和收款路线等信息。 ```json { ... { field: '供货商档案名称', value: '{{基本信息供货商档案名称}}' }, { field: '供货商收款路线', value: '{{基本信息供货商收款路线}}' } ... } ``` #### 实际操作步骤 1. **提取原始数据**: 从小满供应商系统中提取所需的数据,例如供货商档案名称和收款路线等。 2. **执行MongoDB查询**: 使用元数据配置中的MongoDB查询语句,获取对应的用户ID和部门ID。 3. **构建请求体**: 根据API要求构建请求体,将提取到的数据填充到相应字段中。 4. **发送请求**: 使用HTTP POST方法,将构建好的请求体发送到钉钉API接口。 #### 示例代码片段 以下是一个示例代码片段,展示如何使用Python脚本来实现上述操作: ```python import requests import json # 构建请求体 data = { 'process_code': 'PROC-79A9A766-0193-4916-A702-3D134A93136B', 'originator_user_id': get_user_id('owner_name'), # 假设get_user_id是一个函数,用于执行MongoDB查询 'dept_id': get_dept_id('owner_name'), # 假设get_dept_id是一个函数,用于执行MongoDB查询 'form_component_values': [ {'name': '供货商档案名称', 'value': supplier_name}, {'name': '供货商收款路线', 'value': payment_route} ] } # 设置请求头 headers = {'Content-Type': 'application/json'} # 发送POST请求 response = requests.post('https://oapi.dingtalk.com/topapi/processinstance/create', headers=headers, data=json.dumps(data)) # 检查响应状态 if response.status_code == 200: print('Data successfully sent to DingTalk API') else: print(f'Failed to send data: {response.text}') ``` 通过以上步骤,我们成功地将小满供应商的数据转换并写入到了钉钉API接口,实现了不同系统间的数据无缝对接。这不仅提高了业务流程的自动化程度,也极大地提升了工作效率。 ![用友与CRM系统接口开发配置](https://pic.qeasy.cloud/T10.png~tplv-syqr462i7n-qeasy.image)