package cache import ( "context" "joybuywork/internal/app" "joybuywork/internal/plugins/jsonm" "joybuywork/internal/repository/dao" "joybuywork/internal/repository/dbcheck" "joybuywork/internal/repository/model" "joybuywork/internal/utils" "fmt" "strings" ) type Reward struct { Cache } func NewReward(ctx context.Context) *Reward { c := new(Reward) c.init(ctx, &model.Reward{}) return c } // FindByIds ids 获取数据 func (c Reward) FindByIds(ids []int64) ([]*model.Reward, error) { var idm = make(map[int64]struct{}) var keys = make([]string, 0, len(ids)) for _, id := range ids { if _, ok := idm[id]; !ok { keys = append(keys, c.idKey(id)) idm[id] = struct{}{} } } data, err := c.getKeys(keys, func(idKeys []string) (map[string][]byte, error) { var fids = make([]int64, 0, len(idKeys)) var idMap = make(map[int64]string) for _, idKey := range idKeys { idStr, _ := strings.CutPrefix(idKey, c.Prefix()+":") id := utils.StrToInt64(idStr) fids = append(fids, id) idMap[id] = idKey } m := dao.Q.Reward list, err := m.WithContext(c.ctx).Where(m.ID.In(fids...)).Find() if err = dbcheck.DbError(err); err != nil { return nil, err } var dataM = make(map[string][]byte, len(list)) for _, v := range list { b, _ := jsonm.MarshalCkZero(v) dataM[c.idKey(v.ID)] = b } return dataM, nil }) if err != nil { return nil, err } var list []*model.Reward for _, v := range data { var one *model.Reward err = jsonm.Unmarshal(v, &one) if err != nil { return nil, err } list = append(list, one) } return list, nil } // FindById id 获取数据 func (c Reward) FindById(id int64) (*model.Reward, error) { data, err := c.get(c.idKey(id), func() ([]byte, error) { m := dao.Q.Reward data, err := m.WithContext(c.ctx).Where(m.ID.Eq(id)).Take() if err = dbcheck.DbError(err); err != nil { return nil, err } return jsonm.MarshalCkZero(data) }) if err != nil { return nil, err } var info *model.Reward err = jsonm.Unmarshal(data, &info) return info, err } func (c Reward) idKey(id int64) string { return fmt.Sprintf("%s:%d", c.Prefix(), id) } // Clear 清理缓存 func (c Reward) Clear(rewards ...*model.Reward) error { var key []string for _, v := range rewards { key = append(key, c.idKey(v.ID)) } if len(key) > 0 { return app.Redis.Cache.Del(c.ctx, key...).Err() } return nil }