Files
qhmes/docs/SCADA-用户同步接口文档.md

159 lines
4.9 KiB
Markdown
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.
# SCADA 用户同步接口文档
## 1. 目标与适用场景
本文档用于规范 SCADA 系统对 JeecgBoot 用户数据的读取方式,支持以下场景:
- SCADA 首次全量拉取用户并缓存到本地。
- SCADA 按更新时间进行增量同步(断网续传)。
- SCADA 按条件(用户名、工号、手机号)查询特定用户。
- 在需要时拉取用户的组织与租户详细信息。
---
## 2. 接口信息
- **接口名称**SCADA-免登录查询用户信息
- **请求方法**`GET`
- **接口路径**`/jeecg-boot/sys/user/scada/queryUser`
- **认证要求**:免登录(已加入后端白名单)
- **文档状态**:已在 Knife4j 中取消 `X-Access-Token` 必填限制
---
## 3. 请求参数
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
| `username` | string | 否 | - | 用户名,精确匹配 |
| `workNo` | string | 否 | - | 工号,精确匹配 |
| `phone` | string | 否 | - | 手机号,精确匹配 |
| `updatedAfter` | string | 否 | - | 增量同步时间游标,仅返回更新时间或创建时间大于等于该值的数据。支持格式:`yyyy-MM-dd HH:mm:ss``yyyy-MM-dd'T'HH:mm:ss` |
| `pageNo` | int | 否 | `1` | 页码,从 1 开始 |
| `pageSize` | int | 否 | `200` | 每页条数,最大 `1000` |
| `includeDetail` | boolean | 否 | `false` | 是否返回部门/公司/租户详细信息;`true` 会增加查询耗时 |
> 说明:`username/workNo/phone` 三者都可为空;都为空时按分页返回“全部有效用户”。
---
## 4. 返回结构
顶层响应遵循 JeecgBoot 标准格式:
```json
{
"success": true,
"message": "",
"code": 200,
"result": [
{
"id": "用户ID",
"username": "登录账号",
"realname": "真实姓名",
"password": "加密密码串",
"salt": "密码盐值",
"workNo": "工号",
"phone": "手机号",
"email": "邮箱",
"orgCode": "当前组织编码",
"post": "岗位ID/信息",
"status": 1,
"createTime": "创建时间",
"updateTime": "更新时间",
"lastPwdUpdateTime": "最后修改密码时间",
"departIds": "负责部门IDs",
"departmentList": [],
"companyList": [],
"loginTenantId": 1002,
"tenantList": []
}
]
}
```
### 4.1 字段说明(核心)
- `updateTime`**增量同步主游标字段**,建议 SCADA 以此推进同步位点。
- `createTime`:用于补偿“新增但未更新”的数据。
- `departmentList`:仅在 `includeDetail=true` 时有值(否则为空数组)。
- `companyList`:仅在 `includeDetail=true` 时有值(否则为空数组)。
- `tenantList`:仅在 `includeDetail=true` 时有值(否则为空数组)。
- `password`/`salt`:均为后端存储态字段(非明文);如无强依赖,建议 SCADA 侧不落库或脱敏保存。
---
## 5. 查询与同步规则
后端固定只返回“有效用户”:
- `delFlag = 0`
- `status = 1`
当传入 `updatedAfter` 时,后端过滤条件为:
- `updateTime >= updatedAfter` **或**
- `createTime >= updatedAfter`
---
## 6. 推荐调用策略(给 SCADA
### 6.1 首次全量同步
1. `pageNo=1``pageSize=500``includeDetail=false`
2. 按页拉取至空页(或小于 `pageSize`)。
3. 本地记录本次最大 `updateTime` 作为 `syncCursor`
示例:
```http
GET /jeecg-boot/sys/user/scada/queryUser?pageNo=1&pageSize=500&includeDetail=false
```
### 6.2 增量同步(断网续传)
1. 使用本地 `syncCursor` 作为 `updatedAfter`
2. 分页拉取,直到无新增数据。
3. 每处理完一页更新本地游标(建议按返回中最大 `updateTime`)。
示例:
```http
GET /jeecg-boot/sys/user/scada/queryUser?updatedAfter=2026-04-27 10:00:00&pageNo=1&pageSize=500&includeDetail=false
```
### 6.3 明细补拉策略
若 SCADA 需要组织和租户完整信息,仅对“已识别变更的用户”按条件补拉,并使用:
- `includeDetail=true`
- 同时带 `username/workNo/phone` 之一,缩小范围
---
## 7. 性能说明
- 默认 `includeDetail=false`,可避免部门与租户明细查询带来的额外耗时。
- 单次 `pageSize` 上限 `1000`,防止单请求过大。
- 如业务需要更高吞吐,建议后续将部门/租户查询改为批量聚合查询,避免 N+1 查询。
---
## 8. 安全建议
当前接口为免登录接口,建议尽快补充至少一种安全手段:
- IP 白名单(仅允许 SCADA 网段访问)
- 网关层签名校验(`appKey + timestamp + sign`
- HTTPS 强制 + 调用方证书
---
## 9. 当前实现位置
- 控制器:`jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysUserController.java`
- 文档与安全配置:`jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/Swagger3Config.java`
- 免登录白名单:`jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-*.yml`