95 lines
3.5 KiB
Go
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
|
|
}
|