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.
84 lines
2.0 KiB
84 lines
2.0 KiB
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)
|
|
}
|
|
|