Files
TaskPool/internal/controllers/log_controller.go
T
2026-01-18 17:31:04 +08:00

121 lines
2.9 KiB
Go

package controllers
import (
"strconv"
"github.com/engigu/baihu-panel/internal/database"
"github.com/engigu/baihu-panel/internal/models"
"github.com/engigu/baihu-panel/internal/utils"
"github.com/gin-gonic/gin"
)
type LogController struct{}
func NewLogController() *LogController {
return &LogController{}
}
type TaskLogResponse struct {
ID uint `json:"id"`
TaskID uint `json:"task_id"`
TaskName string `json:"task_name"`
TaskType string `json:"task_type"`
Command string `json:"command"`
Status string `json:"status"`
Duration int64 `json:"duration"`
StartTime *models.LocalTime `json:"start_time"`
EndTime *models.LocalTime `json:"end_time"`
CreatedAt models.LocalTime `json:"created_at"`
}
func (lc *LogController) GetLogs(c *gin.Context) {
p := utils.ParsePagination(c)
taskID, _ := strconv.Atoi(c.DefaultQuery("task_id", "0"))
taskName := c.DefaultQuery("task_name", "")
var logs []models.TaskLog
var total int64
query := database.DB.Model(&models.TaskLog{})
if taskID > 0 {
query = query.Where("task_id = ?", taskID)
}
// 按任务名称过滤
if taskName != "" {
var taskIDs []uint
database.DB.Model(&models.Task{}).Where("name LIKE ?", "%"+taskName+"%").Pluck("id", &taskIDs)
if len(taskIDs) > 0 {
query = query.Where("task_id IN ?", taskIDs)
} else {
utils.PaginatedResponse(c, []TaskLogResponse{}, 0, p)
return
}
}
query.Count(&total)
query.Order("id DESC").Offset(p.Offset()).Limit(p.PageSize).Find(&logs)
taskIDList := make([]uint, 0)
for _, log := range logs {
taskIDList = append(taskIDList, log.TaskID)
}
var tasks []models.Task
database.DB.Where("id IN ?", taskIDList).Find(&tasks)
taskMap := make(map[uint]models.Task)
for _, t := range tasks {
taskMap[t.ID] = t
}
result := make([]TaskLogResponse, len(logs))
for i, log := range logs {
task := taskMap[log.TaskID]
taskType := task.Type
if taskType == "" {
taskType = "task"
}
result[i] = TaskLogResponse{
ID: log.ID,
TaskID: log.TaskID,
TaskName: task.Name,
TaskType: taskType,
Command: log.Command,
Status: log.Status,
Duration: log.Duration,
StartTime: log.StartTime,
EndTime: log.EndTime,
CreatedAt: log.CreatedAt,
}
}
utils.PaginatedResponse(c, result, total, p)
}
func (lc *LogController) GetLogDetail(c *gin.Context) {
id, err := strconv.Atoi(c.Param("id"))
if err != nil {
utils.BadRequest(c, "无效的日志ID")
return
}
var log models.TaskLog
if err := database.DB.First(&log, id).Error; err != nil {
utils.NotFound(c, "日志不存在")
return
}
utils.Success(c, gin.H{
"id": log.ID,
"task_id": log.TaskID,
"command": log.Command,
"output": log.Output,
"status": log.Status,
"duration": log.Duration,
"start_time": log.StartTime,
"end_time": log.EndTime,
"created_at": log.CreatedAt,
})
}