通过ETL实现数据转换:将离职信息写入钉钉API

  • 轻易云集成顾问-李国敏
### MySQL数据集成到钉钉:user-钉钉离职人员账号禁用提示信息 在企业管理过程中,及时有效地处理员工的入职与离职信息是确保业务连续性的关键环节。为了自动化和优化这一流程,我们利用轻易云数据集成平台,将MySQL数据库中的离职人员信息实时同步至钉钉系统,并通过API接口发送禁用账号的提示通知,这一方案被命名为 "user-钉钉离职人员账号禁用提示信息"。 本案例涉及多个技术要点,其中包括如何调用MySQL API以获取每个定时周期内的新离职记录,处理分页和限流问题,以及将这些数据批量写入到钉钉系统中。在实施过程中,通过自定义的数据转换逻辑来解决MySQL与钉钉之间的数据格式差异,同时采用了集中监控和告警系统,以确保任何异常情况能得到及时反馈和处理。 具体而言,我们先使用 `select` 查询从MySQL数据库中抓取需要的数据,再通过 `topapi/message/corpconversation/asyncsend_v2` 接口向指定的用户发送消息通知。这个集成操作不仅简化了管理员的工作,也大幅度提升了响应效率。此外,通过使用高吞吐量的数据写入能力,可以快速将大量关键信息传输至目标系统。 在实施整个流程时,为提高稳定性,还设置了错误重试机制和日志记录功能,以便于实时监控整个数据处理过程,并快速定位潜在问题。因此,本次项目成功实现了自动化、可靠且透明的员工账户管理,大幅降低人为干预可能导致的信息滞后或漏掉风险,提高整体业务运营效率。 ![企业微信与ERP系统接口开发配置](https://pic.qeasy.cloud/D15.png~tplv-syqr462i7n-qeasy.image) ### 使用轻易云数据集成平台调用MySQL接口获取并加工数据 在数据集成的生命周期中,调用源系统接口获取数据是至关重要的一步。本文将详细探讨如何使用轻易云数据集成平台,通过调用MySQL接口`select`来获取并加工数据,以实现对钉钉离职人员账号禁用提示信息的集成。 #### 元数据配置解析 在本次集成方案中,我们需要从多个系统(如四化、金蝶、MOM和报价)中获取用户信息,并进行整合。以下是元数据配置的详细解析: 1. **API类型**:`select` 2. **请求方法**:`POST` 3. **请求参数**: - `main_params`:主参数对象,包含两个子参数: - `limit`:限制结果集返回的行数,用于分页查询。 - `offset`:指定查询结果的起始位置,用于分页查询。 4. **其他请求参数**: - `main_sql`:主SQL查询语句,包含动态字段`:limit`和`:offset`,需要在执行查询之前进行参数绑定。 #### SQL查询语句 主SQL查询语句如下: ```sql select '四化' as system, a.user_name, a.real_name, a.status, b.job_number, b.name, b.title, b.del_flag, '064140631924255283,02610858451050657' as userid, c.dept_tree_name from sys_user a left join dingtalk_user b on a.job_number=b.job_number left join dingtalk_dept c on SUBSTRING_INDEX(b.dept_id_list, ',', 1)=c.dept_id where a.status=0 and a.user_type='11' and a.dingtalk_flag<>1 and (b.del_flag='1' or b.job_number is null) UNION ALL select '金蝶' as system, a.FUserAccount as user_name, a.FName as real_name, a.FForbidStatus as status, b.job_number, b.name, b.title, b.del_flag, '064140631924255283,154605330321564028,02610858451050657' as userid, c.dept_tree_name from kingdee_user a left join dingtalk_user b on a.FName=b.name left join dingtalk_dept c on SUBSTRING_INDEX(b.dept_id_list, ',', 1)=c.dept_id where a.FForbidStatus='A' and a.dingtalk_flag<>1 and (b.del_flag='1' or b.job_number is null) UNION ALL select 'MOM' as system, a.login_name as user_name, a.real_name as status,b.job_number,b.name,b.title,b.del_flag,'064140631924255283, 01394563550320843690,02610858451050657' as userid,c.dept_tree_name from mom_user a left join dingtalk_user b on a.login_name=b.job_number left join dingtalk_dept c on SUBSTRING_INDEX(b.dept_id_list, ',', 1)=c.dept_id where a.is_enabled=1 and a.dingtalk_flag<>1 and a.issupplier=0 and (b.del_flag='1' or b.job_number is null) UNION ALL select '报价' as system,a.username as user_name,a.realname as real_name,a.status,b.job_number,b.name,b.title,b.del_flag,'064140631924255283, 02610858451050657' as userid,c.dept_tree_name from crm_user a left join dingtalk_user b on a.realname=b.name left join dingtalk_dept c on SUBSTRING_INDEX(b.dept_id_list, ',', 1)=c.dept_id where a.status=1 and a.dingtalk_flag<>1 and (b.del_flag='1' or b.job_number is null) limit :limit offset :offset; ``` #### 参数绑定与执行 在执行上述SQL查询之前,需要将动态字段`:limit`和`:offset`替换为实际值。具体步骤如下: 1. 将主SQL查询语句中的动态字段`:limit`和`:offset`替换为占位符(例如 `?`)。 2. 在执行查询之前,使用参数绑定的方法,将请求参数的值与占位符进行对应绑定。 例如: ```sql -- 替换后的SQL语句: select '四化' as system,a.user_name,a.real_name,a.status,b.job_number,b.name,b.title,b.del_flag,'064140631924255283, 02610858451050657' as userid,c.dept_tree_name from sys_user ... -- 参数绑定: params = [10, 0] -- 假设分页大小为10,起始行数为0。 ``` #### 数据处理与返回 通过上述步骤,我们可以从不同系统中获取所需的数据,并进行整合。最终的数据将包含以下字段: - `system`: 系统名称(如四化、金蝶等) - `user_name`: 用户名 - `real_name`: 真实姓名 - `status`: 用户状态 - `job_number`: 工号 - `name`: 姓名 - `title`: 职位名称 - `del_flag`: 删除标志 - `userid`: 用户ID列表(用于钉钉账号禁用) - `dept_tree_name`: 部门树名称 这些数据将被进一步处理,以生成钉钉离职人员账号禁用提示信息。 通过以上技术案例,我们展示了如何使用轻易云数据集成平台高效地调用MySQL接口获取并加工数据,实现跨系统的数据整合和处理。 ![数据集成平台可视化配置API接口](https://pic.qeasy.cloud/S30.png~tplv-syqr462i7n-qeasy.image) ### 使用轻易云数据集成平台进行ETL转换并写入钉钉API接口 在数据集成的生命周期中,ETL(提取、转换、加载)是关键步骤之一。本文将详细探讨如何使用轻易云数据集成平台,将已经集成的源平台数据进行ETL转换,并转为钉钉API接口所能接收的格式,最终写入目标平台。 #### 数据请求与清洗 首先,我们需要从源系统提取相关数据,并进行必要的清洗。这一步骤确保我们获取的数据是准确且符合业务需求的。在这里,我们假设已经完成了数据请求与清洗,接下来进入数据转换与写入阶段。 #### 数据转换与写入 在这个阶段,我们将重点放在如何将清洗后的数据转换为钉钉API接口所能接受的格式,并通过API接口将数据写入钉钉系统。 ##### 元数据配置解析 以下是我们需要配置的元数据: ```json { "api": "topapi/message/corpconversation/asyncsend_v2", "effect": "EXECUTE", "method": "POST", "idCheck": true, "request": [ { "field": "userid_list", "label": "userid_list", "type": "string", "describe": "111", "value": "{userid}" }, { "field": "to_all_user", "label": "to_all_user", "type": "string", "describe": "111", "value": "false" }, { "field": "msg", "label": "msg", "type": "object", "describe": "111", "value": "test", ... }, { ... } ] } ``` ##### 配置字段解析 1. **`userid_list`**: 用户ID列表,类型为字符串,用于指定接收消息的用户。 2. **`to_all_user`**: 是否发送给所有用户,类型为字符串,这里设置为`false`。 3. **`msg`**: 消息内容,类型为对象,其中包含消息类型和具体内容。 4. **`agent_id`**: 应用ID,用于标识发送消息的应用。 ##### 消息内容配置 消息内容部分是一个复杂对象,包括以下字段: - **`msgtype`**: 消息类型,这里设置为`markdown`。 - **`markdown`**: Markdown格式的消息内容,包括标题和文本。 Markdown内容中的文本字段使用了动态拼接函数,将多个字段组合成一条完整的信息: ```json { ... { ... { ... { ... { ... { ... { ... { ... { ... { ... { ... { ... { ... { ... "_function CONCAT(' \\n ', '# {system}系统账号禁用提醒: \\n', now(),' \\n', '### 工号:','{job_number}',' \\n', '### 姓名:','{name}',' \\n', '### 部门:','{dept_tree_name}',' \\n', '### 职务:','{title}',' \\n', '### 系统账号:','{user_name}',' \\n', '### 系统姓名:','{real_name}')" } } } } } } } } } } } } } } ``` ##### 实际操作步骤 1. **提取源数据**:从源系统中提取包含用户ID、工号、姓名、部门等信息的数据。 2. **清洗与校验**:对提取的数据进行清洗和校验,确保所有字段符合要求。 3. **构建请求体**:根据元数据配置构建请求体,将各个字段填充到对应的位置。 4. **发送请求**:使用HTTP POST方法,将构建好的请求体发送到钉钉API接口。 ##### 示例代码片段 以下是一个示例代码片段,用于展示如何构建请求体并发送HTTP请求: ```python import requests import json # 构建请求体 payload = { 'userid_list': '123456', 'to_all_user': 'false', 'msg': { 'msgtype': 'markdown', 'markdown': { 'title': '离职人员账号清理提示', 'text': f"# 系统账号禁用提醒: \n {now()} \n ### 工号:12345 \n ### 姓名:张三 \n ### 部门:技术部 \n ### 职务:工程师 \n ### 系统账号:admin \n ### 系统姓名:张三" } }, 'agent_id': '2811489571' } # 设置请求头 headers = {'Content-Type': 'application/json'} # 发送HTTP POST请求 response = requests.post('https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2', headers=headers, data=json.dumps(payload)) # 打印响应结果 print(response.json()) ``` 以上示例展示了如何使用Python脚本构建并发送HTTP POST请求,将经过ETL转换的数据写入钉钉系统。通过这种方式,可以实现不同系统间的数据无缝对接,提高业务效率和透明度。 ![如何对接用友BIP接口](https://pic.qeasy.cloud/T4.png~tplv-syqr462i7n-qeasy.image)