Files
36Wisdom/biz/service/child.go
T
2026-08-14 12:13:02 +08:00

108 lines
2.8 KiB
Go

package service
import (
"context"
"github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/frame/g"
"36wisdom/biz/consts"
"36wisdom/biz/dao"
)
type child struct{}
var Child = &child{}
// getChildOf 校验孩子归属当前家长并返回档案记录。
func getChildOf(ctx context.Context, parentUid, childId int64) (gdb.Record, error) {
rec, err := dao.Child.Model().Ctx(ctx).WherePri(childId).One()
if err != nil {
return nil, err
}
if rec.IsEmpty() || rec["parent_id"].Int64() != parentUid {
return nil, gerror.New("孩子档案不存在")
}
return rec, nil
}
// ChildItem 孩子列表项(含派生值:完美关卡数)。
type ChildItem struct {
ChildId int64
Nickname string
Avatar string
AgeGroup string
Points int
Level int
LevelTitle string
PerfectCount int
DailyLimitMinutes int
}
// Create 新建孩子档案。
func (s *child) Create(ctx context.Context, parentId int64, nickname, ageGroup string) (int64, error) {
return dao.Child.InsertAndReturnId(ctx, g.Map{
"parent_id": parentId,
"nickname": nickname,
"age_group": ageGroup,
"status": consts.StatusEnabled,
})
}
// Update 更新孩子档案:仅本人名下档案可改。
func (s *child) Update(ctx context.Context, parentId, childId int64, data g.Map) error {
rec, err := dao.Child.Model().Ctx(ctx).WherePri(childId).One()
if err != nil {
return err
}
if rec.IsEmpty() || rec["parent_id"].Int64() != parentId {
return gerror.New("孩子档案不存在")
}
return dao.Child.UpdateByPk(ctx, childId, data)
}
// List 家长名下的孩子列表,perfect 数经 user_progress 批量汇总。
func (s *child) List(ctx context.Context, parentId int64) ([]*ChildItem, error) {
recs, err := dao.Child.Model().Ctx(ctx).Where("parent_id", parentId).Order("id ASC").All()
if err != nil {
return nil, err
}
items := make([]*ChildItem, 0, len(recs))
if len(recs) == 0 {
return items, nil
}
childIds := make([]int64, 0, len(recs))
for _, r := range recs {
childIds = append(childIds, r["id"].Int64())
}
perfectMap := make(map[int64]int, len(recs))
rows, err := UserProgress.CountPerfectByChildIds(ctx, childIds)
if err != nil {
return nil, err
}
for _, r := range rows {
perfectMap[r["child_id"].Int64()] = r["cnt"].Int()
}
for _, r := range recs {
perfect := perfectMap[r["id"].Int64()]
level, title := LevelOf(perfect)
items = append(items, &ChildItem{
ChildId: r["id"].Int64(),
Nickname: r["nickname"].String(),
Avatar: r["avatar"].String(),
AgeGroup: r["age_group"].String(),
Points: r["points"].Int(),
Level: level,
LevelTitle: title,
PerfectCount: perfect,
DailyLimitMinutes: r["daily_limit_minutes"].Int(),
})
}
return items, nil
}