You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

128 lines
3.2 KiB

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)
}