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.
 
 
 
 
 
 

102 lines
2.5 KiB

package task
import (
"net/http"
"strconv"
"time"
"task-track-backend/model"
"task-track-backend/pkg/database"
"github.com/gin-gonic/gin"
)
// UpdateTaskRequest 更新任务请求结构
type UpdateTaskRequest struct {
Title *string `json:"title"`
Description *string `json:"description"`
Type *string `json:"type"`
Priority *string `json:"priority"`
Status *string `json:"status"`
AssigneeID *uint `json:"assignee_id"`
StartTime *time.Time `json:"start_time"`
EndTime *time.Time `json:"end_time"`
}
func (h *TaskHandler) UpdateTask(c *gin.Context) {
// 获取任务ID
taskIDStr := c.Param("id")
taskID, err := strconv.ParseUint(taskIDStr, 10, 32)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "无效的任务ID"})
return
}
var req UpdateTaskRequest
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
db := database.GetDB()
// 检查任务是否存在
var existingTask model.Task
if err := db.First(&existingTask, uint(taskID)).Error; err != nil {
if err.Error() == "record not found" {
c.JSON(http.StatusNotFound, gin.H{"error": "任务不存在"})
return
}
c.JSON(http.StatusInternalServerError, gin.H{"error": "查询任务失败"})
return
}
// 构建更新数据
updateData := make(map[string]interface{})
if req.Title != nil {
updateData["title"] = *req.Title
}
if req.Description != nil {
updateData["description"] = *req.Description
}
if req.Type != nil {
updateData["type"] = *req.Type
}
if req.Priority != nil {
updateData["priority"] = *req.Priority
}
if req.Status != nil {
updateData["status"] = *req.Status
}
if req.AssigneeID != nil {
updateData["assignee_id"] = *req.AssigneeID
}
if req.StartTime != nil {
updateData["start_time"] = *req.StartTime
}
if req.EndTime != nil {
updateData["end_time"] = *req.EndTime
}
// 设置更新时间
updateData["updated_at"] = time.Now()
// 执行更新
if err := db.Model(&existingTask).Updates(updateData).Error; err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "更新任务失败"})
return
}
// 重新查询更新后的任务,包含关联数据
var updatedTask model.Task
if err := db.Preload("Creator").
Preload("Assignee").
Preload("Organization").
First(&updatedTask, uint(taskID)).Error; err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "获取更新后的任务失败"})
return
}
c.JSON(http.StatusOK, updatedTask)
}