Merge branch 'feat-IRONFANS-250-Robin' into conf-250

This commit is contained in:
Robin 2024-12-12 16:40:06 +08:00
commit 42683cc4a0
10 changed files with 145 additions and 81 deletions

View File

@ -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
}

View File

@ -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
}

View File

@ -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

View File

@ -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

View File

@ -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
}

View File

@ -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
}

View File

@ -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()

View File

@ -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
}

View File

@ -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

View File

@ -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"
}