# 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`
