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.
107 lines
2.8 KiB
107 lines
2.8 KiB
package task
|
|
|
|
import (
|
|
"net/http"
|
|
"time"
|
|
|
|
"task-track-backend/model"
|
|
"task-track-backend/pkg/database"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
// CreateTaskRequest 创建任务请求结构
|
|
type CreateTaskRequest struct {
|
|
Title string `json:"title" binding:"required"`
|
|
Description string `json:"description"`
|
|
Type string `json:"type"`
|
|
Priority string `json:"priority"`
|
|
AssigneeID *uint `json:"assignee_id"`
|
|
StartTime *time.Time `json:"start_time"`
|
|
EndTime *time.Time `json:"end_time"`
|
|
OrganizationID uint `json:"organization_id" binding:"required"`
|
|
CreatorID uint `json:"creator_id" binding:"required"`
|
|
}
|
|
|
|
func (h *TaskHandler) CreateTask(c *gin.Context) {
|
|
var req CreateTaskRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{
|
|
"code": 400,
|
|
"message": "请求参数错误: " + err.Error(),
|
|
})
|
|
return
|
|
}
|
|
|
|
// 验证优先级
|
|
if req.Priority != "" && req.Priority != "urgent" && req.Priority != "high" && req.Priority != "medium" && req.Priority != "low" {
|
|
c.JSON(http.StatusBadRequest, gin.H{
|
|
"code": 400,
|
|
"message": "优先级值无效,必须是 urgent、high、medium 或 low",
|
|
})
|
|
return
|
|
}
|
|
|
|
// 如果没有指定优先级,默认为 medium
|
|
if req.Priority == "" {
|
|
req.Priority = "medium"
|
|
}
|
|
|
|
// 验证时间逻辑
|
|
if req.StartTime != nil && req.EndTime != nil && req.StartTime.After(*req.EndTime) {
|
|
c.JSON(http.StatusBadRequest, gin.H{
|
|
"code": 400,
|
|
"message": "开始时间不能晚于结束时间",
|
|
})
|
|
return
|
|
}
|
|
|
|
// 创建任务对象
|
|
task := model.Task{
|
|
Title: req.Title,
|
|
Description: req.Description,
|
|
Type: req.Type,
|
|
Priority: req.Priority,
|
|
Status: "pending", // 默认状态
|
|
CreatorID: req.CreatorID,
|
|
OrganizationID: req.OrganizationID,
|
|
StartTime: req.StartTime,
|
|
EndTime: req.EndTime,
|
|
}
|
|
|
|
// 如果指定了执行者
|
|
if req.AssigneeID != nil {
|
|
task.AssigneeID = *req.AssigneeID
|
|
}
|
|
|
|
// 保存到数据库
|
|
db := database.GetDB()
|
|
if err := db.Create(&task).Error; err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{
|
|
"code": 500,
|
|
"message": "创建任务失败: " + err.Error(),
|
|
})
|
|
return
|
|
}
|
|
|
|
// 返回成功响应
|
|
c.JSON(http.StatusCreated, gin.H{
|
|
"code": 201,
|
|
"message": "任务创建成功",
|
|
"data": gin.H{
|
|
"id": task.ID,
|
|
"title": task.Title,
|
|
"description": task.Description,
|
|
"type": task.Type,
|
|
"priority": task.Priority,
|
|
"status": task.Status,
|
|
"creator_id": task.CreatorID,
|
|
"assignee_id": task.AssigneeID,
|
|
"organization_id": task.OrganizationID,
|
|
"start_time": task.StartTime,
|
|
"end_time": task.EndTime,
|
|
"created_at": task.CreatedAt,
|
|
"updated_at": task.UpdatedAt,
|
|
},
|
|
})
|
|
}
|
|
|