123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- package dao
- import (
- "context"
- "encoding/json"
- "fmt"
- "strconv"
- "time"
- model "go-common/app/interface/main/credit/model"
- "go-common/library/cache/redis"
- "go-common/library/log"
- "github.com/pkg/errors"
- )
- const (
- _caseObtainMIDIdx = "c_o_v2_%d"
- _caseVoteCIDMIDIdx = "c_v_c_m_v2_%d_%s"
- _grantCaseKey = "gr_ca_li_v2"
- )
- func caseObtainMIDKey(mid int64) string {
- return fmt.Sprintf(_caseObtainMIDIdx, mid)
- }
- func caseVoteCIDMIDKey(mid int64) string {
- return fmt.Sprintf(_caseVoteCIDMIDIdx, mid, time.Now().Format("2006_01_02"))
- }
- func (d *Dao) CaseObtainMID(c context.Context, mid int64, isToday bool) (cases map[int64]*model.SimCase, err error) {
- conn := d.redis.Get(c)
- defer conn.Close()
- var _setKey string
- if isToday {
- _setKey = caseVoteCIDMIDKey(mid)
- } else {
- _setKey = caseObtainMIDKey(mid)
- }
- var ms []string
- if ms, err = redis.Strings(conn.Do("SMEMBERS", _setKey)); err != nil {
- if err != redis.ErrNil {
- return
- }
- err = nil
- }
- cases = make(map[int64]*model.SimCase)
- for _, s := range ms {
- if s == "" {
- continue
- }
- sc := &model.SimCase{}
- if err = json.Unmarshal([]byte(s), sc); err != nil {
- err = errors.WithStack(err)
- return
- }
- cases[sc.ID] = sc
- }
- return
- }
- func (d *Dao) IsExpiredObtainMID(c context.Context, mid int64, isToday bool) (ok bool, err error) {
- conn := d.redis.Get(c)
- defer conn.Close()
- var _setKey string
- if isToday {
- _setKey = caseVoteCIDMIDKey(mid)
- } else {
- _setKey = caseObtainMIDKey(mid)
- }
- ok, err = redis.Bool(conn.Do("EXPIRE", _setKey, d.redisExpire))
- return
- }
- func (d *Dao) GrantCases(c context.Context) (mcases map[int64]*model.SimCase, err error) {
- conn := d.redis.Get(c)
- defer conn.Close()
- var ms map[string]string
- if ms, err = redis.StringMap(conn.Do("HGETALL", _grantCaseKey)); err != nil {
- if err != redis.ErrNil {
- return
- }
- err = nil
- }
- mcases = make(map[int64]*model.SimCase)
- for m, s := range ms {
- if s == "" {
- continue
- }
- cid, err := strconv.ParseInt(m, 10, 64)
- if err != nil {
- log.Error("strconv.ParseInt(%s) error(%v)", m, err)
- err = nil
- continue
- }
- cc := &model.SimCase{}
- if err = json.Unmarshal([]byte(s), cc); err != nil {
- log.Error("json.Unmarshal(%s) error(%v)", s, err)
- err = nil
- continue
- }
- mcases[cid] = cc
- }
- return
- }
- func (d *Dao) LoadVoteCaseMID(c context.Context, mid int64, mcases map[int64]*model.SimCase, isToday bool) (err error) {
- conn := d.redis.Get(c)
- defer conn.Close()
- var _setKey string
- if isToday {
- _setKey = caseVoteCIDMIDKey(mid)
- } else {
- _setKey = caseObtainMIDKey(mid)
- }
- args := redis.Args{}.Add(_setKey)
- for _, mcase := range mcases {
- var mcStr []byte
- if mcStr, err = json.Marshal(mcase); err != nil {
- err = errors.WithStack(err)
- return
- }
- args = args.Add(string(mcStr))
- }
- if err = conn.Send("SADD", args...); err != nil {
- return
- }
- if err = conn.Send("EXPIRE", _setKey, d.redisExpire); err != nil {
- return
- }
- if err = conn.Flush(); err != nil {
- return
- }
- for i := 0; i < 2; i++ {
- _, err = conn.Receive()
- }
- return
- }
- func (d *Dao) SetVoteCaseMID(c context.Context, mid int64, sc *model.SimCase) (err error) {
- conn := d.redis.Get(c)
- defer conn.Close()
- var scStr []byte
- if scStr, err = json.Marshal(sc); err != nil {
- err = errors.WithStack(err)
- return
- }
- if err = conn.Send("SADD", caseObtainMIDKey(mid), string(scStr)); err != nil {
- return
- }
- if err = conn.Send("SADD", caseVoteCIDMIDKey(mid), string(scStr)); err != nil {
- return
- }
- if err = conn.Send("EXPIRE", caseObtainMIDKey(mid), d.redisExpire); err != nil {
- return
- }
- if err = conn.Send("EXPIRE", caseVoteCIDMIDKey(mid), d.redisExpire); err != nil {
- return
- }
- if err = conn.Flush(); err != nil {
- return
- }
- for i := 0; i < 4; i++ {
- _, err = conn.Receive()
- }
- return
- }
|