123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- package service
- import (
- "context"
- "fmt"
- "strings"
- xtime "time"
- "go-common/app/job/main/vip/model"
- "go-common/library/log"
- "go-common/library/time"
- "github.com/pkg/errors"
- )
- const (
- maxSendMsgCount = 200
- willExpiredDay = 7
- hadExpiredDays = 14
- willExpiredMsg = "您还有%d天大会员即将到期,请尽快续期,享受更多特权!"
- willExpiredTitle = "大会员即将到期提醒"
- hadExpiredMsg = "很抱歉的通知您,您的大会员已过期,请尽快续期享受更多特权!"
- hadExpiredTitle = "大会员过期提醒"
- vipWillExpiredMsgCode = "10_1_2"
- vipHadExpiredMsgCode = "10_1_3"
- systemNotify = 4
- )
- func (s *Service) hadExpiredMsgJob() {
- defer func() {
- if x := recover(); x != nil {
- log.Error("service.hadExpiredMsgJob panic(%v)", x)
- go s.hadExpiredMsgJob()
- log.Info("service.hadExpiredMsgJob recover")
- }
- }()
- log.Info("start send had expire msg job ...................")
- var (
- err error
- mids []int64
- )
- now := xtime.Now()
- startTime := now.AddDate(0, 0, -hadExpiredDays-1)
- endTime := now.AddDate(0, 0, -hadExpiredDays)
- if mids, err = s.willExpireUser(time.Time(startTime.Unix()), time.Time(endTime.Unix()), model.VipStatusOverTime); err != nil {
- log.Error("will expire user(startTime:%v endTime:%v status:%v) error(%+v)", startTime, endTime, model.VipStatusOverTime, err)
- return
- }
- log.Info("send startTime(%v) endDate(%v) mids(%v)", startTime.Format("2006-01-02"), endTime.Format("2006-01-02"), mids)
- if err = s.batchSendMsg(mids, hadExpiredMsg, hadExpiredTitle, vipHadExpiredMsgCode, systemNotify); err != nil {
- log.Error("batch send msg error(%+v)", err)
- return
- }
- log.Info("end send had expire msg job..........................")
- }
- func (s *Service) willExpiredMsgJob() {
- defer func() {
- if x := recover(); x != nil {
- log.Error("service.hadExpiredMsgJob panic(%v)", x)
- go s.willExpiredMsgJob()
- log.Info("service.hadExpiredMsgJob recover")
- }
- }()
- log.Info("start send will expire msg job............................")
- var (
- err error
- mids []int64
- )
- now := xtime.Now()
- startTime := now.AddDate(0, 0, willExpiredDay)
- endTime := now.AddDate(0, 0, willExpiredDay+1)
- if mids, err = s.willExpireUser(time.Time(startTime.Unix()), time.Time(endTime.Unix()), model.VipStatusNotOverTime); err != nil {
- log.Error("will expire user(startTime:%v endTime:%v status:%v) error(%+v)", startTime, endTime, model.VipStatusNotOverTime, err)
- return
- }
- log.Info("send startTime(%v) endDate(%v) mids(%v)", startTime.Format("2006-01-02"), endTime.Format("2006-01-02"), mids)
- if err = s.batchSendMsg(mids, fmt.Sprintf(willExpiredMsg, willExpiredDay), willExpiredTitle, vipWillExpiredMsgCode, systemNotify); err != nil {
- log.Error("batch send msg error(%+v)", err)
- return
- }
- log.Info("end send will expire msg job............................")
- }
- func (s *Service) willExpireUser(startTime time.Time, endTime time.Time, status int) (mids []int64, err error) {
- var (
- maxID int
- size = 10000
- )
- if maxID, err = s.dao.SelMaxID(context.TODO()); err != nil {
- err = errors.WithStack(err)
- return
- }
- page := maxID / size
- if maxID%size != 0 {
- page++
- }
- for i := 0; i < page; i++ {
- startID := i * size
- endID := (i + 1) * size
- var tempMid []int64
- if tempMid, err = s.dao.SelVipUserInfos(context.TODO(), startID, endID, startTime, endTime, status); err != nil {
- err = errors.WithStack(err)
- return
- }
- mids = append(mids, tempMid...)
- }
- return
- }
- func (s *Service) batchSendMsg(mids []int64, content string, title string, ms string, dataType int) (err error) {
- if len(mids) <= maxSendMsgCount && len(mids) >= 1 {
- var midsStr = ""
- for _, v := range mids {
- midsStr += fmt.Sprintf(",%v", v)
- }
- if err = s.dao.SendMultipMsg(context.TODO(), midsStr, content, title, ms, dataType); err != nil {
- err = errors.WithStack(err)
- return
- }
- } else if len(mids) > maxSendMsgCount {
- page := len(mids) / maxSendMsgCount
- if len(mids)%maxSendMsgCount != 0 {
- page++
- }
- for i := 0; i < page; i++ {
- start := i * maxSendMsgCount
- end := (i + 1) * maxSendMsgCount
- if len(mids) < end {
- end = len(mids)
- }
- tempMids := mids[start:end]
- var midsStr []string
- for _, v := range tempMids {
- midsStr = append(midsStr, fmt.Sprintf("%v", v))
- }
- if err = s.dao.SendMultipMsg(context.TODO(), strings.Join(midsStr, ","), content, title, ms, dataType); err != nil {
- err = errors.WithStack(err)
- continue
- }
- }
- }
- return
- }
|