diff --git a/internal/web/ui.go b/internal/web/ui.go index 1dba4b6..ef0adb3 100644 --- a/internal/web/ui.go +++ b/internal/web/ui.go @@ -744,6 +744,7 @@ func (u *UI) Routes() (chi.Router, error) { r.Post("/wizard/apply", u.actionWizardApply) r.Post("/wizard/create-source", u.actionWizardCreateSource) r.Get("/devices", u.pageDevices) + r.Post("/devices/cleanup-offline", u.actionDevicesCleanupOffline) r.Get("/devices/{id}/control", u.pageDeviceControl) r.Get("/plans", u.redirectPlansToSceneTemplates) r.Get("/plans/{name}", u.redirectPlanToSceneTemplate) @@ -1572,6 +1573,32 @@ func (u *UI) pageDevices(w http.ResponseWriter, r *http.Request) { u.render(w, r, "devices", u.deviceOverviewPageData(r, nil, "")) } +func (u *UI) actionDevicesCleanupOffline(w http.ResponseWriter, r *http.Request) { + u.ensureDevicesLoaded() + devices := u.registry.GetDevices() + deleted := 0 + for _, dev := range devices { + if dev == nil || dev.Online || dev.DeviceID == "" { + continue + } + // Delete related data from DB + if strings.TrimSpace(u.dbPath) != "" { + if store, err := storage.OpenSQLite(u.dbPath); err == nil { + db := store.DB() + db.Exec("DELETE FROM device_assignments WHERE device_id = ?", dev.DeviceID) + db.Exec("DELETE FROM recognition_units WHERE scene_template_name IN (SELECT profile_name FROM device_assignments WHERE device_id = ?)", dev.DeviceID) + db.Exec("DELETE FROM device_config_state WHERE device_id = ?", dev.DeviceID) + db.Exec("DELETE FROM device_features WHERE device_id = ?", dev.DeviceID) + db.Exec("DELETE FROM config_versions WHERE device_id = ?", dev.DeviceID) + db.Exec("DELETE FROM devices WHERE device_id = ?", dev.DeviceID) + store.Close() + } + } + deleted++ + } + http.Redirect(w, r, "/devices?msg="+urlQueryEscape(fmt.Sprintf("已清理 %d 台离线设备", deleted)), http.StatusFound) +} + func (u *UI) pageDeviceAdd(w http.ResponseWriter, r *http.Request) { u.render(w, r, "device_add", PageData{Title: "新增设备"}) } diff --git a/internal/web/ui/templates/devices.html b/internal/web/ui/templates/devices.html index e4fdf13..01fbdfb 100644 --- a/internal/web/ui/templates/devices.html +++ b/internal/web/ui/templates/devices.html @@ -29,6 +29,11 @@