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