go-common/app/job/main/sms/service/callback.go
2019-04-22 18:49:16 +08:00

161 lines
4.3 KiB
Go

package service
import (
"context"
"strconv"
"time"
"go-common/app/job/main/sms/dao/chuanglan"
"go-common/app/job/main/sms/dao/mengwang"
smsmdl "go-common/app/service/main/sms/model"
"go-common/library/log"
"go-common/library/sync/errgroup"
)
const (
_callbackSize = 100
)
func (s *Service) dispatchCallback(provider int32) {
switch provider {
case smsmdl.ProviderChuangLan:
s.waiter.Add(1)
go s.callbackChuangLanproc()
case smsmdl.ProviderMengWang:
s.waiter.Add(1)
go s.callbackMengWangproc()
}
}
func (s *Service) callbackChuangLanproc() {
defer s.waiter.Done()
log.Info("callbackChuangLanproc start")
group := errgroup.Group{}
cli := chuanglan.NewClient(s.c)
for {
if s.closed {
log.Info("callbackChuangLanproc exit")
return
}
group.Go(func() error {
callbacks, err := cli.Callback(context.Background(), s.c.Provider.ChuangLanSmsUser, s.c.Provider.ChuangLanSmsPwd, s.c.Provider.ChuangLanSmsCallbackURL, _callbackSize)
if err != nil {
time.Sleep(time.Second)
return nil
}
s.sendChuangLanCallbacks(smsmdl.TypeSms, callbacks)
return nil
})
group.Go(func() error {
callbacks, err := cli.Callback(context.Background(), s.c.Provider.ChuangLanActUser, s.c.Provider.ChuangLanActPwd, s.c.Provider.ChuangLanActCallbackURL, _callbackSize)
if err != nil {
time.Sleep(time.Second)
return nil
}
s.sendChuangLanCallbacks(smsmdl.TypeActSms, callbacks)
return nil
})
group.Go(func() error {
callbacks, err := cli.CallbackInternational(context.Background(), _callbackSize)
if err != nil {
time.Sleep(time.Second)
return nil
}
s.sendChuangLanCallbacks(smsmdl.TypeSms, callbacks)
return nil
})
group.Wait()
time.Sleep(time.Second)
}
}
func (s *Service) sendChuangLanCallbacks(typ int32, cbs []*chuanglan.Callback) (err error) {
ts := time.Now().Unix()
for _, cb := range cbs {
if cb.NotifyTime != "" {
if t, e := time.ParseInLocation("060102150405", cb.NotifyTime, time.Local); e != nil {
log.Warn("sendChuangLanCallbacks(%+v) parse time error(%v)", cb, e)
} else {
ts = t.Unix()
}
}
s.sendUserActionLog(&smsmdl.ModelUserActionLog{
MsgID: cb.MsgID,
Mobile: cb.Mobile,
Status: cb.Status,
Desc: cb.Desc,
Provider: smsmdl.ProviderChuangLan,
Type: typ,
Action: smsmdl.UserActionCallback,
Ts: ts,
})
}
return
}
func (s *Service) callbackMengWangproc() {
defer s.waiter.Done()
log.Info("callbackMengWangproc start")
group := errgroup.Group{}
cli := mengwang.NewClient(s.c)
for {
if s.closed {
log.Info("callbackMengWangproc exit")
return
}
group.Go(func() error {
callbacks, err := cli.Callback(context.Background(), s.c.Provider.MengWangSmsUser, s.c.Provider.MengWangSmsPwd, s.c.Provider.MengWangSmsCallbackURL, _callbackSize)
if err != nil {
time.Sleep(time.Second)
return nil
}
s.sendMengWangCallbacks(smsmdl.TypeSms, callbacks)
return nil
})
group.Go(func() error {
callbacks, err := cli.Callback(context.Background(), s.c.Provider.MengWangActUser, s.c.Provider.MengWangActPwd, s.c.Provider.MengWangActCallbackURL, _callbackSize)
if err != nil {
time.Sleep(time.Second)
return nil
}
s.sendMengWangCallbacks(smsmdl.TypeActSms, callbacks)
return nil
})
group.Go(func() error {
callbacks, err := cli.Callback(context.Background(), s.c.Provider.MengWangInternationUser, s.c.Provider.MengWangInternationPwd, s.c.Provider.MengWangInternationalCallbackURL, _callbackSize)
if err != nil {
time.Sleep(time.Second)
return nil
}
s.sendMengWangCallbacks(smsmdl.TypeSms, callbacks)
return nil
})
group.Wait()
time.Sleep(time.Second)
}
}
func (s *Service) sendMengWangCallbacks(typ int32, cbs []*mengwang.Callback) (err error) {
ts := time.Now().Unix()
for _, cb := range cbs {
if cb.ReportTime != "" {
if t, e := time.ParseInLocation("2006-01-02 15:04:05", cb.ReportTime, time.Local); e != nil {
log.Warn("sendMengWangCallbacks(%+v) parse time error(%v)", cb, e)
} else {
ts = t.Unix()
}
}
s.sendUserActionLog(&smsmdl.ModelUserActionLog{
MsgID: strconv.FormatInt(cb.MsgID, 10),
Mobile: cb.Mobile,
Status: cb.Status,
Desc: cb.Desc,
Provider: smsmdl.ProviderMengWang,
Type: typ,
Action: smsmdl.UserActionCallback,
Ts: ts,
})
}
return
}