You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
264 lines
5.9 KiB
264 lines
5.9 KiB
package service |
|
|
|
import ( |
|
"context" |
|
"encoding/json" |
|
"fmt" |
|
"time" |
|
|
|
"go-common/app/admin/main/vip/model" |
|
"go-common/library/ecode" |
|
"go-common/library/log" |
|
xtime "go-common/library/time" |
|
|
|
"github.com/pkg/errors" |
|
) |
|
|
|
// const . |
|
const ( |
|
_linkTypeH5 = 7 |
|
_linkTypeApp = 10 |
|
) |
|
|
|
// SavePushData save push data |
|
func (s *Service) SavePushData(c context.Context, arg *model.VipPushData) (err error) { |
|
if err = s.checkPushData(arg); err != nil { |
|
err = errors.WithStack(err) |
|
return |
|
} |
|
|
|
if arg.ID == 0 { |
|
arg.ProgressStatus = model.NotStart |
|
arg.Status = model.Normal |
|
if _, err = s.dao.AddPushData(c, arg); err != nil { |
|
err = errors.WithStack(err) |
|
} |
|
return |
|
} |
|
|
|
var pushData *model.VipPushData |
|
if pushData, err = s.dao.GetPushData(c, arg.ID); err != nil { |
|
err = errors.WithStack(err) |
|
return |
|
} |
|
if pushData == nil { |
|
err = ecode.VipPushDataNotExitErr |
|
return |
|
} |
|
|
|
if pushData.Status == model.Fail { |
|
err = ecode.VipPushDataUpdateErr |
|
return |
|
} |
|
|
|
if pushData.ProgressStatus == model.Started { |
|
err = ecode.VipPushDataUpdateErr |
|
return |
|
} |
|
|
|
if pushData.GroupName != arg.GroupName || !pushData.EffectStartDate.Time().Equal(arg.EffectStartDate.Time()) { |
|
if !(pushData.Status == model.Normal && pushData.ProgressStatus == model.NotStart) { |
|
err = ecode.VipPushDataUpdateErr |
|
return |
|
} |
|
} |
|
|
|
arg.ProgressStatus = pushData.ProgressStatus |
|
if pushData.PushedCount == arg.PushTotalCount { |
|
arg.ProgressStatus = model.Started |
|
} |
|
|
|
if _, err = s.dao.UpdatePushData(c, arg); err != nil { |
|
err = errors.WithStack(err) |
|
} |
|
return |
|
} |
|
|
|
func (s *Service) checkPushData(arg *model.VipPushData) (err error) { |
|
if len(arg.GroupName) > 10 { |
|
err = ecode.VipPushGroupLenErr |
|
return |
|
} |
|
|
|
if len(arg.Title) > 30 { |
|
err = ecode.VipPushTitleLenErr |
|
return |
|
} |
|
|
|
if len(arg.Content) > 200 { |
|
err = ecode.VipPushContentLenErr |
|
return |
|
} |
|
|
|
if arg.LinkType != _linkTypeH5 && arg.LinkType != _linkTypeApp { |
|
err = ecode.VipPushLinkTypeErr |
|
return |
|
} |
|
|
|
if arg.EffectEndDate.Time().Before(arg.EffectStartDate.Time()) { |
|
err = ecode.VipPushEffectTimeErr |
|
return |
|
} |
|
|
|
duration := arg.EffectEndDate.Time().Sub(arg.EffectStartDate.Time()) |
|
day := duration.Hours() / 24 |
|
arg.PushTotalCount = int32(day) + 1 |
|
|
|
if _, err = time.Parse("15:04:05", arg.PushStartTime); err != nil { |
|
err = ecode.VipPushFmtTimeErr |
|
return |
|
} |
|
if _, err = time.Parse("15:04:05", arg.PushEndTime); err != nil { |
|
err = ecode.VipPushFmtTimeErr |
|
return |
|
} |
|
|
|
platformMap := make(map[string]*model.PushDataPlatform) |
|
platformArr := make([]*model.PushDataPlatform, 0) |
|
var ( |
|
data []byte |
|
key string |
|
condition string |
|
ok bool |
|
) |
|
if err = json.Unmarshal([]byte(arg.Platform), &platformArr); err != nil { |
|
log.Error("error(%+v)", err) |
|
err = ecode.VipPushPlatformErr |
|
return |
|
} |
|
|
|
for _, v := range platformArr { |
|
|
|
if key, ok = model.PushPlatformNameMap[v.Name]; !ok { |
|
err = ecode.VipPushPlatformErr |
|
return |
|
} |
|
if condition, ok = model.ConditionNameMap[v.Condition]; !ok { |
|
err = ecode.VipPushPlatformErr |
|
return |
|
} |
|
|
|
v.Condition = condition |
|
platformMap[key] = v |
|
|
|
} |
|
|
|
if data, err = json.Marshal(platformMap); err != nil { |
|
err = errors.WithStack(err) |
|
return |
|
} |
|
|
|
arg.Platform = string(data) |
|
return |
|
} |
|
|
|
// GetPushData get push data |
|
func (s *Service) GetPushData(c context.Context, id int64) (res *model.VipPushData, err error) { |
|
if res, err = s.dao.GetPushData(c, id); err != nil { |
|
err = errors.WithStack(err) |
|
return |
|
} |
|
if res == nil { |
|
return |
|
} |
|
res.PushProgress = fmt.Sprintf("%v/%v", res.PushedCount, res.PushTotalCount) |
|
if err = s.fmtPushDataPlatform(res); err != nil { |
|
err = errors.WithStack(err) |
|
} |
|
return |
|
} |
|
|
|
// DisablePushData . |
|
func (s *Service) DisablePushData(c context.Context, id int64) (err error) { |
|
var ( |
|
res *model.VipPushData |
|
now = time.Now() |
|
) |
|
if res, err = s.dao.GetPushData(c, id); err != nil { |
|
err = errors.WithStack(err) |
|
return |
|
} |
|
if res == nil { |
|
err = ecode.VipPushDataNotExitErr |
|
return |
|
} |
|
|
|
if !(res.ProgressStatus == model.Starting && res.Status == model.Normal && res.DisableType == model.UnDisable) { |
|
err = ecode.VipPushDataDisableErr |
|
return |
|
} |
|
duration := now.Sub(res.EffectStartDate.Time()) |
|
day := duration.Hours() / 24 |
|
res.PushTotalCount = int32(day) + 1 |
|
res.EffectEndDate = xtime.Time(now.Unix()) |
|
if res.PushTotalCount > res.PushedCount { |
|
res.PushTotalCount-- |
|
} |
|
if res.PushTotalCount == res.PushedCount { |
|
res.ProgressStatus = model.Started |
|
} |
|
if err = s.dao.DisablePushData(c, res); err != nil { |
|
err = errors.WithStack(err) |
|
} |
|
return |
|
} |
|
|
|
// DelPushData . |
|
func (s *Service) DelPushData(c context.Context, id int64) (err error) { |
|
var res *model.VipPushData |
|
if res, err = s.dao.GetPushData(c, id); err != nil { |
|
err = errors.WithStack(err) |
|
return |
|
} |
|
if res == nil { |
|
err = ecode.VipPushDataNotExitErr |
|
return |
|
} |
|
if !(res.ProgressStatus == model.NotStart && res.Status == model.Normal) { |
|
err = ecode.VipPushDataDelErr |
|
return |
|
} |
|
|
|
if err = s.dao.DelPushData(c, id); err != nil { |
|
err = errors.WithStack(err) |
|
} |
|
return |
|
} |
|
|
|
// PushDatas get push datas |
|
func (s *Service) PushDatas(c context.Context, arg *model.ArgPushData) (res []*model.VipPushData, count int64, err error) { |
|
if count, err = s.dao.PushDataCount(c, arg); err != nil { |
|
err = errors.WithStack(err) |
|
return |
|
} |
|
|
|
if res, err = s.dao.PushDatas(c, arg); err != nil { |
|
err = errors.WithStack(err) |
|
return |
|
} |
|
|
|
for _, v := range res { |
|
v.PushProgress = fmt.Sprintf("%v/%v", v.PushedCount, v.PushTotalCount) |
|
} |
|
return |
|
} |
|
|
|
func (s *Service) fmtPushDataPlatform(res *model.VipPushData) (err error) { |
|
var platformArr []*model.PushDataPlatform |
|
|
|
platform := make(map[string]*model.PushDataPlatform) |
|
if err = json.Unmarshal([]byte(res.Platform), &platform); err != nil { |
|
err = errors.WithStack(err) |
|
return |
|
} |
|
|
|
for k, v := range platform { |
|
r := new(model.PushDataPlatform) |
|
r.Name = model.PushPlatformMap[k] |
|
r.Build = v.Build |
|
r.Condition = model.ConditionMap[v.Condition] |
|
platformArr = append(platformArr, r) |
|
} |
|
res.PlatformArr = platformArr |
|
return |
|
}
|
|
|