package task import ( "net/http" "strconv" "time" "task-track-backend/model" "task-track-backend/pkg/database" "github.com/gin-gonic/gin" ) // UpdateTaskStatusRequest 更新任务状态请求结构 type UpdateTaskStatusRequest struct { Status string `json:"status" binding:"required"` } func (h *TaskHandler) UpdateTaskStatus(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 UpdateTaskStatusRequest if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } // 验证状态值 validStatuses := []string{"pending", "in_progress", "completed", "cancelled"} isValidStatus := false for _, status := range validStatuses { if req.Status == status { isValidStatus = true break } } if !isValidStatus { c.JSON(http.StatusBadRequest, gin.H{"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 := map[string]interface{}{ "status": req.Status, "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) }