更新项目配置,新增设备同步模块,优化WebSocket和Swagger配置,增强SCADA系统的免登录接口,支持数据字典项和登录日志的免登录查询与记录。调整Java编译设置,确保更好的开发体验。

This commit is contained in:
geht
2026-04-28 10:23:58 +08:00
parent bbe46dcf2d
commit 142a0bdaba
1013 changed files with 41858 additions and 28 deletions

View File

@@ -0,0 +1,158 @@
# 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`