package task import ( "net/http" "task-track-backend/model" "task-track-backend/pkg/database" "github.com/gin-gonic/gin" ) // GetTasksQuery 获取任务列表查询参数 type GetTasksQuery struct { Page int `form:"page" binding:"min=1"` PageSize int `form:"page_size" binding:"min=1,max=100"` Status string `form:"status"` Priority string `form:"priority"` Type string `form:"type"` AssigneeID uint `form:"assignee_id"` CreatorID uint `form:"creator_id"` OrganizationID uint `form:"organization_id"` Search string `form:"search"` SortBy string `form:"sort_by"` SortOrder string `form:"sort_order"` } // GetTasksResponse 获取任务列表响应 type GetTasksResponse struct { Tasks []model.Task `json:"tasks"` Total int64 `json:"total"` Page int `json:"page"` PageSize int `json:"page_size"` TotalPages int `json:"total_pages"` } func (h *TaskHandler) GetTasks(c *gin.Context) { var query GetTasksQuery // 设置默认值 query.Page = 1 query.PageSize = 10 query.SortBy = "created_at" query.SortOrder = "desc" if err := c.ShouldBindQuery(&query); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } db := database.GetDB() // 构建查询 taskQuery := db.Model(&model.Task{}) // 预加载相关数据 taskQuery = taskQuery.Preload("Creator").Preload("Assignee").Preload("Organization") // 应用过滤条件 if query.Status != "" { taskQuery = taskQuery.Where("status = ?", query.Status) } if query.Priority != "" { taskQuery = taskQuery.Where("priority = ?", query.Priority) } if query.Type != "" { taskQuery = taskQuery.Where("type = ?", query.Type) } if query.AssigneeID > 0 { taskQuery = taskQuery.Where("assignee_id = ?", query.AssigneeID) } if query.CreatorID > 0 { taskQuery = taskQuery.Where("creator_id = ?", query.CreatorID) } if query.OrganizationID > 0 { taskQuery = taskQuery.Where("organization_id = ?", query.OrganizationID) } // 搜索功能 if query.Search != "" { searchTerm := "%" + query.Search + "%" taskQuery = taskQuery.Where("title LIKE ? OR description LIKE ?", searchTerm, searchTerm) } // 计算总数 var total int64 if err := taskQuery.Count(&total).Error; err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "计算任务总数失败"}) return } // 计算总页数 totalPages := int((total + int64(query.PageSize) - 1) / int64(query.PageSize)) // 应用排序 orderBy := query.SortBy if query.SortOrder == "asc" { orderBy += " ASC" } else { orderBy += " DESC" } taskQuery = taskQuery.Order(orderBy) // 应用分页 offset := (query.Page - 1) * query.PageSize taskQuery = taskQuery.Offset(offset).Limit(query.PageSize) // 执行查询 var tasks []model.Task if err := taskQuery.Find(&tasks).Error; err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "获取任务列表失败"}) return } response := GetTasksResponse{ Tasks: tasks, Total: total, Page: query.Page, PageSize: query.PageSize, TotalPages: totalPages, } c.JSON(http.StatusOK, response) }