fix: 修复新建任务后任务列表返回为空的问题

- 在 Task 模型中添加 ExternalID 字段用于关联内存中的 taskID
- 修改 Generate 函数,将任务记录同时存入内存和数据库
- 添加 saveTaskToDB 和 updateTaskInDB 函数处理任务持久化
- 同步更新任务状态到数据库,确保 GetProjectTasks 能正确查询
- 处理 default 工程的特殊情况(跳过数据库存储)
This commit is contained in:
2026-05-25 17:48:31 +08:00
parent 8568ce91ac
commit bb5d3431c1
2 changed files with 64 additions and 9 deletions
+54
View File
@@ -4,9 +4,11 @@ import (
"context"
"fmt"
"net/http"
"strconv"
"sync"
"time"
"gen2d/internal/db"
"gen2d/internal/logger"
"gen2d/internal/model"
"gen2d/internal/service"
@@ -101,6 +103,9 @@ func Generate(c *gin.Context) {
},
})
// 将任务记录写入数据库(用于任务列表查询)
go saveTaskToDB(c.Request.Context(), projectID, taskID, req)
// 返回 taskId
c.JSON(http.StatusOK, model.OK(GenerateResponse{TaskID: taskID}))
@@ -191,6 +196,9 @@ func updateTaskProgress(taskID, status, stage string, progress int) {
r.task.Stage = stage
r.task.Progress = progress
taskStore.Store(taskID, r)
// 同步更新数据库状态
updateTaskInDB(taskID, status, stage, "", progress)
}
func updateFailed(taskID, errMsg string) {
@@ -202,6 +210,9 @@ func updateFailed(taskID, errMsg string) {
r.task.Status = "failed"
r.task.Error = errMsg
taskStore.Store(taskID, r)
// 同步更新数据库状态
updateTaskInDB(taskID, "failed", r.task.Stage, errMsg, r.task.Progress)
}
// GetTask 查询任务信息。
@@ -234,3 +245,46 @@ func GetAssets(c *gin.Context) {
Metadata: r.metadata,
}))
}
// saveTaskToDB 将任务记录保存到数据库。
func saveTaskToDB(ctx context.Context, projectID, taskID string, req GenerateRequest) {
// "default" 工程没有数据库记录,跳过
if projectID == "default" {
return
}
projectIDUint, err := strconv.ParseUint(projectID, 10, 32)
if err != nil {
logger.FromCtx(ctx).Error("failed to parse projectID", "projectID", projectID, "error", err)
return
}
task := &model.Task{
ExternalID: taskID,
ProjectID: uint(projectIDUint),
Prompt: req.Prompt,
AssetType: req.AssetType,
Status: "pending",
Progress: 0,
RetryCount: 0,
CreatedAt: time.Now(),
UpdatedAt: time.Now(),
}
if err := db.GetDB().WithContext(ctx).Create(task).Error; err != nil {
logger.FromCtx(ctx).Error("failed to save task to db", "taskID", taskID, "error", err)
}
}
// updateTaskInDB 更新数据库中的任务状态。
func updateTaskInDB(taskID string, status, stage, error string, progress int) {
db.GetDB().Model(&model.Task{}).
Where("external_id = ?", taskID).
Updates(map[string]interface{}{
"status": status,
"stage": stage,
"progress": progress,
"error": error,
"updated_at": time.Now(),
})
}
+10 -9
View File
@@ -4,15 +4,16 @@ import "time"
// Task 任务数据模型,对应数据库表。
type Task struct {
ID uint `gorm:"primaryKey" json:"id"`
ProjectID uint `gorm:"index" json:"-"`
Prompt string `gorm:"type:text" json:"prompt"`
AssetType string `gorm:"size:50" json:"assetType"`
Status string `gorm:"size:20;default:'pending'" json:"status"`
Stage string `gorm:"size:50" json:"stage,omitempty"`
Progress int `gorm:"default:0" json:"progress"`
RetryCount int `gorm:"default:0" json:"retryCount"`
Error string `gorm:"type:text" json:"error,omitempty"`
ID uint `gorm:"primaryKey" json:"id"`
ExternalID string `gorm:"size:100;index" json:"externalId,omitempty"` // 外部任务ID,关联内存中的taskID
ProjectID uint `gorm:"index" json:"-"`
Prompt string `gorm:"type:text" json:"prompt"`
AssetType string `gorm:"size:50" json:"assetType"`
Status string `gorm:"size:20;default:'pending'" json:"status"`
Stage string `gorm:"size:50" json:"stage,omitempty"`
Progress int `gorm:"default:0" json:"progress"`
RetryCount int `gorm:"default:0" json:"retryCount"`
Error string `gorm:"type:text" json:"error,omitempty"`
CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt,omitempty"`
}