From 52d96d568d059664a531976831f48ba6699111c1 Mon Sep 17 00:00:00 2001 From: Robin <7434053+warrior_of_light_robin@user.noreply.gitee.com> Date: Thu, 12 Dec 2024 16:31:44 +0800 Subject: [PATCH] by Robin at 20241212 --- .../activity_hot/proto/activity_hot_op_vo.go | 13 -- app/mix/dao/mongo.go | 141 ++++++++++++------ app/mix/service/business_validator/auth.go | 4 +- app/mix/service/cronservice.go | 1 + app/mix/service/logic/activity_banner.go | 14 ++ app/mix/service/logic/activity_hot.go | 18 ++- .../service/opservice_business_validation.go | 2 +- app/mix/service/service.go | 11 -- app/mix/service/utilservice.go | 5 +- app/mix/service/xxljob_tasks.go | 17 +++ 10 files changed, 145 insertions(+), 81 deletions(-) diff --git a/api/proto/activity_hot/proto/activity_hot_op_vo.go b/api/proto/activity_hot/proto/activity_hot_op_vo.go index 36cbae44..1a11ef91 100644 --- a/api/proto/activity_hot/proto/activity_hot_op_vo.go +++ b/api/proto/activity_hot/proto/activity_hot_op_vo.go @@ -1,10 +1,7 @@ package proto import ( - "service/api/consts" "service/dbstruct" - - goproto "google.golang.org/protobuf/proto" ) type ActivityHotOpVO struct { @@ -31,13 +28,3 @@ func (vo *ActivityHotOpVO) CopyAccount(account *dbstruct.Account) *ActivityHotOp vo.UserId = account.GetUserId() return vo } - -// 设置状态 -func (vo *ActivityHotOpVO) SetStatus(nt int64) *ActivityHotOpVO { - if vo.ActivityHot.GetSt() > nt { // 开始时间晚于当前时间,则为未开始 - vo.ActivityHot.Status = goproto.Int64(consts.ActivityHotStatus_Waiting) - } else if vo.ActivityHot.GetEt() < nt { // 结束时间早于当前时间,则为已过期 - vo.ActivityHot.Status = goproto.Int64(consts.ActivityHotStatus_Expired) - } - return vo -} diff --git a/app/mix/dao/mongo.go b/app/mix/dao/mongo.go index 3f05869d..ced4a9a8 100644 --- a/app/mix/dao/mongo.go +++ b/app/mix/dao/mongo.go @@ -6570,34 +6570,12 @@ func (m *Mongo) GetActivityHotList(ctx *gin.Context, req *activity_hot_proto.OpL "del_flag": 0, } - nt := time.Now().Unix() - if req.Uid != nil { query["mid"] = util.DerefInt64(req.Uid) } if req.Status != nil { - switch util.DerefInt64(req.Status) { - // 正常或暂停 - case consts.ActivityHotStatus_Normal, consts.ActivityHotStatus_Paused: - query["status"] = util.DerefInt64(req.Status) - query["st"] = qmgo.M{ - "$lte": nt, - } - query["et"] = qmgo.M{ - "$gte": nt, - } - // 未开始,开始时间必须大于现在的时间(即晚于) - case consts.ActivityHotStatus_Waiting: - query["st"] = qmgo.M{ - "$gt": nt, - } - // 已失效,结束时间必须小于现在的时间(即早于) - case consts.ActivityHotStatus_Expired: - query["et"] = qmgo.M{ - "$lt": nt, - } - } + query["status"] = util.DerefInt64(req.Status) } err := col.Find(ctx, query).Sort("-priority").Skip(int64(req.Offset)).Limit(int64(req.Limit)).All(&list) @@ -6608,11 +6586,12 @@ func (m *Mongo) GetActivityHotList(ctx *gin.Context, req *activity_hot_proto.OpL return list, err } -func (m *Mongo) GetActivityHotByMid(ctx *gin.Context, mid int64) (*dbstruct.ActivityHot, error) { +func (m *Mongo) GetActivityHotByMidAndStatus(ctx *gin.Context, mid int64, status int64) (*dbstruct.ActivityHot, error) { one := &dbstruct.ActivityHot{} col := m.getColActivityHot() query := qmgo.M{ "mid": mid, + "status": status, "del_flag": 0, } err := col.Find(ctx, query).One(one) @@ -6640,6 +6619,50 @@ func (m *Mongo) GetActivityHotListByIds(ctx *gin.Context, ids []int64) ([]*dbstr return list, err } +func (m *Mongo) StartActivityHotAtDueTime(ctx *gin.Context, nt int64) error { + col := m.getColActivityHot() + // 所有开始时间早于现在时间且是待开始状态的,转为推送中 + query := qmgo.M{ + "st": qmgo.M{ + "$lte": nt, + }, + "status": consts.ActivityHotStatus_Waiting, + "del_flag": 0, + } + set := qmgo.M{ + "status": consts.ActivityHotStatus_Normal, + "ut": time.Now().Unix(), + } + up := qmgo.M{ + "$set": set, + } + _, err := col.UpdateAll(ctx, query, up) + return err +} + +func (m *Mongo) EndActivityHotAtDueTime(ctx *gin.Context, nt int64) error { + col := m.getColActivityHot() + // 所有结束时间早于现在时间且未被关闭的,转为已失效 + query := qmgo.M{ + "et": qmgo.M{ + "$lte": nt, + }, + "status": qmgo.M{ + "$ne": consts.ActivityHotStatus_Expired, + }, + "del_flag": 0, + } + set := qmgo.M{ + "status": consts.ActivityHotStatus_Expired, + "ut": time.Now().Unix(), + } + up := qmgo.M{ + "$set": set, + } + _, err := col.UpdateAll(ctx, query, up) + return err +} + // 活动banner表相关 func (m *Mongo) CreateActivityBanner(ctx *gin.Context, activity_banner *dbstruct.ActivityBanner) error { col := m.getColActivityBanner() @@ -6676,33 +6699,11 @@ func (m *Mongo) GetActivityBannerList(ctx *gin.Context, req *activity_banner_pro "del_flag": 0, } - nt := time.Now().Unix() - if req.Status != nil { - switch util.DerefInt64(req.Status) { - // 正常或暂停 - case consts.ActivityBannerStatus_Normal, consts.ActivityBannerStatus_Paused: - query["status"] = util.DerefInt64(req.Status) - query["st"] = qmgo.M{ - "$lte": nt, - } - query["et"] = qmgo.M{ - "$gte": nt, - } - // 未开始,开始时间必须大于现在的时间(即晚于) - case consts.ActivityBannerStatus_Waiting: - query["st"] = qmgo.M{ - "$gt": nt, - } - // 已失效,结束时间必须小于现在的时间(即早于) - case consts.ActivityBannerStatus_Expired: - query["et"] = qmgo.M{ - "$lt": nt, - } - } + query["status"] = util.DerefInt64(req.Status) } - err := col.Find(ctx, query).Sort("-priority").Skip(int64(req.Offset)).Limit(int64(req.Limit)).All(&list) + err := col.Find(ctx, query).Sort("-ct").Skip(int64(req.Offset)).Limit(int64(req.Limit)).All(&list) if err == qmgo.ErrNoSuchDocuments { err = nil return list, err @@ -6741,3 +6742,47 @@ func (m *Mongo) GetActivityBannerListByIds(ctx *gin.Context, ids []int64) ([]*db } return list, err } + +func (m *Mongo) StartActivityBannerAtDueTime(ctx *gin.Context, nt int64) error { + col := m.getColActivityBanner() + // 所有开始时间早于现在时间且是待开始状态的,转为推送中 + query := qmgo.M{ + "st": qmgo.M{ + "$lte": nt, + }, + "status": consts.ActivityBannerStatus_Waiting, + "del_flag": 0, + } + set := qmgo.M{ + "status": consts.ActivityBannerStatus_Normal, + "ut": time.Now().Unix(), + } + up := qmgo.M{ + "$set": set, + } + _, err := col.UpdateAll(ctx, query, up) + return err +} + +func (m *Mongo) EndActivityBannerAtDueTime(ctx *gin.Context, nt int64) error { + col := m.getColActivityBanner() + // 所有结束时间早于现在时间且未被关闭的,转为已失效 + query := qmgo.M{ + "et": qmgo.M{ + "$lte": nt, + }, + "status": qmgo.M{ + "$ne": consts.ActivityBannerStatus_Expired, + }, + "del_flag": 0, + } + set := qmgo.M{ + "status": consts.ActivityBannerStatus_Expired, + "ut": time.Now().Unix(), + } + up := qmgo.M{ + "$set": set, + } + _, err := col.UpdateAll(ctx, query, up) + return err +} diff --git a/app/mix/service/business_validator/auth.go b/app/mix/service/business_validator/auth.go index 3640fe89..c3af2127 100644 --- a/app/mix/service/business_validator/auth.go +++ b/app/mix/service/business_validator/auth.go @@ -788,9 +788,9 @@ func (l *AuthBusinessValidator) EnsureStreamerAuthApprovalIsUnique(createFunc fu return l } -func (l *AuthBusinessValidator) EnsureActivityHotIsMidUnique(fun func(*gin.Context, int64) (*dbstruct.ActivityHot, error), mid int64) *AuthBusinessValidator { +func (l *AuthBusinessValidator) EnsureActivityHotIsMidUnique(fun func(*gin.Context, int64, int64) (*dbstruct.ActivityHot, error), mid int64, status int64) *AuthBusinessValidator { l.oplist = append(l.oplist, func() { - activityHot, err := fun(l.ctx, mid) + activityHot, err := fun(l.ctx, mid, status) if err != nil { logger.Error("GetActivityHotByMid fail, err: %v", err) l.ec = errcode.ErrCodeActivityHotSrvFail diff --git a/app/mix/service/cronservice.go b/app/mix/service/cronservice.go index 5119a304..a52c9029 100644 --- a/app/mix/service/cronservice.go +++ b/app/mix/service/cronservice.go @@ -87,6 +87,7 @@ func (s *CronService) Init(c any) (exec xxl.Executor, err error) { exec.RegTask("reload_blocked_from_being_searched_list", s.ReloadBlockedFromBeingSearchedList) exec.RegTask("clear_auto_response_create_times", s.ClearAutoResponseCreateTimes) exec.RegTask("clear_veri_code_wrong_times", s.ClearVeriCodeWrongTimes) + exec.RegTask("sync_activity", s.SyncActivityStatus) exec.LogHandler(customLogHandle) //注册任务handler diff --git a/app/mix/service/logic/activity_banner.go b/app/mix/service/logic/activity_banner.go index e50cc0fa..a7879f7c 100644 --- a/app/mix/service/logic/activity_banner.go +++ b/app/mix/service/logic/activity_banner.go @@ -88,3 +88,17 @@ func (p *ActivityBanner) GetByIds(ctx *gin.Context, ids []int64) ([]*dbstruct.Ac } return list, nil } + +func (p *ActivityBanner) Sync(ctx *gin.Context, nt int64) error { + err := p.store.StartActivityBannerAtDueTime(ctx, nt) + if err != nil { + logger.Error("StartActivityBannerAtDueTime fail", err) + return err + } + err = p.store.EndActivityBannerAtDueTime(ctx, nt) + if err != nil { + logger.Error("EndActivityBannerAtDueTime fail", err) + return err + } + return nil +} diff --git a/app/mix/service/logic/activity_hot.go b/app/mix/service/logic/activity_hot.go index 6c05969b..80acc89e 100644 --- a/app/mix/service/logic/activity_hot.go +++ b/app/mix/service/logic/activity_hot.go @@ -71,8 +71,8 @@ func (p *ActivityHot) OpList(ctx *gin.Context, req *activity_hot_proto.OpListReq return list, nil } -func (p *ActivityHot) GetByMid(ctx *gin.Context, id int64) (*dbstruct.ActivityHot, error) { - one, err := p.store.GetActivityHotByMid(ctx, id) +func (p *ActivityHot) GetByMidAndStatus(ctx *gin.Context, id int64, status int64) (*dbstruct.ActivityHot, error) { + one, err := p.store.GetActivityHotByMidAndStatus(ctx, id, status) if err != nil { logger.Error("GetActivityHotByMid fail, id: %v, err: %v", id, err) return nil, err @@ -88,3 +88,17 @@ func (p *ActivityHot) GetByIds(ctx *gin.Context, ids []int64) ([]*dbstruct.Activ } return list, nil } + +func (p *ActivityHot) Sync(ctx *gin.Context, nt int64) error { + err := p.store.StartActivityHotAtDueTime(ctx, nt) + if err != nil { + logger.Error("StartActivityHotAtDueTime fail", err) + return err + } + err = p.store.EndActivityHotAtDueTime(ctx, nt) + if err != nil { + logger.Error("EndActivityHotAtDueTime fail", err) + return err + } + return nil +} diff --git a/app/mix/service/opservice_business_validation.go b/app/mix/service/opservice_business_validation.go index 3a1218e8..26360a4b 100644 --- a/app/mix/service/opservice_business_validation.go +++ b/app/mix/service/opservice_business_validation.go @@ -1501,7 +1501,7 @@ func (s *Service) OpCreateActivityHotBusinessValidate(ctx *gin.Context, req *act ec = errcode.ErrCodeActivityHotSrvOk resultList := businessvalidator.NewAuthBusinessValidator(ctx, req). - EnsureActivityHotIsMidUnique(_DefaultActivityHot.GetByMid, req.ActivityHot.GetMid()). + EnsureActivityHotIsMidUnique(_DefaultActivityHot.GetByMidAndStatus, req.ActivityHot.GetMid(), consts.ActivityHotStatus_Normal). EnsureZoneExist(_DefaultZone.GetByMid, req.ActivityHot.GetMid()). Validate(). Collect() diff --git a/app/mix/service/service.go b/app/mix/service/service.go index 04713a2c..fbb58976 100644 --- a/app/mix/service/service.go +++ b/app/mix/service/service.go @@ -5171,16 +5171,5 @@ func (s *Service) OpGetActivityBannerList(ctx *gin.Context, req *activity_banner ec = errcode.ErrCodeActivityBannerSrvFail return } - - // 当前时间 - nt := time.Now().Unix() - - for _, v := range list { - if v.GetSt() > nt { // 开始时间晚于当前时间,则为未开始 - v.Status = goproto.Int64(consts.ActivityHotStatus_Waiting) - } else if v.GetEt() < nt { // 结束时间早于当前时间,则为已过期 - v.Status = goproto.Int64(consts.ActivityHotStatus_Expired) - } - } return } diff --git a/app/mix/service/utilservice.go b/app/mix/service/utilservice.go index 15131c24..f94ca6ab 100644 --- a/app/mix/service/utilservice.go +++ b/app/mix/service/utilservice.go @@ -2269,11 +2269,8 @@ func (s *Service) utilFillActivityHotOpVO(ctx *gin.Context, list []*dbstruct.Act return make([]*activity_hot_proto.ActivityHotOpVO, 0), err } - // 当前时间 - nt := time.Now().Unix() - for _, v := range list { - vo := activity_hot_proto.NewActivityHotOpVO().CopyActivityHot(v).CopyAccount(acctMp[v.GetMid()]).SetStatus(nt) + vo := activity_hot_proto.NewActivityHotOpVO().CopyActivityHot(v).CopyAccount(acctMp[v.GetMid()]) volist = append(volist, vo) } return volist, nil diff --git a/app/mix/service/xxljob_tasks.go b/app/mix/service/xxljob_tasks.go index 56b26e78..6304b0e3 100644 --- a/app/mix/service/xxljob_tasks.go +++ b/app/mix/service/xxljob_tasks.go @@ -618,3 +618,20 @@ func (s *CronService) ClearVeriCodeWrongTimes(ctx context.Context, param *xxl.Ru logger.Info("vericode_wrong_times collection has been cleared") return "vericode_wrong_times collection has been cleared" } + +func (s *CronService) SyncActivityStatus(ctx context.Context, param *xxl.RunReq) (msg string) { + logger.Info("task %v param: %v log_id: %v", param.ExecutorHandler, param.ExecutorParams, xxl.Int64ToStr(param.LogID)) + logger.Info("Sync activity status...") + + nt := time.Now().Unix() + if err := _DefaultActivityHot.Sync(&gin.Context{}, nt); err != nil { + logger.Error("_DefaultActivityHot Sync fail: %v", err) + return fmt.Sprintf("_DefaultActivityHot Sync fail: %v", err) + } + if err := _DefaultActivityBanner.Sync(&gin.Context{}, nt); err != nil { + logger.Error("_DefaultActivityBanner Sync fail: %v", err) + return fmt.Sprintf("_DefaultActivityBanner Sync fail: %v", err) + } + logger.Info("activity status sync success") + return "activity status sync success" +}