lotteryDrawTask.go 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. package activity
  2. import (
  3. "app.yhyue.com/moapp/jybase/date"
  4. "app.yhyue.com/moapp/jybase/go-logger/logger"
  5. "app.yhyue.com/moapp/message/db"
  6. "app.yhyue.com/moapp/message/model"
  7. "app.yhyue.com/moapp/message/util"
  8. "encoding/json"
  9. "fmt"
  10. "github.com/gogf/gf/v2/frame/g"
  11. "github.com/gogf/gf/v2/os/gctx"
  12. "regexp"
  13. "time"
  14. )
  15. const (
  16. //表
  17. tableTaskInfo = "jyactivities.lottery_task_info"
  18. tableTaskUser = "jyactivities.lottery_task_user"
  19. tableActivityInfo = "jyactivities.activity_info"
  20. )
  21. // 任务信息
  22. type TaskInfo struct {
  23. Id int64 `json:"id"`
  24. Name string `json:"name"`
  25. ActiveId int64 `json:"active_id"` //活动id
  26. Qualification int `json:"qualification"` //获取抽奖资格次数;
  27. CycleNum int `json:"cycle_num"` //任务周期(每天/每周/每月/活动周期) 可执行任务次数:n次;-1:不限制
  28. CycleUnit int `json:"cycle_unit"` //默认0:当天;;1:当周;2:当月;3:活动周期
  29. ActivityStartTime string `json:"start_time"` //活动开始时间
  30. ActivityEndTime string `json:"end_time"` //活动结束时间
  31. ActivityName string `json:"activity_name"` //活动名称
  32. }
  33. // 信息主题
  34. type MsgBody struct {
  35. Phone string
  36. UserId string
  37. MgoUserId string
  38. PositionId int64
  39. ActiveId int64
  40. TaskInfoId int64
  41. OrderCode string
  42. }
  43. // LotteryDrawTask 抽奖任务
  44. func LotteryDrawTask(msg *model.Message) {
  45. var msgBody MsgBody
  46. if msg.E_body != nil {
  47. b, err := json.Marshal(msg.E_body)
  48. if err == nil {
  49. err = json.Unmarshal(b, &msgBody)
  50. }
  51. if err != nil {
  52. logger.Info(fmt.Sprintf("任务完成参数信息有误:%s", msg.E_userId))
  53. return
  54. }
  55. }
  56. //判断用户是否存在
  57. data, ok := db.Mgo.FindById("user", msg.E_userId, `{"l_registedate":1,"s_phone":1,"s_m_phone":1}`)
  58. if data == nil || len(*data) == 0 || !ok {
  59. logger.Info(fmt.Sprintf("未找到用户:%s, 任务id:%d。", msg.E_userId, msgBody.TaskInfoId))
  60. return
  61. }
  62. //任务信息
  63. taskInfos := db.Mysql.SelectBySql(fmt.Sprintf("SELECT lti.*,ai.start_time,ai.end_time,ai.name AS activity_name FROM %s lti LEFT JOIN %s ai ON lti.active_id = ai.id WHERE lti.active_id = ? AND lti.id = ? AND ai.end_time >= NOW() ORDER BY lti.create_date DESC", tableTaskInfo, tableActivityInfo), msgBody.ActiveId, msgBody.TaskInfoId)
  64. if taskInfos == nil || len(*taskInfos) == 0 {
  65. logger.Info(fmt.Sprintf("没有当前需要完成的任务信息:%v", msgBody))
  66. return
  67. }
  68. //任务信息
  69. var taskInfo TaskInfo
  70. b, err := json.Marshal((*taskInfos)[0])
  71. if err == nil {
  72. err = json.Unmarshal(b, &taskInfo)
  73. }
  74. if err != nil {
  75. logger.Info(fmt.Sprintf("任务信息异常:%v,err:%s", msgBody, err.Error()))
  76. return
  77. }
  78. var (
  79. now = time.Now()
  80. timeRange = util.TimeRange{}
  81. )
  82. //判断任务有效期内,此次任务是否已完成
  83. switch taskInfo.CycleUnit {
  84. case 1: //当周
  85. timeRange = util.GetWeekRange(now)
  86. case 2: //当月
  87. timeRange = util.GetMonthRange(now)
  88. case 3: //活动周期
  89. startTime, _ := time.ParseInLocation(date.Date_Full_Layout, taskInfo.ActivityStartTime, time.Local)
  90. emdTime, _ := time.ParseInLocation(date.Date_Full_Layout, taskInfo.ActivityEndTime, time.Local)
  91. timeRange = util.TimeRange{
  92. StartTime: startTime,
  93. EndTime: emdTime,
  94. StartUnix: startTime.Unix(),
  95. EndUnix: emdTime.Unix(),
  96. }
  97. default: //当天
  98. timeRange = util.GetDayRange(now)
  99. }
  100. //当前周期内 是否已完成任务
  101. if taskInfo.CycleNum > 0 {
  102. if count := db.Mysql.CountBySql(fmt.Sprintf(`SELECT COUNT(ltu.id) FROM %s ltu WHERE ltu.active_id = ? AND ltu.task_id = ? AND ltu.state = 0 AND ltu.create_date < ? AND ltu.create_date > ? `, tableTaskUser), taskInfo.ActiveId, taskInfo.Id, timeRange.EndTime.Format(date.Date_Full_Layout), timeRange.StartTime.Format(date.Date_Full_Layout)); taskInfo.CycleNum <= int(count) {
  103. logger.Info(fmt.Sprintf("用户:%s ,此任务:%s ,在 %s 已完成", msgBody.Phone, taskInfo.Name, timeRange.StartTime.Format(date.Date_Short_Layout)))
  104. return
  105. }
  106. }
  107. //二次验证
  108. switch taskInfo.Id {
  109. case 1: //签到赠送剑鱼币任务
  110. case 2: //设置关键词任务
  111. var hasKeys bool
  112. //查看当前用户是否有订阅词
  113. res := db.Compatible.Select(msgBody.UserId, `{"o_vipjy":1,"o_member_jy":1,"o_jy":"1"}`)
  114. if res != nil && len(*res) > 0 {
  115. obj, _ := (*res)["o_jy"].(map[string]interface{})
  116. aKey, _ := obj["a_key"].([]interface{})
  117. if len(aKey) > 0 {
  118. hasKeys = true
  119. }
  120. if !hasKeys {
  121. obj, _ = (*res)["o_vipjy"].(map[string]interface{})
  122. if obj == nil {
  123. obj, _ = (*res)["o_member_jy"].(map[string]interface{})
  124. }
  125. if obj != nil {
  126. itmes, _ := obj["a_items"].([]interface{})
  127. for _, v := range itmes {
  128. item, _ := v.(map[string]interface{})
  129. keys, _ := item["a_key"].([]interface{})
  130. if len(keys) > 0 {
  131. hasKeys = true
  132. break
  133. }
  134. }
  135. }
  136. }
  137. }
  138. //没有设置关键词
  139. if !hasKeys {
  140. logger.Info(fmt.Sprintf("当前用户:%s,手机号: %s 没有设置订阅词", msgBody.UserId, msgBody.Phone))
  141. return
  142. }
  143. case 3: //招标采购搜索任务
  144. case 4: //购买/续费/升级超级订阅会员
  145. case 5: //购买/续费/升级大会员
  146. // TODO 完成任务 赠送两次 抽奖机会
  147. case 6: //给朋友分享活动
  148. }
  149. insertMap := map[string]interface{}{
  150. "active_id": msgBody.ActiveId,
  151. "task_id": msgBody.TaskInfoId,
  152. "phone": msgBody.Phone,
  153. "position_id": msgBody.PositionId,
  154. "mgo_user_id": msgBody.MgoUserId,
  155. "order_code": msgBody.OrderCode,
  156. "state": 0,
  157. "end_date": timeRange.EndTime.Format(date.Date_Full_Layout),
  158. "update_date": time.Now().Format(date.Date_Full_Layout),
  159. "create_date": time.Now().Format(date.Date_Full_Layout),
  160. }
  161. for i := 0; i < taskInfo.Qualification; i++ {
  162. if id := db.Mysql.Insert(tableTaskUser, insertMap); id < 0 {
  163. logger.Info(fmt.Sprintf("保存任务记录异常:%v", msgBody))
  164. // TODO 保存任务记录异常 告警
  165. if webhookURL := g.Cfg().MustGet(gctx.New(), "webhookURL").Strings(); len(webhookURL) > 0 {
  166. content := fmt.Sprintf(`保存任务记录异常:\n活动名称:%s \n手机号:%s \n职位id:%d \n任务id:%d \n任务名称:%s`,
  167. taskInfo.ActivityName, msgBody.Phone, msgBody.PositionId, msgBody.TaskInfoId, taskInfo.Name)
  168. util.SendMsgByWXURL(content, webhookURL)
  169. }
  170. }
  171. }
  172. }
  173. type lotteryBody struct {
  174. NickName string
  175. Phone string
  176. MgoUserId string
  177. PositionId int64
  178. ActiveId int64
  179. ActiveName string
  180. PrizeId int64
  181. PrizeName string
  182. }
  183. // WinningLottery 中奖信息
  184. func WinningLottery(msg *model.Message) {
  185. //TODO sse 通知用户 中奖信息
  186. var lb lotteryBody
  187. if msg.E_body != nil {
  188. b, err := json.Marshal(msg.E_body)
  189. if err == nil {
  190. err = json.Unmarshal(b, &lb)
  191. }
  192. if err != nil {
  193. logger.Info(fmt.Sprintf("中奖参数信息有误:%s", msg.E_userId))
  194. return
  195. }
  196. }
  197. var userName = lb.NickName
  198. if lb.Phone != "" {
  199. var PhoneReg = regexp.MustCompile(`^(100\d{8}|1[3-9]\d{9})$`)
  200. if PhoneReg.MatchString(lb.Phone) {
  201. phone := []rune(lb.Phone)
  202. userName = string(phone[0:3]) + "****" + string(phone[(len(phone)-4):])
  203. }
  204. }
  205. logger.Info(" sse 中奖信息通知:", msg)
  206. util.SseBroadcast.SendToUsers(model.SseMessage{
  207. Prize: lb.PrizeName,
  208. User: userName,
  209. State: model.AllTarget,
  210. Time: time.Now().Format(date.Date_Full_Layout),
  211. Remark: fmt.Sprintf("恭喜 %s 抽中 %s ", userName, lb.PrizeName),
  212. })
  213. }