roll.go 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387
  1. package models
  2. // roll房
  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 RollConditionInfo struct {
  16. Conditions string `json:"c"` // 条件
  17. CValue int `json:"cv"` // 条件值
  18. }
  19. type RollInfo struct {
  20. Id int // 活动ID
  21. Name string `orm:"size(64)" valid:"Required"` // 房间名
  22. BandShareCode string `orm:"size(10)" valid:"Required"` // 限制绑定推广码
  23. CreateTime int64 `valid:"Required"` // 创建时间
  24. ShowStartTime int64 `valid:"Required"` // 开始展示时间
  25. SignupStartTime int64 `valid:"Required"` // 报名开始时间
  26. SignupEndTime int64 `valid:"Required"` // 报名结束时间
  27. AwardTime int64 `valid:"Required"` // 开奖时间
  28. Conditions []*RollConditionInfo // 参与条件列表
  29. ItemIdList []int // 奖励物品ID列表
  30. SignupUidList []int // 报名玩家ID列表列表
  31. }
  32. type RollInfoArray []*RollInfo
  33. type RollCondition struct {
  34. KeyCondition string
  35. Name string
  36. }
  37. type RollConditionArray []*RollCondition
  38. var conditionList RollConditionArray
  39. var rollList RollInfoArray
  40. var riMutex sync.Mutex
  41. var ROLL_MAIN_KEY = "roll:room"
  42. func get_roll_key(id int) string {
  43. return fmt.Sprintf("%s:%d", ROLL_MAIN_KEY, id)
  44. }
  45. func CreateRollId() int {
  46. pool := utils.GetAccountRedisPool()
  47. if pool == nil {
  48. fmt.Println("get redis pool fail")
  49. return 0
  50. }
  51. rd := pool.Get()
  52. if rd == nil {
  53. fmt.Println("get redis conn fail")
  54. return 0
  55. }
  56. defer rd.Close()
  57. reply, err := rd.Do("hincrby", "global", "max:roll:room:id", 1)
  58. if err != nil {
  59. fmt.Printf("redis hincrby err: %v", err)
  60. return 0
  61. }
  62. id, err := redis.Int(reply, err)
  63. if err != nil {
  64. fmt.Printf("redis hincrby err: %v", err)
  65. return 0
  66. }
  67. return id
  68. }
  69. // 初始化roll房信息
  70. func InitRollInfo() {
  71. // 活跃ID列表
  72. pool := utils.GetAccountRedisPool()
  73. if pool == nil {
  74. fmt.Println("get redis pool fail")
  75. return
  76. }
  77. rd := pool.Get()
  78. defer rd.Close()
  79. result, _ := redis.Values(rd.Do("smembers", ROLL_MAIN_KEY))
  80. for _, v := range result {
  81. id := utils.StringToInt(string(v.([]byte)))
  82. pKey := get_roll_key(id)
  83. log.Printf("InitRollInfo v[%v] id[%d] pKey[%s]", v, id, pKey)
  84. name, _ := redis.String(rd.Do("hget", pKey, "name"))
  85. bandShareCode, _ := redis.String(rd.Do("hget", pKey, "bandShareCode"))
  86. creatTime, _ := redis.Int64(rd.Do("hget", pKey, "creatTime"))
  87. showStartTime, _ := redis.Int64(rd.Do("hget", pKey, "showStartTime"))
  88. signupStartTime, _ := redis.Int64(rd.Do("hget", pKey, "signupStartTime"))
  89. signupEndTime, _ := redis.Int64(rd.Do("hget", pKey, "signupEndTime"))
  90. awardTime, _ := redis.Int64(rd.Do("hget", pKey, "awardTime"))
  91. conditions, _ := redis.String(rd.Do("hget", pKey, "conditions"))
  92. var _conditions []*RollConditionInfo
  93. json.Unmarshal([]byte(conditions), &_conditions)
  94. itemIdList, _ := redis.String(rd.Do("hget", pKey, "itemIdList"))
  95. var _itemIdList []int
  96. json.Unmarshal([]byte(itemIdList), &_itemIdList)
  97. signupUidList, _ := redis.String(rd.Do("hget", pKey, "signupUidList"))
  98. var _signupUidList []int
  99. json.Unmarshal([]byte(signupUidList), &_signupUidList)
  100. rollList = append(rollList, &RollInfo{
  101. Id: id,
  102. Name: name,
  103. BandShareCode: bandShareCode,
  104. CreateTime: creatTime,
  105. ShowStartTime: showStartTime,
  106. SignupStartTime: signupStartTime,
  107. SignupEndTime: signupEndTime,
  108. AwardTime: awardTime,
  109. Conditions: _conditions,
  110. ItemIdList: _itemIdList,
  111. SignupUidList: _signupUidList,
  112. })
  113. }
  114. conditionList = append(conditionList, &RollCondition{
  115. KeyCondition: "pay_day_totalAmount",
  116. Name: "今日充值(单位:分)",
  117. })
  118. beego.Info("load roll info", len(rollList))
  119. }
  120. func checkRollInfo(hf *RollInfo) (err error) {
  121. valid := validation.Validation{}
  122. b, _ := valid.Valid(&hf)
  123. if !b {
  124. for _, err := range valid.Errors {
  125. log.Println(err.Key, err.Message)
  126. return errors.New(err.Message)
  127. }
  128. }
  129. return nil
  130. }
  131. // 新增roll房信息
  132. func AddRollInfo(hf *RollInfo) error {
  133. pool := utils.GetAccountRedisPool()
  134. if pool == nil {
  135. return fmt.Errorf("get redis pool fail")
  136. }
  137. rd := pool.Get()
  138. defer rd.Close()
  139. if err := checkRollInfo(hf); err != nil {
  140. return err
  141. }
  142. if hf.Id == 0 {
  143. hf.Id = CreateRollId()
  144. }
  145. if hf.Id == 0 {
  146. return fmt.Errorf("分配roll房ID失败")
  147. }
  148. // 插入数据库
  149. db, err := utils.GetMysqlHandler()
  150. if err != nil {
  151. log.Println("GetMysqlHandler, Error: ", err)
  152. return err
  153. }
  154. hf.CreateTime = time.Now().Unix()
  155. bConditions, _ := json.Marshal(hf.Conditions)
  156. bItemIdList, _ := json.Marshal(hf.ItemIdList)
  157. columns := "id,name,bandShareCode,createTime,showStartTime,signupStartTime,signupEndTime,awardTime,conditions,itemIdList"
  158. values := fmt.Sprintf("%d, '%s', '%s', %d, %d, %d, %d, %d, '%s', '%s'", hf.Id, hf.Name, hf.BandShareCode, hf.CreateTime, hf.ShowStartTime, hf.SignupStartTime, hf.SignupEndTime, hf.AwardTime, bConditions, bItemIdList)
  159. sql := fmt.Sprintf("insert into mdl_roll (%s) value (%s);", columns, values)
  160. log.Println("AddRollInfo sql:", sql)
  161. _, err = db.Exec(sql)
  162. if err != nil {
  163. log.Println("AddRollInfo Insert data Exec Failed, Error: ", err)
  164. return err
  165. }
  166. pKey := get_roll_key(hf.Id)
  167. rd.Do("hset", pKey, "name", hf.Name)
  168. rd.Do("hset", pKey, "bandShareCode", hf.BandShareCode)
  169. rd.Do("hset", pKey, "createTime", hf.CreateTime)
  170. rd.Do("hset", pKey, "showStartTime", hf.ShowStartTime)
  171. rd.Do("hset", pKey, "signupStartTime", hf.SignupStartTime)
  172. rd.Do("hset", pKey, "signupEndTime", hf.SignupEndTime)
  173. rd.Do("hset", pKey, "awardTime", hf.AwardTime)
  174. rd.Do("hset", pKey, "conditions", bConditions)
  175. rd.Do("hset", pKey, "itemIdList", bItemIdList)
  176. rd.Do("sadd", ROLL_MAIN_KEY, hf.Id)
  177. riMutex.Lock()
  178. rollList = append(rollList, hf)
  179. riMutex.Unlock()
  180. return nil
  181. }
  182. // 修改roll房信息
  183. func UpdateRollInfo(hf *RollInfo) error {
  184. pool := utils.GetAccountRedisPool()
  185. if pool == nil {
  186. return fmt.Errorf("get redis pool fail")
  187. }
  188. rd := pool.Get()
  189. defer rd.Close()
  190. if err := checkRollInfo(hf); err != nil {
  191. return err
  192. }
  193. // 更新数据库
  194. db, err := utils.GetMysqlHandler()
  195. if err != nil {
  196. log.Println("GetMysqlHandler, Error: ", err)
  197. return err
  198. }
  199. bConditions, _ := json.Marshal(hf.Conditions)
  200. bItemIdList, _ := json.Marshal(hf.ItemIdList)
  201. sets := fmt.Sprintf("name='%s',bandShareCode='%s',showStartTime=%d,signupStartTime=%d,signupEndTime=%d,awardTime=%d,conditions='%s',itemIdList='%s'",
  202. hf.Name, hf.BandShareCode, hf.ShowStartTime, hf.SignupStartTime, hf.SignupEndTime, hf.AwardTime, bConditions, bItemIdList)
  203. sql := fmt.Sprintf("UPDATE mdl_roll SET %s WHERE id=%d;", sets, hf.Id)
  204. // log.Println("order_insert_db sql:", sql)
  205. _, err = db.Exec(sql)
  206. if err != nil {
  207. log.Println("UpdateRollInfo update data Exec Failed, Error: ", err)
  208. return err
  209. }
  210. pKey := get_roll_key(hf.Id)
  211. rd.Do("hset", pKey, "name", hf.Name)
  212. rd.Do("hset", pKey, "bandShareCode", hf.BandShareCode)
  213. rd.Do("hset", pKey, "showStartTime", hf.ShowStartTime)
  214. rd.Do("hset", pKey, "signupStartTime", hf.SignupStartTime)
  215. rd.Do("hset", pKey, "signupEndTime", hf.SignupEndTime)
  216. rd.Do("hset", pKey, "awardTime", hf.AwardTime)
  217. rd.Do("hset", pKey, "conditions", bConditions)
  218. rd.Do("hset", pKey, "itemIdList", bItemIdList)
  219. riMutex.Lock()
  220. for i := 0; i < len(rollList); i++ {
  221. if hf.Id == rollList[i].Id {
  222. old := rollList[i]
  223. old.Name = hf.Name
  224. old.BandShareCode = hf.BandShareCode
  225. old.ShowStartTime = hf.ShowStartTime
  226. old.SignupStartTime = hf.SignupStartTime
  227. old.SignupEndTime = hf.SignupEndTime
  228. old.AwardTime = hf.AwardTime
  229. old.Conditions = hf.Conditions
  230. old.ItemIdList = hf.ItemIdList
  231. break
  232. }
  233. }
  234. riMutex.Unlock()
  235. return nil
  236. }
  237. // 更新参与玩家列表
  238. func UpdateSignupUidList(id int) error {
  239. pool := utils.GetAccountRedisPool()
  240. if pool == nil {
  241. return fmt.Errorf("get redis pool fail")
  242. }
  243. rd := pool.Get()
  244. defer rd.Close()
  245. pKey := get_roll_key(id)
  246. signupUidList, _ := redis.String(rd.Do("hget", pKey, "signupUidList"))
  247. var _signupUidList []int
  248. json.Unmarshal([]byte(signupUidList), &_signupUidList)
  249. for i := 0; i < len(rollList); i++ {
  250. if id == rollList[i].Id {
  251. old := rollList[i]
  252. old.SignupUidList = _signupUidList
  253. break
  254. }
  255. }
  256. return nil
  257. }
  258. // 删除roll房信息
  259. func DelRollInfoById(id int) error {
  260. pool := utils.GetAccountRedisPool()
  261. if pool == nil {
  262. return fmt.Errorf("get redis pool fail")
  263. }
  264. rd := pool.Get()
  265. defer rd.Close()
  266. riMutex.Lock()
  267. defer riMutex.Unlock()
  268. pKey := get_roll_key(id)
  269. _, err := rd.Do("del", pKey)
  270. if err != nil {
  271. log.Println(err)
  272. return err
  273. }
  274. rd.Do("srem", ROLL_MAIN_KEY, id)
  275. for i := 0; i < len(rollList); i++ {
  276. if id == rollList[i].Id {
  277. ii := i + 1
  278. rollList = append(rollList[:i], rollList[ii:]...)
  279. }
  280. }
  281. return nil
  282. }
  283. // 删除非活跃roll房
  284. func del_unactive_roll_info(id int) error {
  285. pool := utils.GetAccountRedisPool()
  286. if pool == nil {
  287. return fmt.Errorf("get redis pool fail")
  288. }
  289. rd := pool.Get()
  290. defer rd.Close()
  291. pKey := get_roll_key(id)
  292. _, err := rd.Do("del", pKey)
  293. if err != nil {
  294. log.Println(err)
  295. return err
  296. }
  297. rd.Do("srem", ROLL_MAIN_KEY, id)
  298. return nil
  299. }
  300. // 获取roll房信息信息
  301. func GetRollInfoById(id int) (hf *RollInfo) {
  302. riMutex.Lock()
  303. defer riMutex.Unlock()
  304. // 更新参与列表
  305. UpdateSignupUidList(id)
  306. for i := 0; i < len(rollList); i++ {
  307. if id == rollList[i].Id {
  308. return rollList[i]
  309. }
  310. }
  311. return nil
  312. }
  313. func GetRollInfoList() RollInfoArray {
  314. riMutex.Lock()
  315. defer riMutex.Unlock()
  316. // 更新参与列表
  317. for _, v := range rollList {
  318. UpdateSignupUidList(v.Id)
  319. }
  320. // 已开奖
  321. var _rollList RollInfoArray
  322. currTime := time.Now().Unix()
  323. for _, v := range rollList {
  324. if v.AwardTime > currTime {
  325. _rollList = append(_rollList, v)
  326. del_unactive_roll_info(v.Id)
  327. }
  328. }
  329. rollList = _rollList
  330. return rollList
  331. }
  332. func GetRollConditionList() RollConditionArray {
  333. return conditionList
  334. }