|
|
|
|
@ -236,6 +236,79 @@ C# 服务会通过 WebSocket 实时推送设备读取记录,格式示例:
|
|
|
|
|
|
|
|
|
|
### 原有接口(聚合 / 辅助)
|
|
|
|
|
|
|
|
|
|
1. `GET /rfid/dashboard/data`
|
|
|
|
|
- 前端方法:`getDashboardData(locationId?: number)` / `getDashboardStats(locationId?: number)`(兼容老名称)。
|
|
|
|
|
- 参数:`locationId?: number`,位置 ID,可选。
|
|
|
|
|
- 返回:`DashboardVO`(统计概览 + 设备状态列表 + 成功率趋势 + 告警统计)。
|
|
|
|
|
|
|
|
|
|
2. `GET /rfid/dashboard/overview`
|
|
|
|
|
- 前端方法:`getOverview()`。
|
|
|
|
|
- 参数:无。
|
|
|
|
|
- 返回:`StatisticsOverview`,字段含义同上。
|
|
|
|
|
|
|
|
|
|
3. `GET /rfid/dashboard/alarmStats`
|
|
|
|
|
- 前端方法:`getAlarmStats(limit?: number)`。
|
|
|
|
|
- 参数:`limit?: number`,限制返回条数,默认 10。
|
|
|
|
|
- 返回:`AlarmStatVO[]`,字段含义同实时统计中的 `alarmStats`.
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
### 接口4:设备最新读取记录
|
|
|
|
|
|
|
|
|
|
> 请求方式:`GET /rfid/dashboard/deviceLatestRecords`
|
|
|
|
|
> 前端方法:`getDeviceLatestRecords()`
|
|
|
|
|
> 后端链路:`DashboardController#getDeviceLatestRecords` → `IDashboardService#getDeviceLatestRecords`
|
|
|
|
|
|
|
|
|
|
**请求参数(Query)**
|
|
|
|
|
|
|
|
|
|
- 无参数,直接调用即返回所有设备的最新读取记录。
|
|
|
|
|
|
|
|
|
|
**返回实体与字段**
|
|
|
|
|
|
|
|
|
|
- 后端返回类型:`List<DashboardVO.DeviceLatestRecordVO>`
|
|
|
|
|
- 前端 TS 类型:`DeviceLatestRecordVO[]`
|
|
|
|
|
|
|
|
|
|
字段说明:
|
|
|
|
|
|
|
|
|
|
1. `deviceId: number`:设备 ID。
|
|
|
|
|
2. `deviceCode: string`:设备编号。
|
|
|
|
|
3. `deviceName: string`:设备名称。
|
|
|
|
|
4. `latestBarcode: string | null`:最新条码信息,可能为 `null`(无记录时)。
|
|
|
|
|
5. `latestRecordTime: string | null`:最新记录时间(`yyyy-MM-dd HH:mm:ss` 格式),可能为 `null`。
|
|
|
|
|
6. `readStatus: string | null`:读取状态(`1-成功;0-失败`),可能为 `null`。
|
|
|
|
|
7. `alarmFlag: string | null`:是否告警(`0-否;1-是`),可能为 `null`。
|
|
|
|
|
8. `alarmAction: string | null`:告警行为,可能为 `null`。
|
|
|
|
|
|
|
|
|
|
**后端处理要点**
|
|
|
|
|
|
|
|
|
|
1. **近7天多表查询**:由于设备可能当天或最近几天没有数据,接口会查询近7天内(包含今天)所有实际存在的分表。
|
|
|
|
|
2. **分表检测**:通过 `RfidReadRecordTableHelper.getExistingTableNames()` 获取近7天内**实际存在**的分表列表。
|
|
|
|
|
- 先生成近7天的所有可能表名(如 `rfid_read_record_20251128` ~ `rfid_read_record_20251204`);
|
|
|
|
|
- 通过 `checkTableExists()` 查询 `information_schema` 过滤掉数据库中不存在的表;
|
|
|
|
|
- **分表不一定连续**:如某几天无数据则无对应分表,最终可能只返回 2-3 张表。
|
|
|
|
|
3. **多表联合查询**:使用 `selectLatestRecordByDeviceMultiTable` 方法,通过 `UNION ALL` 合并多表数据,按 `device_id` 分组取每个设备 `record_time` 最大的记录。
|
|
|
|
|
4. **异常处理**:当近7天内无可用分表或查询出错时,返回空列表,不影响接口可用性。
|
|
|
|
|
|
|
|
|
|
**SQL 逻辑说明**
|
|
|
|
|
|
|
|
|
|
```sql
|
|
|
|
|
-- 合并近7天分表数据
|
|
|
|
|
SELECT ... FROM (
|
|
|
|
|
SELECT ... FROM rfid_read_record_20251128
|
|
|
|
|
UNION ALL
|
|
|
|
|
SELECT ... FROM rfid_read_record_20251129
|
|
|
|
|
...
|
|
|
|
|
) t1
|
|
|
|
|
INNER JOIN (
|
|
|
|
|
-- 按设备分组取最新时间
|
|
|
|
|
SELECT device_id, MAX(record_time) as max_time FROM (...) GROUP BY device_id
|
|
|
|
|
) latest ON t1.device_id = latest.device_id AND t1.record_time = latest.max_time
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
### 原有接口(聚合 / 辅助)
|
|
|
|
|
|
|
|
|
|
1. `GET /rfid/dashboard/data`
|
|
|
|
|
- 前端方法:`getDashboardData(locationId?: number)` / `getDashboardStats(locationId?: number)`(兼容老名称)。
|
|
|
|
|
- 参数:`locationId?: number`,位置 ID,可选。
|
|
|
|
|
|