exchangecode.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. package models
  2. // 兑换码
  3. import (
  4. "box-gm/utils"
  5. "encoding/json"
  6. "errors"
  7. "fmt"
  8. "log"
  9. "sync"
  10. "time"
  11. "github.com/astaxie/beego"
  12. "github.com/astaxie/beego/validation"
  13. "github.com/garyburd/redigo/redis"
  14. )
  15. type ExchangeItemsInfo struct {
  16. ItemId int `json:"id"` // 道具ID
  17. Count int `json:"count"` // 数量
  18. Weight int `json:"weight"` // 权重
  19. }
  20. type ExchangeCodeInfo struct {
  21. Pcode string `json:"pcode"` // 兑换码
  22. AwardTimes int64 `json:"awardTimes"` // 领奖次数
  23. CreateTime int64 `json:"creatTime"` // 创建时间
  24. ModifyTime int64 `json:"modifyTime"` // 修改时间
  25. ExpireTime int64 `json:"expireTime"` // 过期时间
  26. Items []*ExchangeItemsInfo `json:"items"` // 随机奖励列表
  27. }
  28. type ExchangeCodeInfoArray []*ExchangeCodeInfo
  29. var exchangeCodeList ExchangeCodeInfoArray
  30. var ecMutex sync.Mutex
  31. var MAIN_KEY = "exchange:code"
  32. // 兑换码key
  33. func get_exchange_code_key(pcode string) string {
  34. return fmt.Sprintf("%s:%s", MAIN_KEY, pcode)
  35. }
  36. // 初始化兑换码
  37. func InitExchangeCodeInfo() {
  38. pool := utils.GetAccountRedisPool()
  39. if pool == nil {
  40. fmt.Println("get redis pool fail")
  41. return
  42. }
  43. rd := pool.Get()
  44. defer rd.Close()
  45. result, _ := redis.Values(rd.Do("smembers", MAIN_KEY))
  46. for _, v := range result {
  47. pcode := string(v.([]byte))
  48. pKey := get_exchange_code_key(pcode)
  49. awardTimes, _ := redis.Int64(rd.Do("hget", pKey, "awardTimes"))
  50. creatTime, _ := redis.Int64(rd.Do("hget", pKey, "creatTime"))
  51. modifyTime, _ := redis.Int64(rd.Do("hget", pKey, "modifyTime"))
  52. expireTime, _ := redis.Int64(rd.Do("hget", pKey, "expireTime"))
  53. items, _ := redis.String(rd.Do("hget", pKey, "items"))
  54. var _items []*ExchangeItemsInfo
  55. json.Unmarshal([]byte(items), &_items)
  56. exchangeCodeList = append(exchangeCodeList, &ExchangeCodeInfo{
  57. Pcode: pcode,
  58. AwardTimes: awardTimes,
  59. CreateTime: creatTime,
  60. ModifyTime: modifyTime,
  61. ExpireTime: expireTime,
  62. Items: _items,
  63. })
  64. }
  65. beego.Info("load exchange code info", len(exchangeCodeList))
  66. }
  67. func checkExchangeCodeInfo(hf *ExchangeCodeInfo) (err error) {
  68. valid := validation.Validation{}
  69. b, _ := valid.Valid(&hf)
  70. if !b {
  71. for _, err := range valid.Errors {
  72. log.Println(err.Key, err.Message)
  73. return errors.New(err.Message)
  74. }
  75. }
  76. return nil
  77. }
  78. // 新增兑换码
  79. func AddExchangeCodeInfo(hf *ExchangeCodeInfo) error {
  80. pool := utils.GetAccountRedisPool()
  81. if pool == nil {
  82. return fmt.Errorf("get redis pool fail")
  83. }
  84. rd := pool.Get()
  85. defer rd.Close()
  86. if err := checkExchangeCodeInfo(hf); err != nil {
  87. return err
  88. }
  89. hf.CreateTime = time.Now().Unix()
  90. hf.ModifyTime = hf.CreateTime
  91. pKey := get_exchange_code_key(hf.Pcode)
  92. rd.Do("hset", pKey, "awardTimes", hf.AwardTimes)
  93. rd.Do("hset", pKey, "creatTime", hf.CreateTime)
  94. rd.Do("hset", pKey, "modifyTime", hf.ModifyTime)
  95. rd.Do("hset", pKey, "expireTime", hf.ExpireTime)
  96. items, _ := json.Marshal(hf.Items)
  97. rd.Do("hset", pKey, "items", items)
  98. rd.Do("sadd", MAIN_KEY, hf.Pcode)
  99. ecMutex.Lock()
  100. exchangeCodeList = append(exchangeCodeList, hf)
  101. ecMutex.Unlock()
  102. return nil
  103. }
  104. // 修改兑换码
  105. func UpdateExchangeCodeInfo(hf *ExchangeCodeInfo) error {
  106. pool := utils.GetAccountRedisPool()
  107. if pool == nil {
  108. return fmt.Errorf("get redis pool fail")
  109. }
  110. rd := pool.Get()
  111. defer rd.Close()
  112. if err := checkExchangeCodeInfo(hf); err != nil {
  113. return err
  114. }
  115. hf.ModifyTime = time.Now().Unix()
  116. pKey := get_exchange_code_key(hf.Pcode)
  117. rd.Do("hset", pKey, "awardTimes", hf.AwardTimes)
  118. rd.Do("hset", pKey, "modifyTime", hf.ModifyTime)
  119. rd.Do("hset", pKey, "expireTime", hf.ExpireTime)
  120. items, _ := json.Marshal(hf.Items)
  121. rd.Do("hset", pKey, "items", items)
  122. rd.Do("sadd", MAIN_KEY, hf.Pcode)
  123. ecMutex.Lock()
  124. for i := 0; i < len(exchangeCodeList); i++ {
  125. if hf.Pcode == exchangeCodeList[i].Pcode {
  126. old := exchangeCodeList[i]
  127. old.AwardTimes = hf.AwardTimes
  128. old.ModifyTime = hf.ModifyTime
  129. old.ExpireTime = hf.ExpireTime
  130. old.Items = hf.Items
  131. break
  132. }
  133. }
  134. ecMutex.Unlock()
  135. return nil
  136. }
  137. // 删除兑换码
  138. func DelExchangeCodeInfoById(pcode string) error {
  139. pool := utils.GetAccountRedisPool()
  140. if pool == nil {
  141. return fmt.Errorf("get redis pool fail")
  142. }
  143. rd := pool.Get()
  144. defer rd.Close()
  145. ecMutex.Lock()
  146. defer ecMutex.Unlock()
  147. rd.Do("srem", MAIN_KEY, pcode)
  148. pKey := get_exchange_code_key(pcode)
  149. _, err := rd.Do("del", pKey)
  150. if err != nil {
  151. log.Println(err)
  152. return err
  153. }
  154. for i := 0; i < len(exchangeCodeList); i++ {
  155. if pcode == exchangeCodeList[i].Pcode {
  156. ii := i + 1
  157. exchangeCodeList = append(exchangeCodeList[:i], exchangeCodeList[ii:]...)
  158. }
  159. }
  160. return nil
  161. }
  162. // 获取兑换码信息
  163. func GetExchangeCodeInfoByCode(pcode string) (hf *ExchangeCodeInfo) {
  164. ecMutex.Lock()
  165. defer ecMutex.Unlock()
  166. for i := 0; i < len(exchangeCodeList); i++ {
  167. if pcode == exchangeCodeList[i].Pcode {
  168. return exchangeCodeList[i]
  169. }
  170. }
  171. return nil
  172. }
  173. func GetExchangeCodeInfo() ExchangeCodeInfoArray {
  174. ecMutex.Lock()
  175. defer ecMutex.Unlock()
  176. return exchangeCodeList
  177. }