lottery.go 4.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. package models
  2. import (
  3. "annual-lottery2/models/model"
  4. "annual-lottery2/utils"
  5. "strconv"
  6. "time"
  7. )
  8. const (
  9. STATUS_DELETE = iota - 1
  10. STATUS_READY
  11. STATUS_NORMAL
  12. STATUS_EXPIRE
  13. )
  14. const (
  15. DATA_DELETE = iota - 1
  16. DATA_ADD
  17. DATA_UPDATE
  18. )
  19. // LotteryModel model
  20. type LotteryModel struct{}
  21. // UserList 用户列表
  22. func (m *LotteryModel) UserList() ([]model.TaUser, error) {
  23. users := make([]model.TaUser, 0)
  24. err := Dao.Asc("user_id").Find(&users)
  25. return users, err
  26. }
  27. // PrizeSettingList 奖品设置列表
  28. func (m *LotteryModel) PrizeSettingList() ([]model.TaPrizeSetting, error) {
  29. ps := make([]model.TaPrizeSetting, 0)
  30. err := Dao.Desc("create_date").Find(&ps)
  31. return ps, err
  32. }
  33. // PrizeSetting 抽奖设置维护
  34. func (m *LotteryModel) PrizeSetting(s *model.TaPrizeSetting, typ int) error {
  35. switch typ {
  36. case DATA_ADD:
  37. s.SettingId = 0
  38. s.Status = STATUS_NORMAL
  39. s.CreateDate = time.Now().Local()
  40. _, err := Dao.Insert(s)
  41. return err
  42. case DATA_UPDATE:
  43. cols := []string{"prize_id", "is_repeat", "prize_num", "status"}
  44. _, err := Dao.Cols(cols...).Where("setting_id=?", s.SettingId).Update(s)
  45. return err
  46. default:
  47. return nil
  48. }
  49. }
  50. // Draw 抽奖
  51. // 因为没有库存的概念,因此奖品中奖后, 不会把奖品表中的数量减一
  52. func (m *LotteryModel) Draw() ([]model.TaPrizeWinner, error) {
  53. // 获取当前可用抽奖设置
  54. setting := model.TaPrizeSetting{}
  55. if _, err := Dao.Where("status=?", STATUS_NORMAL).Get(&setting); err != nil {
  56. return nil, err
  57. }
  58. // 获取奖品
  59. prize := model.TaPrize{}
  60. if _, err := Dao.Where("prize_id=?", setting.PrizeId).Get(&prize); err != nil {
  61. return nil, err
  62. }
  63. // 获取参与抽奖人员
  64. users := make([]model.TaUser, 0)
  65. query := `select * from ta_user t where 1=1`
  66. if setting.IsRepeat == 0 {
  67. // 如果不允许多次中奖
  68. query += ` and not exists (
  69. select * from ta_prize_winner s where t.user_id = s.user_id and s.status = ` + strconv.Itoa(STATUS_NORMAL) + `
  70. )`
  71. }
  72. iu, nu := UserFilters(prize.PrizeType)
  73. if nu != "" {
  74. query += " and not exists (" + nu + ") "
  75. }
  76. if err := Dao.SQL(query).Find(&users); err != nil {
  77. return nil, err
  78. }
  79. pws := make([]model.TaPrizeWinner, 0)
  80. randIDs := make([]int, 0)
  81. randID := -1
  82. // 如果人员不如奖品多
  83. userNums := len(users)
  84. times := setting.PrizeNum
  85. if times > userNums {
  86. times = userNums
  87. }
  88. // 获取中奖人员
  89. for i := 0; i < times; i++ {
  90. randID = -1
  91. if len(iu) > i {
  92. for j, u := range users {
  93. if u.UserName == iu[i].UserName && u.UserOrg == iu[i].UserOrg {
  94. randID = j
  95. randIDs = append(randIDs, randID)
  96. break
  97. }
  98. }
  99. }
  100. if randID == -1 {
  101. for {
  102. randID = utils.RandNum(len(users))
  103. if utils.IntSliceIndex(randIDs, randID) == -1 {
  104. randIDs = append(randIDs, randID)
  105. break
  106. }
  107. }
  108. }
  109. winner := users[randID]
  110. // 组合中奖信息
  111. pw := model.TaPrizeWinner{
  112. UserId: winner.UserId,
  113. UserName: winner.UserName,
  114. UserOrg: winner.UserOrg,
  115. UserDept: winner.UserDept,
  116. PrizeId: prize.PrizeId,
  117. PrizeName: prize.PrizeName,
  118. PrizeType: prize.PrizeType,
  119. SettingId: setting.SettingId,
  120. Status: STATUS_NORMAL,
  121. CreateDate: time.Now().Local(),
  122. }
  123. pws = append(pws, pw)
  124. }
  125. // 更新抽奖配置
  126. if _, err := Dao.Cols("status").
  127. Update(&model.TaPrizeSetting{SettingId: setting.SettingId, Status: STATUS_EXPIRE}); err != nil {
  128. return nil, err
  129. }
  130. // 保存记录
  131. if _, err := Dao.Insert(&pws); err != nil {
  132. return nil, err
  133. }
  134. return pws, nil
  135. }
  136. // PrizeEdit 奖品维护
  137. func (m *LotteryModel) PrizeEdit(p *model.TaPrize, typ int) error {
  138. switch typ {
  139. case DATA_ADD:
  140. p.CreateDate = time.Now().Local()
  141. _, err := Dao.Insert(p)
  142. return err
  143. case DATA_UPDATE:
  144. cols := []string{"prize_type", "prize_name", "picture", "stock"}
  145. _, err := Dao.Cols(cols...).Where("prize_id=?", p.PrizeId).Update(p)
  146. return err
  147. default:
  148. return nil
  149. }
  150. }
  151. // PrizeList 奖品列表
  152. func (m *LotteryModel) PrizeList() ([]model.TaPrize, error) {
  153. ps := make([]model.TaPrize, 0)
  154. err := Dao.Desc("create_date").Find(&ps)
  155. return ps, err
  156. }
  157. // WinnerList 中奖人员名单
  158. // typ 奖品类型
  159. // name 用户名称
  160. // del 是否有效记录
  161. func (m *LotteryModel) WinnerList(typ, name string, del ...int) ([]model.TaPrizeWinner, error) {
  162. ws := make([]model.TaPrizeWinner, 0)
  163. query := Dao.Where("1=1")
  164. if typ != "" {
  165. query = query.And("prize_type like '%" + typ + "%'")
  166. }
  167. if name != "" {
  168. query = query.And("user_name like '%" + name + "%'")
  169. }
  170. if len(del) > 0 {
  171. query = query.And("status=?", del[0])
  172. }
  173. err := query.Asc("user_org", "prize_type").Desc("create_date").Find(&ws)
  174. return ws, err
  175. }
  176. // CancelWinner 作废中奖人员
  177. func (m *LotteryModel) CancelWinner(prizeID, userID int) error {
  178. // 作废记录
  179. pw := model.TaPrizeWinner{Status: STATUS_DELETE}
  180. if _, err := Dao.Cols("status").Where("prize_id=?", prizeID).
  181. And("user_id=?", userID).Update(&pw); err != nil {
  182. return err
  183. }
  184. return nil
  185. }