You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

453 lines
13 KiB

4 hours ago
# -*- coding: utf-8 -*-
"""票 01 t11:把 5 份同步任务 .bru 写入文档仓(Write 工具无法出 workspace,经此脚本落盘)。"""
import io, os, sys
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
BASE = r'D:\code\crm-api-docs\A7 后台管理\用户管理\同步任务'
os.makedirs(BASE, exist_ok=True)
DOCS = {}
DOCS['钉钉组织同步.bru'] = '''meta {
name: 钉钉组织同步
type: http
seq: 1
tags: [
generated
]
}
post {
url: {{baseUrl}}/api/system/sync/dingtalk
body: none
auth: inherit
}
docs {
# 钉钉组织同步
`POST /api/system/sync/dingtalk`
发起钉钉组织同步任务A7-1-2 任务化建任务行即返回任务编号同步异步执行全量同步钉钉部门树与用户幂等可重跑
> ADMIN 角色已有运行中任务达到并发上限时返回 61023已有同步任务运行中
> 执行结果部门/用户新增更新计数进度失败明细同步任务详情 taskId 查询
> 手动发起触发方式记为 manual每日自动调度记为 auto重新同步复用本端点
## 请求参数
## 请求示例
请求头Authorization: Bearer {{token}}
POST /api/system/sync/dingtalk
## 响应 data 结构
data DtSyncLaunchDTO发起结果执行异步进行
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| taskId | string | 任务ID用于查同步任务详情 |
| taskNo | string | 任务编号格式 SYNC-MMdd-当日序号 |
## 响应示例
// 示例数据字段结构以上表为准非真实返回
```json
{
"code": 0,
"success": true,
"message": "success",
"data": {
"taskId": "2097168678261866498",
"taskNo": "SYNC-0908-01"
}
}
```
}
'''
DOCS['同步任务分页.bru'] = '''meta {
name: 同步任务分页
type: http
seq: 2
tags: [
generated
]
}
post {
url: {{baseUrl}}/api/system/sync/tasks/page
body: formUrlEncoded
auth: inherit
}
body:form-urlencoded {
current: 1
size: 10
taskNo: 0908
startTimeFrom: 2026-09-01
startTimeTo: 2026-09-08
triggerType: manual
status: running
}
docs {
# 同步任务分页
`POST /api/system/sync/tasks/page`
同步记录分页A7-1-2 ADMIN 角色任务编号/开始时间范围/触发方式/执行状态筛选默认按开始时间倒序
## 请求参数
| 参数 | 类型 | 必填 | 默认 | 说明 |
| --- | --- | --- | --- | --- |
| current | int | | 1 | 当前页码 1 开始 |
| size | int | | 10 | 每页条数上限 500 |
| orderBy | string | | - | 排序字段缺省按 startTime 倒序 |
| asc | boolean | | false | 是否升序 |
| taskNo | string | | - | 任务编号模糊匹配 0908 |
| startTimeFrom | date | | - | 开始时间起含当天 00:00 |
| startTimeTo | date | | - | 开始时间讫含当天 23:59:59 |
| triggerType | string | | - | 触发方式 manual/auto |
| status | string | | - | 执行状态 running/success/partial_failed/all_failed |
## 请求示例
请求头Authorization: Bearer {{token}}
Content-Type: application/x-www-form-urlencoded
POST /api/system/sync/tasks/page
current=1&size=10&taskNo=0908&startTimeFrom=2026-09-01&startTimeTo=2026-09-08&triggerType=manual&status=running
## 响应 data 结构
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| content[] | array<object> | 任务列表 |
| id | string | 任务ID |
| taskNo | string | 任务编号 SYNC-MMdd-序号 |
| triggerType | string | 触发方式 manual手动/ auto每日自动 |
| status | string | 执行状态 running/success/partial_failed/all_failed |
| startTime | datetime | 开始时间 |
| endTime | datetime | 结束时间执行中为 null |
| deptTotal | int | 钉钉侧部门总数 |
| deptInserted | int | 新增部门数 |
| deptUpdated | int | 更新部门数 |
| userTotal | int | 钉钉侧用户总数去重 |
| userInserted | int | 新增用户数 |
| userUpdated | int | 更新用户数 |
| errorCount | int | 异常数失败明细条数 |
| progress | int | 进度百分比 0~100发起 5 部门完成 45 用户完成 90 结束 100 |
| total | long | 总条数 |
| size | long | 每页条数 |
| current | long | 当前页码 |
| pages | long | 总页数 |
| empty | boolean | 是否空结果 |
## 响应示例
// 示例数据字段结构以上表为准非真实返回
```json
{
"code": 0,
"success": true,
"message": "success",
"data": {
"content": [
{
"id": "2097168678261866498",
"taskNo": "SYNC-0908-02",
"triggerType": "manual",
"status": "success",
"startTime": "2026-09-08 10:30:00",
"endTime": "2026-09-08 10:31:12",
"deptTotal": 42,
"deptInserted": 0,
"deptUpdated": 3,
"userTotal": 120,
"userInserted": 2,
"userUpdated": 5,
"errorCount": 0,
"progress": 100
}
],
"total": 1,
"size": 10,
"current": 1,
"pages": 1,
"empty": false
}
}
```
}
'''
DOCS['同步任务详情.bru'] = '''meta {
name: 同步任务详情
type: http
seq: 3
tags: [
generated
]
}
get {
url: {{baseUrl}}/api/system/sync/tasks/detail
body: none
auth: inherit
}
params:query {
id: 2097168678261866498
}
docs {
# 同步任务详情
`GET /api/system/sync/tasks/detail?id=`
同步任务详情A7-1-2 ADMIN 角色执行结果部门/用户新增更新计数失败对象/接口错误/处理结果执行进度
任务不存在返回 61024
## 请求参数
| 参数 | 类型 | 必填 | 默认 | 说明 |
| --- | --- | --- | --- | --- |
| id | string | | - | 任务ID发起同步返回的 taskId或分页行 id |
## 请求示例
请求头Authorization: Bearer {{token}}
GET /api/system/sync/tasks/detail?id=2097168678261866498
## 响应 data 结构
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| id | string | 任务ID |
| taskNo | string | 任务编号 SYNC-MMdd-序号 |
| triggerType | string | 触发方式 manual/auto |
| status | string | 执行状态 running/success/partial_failed/all_failed |
| startTime | datetime | 开始时间 |
| endTime | datetime | 结束时间执行中为 null |
| deptTotal | int | 钉钉侧部门总数 |
| deptInserted | int | 新增部门数 |
| deptUpdated | int | 更新部门数 |
| userTotal | int | 钉钉侧用户总数去重 |
| userInserted | int | 新增用户数 |
| userUpdated | int | 更新用户数 |
| errorCount | int | 异常数 |
| progress | int | 进度百分比 0~100 |
| failDetails[] | array<object> | 失败明细成功为空数组 |
| failObject | string | 失败对象如某部门名/某用户名 |
| apiError | string | 接口错误信息 |
| handleResult | string | 处理结果保留旧值 |
## 响应示例
// 示例数据字段结构以上表为准非真实返回
```json
{
"code": 0,
"success": true,
"message": "success",
"data": {
"id": "2097168678261866498",
"taskNo": "SYNC-0908-02",
"triggerType": "auto",
"status": "all_failed",
"startTime": "2026-09-08 02:00:00",
"endTime": "2026-09-08 02:00:41",
"deptTotal": 0,
"deptInserted": 0,
"deptUpdated": 0,
"userTotal": 0,
"userInserted": 0,
"userUpdated": 0,
"errorCount": 1,
"progress": 0,
"failDetails": [
{
"failObject": "钉钉组织同步",
"apiError": "钉钉组织同步失败:拉取部门用户失败(errcode=60003)",
"handleResult": "本次同步未产生变更,保留同步前资料。"
}
]
}
}
```
}
'''
DOCS['读取同步设置.bru'] = '''meta {
name: 读取同步设置
type: http
seq: 4
tags: [
generated
]
}
get {
url: {{baseUrl}}/api/system/sync/settings
body: none
auth: inherit
}
docs {
# 读取同步设置
`GET /api/system/sync/settings`
读取钉钉自动同步设置A7-1-2 ADMIN 角色单例行配置首次读取自动初始化默认行每日 02:00 / 间隔 10 分钟 / 重试 2 / 并发 1
> plan当前计划 nextExecuteTime下次执行时间为派生字段不落库
> lastModifierName 取最近修改人姓名
## 请求参数
## 请求示例
请求头Authorization: Bearer {{token}}
GET /api/system/sync/settings
## 响应 data 结构
data DtSyncSettingsDTO
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| id | string | 设置行ID |
| autoSyncEnabled | boolean | 自动同步开关 |
| dailyTime | string | 每日执行时间 HH:mm |
| retryIntervalMinutes | int | 重试间隔分钟1 |
| retryMaxTimes | int | 重试次数1 |
| concurrency | int | 并发任务数1 |
| plan | string | 当前计划派生启用=每日 HH:mm运行中停用=已停用 |
| nextExecuteTime | datetime | 下次执行时间派生停用为 null启用=今日/次日 dailyTime |
| lastModifierName | string | 最近修改人姓名从未修改为 null |
| lastModifiedTime | datetime | 最近修改时间从未修改为 null |
## 响应示例
// 示例数据字段结构以上表为准非真实返回
```json
{
"code": 0,
"success": true,
"message": "success",
"data": {
"id": "2097168678261866499",
"autoSyncEnabled": true,
"dailyTime": "02:00",
"retryIntervalMinutes": 10,
"retryMaxTimes": 2,
"concurrency": 1,
"plan": "每日 02:00(运行中)",
"nextExecuteTime": "2026-09-09 02:00:00",
"lastModifierName": null,
"lastModifiedTime": null
}
}
```
}
'''
DOCS['保存同步设置.bru'] = '''meta {
name: 保存同步设置
type: http
seq: 5
tags: [
generated
]
}
post {
url: {{baseUrl}}/api/system/sync/settings
body: formUrlEncoded
auth: inherit
}
body:form-urlencoded {
autoSyncEnabled: true
dailyTime: 02:00
retryIntervalMinutes: 10
retryMaxTimes: 2
concurrency: 1
}
docs {
# 保存同步设置
`POST /api/system/sync/settings`
保存钉钉自动同步设置A7-1-2 ADMIN 角色返回保存后的完整设置含派生回显
> 边界校验不过返回 61022同步设置参数非法dailyTime 须为 HH:mm 格式
> 重试间隔1 分钟重试次数1并发任务数1
## 请求参数
| 参数 | 类型 | 必填 | 默认 | 说明 |
| --- | --- | --- | --- | --- |
| autoSyncEnabled | boolean | | - | 自动同步开关 |
| dailyTime | string | | - | 每日执行时间 HH:mm00:00~23:59 |
| retryIntervalMinutes | int | | - | 重试间隔分钟1 |
| retryMaxTimes | int | | - | 重试次数1 |
| concurrency | int | | - | 并发任务数1 |
## 请求示例
请求头Authorization: Bearer {{token}}
Content-Type: application/x-www-form-urlencoded
POST /api/system/sync/settings
autoSyncEnabled=true&dailyTime=02:00&retryIntervalMinutes=10&retryMaxTimes=2&concurrency=1
## 响应 data 结构
data 为保存后的 DtSyncSettingsDTO字段同读取同步设置
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| id | string | 设置行ID |
| autoSyncEnabled | boolean | 自动同步开关 |
| dailyTime | string | 每日执行时间 HH:mm |
| retryIntervalMinutes | int | 重试间隔分钟 |
| retryMaxTimes | int | 重试次数 |
| concurrency | int | 并发任务数 |
| plan | string | 当前计划派生回显 |
| nextExecuteTime | datetime | 下次执行时间派生回显停用为 null |
| lastModifierName | string | 最近修改人姓名 |
| lastModifiedTime | datetime | 最近修改时间 |
## 响应示例
// 示例数据字段结构以上表为准非真实返回
```json
{
"code": 0,
"success": true,
"message": "success",
"data": {
"id": "2097168678261866499",
"autoSyncEnabled": true,
"dailyTime": "02:00",
"retryIntervalMinutes": 10,
"retryMaxTimes": 2,
"concurrency": 1,
"plan": "每日 02:00(运行中)",
"nextExecuteTime": "2026-09-09 02:00:00",
"lastModifierName": "管理员",
"lastModifiedTime": "2026-09-08 10:35:00"
}
}
```
}
'''
for name, content in DOCS.items():
path = os.path.join(BASE, name)
with open(path, 'w', encoding='utf-8', newline='\n') as f:
f.write(content)
print('OK', name, len(content.encode('utf-8')), 'bytes')