point.go 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. package bws
  2. import (
  3. "context"
  4. "database/sql"
  5. "encoding/json"
  6. "fmt"
  7. bwsmdl "go-common/app/interface/main/activity/model/bws"
  8. "go-common/library/cache/redis"
  9. xsql "go-common/library/database/sql"
  10. "go-common/library/log"
  11. )
  12. const (
  13. _userPointKeyFmt = "bws_u_p_%d_%s"
  14. _pointsSQL = "SELECT id,`name`,icon,fid,image,unlocked,lock_type,dic,rule,bid,lose_unlocked,other_ip,ower,ctime,mtime FROM act_bws_points WHERE del = 0 AND bid = ? ORDER BY ID"
  15. _userPointSQL = "SELECT id,pid,points,ctime FROM act_bws_user_points WHERE bid = ? AND `key` = ? AND del = 0"
  16. _userPointAddSQL = "INSERT INTO act_bws_user_points(bid,pid,points,`key`) VALUES(?,?,?,?)"
  17. )
  18. func keyUserPoint(bid int64, key string) string {
  19. return fmt.Sprintf(_userPointKeyFmt, bid, key)
  20. }
  21. // RawPoints points list
  22. func (d *Dao) RawPoints(c context.Context, bid int64) (res *bwsmdl.Points, err error) {
  23. var (
  24. rows *xsql.Rows
  25. rs []*bwsmdl.Point
  26. )
  27. if rows, err = d.db.Query(c, _pointsSQL, bid); err != nil {
  28. log.Error("RawPoints: db.Exec(%d) error(%v)", bid, err)
  29. return
  30. }
  31. defer rows.Close()
  32. for rows.Next() {
  33. r := new(bwsmdl.Point)
  34. if err = rows.Scan(&r.ID, &r.Name, &r.Icon, &r.Fid, &r.Image, &r.Unlocked, &r.LockType, &r.Dic, &r.Rule, &r.Bid, &r.LoseUnlocked, &r.OtherIp, &r.Ower, &r.Ctime, &r.Mtime); err != nil {
  35. log.Error("RawPoints:row.Scan() error(%v)", err)
  36. return
  37. }
  38. rs = append(rs, r)
  39. }
  40. if len(rs) > 0 {
  41. res = new(bwsmdl.Points)
  42. res.Points = rs
  43. }
  44. return
  45. }
  46. // RawUserPoints .
  47. func (d *Dao) RawUserPoints(c context.Context, bid int64, key string) (rs []*bwsmdl.UserPoint, err error) {
  48. var (
  49. rows *xsql.Rows
  50. )
  51. if rows, err = d.db.Query(c, _userPointSQL, bid, key); err != nil {
  52. log.Error("RawUserPoints:db.Query error(%v)", err)
  53. return
  54. }
  55. defer rows.Close()
  56. for rows.Next() {
  57. r := new(bwsmdl.UserPoint)
  58. if err = rows.Scan(&r.ID, &r.Pid, &r.Points, &r.Ctime); err != nil {
  59. log.Error("RawUserPoints:row.Scan() error(%v)", err)
  60. return
  61. }
  62. rs = append(rs, r)
  63. }
  64. return
  65. }
  66. // AddUserPoint .
  67. func (d *Dao) AddUserPoint(c context.Context, bid, pid, points int64, key string) (lastID int64, err error) {
  68. var res sql.Result
  69. if res, err = d.db.Exec(c, _userPointAddSQL, bid, pid, points, key); err != nil {
  70. log.Error("AddUserPoint error d.db.Exec(%d,%d,%d,%s) error(%v)", bid, pid, points, key, err)
  71. return
  72. }
  73. return res.LastInsertId()
  74. }
  75. // CacheUserPoints .
  76. func (d *Dao) CacheUserPoints(c context.Context, bid int64, key string) (res []*bwsmdl.UserPoint, err error) {
  77. var (
  78. values []interface{}
  79. cacheKey = keyUserPoint(bid, key)
  80. conn = d.redis.Get(c)
  81. )
  82. defer conn.Close()
  83. if values, err = redis.Values(conn.Do("ZRANGE", cacheKey, 0, -1)); err != nil {
  84. log.Error("CacheUserAchieves conn.Do(ZRANGE, %s) error(%v)", cacheKey, err)
  85. return
  86. } else if len(values) == 0 {
  87. return
  88. }
  89. for len(values) > 0 {
  90. var bs []byte
  91. if values, err = redis.Scan(values, &bs); err != nil {
  92. log.Error("CacheUserAchieves redis.Scan(%v) error(%v)", values, err)
  93. return
  94. }
  95. item := new(bwsmdl.UserPoint)
  96. if err = json.Unmarshal(bs, &item); err != nil {
  97. log.Error("CacheUserAchieves conn.Do(ZRANGE, %s) error(%v)", cacheKey, err)
  98. continue
  99. }
  100. res = append(res, item)
  101. }
  102. return
  103. }
  104. // AddCacheUserPoints .
  105. func (d *Dao) AddCacheUserPoints(c context.Context, bid int64, data []*bwsmdl.UserPoint, key string) (err error) {
  106. var bs []byte
  107. if len(data) == 0 {
  108. return
  109. }
  110. cacheKey := keyUserPoint(bid, key)
  111. conn := d.redis.Get(c)
  112. defer conn.Close()
  113. args := redis.Args{}.Add(cacheKey)
  114. for _, v := range data {
  115. if bs, err = json.Marshal(v); err != nil {
  116. log.Error("AddCacheUserPoints json.Marshal() error(%v)", err)
  117. return
  118. }
  119. args = args.Add(v.ID).Add(bs)
  120. }
  121. if err = conn.Send("ZADD", args...); err != nil {
  122. log.Error("AddCacheUserPoints conn.Send(ZADD, %s, %v) error(%v)", cacheKey, args, err)
  123. return
  124. }
  125. if err = conn.Send("EXPIRE", cacheKey, d.userPointExpire); err != nil {
  126. log.Error("AddCacheUserPoints conn.Send(Expire, %s) error(%v)", cacheKey, err)
  127. return
  128. }
  129. if err = conn.Flush(); err != nil {
  130. log.Error("AddCacheUserPoints conn.Flush error(%v)", err)
  131. return
  132. }
  133. for i := 0; i < 2; i++ {
  134. if _, err = conn.Receive(); err != nil {
  135. log.Error("AddCacheUserPoints conn.Receive() error(%v)", err)
  136. return
  137. }
  138. }
  139. return
  140. }
  141. // AppendUserPointsCache .
  142. func (d *Dao) AppendUserPointsCache(c context.Context, bid int64, key string, point *bwsmdl.UserPoint) (err error) {
  143. var (
  144. bs []byte
  145. ok bool
  146. cacheKey = keyUserPoint(bid, key)
  147. conn = d.redis.Get(c)
  148. )
  149. defer conn.Close()
  150. if ok, err = redis.Bool(conn.Do("EXPIRE", cacheKey, d.userPointExpire)); err != nil || !ok {
  151. log.Error("AppendUserPointsCache conn.Do(EXPIRE %s) error(%v)", key, err)
  152. return
  153. }
  154. args := redis.Args{}.Add(cacheKey)
  155. if bs, err = json.Marshal(point); err != nil {
  156. log.Error("AppendUserPointsCache json.Marshal() error(%v)", err)
  157. return
  158. }
  159. args = args.Add(point.ID).Add(bs)
  160. if err = conn.Send("ZADD", args...); err != nil {
  161. log.Error("AppendUserPointsCache conn.Send(ZADD, %s, %v) error(%v)", cacheKey, args, err)
  162. return
  163. }
  164. if err = conn.Send("EXPIRE", cacheKey, d.userPointExpire); err != nil {
  165. log.Error("AppendUserPointsCache conn.Send(Expire, %s) error(%v)", cacheKey, err)
  166. return
  167. }
  168. if err = conn.Flush(); err != nil {
  169. log.Error("AppendUserPointsCache conn.Flush error(%v)", err)
  170. return
  171. }
  172. for i := 0; i < 2; i++ {
  173. if _, err = conn.Receive(); err != nil {
  174. log.Error("AppendUserPointsCache conn.Receive() error(%v)", err)
  175. return
  176. }
  177. }
  178. return
  179. }
  180. // DelCacheUserPoints .
  181. func (d *Dao) DelCacheUserPoints(c context.Context, bid int64, key string) (err error) {
  182. cacheKey := keyUserPoint(bid, key)
  183. conn := d.redis.Get(c)
  184. defer conn.Close()
  185. if _, err = conn.Do("DEL", cacheKey); err != nil {
  186. log.Error("DelCacheUserPoints conn.Do(DEL) key(%s) error(%v)", cacheKey, err)
  187. }
  188. return
  189. }