Files
36Wisdom/biz/dao/dao_scene_node.go
T
2026-08-14 16:11:10 +08:00

95 lines
3.5 KiB
Go

package dao
import (
"context"
"github.com/gogf/gf/v2/frame/g"
"36wisdom/biz/consts"
"36wisdom/biz/model/entity"
"36wisdom/common"
)
type sceneNodeDao struct{ common.BaseDao }
var SceneNode = &sceneNodeDao{BaseDao: common.BaseDao{Table: consts.TableSceneNode}}
func (d *sceneNodeDao) Init(ctx context.Context) error {
_, err := g.DB().Exec(ctx, `
CREATE TABLE IF NOT EXISTS scene_node (
id INTEGER PRIMARY KEY AUTOINCREMENT,
level_id INTEGER NOT NULL,
title TEXT,
character_id INTEGER,
content TEXT NOT NULL,
content_pinyin TEXT,
image TEXT,
audio TEXT,
node_type INTEGER NOT NULL DEFAULT 1,
interaction_type INTEGER NOT NULL DEFAULT 1,
config TEXT,
script TEXT,
result_type INTEGER NOT NULL DEFAULT 0,
is_entry INTEGER NOT NULL DEFAULT 0,
sort_order INTEGER NOT NULL DEFAULT 1,
status INTEGER NOT NULL DEFAULT 1
);
CREATE INDEX IF NOT EXISTS idx_node_level ON scene_node(level_id);`)
common.EnsureColumn(ctx, consts.TableSceneNode, "content_pinyin", "TEXT")
common.EnsureColumn(ctx, consts.TableSceneNode, "script", "TEXT")
return err
}
// GetByPk 主键查询(无缓存);不存在返回 nil, nil。
func (d *sceneNodeDao) GetByPk(ctx context.Context, id int64) (*entity.SceneNode, error) {
return common.GetOne[entity.SceneNode](d.Model().Ctx(ctx).WherePri(id))
}
// GetInLevelCached 关卡内启用节点(内容缓存);不存在返回 nil, nil。
func (d *sceneNodeDao) GetInLevelCached(ctx context.Context, nodeId, levelId int64) (*entity.SceneNode, error) {
return common.GetOne[entity.SceneNode](d.Model().Ctx(ctx).Cache(d.ContentCache(ctx)).
Where("id", nodeId).Where("level_id", levelId).Where("status", consts.StatusEnabled))
}
// ListEnabledByLevelCached 关卡内启用节点(内容缓存),按 sort_order 升序。
func (d *sceneNodeDao) ListEnabledByLevelCached(ctx context.Context, levelId int64) ([]*entity.SceneNode, error) {
return common.GetList[entity.SceneNode](d.Model().Ctx(ctx).Cache(d.ContentCache(ctx)).
Where("level_id", levelId).Where("status", consts.StatusEnabled).Order("sort_order ASC"))
}
// CountFinalsByLevel 关卡内终局节点数(result_type > 0,不缓存)。
func (d *sceneNodeDao) CountFinalsByLevel(ctx context.Context, levelId int64) (int, error) {
return d.Model().Ctx(ctx).Where("level_id", levelId).
Where("status", consts.StatusEnabled).WhereGT("result_type", 0).Count()
}
// ListByLevel 关卡下全部节点(含下架),按序号排序。
func (d *sceneNodeDao) ListByLevel(ctx context.Context, levelId int64) ([]*entity.SceneNode, error) {
return common.GetList[entity.SceneNode](d.Model().Ctx(ctx).Where("level_id", levelId).Order("sort_order ASC"))
}
// ListByIds 按 id 批量取(无缓存)。
func (d *sceneNodeDao) ListByIds(ctx context.Context, ids []int64) ([]*entity.SceneNode, error) {
if len(ids) == 0 {
return []*entity.SceneNode{}, nil
}
return common.GetList[entity.SceneNode](d.Model().Ctx(ctx).WhereIn("id", ids))
}
// CountByLevelIds 各关卡节点数(单表 GROUP BY 聚合)。
func (d *sceneNodeDao) CountByLevelIds(ctx context.Context, levelIds []int64) (map[int64]int, error) {
m := make(map[int64]int, len(levelIds))
if len(levelIds) == 0 {
return m, nil
}
recs, err := d.Model().Ctx(ctx).WhereIn("level_id", levelIds).Group("level_id").
Fields("level_id, COUNT(*) AS cnt").All()
if err != nil {
return nil, err
}
for _, r := range recs {
m[r["level_id"].Int64()] = r["cnt"].Int()
}
return m, nil
}