Files
data-engine/sql/seed_data_dingtalk.sql
2026-06-11 13:06:54 +08:00

230 lines
10 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- =============================================
-- 钉钉开放平台初始化数据
--
-- 执行后需配置 tokenOAUTH2 读取 token 列,非 api_key
-- UPDATE api_datasource_platform SET token = '你的oapi access_token'
-- WHERE platform_code = 'dingtalk';
-- =============================================
-- 1. 创建钉钉平台
INSERT INTO api_datasource_platform (
tenant_id, creator, created_at, updater, updated_at,
platform_code, platform_name, description, status,
api_base_url, auth_type,
auth_config,
rate_limit_per_minute, rate_limit_per_hour,
concurrency_limit, request_timeout_ms, max_retries, retry_delay_ms
) VALUES (
1, 'admin', NOW(), 'admin', NOW(),
'dingtalk', '钉钉', '钉钉开放平台数据同步', 'ACTIVE',
'https://oapi.dingtalk.com', 'OAUTH2',
'{
"token_in_query": true,
"query_key": "access_token"
}'::jsonb,
60, 3600, 5, 30000, 3, 1000
);
-- 2. 部门列表(递归遍历全量部门树)
-- 先从根(不传 dept_id获取一级部门再对每个子部门递归调用获取下级
-- 请求POSTaccess_token 在 URL 查询参数中
-- 响应:{"errcode":0,"errmsg":"ok","result":[{...}]}
INSERT INTO api_interface (
tenant_id, creator, created_at, updater, updated_at,
platform_id, name, code, url, method, status, auth_type,
request_config, response_config, table_definition
) VALUES (
1, 'admin', NOW(), 'admin', NOW(),
(SELECT id FROM api_datasource_platform WHERE platform_code = 'dingtalk'),
'部门列表', 'department_list',
'/topapi/v2/department/listsub', 'POST', 'active', 'inherit',
'{
"parameters_location": "query",
"page_param": "cursor",
"page_size_param": "pageSize",
"language": "zh_CN",
"recursive": {
"key_field": "dept_id",
"target_param": "dept_id"
},
"max_recursive_depth": 20
}'::jsonb,
'{
"success_field": "errcode",
"success_value": 0,
"message_field": "errmsg",
"list_path": "result"
}'::jsonb,
'{
"table_name": "dingtalk_department",
"columns": [
{"name": "dept_id", "type": "BIGINT", "comment": "部门ID"},
{"name": "name", "type": "VARCHAR(300)", "comment": "部门名称"},
{"name": "parent_id", "type": "BIGINT", "comment": "父部门ID"},
{"name": "create_dept_group", "type": "BOOLEAN", "comment": "是否同步创建关联企业群"},
{"name": "auto_add_user", "type": "BOOLEAN", "comment": "新人是否自动加入部门群"}
],
"conflict_keys": ["dept_id"]
}'::jsonb
);
-- 3. 部门用户列表prefetch→department_list游标分页
-- 先递归获取全量部门树,再对每个部门分页拉取用户
-- dept_id 为必填,通过 prefetch 从部门列表注入
-- 响应result.list用户数组result.has_more是否还有更多result.next_cursor下一游标
INSERT INTO api_interface (
tenant_id, creator, created_at, updater, updated_at,
platform_id, name, code, url, method, status, auth_type,
request_config, response_config, table_definition
) VALUES (
1, 'admin', NOW(), 'admin', NOW(),
(SELECT id FROM api_datasource_platform WHERE platform_code = 'dingtalk'),
'部门用户列表', 'user_list',
'/topapi/v2/user/list', 'POST', 'active', 'inherit',
'{
"parameters_location": "query",
"page_param": "cursor",
"page_size_param": "size",
"cursor_pagination": true,
"size": 100,
"order_field": "modify_desc",
"language": "zh_CN",
"initial_cursor": 0,
"prefetch": {
"url": "/topapi/v2/department/listsub",
"method": "POST",
"response_path": "result",
"target_param": "dept_id",
"value_field": "dept_id"
}
}'::jsonb,
'{
"success_field": "errcode",
"success_value": 0,
"message_field": "errmsg",
"list_path": "result.list",
"cursor_field": "result.next_cursor",
"has_more_field": "result.has_more"
}'::jsonb,
'{
"table_name": "dingtalk_user",
"columns": [
{"name": "userid", "type": "VARCHAR(100)", "comment": "用户userId"},
{"name": "unionid", "type": "VARCHAR(200)", "comment": "用户唯一标识"},
{"name": "name", "type": "VARCHAR(200)", "comment": "用户姓名"},
{"name": "avatar", "type": "TEXT", "comment": "头像地址"},
{"name": "state_code", "type": "VARCHAR(20)", "comment": "国际电话区号"},
{"name": "mobile", "type": "VARCHAR(50)", "comment": "手机号码"},
{"name": "hide_mobile", "type": "BOOLEAN", "comment": "是否号码隐藏"},
{"name": "telephone", "type": "VARCHAR(50)", "comment": "分机号"},
{"name": "job_number", "type": "VARCHAR(100)", "comment": "员工工号"},
{"name": "title", "type": "VARCHAR(200)", "comment": "职位"},
{"name": "email", "type": "VARCHAR(200)", "comment": "员工邮箱"},
{"name": "org_email", "type": "VARCHAR(200)", "comment": "企业邮箱"},
{"name": "work_place", "type": "VARCHAR(300)", "comment": "办公地点"},
{"name": "remark", "type": "TEXT", "comment": "备注"},
{"name": "dept_id_list", "type": "JSONB", "comment": "所属部门id列表"},
{"name": "dept_order", "type": "INT", "comment": "员工在部门中的排序"},
{"name": "extension", "type": "TEXT", "comment": "扩展属性"},
{"name": "hired_date", "type": "BIGINT", "comment": "入职时间"},
{"name": "active", "type": "BOOLEAN", "comment": "是否激活钉钉"},
{"name": "admin", "type": "BOOLEAN", "comment": "是否企业管理员"},
{"name": "boss", "type": "BOOLEAN", "comment": "是否企业老板"},
{"name": "leader", "type": "BOOLEAN", "comment": "是否部门主管"},
{"name": "exclusive_account", "type": "BOOLEAN", "comment": "是否企业账号"}
],
"conflict_keys": ["userid"]
}'::jsonb
);
-- 4. 考勤数据查询单个用户单日prefetch→user_list
-- 需先同步 user_list 获取全量用户,再对每个用户调用此接口查询考勤数据
-- userid 通过 prefetch 从 user_list 注入work_date 固定为当天日期
-- 响应result 对象(包含 attendance_result_list/check_record_list/approve_list 等)
-- 注意:当前代码支持两级 prefetch 链(即本接口 prefetch→user_list
-- user_list 自有 prefetch→department_list但 user_list 的 dept_id 依赖
-- 在作为 prefetch 来源时不会自动解析。若需全量同步所有用户的考勤数据,
-- 建议先手动同步 user_list 和 department_list再同步此接口。
-- 使用前请将 work_date 更新为目标日期,如 '2026-06-03'
INSERT INTO api_interface (
tenant_id, creator, created_at, updater, updated_at,
platform_id, name, code, url, method, status, auth_type,
request_config, response_config, table_definition
) VALUES (
1, 'admin', NOW(), 'admin', NOW(),
(SELECT id FROM api_datasource_platform WHERE platform_code = 'dingtalk'),
'考勤数据查询', 'attendance_getupdatedata',
'/topapi/attendance/getupdatedata', 'POST', 'active', 'inherit',
'{
"parameters_location": "query",
"prefetch": {
"url": "/topapi/v2/user/list",
"method": "POST",
"response_path": "result.list",
"target_param": "userid",
"value_field": "userid"
},
"work_date": "2026-06-03"
}'::jsonb,
'{
"success_field": "errcode",
"success_value": 0,
"message_field": "errmsg",
"list_path": "result",
"single_record": true
}'::jsonb,
'{
"table_name": "dingtalk_attendance",
"columns": [
{"name": "userid", "type": "VARCHAR(100)", "comment": "用户userId"},
{"name": "work_date", "type": "VARCHAR(30)", "comment": "查询日期"},
{"name": "corpId", "type": "VARCHAR(100)", "comment": "企业corpId"},
{"name": "attendance_result_list", "type": "JSONB", "comment": "打卡结果列表"},
{"name": "check_record_list", "type": "JSONB", "comment": "打卡详情列表"},
{"name": "approve_list", "type": "JSONB", "comment": "审批单列表"},
{"name": "rest_time_vo_list", "type": "JSONB", "comment": "班次内休息信息"},
{"name": "rest_end_time", "type": "BIGINT", "comment": "休息结束时间"},
{"name": "rest_begin_time", "type": "BIGINT", "comment": "休息开始时间"}
],
"conflict_keys": ["userid", "work_date"]
}'::jsonb
);
-- 5. 角色列表偏移量分页offset/size + hasMore
-- 响应result.list角色组数组result.hasMore是否还有更多
-- 每个角色组内包含 roles 数组({id, name})你
INSERT INTO api_interface (
tenant_id, creator, created_at, updater, updated_at,
platform_id, name, code, url, method, status, auth_type,
request_config, response_config, table_definition
) VALUES (
1, 'admin', NOW(), 'admin', NOW(),
(SELECT id FROM api_datasource_platform WHERE platform_code = 'dingtalk'),
'角色列表', 'role_list',
'/topapi/role/list', 'POST', 'active', 'inherit',
'{
"parameters_location": "query",
"page_param": "offset",
"page_size_param": "size",
"size": 200,
"offset": 0,
"pagination_mode": "offset"
}'::jsonb,
'{
"success_field": "errcode",
"success_value": 0,
"message_field": "errmsg",
"list_path": "result.list",
"has_more_field": "result.has_more"
}'::jsonb,
'{
"table_name": "dingtalk_role",
"columns": [
{"name": "groupId", "type": "BIGINT", "comment": "角色组ID"},
{"name": "name", "type": "VARCHAR(200)", "comment": "角色组名称"},
{"name": "roles", "type": "JSONB", "comment": "角色列表"}
],
"conflict_keys": ["groupId"]
}'::jsonb
);