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 2bbbc4af..ce918eea 100644 --- a/app/mix/dao/mongo.go +++ b/app/mix/dao/mongo.go @@ -7238,34 +7238,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) @@ -7276,11 +7254,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) @@ -7308,6 +7287,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() @@ -7344,33 +7367,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 @@ -7409,3 +7410,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 fac8f506..86b457e2 100644 --- a/app/mix/service/business_validator/auth.go +++ b/app/mix/service/business_validator/auth.go @@ -822,9 +822,9 @@ func (l *AuthBusinessValidator) EnsureContactCustomerServiceIdsAreFromThisUser(m 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 72a75dd4..b50a48c1 100644 --- a/app/mix/service/cronservice.go +++ b/app/mix/service/cronservice.go @@ -89,6 +89,7 @@ func (s *CronService) Init(c any) (exec xxl.Executor, err error) { exec.RegTask("push_notifications", s.PushNotifications) exec.RegTask("clear_veri_code_wrong_times", s.ClearVeriCodeWrongTimes) exec.RegTask("user_refund_audit_times", s.UserRefundAuditTimes) + 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 b883d8f1..24d5ed84 100644 --- a/app/mix/service/service.go +++ b/app/mix/service/service.go @@ -5626,16 +5626,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 d088d827..709628f1 100644 --- a/app/mix/service/utilservice.go +++ b/app/mix/service/utilservice.go @@ -2482,11 +2482,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 a00796f8..16fa68fb 100644 --- a/app/mix/service/xxljob_tasks.go +++ b/app/mix/service/xxljob_tasks.go @@ -686,3 +686,20 @@ func (s *CronService) UserRefundAuditTimes(ctx context.Context, param *xxl.RunRe } return "user_refund_audit_times collection has been " } + +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" +}