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" "context"
"fmt" "fmt"
"net/http" "net/http"
"strconv"
"sync" "sync"
"time" "time"
"gen2d/internal/db"
"gen2d/internal/logger" "gen2d/internal/logger"
"gen2d/internal/model" "gen2d/internal/model"
"gen2d/internal/service" "gen2d/internal/service"
@@ -101,6 +103,9 @@ func Generate(c *gin.Context) {
}, },
}) })
// 将任务记录写入数据库(用于任务列表查询)
go saveTaskToDB(c.Request.Context(), projectID, taskID, req)
// 返回 taskId // 返回 taskId
c.JSON(http.StatusOK, model.OK(GenerateResponse{TaskID: 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.Stage = stage
r.task.Progress = progress r.task.Progress = progress
taskStore.Store(taskID, r) taskStore.Store(taskID, r)
// 同步更新数据库状态
updateTaskInDB(taskID, status, stage, "", progress)
} }
func updateFailed(taskID, errMsg string) { func updateFailed(taskID, errMsg string) {
@@ -202,6 +210,9 @@ func updateFailed(taskID, errMsg string) {
r.task.Status = "failed" r.task.Status = "failed"
r.task.Error = errMsg r.task.Error = errMsg
taskStore.Store(taskID, r) taskStore.Store(taskID, r)
// 同步更新数据库状态
updateTaskInDB(taskID, "failed", r.task.Stage, errMsg, r.task.Progress)
} }
// GetTask 查询任务信息。 // GetTask 查询任务信息。
@@ -234,3 +245,46 @@ func GetAssets(c *gin.Context) {
Metadata: r.metadata, 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(),
})
}
+1
View File
@@ -5,6 +5,7 @@ import "time"
// Task 任务数据模型,对应数据库表。 // Task 任务数据模型,对应数据库表。
type Task struct { type Task struct {
ID uint `gorm:"primaryKey" json:"id"` ID uint `gorm:"primaryKey" json:"id"`
ExternalID string `gorm:"size:100;index" json:"externalId,omitempty"` // 外部任务ID,关联内存中的taskID
ProjectID uint `gorm:"index" json:"-"` ProjectID uint `gorm:"index" json:"-"`
Prompt string `gorm:"type:text" json:"prompt"` Prompt string `gorm:"type:text" json:"prompt"`
AssetType string `gorm:"size:50" json:"assetType"` AssetType string `gorm:"size:50" json:"assetType"`