24 lines
1.2 KiB
Markdown
24 lines
1.2 KiB
Markdown
# 2026-06-12 工作日志
|
||
|
||
### 15. 修复设备断电后数据库状态未更新为离线
|
||
|
||
**问题**:设备断电/断网后,Redis 中的在线 Key(`mqtt:device:status:{deviceNo}`)会在 TTL(默认 300s)到期后自动消失,但数据库 `app_device.status` 字段没有同步更新,始终显示在线。
|
||
|
||
**方案**:三层联动
|
||
|
||
1. **定时任务扫库(新增 `DeviceOfflineCheckTask`)**:每 90s 扫描 DB 中 `status=1` 的设备,检查 Redis Key 是否存在,不存在则批量更新 `status=0`(离线)。扫描间隔可通过 `mqtt.offline-check.interval-ms` 配置项覆盖。
|
||
|
||
2. **上线时同步写库**:
|
||
- `DeviceDataHandler.handle()`:收到电量上报时,`AppDeviceBo.setStatus("1")` 写库 + 刷新 Redis Key
|
||
- `DeviceRegisterHandler.buildRegisterDevice()`:注册时 `device.setStatus("1")`
|
||
|
||
3. **修复注册默认状态**:`registerByMqtt()` 中注册默认值从 `status=2` 改为 `status=1`(在线)
|
||
|
||
**状态值定义**(来自 `AppDeviceBo` 注释):
|
||
- `0`:离线
|
||
- `1`:在线
|
||
- `2`:到期
|
||
- `3`:故障
|
||
|
||
**新增文件**:`water-app/src/main/java/org/dromara/app/task/DeviceOfflineCheckTask.java`
|