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