safesight-control/internal/models/task.go
tian 15f6f91fb6 feat: task timestamps, dirty state, confirmation dialog
- Task 模型增加 CreatedAt/CompletedAt,DB 读取和快照同步
- 总览页最近任务显示时间,限制5条,增加"更多 →"链接
- 任务中心增加创建时间/完成时间列
- 管控台"保存并下发"按钮:修改功能或视频源后才激活
- 下发前弹出变更摘要确认对话框
- 下发后回到管控台并显示任务ID
2026-05-12 14:26:10 +08:00

54 lines
1.5 KiB
Go

package models
import (
"sync"
"time"
)
type TaskStatus string
const (
TaskPending TaskStatus = "pending"
TaskRunning TaskStatus = "running"
TaskSuccess TaskStatus = "success"
TaskFailed TaskStatus = "failed"
)
type DeviceTaskStatus struct {
DeviceID string `json:"device_id"`
Status TaskStatus `json:"status"`
Progress float64 `json:"progress"`
Error string `json:"error"`
}
type Task struct {
ID string `json:"task_id"`
Type string `json:"type"`
DeviceIDs []string `json:"device_ids"`
Payload interface{} `json:"payload"`
Status TaskStatus `json:"status"`
Devices map[string]*DeviceTaskStatus `json:"devices"`
CreatedAt string `json:"created_at"`
CompletedAt string `json:"completed_at"`
Mu sync.RWMutex `json:"-"`
}
func NewTask(id, t string, deviceIDs []string, payload interface{}) *Task {
devices := make(map[string]*DeviceTaskStatus)
for _, did := range deviceIDs {
devices[did] = &DeviceTaskStatus{
DeviceID: did,
Status: TaskPending,
}
}
return &Task{
ID: id,
Type: t,
DeviceIDs: deviceIDs,
Payload: payload,
Status: TaskPending,
Devices: devices,
CreatedAt: time.Now().Format("2006-01-02 15:04:05"),
}
}