package model import "time" type ApplyLog struct { ID uint `json:"id" gorm:"primaryKey"` NodeID string `json:"node_id" gorm:"index;size:64;not null"` Version string `json:"version" gorm:"size:32;not null"` Result string `json:"result" gorm:"size:32;not null"` Message string `json:"message" gorm:"size:1024"` Checksum string `json:"checksum" gorm:"size:64;not null;default:''"` MainConfigChecksum string `json:"main_config_checksum" gorm:"size:64;not null;default:''"` RouteConfigChecksum string `json:"route_config_checksum" gorm:"size:64;not null;default:''"` SupportFileCount int `json:"support_file_count" gorm:"not null;default:0"` CreatedAt time.Time `json:"created_at"` } func ListApplyLogs(nodeID string) (logs []*ApplyLog, err error) { query := DB.Order("id desc") if nodeID != "" { query = query.Where("node_id = ?", nodeID) } err = query.Find(&logs).Error return logs, err } func GetLatestApplyLog(nodeID string) (*ApplyLog, error) { log := &ApplyLog{} err := DB.Where("node_id = ?", nodeID).Order("id desc").First(log).Error return log, err } func GetLatestApplyLogsByNodeIDs(nodeIDs []string) (map[string]*ApplyLog, error) { result := make(map[string]*ApplyLog) if len(nodeIDs) == 0 { return result, nil } var logs []*ApplyLog subQuery := DB.Model(&ApplyLog{}). Select("MAX(id) AS id"). Where("node_id IN ?", nodeIDs). Group("node_id") if err := DB.Where("id IN (?)", subQuery).Find(&logs).Error; err != nil { return nil, err } for _, log := range logs { result[log.NodeID] = log } return result, nil }