feat(*): 短剧创作工作台 - 完善章节分镜、资产管理、技能运行与生成任务恢复

This commit is contained in:
ddCat
2026-08-29 23:34:46 +08:00
parent 4f07daae9e
commit 2f6832f99c
113 changed files with 7016 additions and 723 deletions

View File

@@ -46,6 +46,8 @@ func Models() []any {
&model.StorageLocation{},
&model.UserDailyUploadUsage{},
&model.Skill{},
&model.SkillVersion{},
&model.SkillFile{},
&model.UserSkillState{},
&model.Resource{},
&model.ResourceDeletionJob{},
@@ -105,6 +107,9 @@ func MigrateSchema(db *gorm.DB) error {
if err := db.AutoMigrate(Models()...); err != nil {
return err
}
if err := backfillProjectUnitWordCounts(db); err != nil {
return err
}
if err := migrateChannelModelPriceTierSelectors(db); err != nil {
return err
}
@@ -140,6 +145,22 @@ func MigrateSchema(db *gorm.DB) error {
return db.Exec("CREATE UNIQUE INDEX IF NOT EXISTS idx_users_email_nonempty ON users(lower(email)) WHERE email <> ''").Error
}
func backfillProjectUnitWordCounts(db *gorm.DB) error {
var units []model.ProjectUnit
if err := db.Select("id", "source_text").Where("word_count = 0 AND source_text <> ''").Find(&units).Error; err != nil {
return fmt.Errorf("读取待回填章节字数:%w", err)
}
return db.Transaction(func(tx *gorm.DB) error {
for _, unit := range units {
wordCount := model.ProjectUnitWordCount(unit.SourceText)
if err := tx.Model(&model.ProjectUnit{}).Where("id = ?", unit.ID).Update("word_count", wordCount).Error; err != nil {
return fmt.Errorf("回填章节 %s 字数:%w", unit.ID, err)
}
}
return nil
})
}
// migrateChannelModelPriceTierSelectors upgrades the old video-only unique key to
// a canonical SKU selector key. It never changes task, route-attempt, or billing
// foreign keys, so completed work remains auditable after a product SKU merge.