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