feat: 种子拼音写时标注 + 启动补标

This commit is contained in:
2026-08-13 13:55:52 +08:00
parent 568ffde0ce
commit ec3ca4d856
2 changed files with 71 additions and 11 deletions
+49
View File
@@ -0,0 +1,49 @@
package seed
import (
"context"
"github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/v2/frame/g"
"36wisdom/biz/consts"
"36wisdom/common"
)
// annotateAll 拼音补标:对 *_pinyin 为空的记录按原文标注。
// 启动维护一次性(约 500 行),单事务内逐行 UPDATE,失败告警不阻断。
// 注意:迁移补列的历史记录为 NULL,须同时匹配 '' 与 NULL。
func annotateAll(ctx context.Context) {
type target struct{ table, pinyinCol, textCol string }
targets := []target{
{consts.TableStrategy, "meaning_pinyin", "meaning"},
{consts.TableStrategy, "teach_content_pinyin", "teach_content"},
{consts.TableStrategy, "summary_q_pinyin", "summary_q"},
{consts.TableStrategy, "summary_options_pinyin", "summary_options"},
{consts.TableLevel, "scene_content_pinyin", "scene_content"},
{consts.TableSceneNode, "content_pinyin", "content"},
{consts.TableNodeOption, "text_pinyin", "text"},
{consts.TableNodeOption, "feedback_pinyin", "feedback"},
{consts.TableElement, "name_pinyin", "name"},
{consts.TableElement, "description_pinyin", "description"},
}
if err := g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error {
for _, t := range targets {
recs, err := tx.Model(t.table).Ctx(ctx).Where(t.pinyinCol, "").WhereOr(t.pinyinCol, nil).Fields("id," + t.textCol).All()
if err != nil {
return err
}
for _, rec := range recs {
if _, err := tx.Model(t.table).Ctx(ctx).WherePri(rec["id"].Int64()).
Data(g.Map{t.pinyinCol: common.AnnotatePinyin(rec[t.textCol].String())}).Update(); err != nil {
return err
}
}
}
return nil
}); err != nil {
g.Log().Warningf(ctx, "seed: 拼音补标失败: %v", err)
return
}
g.Log().Info(ctx, "seed: 拼音补标完成")
}
+22 -11
View File
@@ -16,6 +16,7 @@ import (
"36wisdom/biz/consts"
"36wisdom/biz/dao"
"36wisdom/common"
)
//go:embed seed_36_ji/*.json
@@ -122,12 +123,14 @@ func EnsureSeeded(ctx context.Context) {
}
if count > 0 {
g.Log().Info(ctx, "seed: 数据已存在,跳过种子导入")
return
} else {
if err := doSeed(ctx); err != nil {
g.Log().Fatal(ctx, err)
}
g.Log().Info(ctx, "seed: 种子数据导入完成")
}
if err := doSeed(ctx); err != nil {
g.Log().Fatal(ctx, err)
}
g.Log().Info(ctx, "seed: 种子数据导入完成")
annotateAll(ctx)
// ensureInteractions(ctx) // Task 4 打开
}
func doSeed(ctx context.Context) (err error) {
@@ -206,8 +209,10 @@ func insertElement(ctx context.Context, tx gdb.TX, ids map[string]int64, el seed
return nil
}
res, err := tx.Model(consts.TableElement).Ctx(ctx).Data(g.Map{
"e_type": el.EType, "name": el.Name, "image": el.Image, "audio": el.Audio,
"description": el.Description, "status": consts.StatusEnabled,
"e_type": el.EType, "name": el.Name, "name_pinyin": common.AnnotatePinyin(el.Name),
"image": el.Image, "audio": el.Audio,
"description": el.Description, "description_pinyin": common.AnnotatePinyin(el.Description),
"status": consts.StatusEnabled,
}).Insert()
if err != nil {
return err
@@ -235,8 +240,11 @@ func insertStrategy(ctx context.Context, tx gdb.TX, elementIds map[string]int64,
unlockBefore := gconv.Int64(s.UnlockBefore)
data := g.Map{
"name": s.Name, "pinyin": s.Pinyin, "group_no": s.GroupNo, "group_name": s.GroupName,
"meaning": s.Meaning, "teach_content": s.TeachContent, "teach_image": s.TeachImage,
"teach_audio": s.TeachAudio, "summary_q": s.SummaryQ, "summary_options": s.SummaryOptions,
"meaning": s.Meaning, "meaning_pinyin": common.AnnotatePinyin(s.Meaning),
"teach_content": s.TeachContent, "teach_content_pinyin": common.AnnotatePinyin(s.TeachContent),
"teach_image": s.TeachImage,
"teach_audio": s.TeachAudio, "summary_q": s.SummaryQ, "summary_q_pinyin": common.AnnotatePinyin(s.SummaryQ),
"summary_options": s.SummaryOptions, "summary_options_pinyin": common.AnnotatePinyin(s.SummaryOptions),
"summary_audio": s.SummaryAudio, "icon": s.Icon, "sort_order": s.SortOrder,
"status": consts.StatusEnabled,
}
@@ -279,7 +287,8 @@ func insertLevel(ctx context.Context, tx gdb.TX, elementIds map[string]int64, st
}
res, err := tx.Model(consts.TableLevel).Ctx(ctx).Data(g.Map{
"strategy_id": strategyId, "title": lv.Title, "scene_id": sceneId,
"scene_content": lv.SceneContent, "scene_image": lv.SceneImage, "scene_audio": lv.SceneAudio,
"scene_content": lv.SceneContent, "scene_content_pinyin": common.AnnotatePinyin(lv.SceneContent),
"scene_image": lv.SceneImage, "scene_audio": lv.SceneAudio,
"age_group": ageGroup, "content_version": 1, "sort_order": sortOrder,
"status": consts.StatusEnabled,
}).Insert()
@@ -334,8 +343,10 @@ func insertLevel(ctx context.Context, tx gdb.TX, elementIds map[string]int64, st
nextNodeId = nodeIds[opt.NextIndex]
}
if _, err := tx.Model(consts.TableNodeOption).Ctx(ctx).Data(g.Map{
"node_id": nodeIds[i], "text": opt.Text, "prop_id": propId,
"node_id": nodeIds[i], "text": opt.Text, "text_pinyin": common.AnnotatePinyin(opt.Text),
"prop_id": propId,
"audio": opt.Audio, "next_node_id": nextNodeId, "feedback": opt.Feedback,
"feedback_pinyin": common.AnnotatePinyin(opt.Feedback),
"feedback_audio": opt.FeedbackAudio, "sort_order": oi + 1,
"status": consts.StatusEnabled,
}).Insert(); err != nil {