From 47655b75d20434131c80e5a04e0b69e969ea4cd2 Mon Sep 17 00:00:00 2001
From: tian <11429339@qq.com>
Date: Sun, 26 Jul 2026 13:42:09 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20=E6=89=B9=E9=87=8F=E5=B7=A5=E5=85=B7?=
=?UTF-8?q?=E6=A0=8F=E6=B7=BB=E5=8A=A0=E6=97=B6=E9=97=B4=E5=90=8C=E6=AD=A5?=
=?UTF-8?q?=E6=8C=89=E9=92=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
internal/service/task.go | 15 +++++++++++++++
internal/web/ui.go | 2 +-
internal/web/ui/templates/devices.html | 4 ++++
3 files changed, 20 insertions(+), 1 deletion(-)
diff --git a/internal/service/task.go b/internal/service/task.go
index 8202584..b370a1a 100644
--- a/internal/service/task.go
+++ b/internal/service/task.go
@@ -429,6 +429,21 @@ func (s *TaskService) executeOnDevice(task *models.Task, did string) {
s.updateDeviceStatus(task.ID, did, models.TaskSuccess, 1.0, "")
s.appendAuditLog(task, did, models.TaskSuccess, "")
+ case "time_sync":
+ nowMS := time.Now().UnixMilli()
+ body, _ := json.Marshal(map[string]int64{"unix_ms": nowMS})
+ _, code, err := s.agent.Do("POST", dev.IP, dev.AgentPort, "/v1/time/set", body)
+ if err != nil {
+ s.updateDeviceStatus(task.ID, did, models.TaskFailed, 0, err.Error())
+ return
+ }
+ if code >= 400 {
+ s.updateDeviceStatus(task.ID, did, models.TaskFailed, 0, fmt.Sprintf("agent error: %d", code))
+ return
+ }
+ s.updateDeviceStatus(task.ID, did, models.TaskSuccess, 1.0, "")
+ s.appendAuditLog(task, did, models.TaskSuccess, "")
+
case "face_gallery_reload":
_, code, err := s.agent.Do("POST", dev.IP, dev.AgentPort, "/v1/face-gallery/reload", nil)
if err != nil {
diff --git a/internal/web/ui.go b/internal/web/ui.go
index 31de51a..238525c 100644
--- a/internal/web/ui.go
+++ b/internal/web/ui.go
@@ -1753,7 +1753,7 @@ func (u *UI) actionDevicesBatchAction(w http.ResponseWriter, r *http.Request) {
typeStr := ""
switch action {
- case "media_start", "media_restart", "media_stop", "reload", "rollback":
+ case "media_start", "media_restart", "media_stop", "reload", "rollback", "time_sync":
typeStr = action
default:
u.render(w, r, "devices", u.deviceOverviewPageData(r, deviceIDs, "不支持的操作: "+action))
diff --git a/internal/web/ui/templates/devices.html b/internal/web/ui/templates/devices.html
index ced14da..01a497b 100644
--- a/internal/web/ui/templates/devices.html
+++ b/internal/web/ui/templates/devices.html
@@ -47,6 +47,10 @@
{{if $allOffline}}
{{end}}
+ {{$drift := false}}{{range .DeviceRows}}{{if and (gt .TimeDriftSec 5) (hasString $.SelectedDeviceIDs .Device.DeviceID)}}{{$drift = true}}{{end}}{{end}}
+ {{if $drift}}
+
+ {{end}}
下发设备分配
清空选择