108 lines
2.8 KiB
Go
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
|
|
}
|