From 48d2038a23dac9fe5d3f9f139b08fedf2cb73e6a Mon Sep 17 00:00:00 2001 From: hujiebin Date: Mon, 29 May 2023 16:35:59 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E7=BB=9F=E8=AE=A1=E6=88=90=E5=B0=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _const/enum/cp_e/achievement.go | 11 +++++++ domain/event/cp_ev/space.go | 30 ++++++++++++++++++ domain/model/cp_m/achievement.go | 42 +++++++++++++++++++++++++ domain/model/cp_m/visit.go | 46 ++++++++++++++++++++++++++++ domain/service/event_s/cp_level.go | 34 ++++++++++++++++++++ domain/service/event_s/cp_visit.go | 29 ++++++++++++++++++ domain/service/event_s/event_init.go | 1 + route/cp_r/space.go | 10 ++++++ 8 files changed, 203 insertions(+) create mode 100644 _const/enum/cp_e/achievement.go create mode 100644 domain/event/cp_ev/space.go create mode 100644 domain/model/cp_m/achievement.go create mode 100644 domain/model/cp_m/visit.go create mode 100644 domain/service/event_s/cp_visit.go diff --git a/_const/enum/cp_e/achievement.go b/_const/enum/cp_e/achievement.go new file mode 100644 index 0000000..2d69655 --- /dev/null +++ b/_const/enum/cp_e/achievement.go @@ -0,0 +1,11 @@ +package cp_e + +type CpAchievement int + +const ( + CpAchievementLevel CpAchievement = 1 // 等级 + CpAchievementVisitors CpAchievement = 2 // 空间访问人数 + CpAchievementMonthRank CpAchievement = 3 // 月榜最高 + CpAchievementWeekRank CpAchievement = 4 // 周榜最高 + CpAchievementDayRank CpAchievement = 5 // 日榜最高 +) diff --git a/domain/event/cp_ev/space.go b/domain/event/cp_ev/space.go new file mode 100644 index 0000000..106ff73 --- /dev/null +++ b/domain/event/cp_ev/space.go @@ -0,0 +1,30 @@ +package cp_ev + +import ( + "git.hilo.cn/hilo-common/domain" + "git.hilo.cn/hilo-common/resource/mysql" +) + +//注册监听 +var spaceVisitListen = new(domain.EventBase) + +type SpaceVisitEvent struct { + UserId mysql.ID + CpId mysql.ID + UserId1, UserId2 mysql.ID +} + +//添加领域事件,在每个领域模型中init中添加,因为这是静态业务,非动态的。 +func AddCpSpaceVisitSync(callback func(model *domain.Model, event interface{}) error) { + domain.AddEventSync(spaceVisitListen, callback) +} + +//加入到异步操作中 +func AddCpSpaceVisitAsync(callback func(model *domain.Model, event interface{}) error) { + domain.AddEventAsync(spaceVisitListen, callback) +} + +//领域事件发布 +func PublishCpSpaceVisit(model *domain.Model, event interface{}) error { + return domain.PublishEvent(spaceVisitListen, model, event) +} diff --git a/domain/model/cp_m/achievement.go b/domain/model/cp_m/achievement.go new file mode 100644 index 0000000..47782ca --- /dev/null +++ b/domain/model/cp_m/achievement.go @@ -0,0 +1,42 @@ +package cp_m + +import ( + "git.hilo.cn/hilo-common/domain" + "git.hilo.cn/hilo-common/resource/mysql" + "gorm.io/gorm" + "hilo-user/_const/enum/cp_e" + "time" +) + +type CpAchievement struct { + CpId mysql.ID + UserId1 mysql.ID + UserId2 mysql.ID + Type cp_e.CpAchievement + Score mysql.Num + CreatedTime time.Time `gorm:"->"` + UpdatedTime time.Time `gorm:"->"` +} + +// 更新cp成就 +// 单进程操作,先create,后update +func UpdateCpAchievement(model *domain.Model, cpId, userId1, userId2 mysql.ID, Type cp_e.CpAchievement, score mysql.Num) error { + var cpAchievement CpAchievement + if err := model.DB().Model(CpAchievement{}).Where("cp_id = ? AND `type` = ?", cpId, Type).First(&cpAchievement).Error; err != nil { + if err != gorm.ErrRecordNotFound { + model.Log.Errorf("UpdateCpAchievement fail:%v", err) + return err + } + // gorm.ErrRecordNotFound + cpAchievement = CpAchievement{ + CpId: cpId, + UserId1: userId1, + UserId2: userId2, + Type: Type, + Score: score, + } + return model.DB().Model(CpAchievement{}).Create(&cpAchievement).Error + } + // update if less than + return model.DB().Model(CpAchievement{}).Where("cp_id = ? AND `type` = ?", cpId, Type).Where("score < ?", score).UpdateColumn("score", score).Error +} diff --git a/domain/model/cp_m/visit.go b/domain/model/cp_m/visit.go new file mode 100644 index 0000000..ab2a02e --- /dev/null +++ b/domain/model/cp_m/visit.go @@ -0,0 +1,46 @@ +package cp_m + +import ( + "git.hilo.cn/hilo-common/domain" + "git.hilo.cn/hilo-common/resource/mysql" + "gorm.io/gorm" + "gorm.io/gorm/clause" + "time" +) + +type CpVisitor struct { + CpId mysql.ID + UserId1 mysql.ID + UserId2 mysql.ID + Visitor mysql.ID + Times mysql.Num + CreatedTime time.Time `gorm:"->"` + UpdatedTime time.Time `gorm:"->"` +} + +// 添加cp空间访问量 +func AddCpSpaceVisitor(model *domain.Model, cpId, userId1, userId2, visitor mysql.ID) error { + vis := &CpVisitor{ + CpId: cpId, + UserId1: userId1, + UserId2: userId2, + Visitor: visitor, + Times: 1, + } + if err := model.DB().Model(CpVisitor{}).Clauses(clause.OnConflict{Columns: []clause.Column{{Name: "cp_id"}, {Name: "visitor"}}, + DoUpdates: clause.Assignments(map[string]interface{}{ + "times": gorm.Expr("times + ?", 1)})}).Create(vis).Error; err != nil { + model.Log.Errorf("AddCpSpaceVisitor fail:%v", err) + return err + } + return nil +} + +// 获取cp空间访问人数 +func CountCpSpaceVisitors(model *domain.Model, cpId mysql.ID) int64 { + var cnt int64 + if err := model.DB().Model(CpVisitor{}).Where("cp_id = ?", cpId).Count(&cnt).Error; err != nil { + model.Log.Errorf("CountCpSpaceVisitors fail:%v", err) + } + return cnt +} diff --git a/domain/service/event_s/cp_level.go b/domain/service/event_s/cp_level.go index ae7b1fe..38e1305 100644 --- a/domain/service/event_s/cp_level.go +++ b/domain/service/event_s/cp_level.go @@ -2,8 +2,12 @@ package event_s import ( "git.hilo.cn/hilo-common/domain" + "git.hilo.cn/hilo-common/resource/mysql" + "github.com/jinzhu/now" + "hilo-user/_const/enum/cp_e" "hilo-user/domain/event/gift_ev" "hilo-user/domain/model/cp_m" + "time" ) // 送礼增加cp等级 @@ -25,6 +29,36 @@ func CpGiftEvent() { if err := cp_m.AddCpDayRank(model, cpRelation, diamonds); err != nil { model.Log.Errorf("AddCpDayRank fail:%v", err) } + // 检查最新的等级 + if cpLevel := cp_m.GetCpLevel(model, cpRelation.ID); cpLevel.CpId >= 0 { + if err := cp_m.UpdateCpAchievement(model, cpLevel.CpId, cpRelation.UserId1, cpRelation.UserId2, cp_e.CpAchievementLevel, mysql.Num(cpLevel.Level)); err != nil { + model.Log.Errorf("UpdateCpAchievement fail:%v", err) + } + } + // 检查最高的分数 + for _, queryType := range []string{"day", "week", "month"} { + var beginDate, endDate string + var cpAchievementType cp_e.CpAchievement + switch queryType { + case "day": + beginDate, endDate = time.Now().Format("2006-01-02"), time.Now().Format("2006-01-02") + cpAchievementType = cp_e.CpAchievementDayRank + case "week": + beginDate = now.BeginningOfWeek().Format("2006-01-02") + endDate = now.EndOfWeek().Format("2006-01-02") + cpAchievementType = cp_e.CpAchievementWeekRank + case "month": + beginDate = now.BeginningOfMonth().Format("2006-01-02") + endDate = now.EndOfMonth().Format("2006-01-02") + cpAchievementType = cp_e.CpAchievementMonthRank + } + if data := cp_m.GetCpDayRank(model, beginDate, endDate, cpRelation.ID); data.Score > 0 { + if err := cp_m.UpdateCpAchievement(model, cpRelation.ID, cpRelation.UserId1, cpRelation.UserId2, cpAchievementType, data.Score); err != nil { + model.Log.Errorf("UpdateCpAchievement fail:%v", err) + } + } + } + // 检查最新日周月榜单 return nil // 业务场景允许提前break(cp是唯一的) } } diff --git a/domain/service/event_s/cp_visit.go b/domain/service/event_s/cp_visit.go new file mode 100644 index 0000000..b0aa8bc --- /dev/null +++ b/domain/service/event_s/cp_visit.go @@ -0,0 +1,29 @@ +package event_s + +import ( + "git.hilo.cn/hilo-common/domain" + "git.hilo.cn/hilo-common/resource/mysql" + "hilo-user/_const/enum/cp_e" + "hilo-user/domain/event/cp_ev" + "hilo-user/domain/model/cp_m" + "hilo-user/myerr/bizerr" +) + +// cp空间访问 +func CpSpaceVisitEvent() { + cp_ev.AddCpSpaceVisitAsync(func(model *domain.Model, event interface{}) error { + e, ok := event.(*cp_ev.SpaceVisitEvent) + if !ok { + return bizerr.InvalidParameter + } + if err := cp_m.AddCpSpaceVisitor(model, e.CpId, e.UserId1, e.UserId2, e.UserId); err != nil { + model.Log.Errorf("AddCpSpaceVisitor fail:%v", err) + } + if cnt := cp_m.CountCpSpaceVisitors(model, e.CpId); cnt > 0 { + if err := cp_m.UpdateCpAchievement(model, e.CpId, e.UserId1, e.UserId2, cp_e.CpAchievementVisitors, mysql.Num(cnt)); err != nil { + model.Log.Errorf("UpdateCpAchievement fail:%v", err) + } + } + return nil + }) +} diff --git a/domain/service/event_s/event_init.go b/domain/service/event_s/event_init.go index 0ec52a6..14d1079 100644 --- a/domain/service/event_s/event_init.go +++ b/domain/service/event_s/event_init.go @@ -15,6 +15,7 @@ import ( func EventInit() { UserBagSendEvent() CpGiftEvent() + CpSpaceVisitEvent() } func UserBagSendEvent() { diff --git a/route/cp_r/space.go b/route/cp_r/space.go index 2a3f82f..9fec5d1 100644 --- a/route/cp_r/space.go +++ b/route/cp_r/space.go @@ -8,6 +8,7 @@ import ( "hilo-user/_const/enum/cp_e" "hilo-user/cv/cp_cv" "hilo-user/cv/user_cv" + "hilo-user/domain/event/cp_ev" "hilo-user/domain/model/cp_m" "hilo-user/domain/model/user_m" "hilo-user/myerr/bizerr" @@ -48,6 +49,15 @@ func CpSpace(c *gin.Context) (*mycontext.MyContext, error) { level := cp_m.GetCpLevel(model, cpRelation.ID) cpLevel, curPoints = level.Level, level.Points expireAtUnix = level.ExpireAt.Unix() + // cp 存在的时候,发布访问cp空间事件 + if err := cp_ev.PublishCpSpaceVisit(model, &cp_ev.SpaceVisitEvent{ + UserId: userId, + CpId: cpRelation.ID, + UserId1: cpRelation.UserId1, + UserId2: cpRelation.UserId2, + }); err != nil { + return myContext, err + } } if cpLevel != cp_e.CpLevelMax { nextPoints = cp_e.CpLevelPoints[cpLevel+1] -- 2.22.0