diff --git a/_const/enum/groupPower_e/star.go b/_const/enum/groupPower_e/star.go new file mode 100644 index 0000000000000000000000000000000000000000..09f4c0705d859640863ca3731319c0ccb208478a --- /dev/null +++ b/_const/enum/groupPower_e/star.go @@ -0,0 +1,16 @@ +package groupPower_e + +type GroupPowerStarType int + +const ( + GroupPowerStarTypeFamous GroupPowerStarType = 1 // 送礼 + GroupPowerStarTypeActive GroupPowerStarType = 2 // 活跃 + GroupPowerStarTypeCharm GroupPowerStarType = 3 // 收礼 +) + +func IsGroupPowerStarType(t GroupPowerStarType) bool { + if t != GroupPowerStarTypeFamous && t != GroupPowerStarTypeActive && t != GroupPowerStarTypeCharm { + return false + } + return true +} diff --git a/cv/group_power_cv/group_rank.go b/cv/group_power_cv/group_rank.go index a9c5e3249bc488bd39b5918cd1b8758fd67d29d7..edf7887f6be38c5f19a68c6c6faadc020eb631c9 100644 --- a/cv/group_power_cv/group_rank.go +++ b/cv/group_power_cv/group_rank.go @@ -3,8 +3,15 @@ package group_power_cv import ( "git.hilo.cn/hilo-common/resource/mysql" "hilo-group/_const/enum/groupPower_e" + "hilo-group/cv/user_cv" ) +// 家族榜单 +type CvGroupPowerRank struct { + MyGroupPower CvGroupPowerRankData `json:"myGroupPower"` + Items []CvGroupPowerRankData `json:"items"` +} + type CvGroupPowerRankData struct { GroupPowerId mysql.ID `json:"groupPowerId"` // 家族id GroupPic string `json:"groupPic"` // 家族图片 @@ -16,7 +23,8 @@ type CvGroupPowerRankData struct { // todo 铭牌,图片等字段, 等伟健哥哥的结构体 } -type CvGroupPowerRank struct { - MyGroupPower CvGroupPowerRankData `json:"myGroupPower"` - Items []CvGroupPowerRankData `json:"items"` +// 家族之星 +type CvGroupPowerStarData struct { + user_cv.CvUserBase `json:",inline"` + Score mysql.Num `json:"score"` // 对应分值 } diff --git a/domain/model/groupPower_m/groupPower.go b/domain/model/groupPower_m/groupPower.go index 3e682846c701c1d644679741b4b64f89dd4a55a4..d3ed5db457e2c9beebe9b4a8e93146c8f5c01cf4 100644 --- a/domain/model/groupPower_m/groupPower.go +++ b/domain/model/groupPower_m/groupPower.go @@ -666,3 +666,18 @@ func GetGroupPowerGroups(model *domain.Model, groupPowerId mysql.ID) ([]*group_m } return res, nil } + +// 批量获取势力用户 +// return userId->GroupPowerUser +func BatchGetGroupPowerUser(model *domain.Model, userIds []mysql.ID) (map[mysql.ID]GroupPowerUser, error) { + var rows []GroupPowerUser + res := make(map[mysql.ID]GroupPowerUser) + if err := model.Db.Model(GroupPowerUser{}).Where("user_id in ?", userIds).Find(&rows).Error; err != nil { + model.Log.Errorf("BatchGetGroupPowerUser fail:%v", err) + return res, err + } + for i, v := range rows { + res[v.UserId] = rows[i] + } + return res, nil +} diff --git a/domain/model/groupPower_m/group_star.go b/domain/model/groupPower_m/group_star.go new file mode 100644 index 0000000000000000000000000000000000000000..8c7e15729def378edc872f38a398bcf923660b12 --- /dev/null +++ b/domain/model/groupPower_m/group_star.go @@ -0,0 +1,54 @@ +package groupPower_m + +import ( + "git.hilo.cn/hilo-common/domain" + "git.hilo.cn/hilo-common/resource/mysql" + "gorm.io/gorm" + "gorm.io/gorm/clause" + "hilo-group/_const/enum/groupPower_e" + "time" +) + +// 家族之星 +type GroupPowerMonthStar struct { + Month string + GroupPowerId mysql.ID + UserId mysql.ID + Type groupPower_e.GroupPowerStarType + Score mysql.Num + CreatedTime time.Time `gorm:"->"` + UpdatedTime time.Time `gorm:"->"` +} + +// 增加家族之星分数 +func IncrGroupPowerMonthStarScore(model *domain.Model, groupPowerId, userId mysql.ID, _type groupPower_e.GroupPowerStarType, score mysql.Num) error { + month := time.Now().Format("200601") + star := &GroupPowerMonthStar{ + Month: month, + GroupPowerId: groupPowerId, + UserId: userId, + Type: _type, + Score: score, + } + if err := model.DB().Model(GroupPowerMonthStar{}).Clauses(clause.OnConflict{ + Columns: []clause.Column{{Name: "month"}, {Name: "group_power_id"}, {Name: "user_id"}, {Name: "type"}}, + DoUpdates: clause.Assignments(map[string]interface{}{ + "score": gorm.Expr("score + ?", star.Score)}), + }).Create(star).Error; err != nil { + model.Log.Errorf("IncrGroupPowerMonthStarScore fail:%v", err) + return err + } + return nil +} + +// 获取家族之星排行 +func GetGroupPowerMonthStarRank(model *domain.Model, groupPowerId mysql.ID, _type groupPower_e.GroupPowerStarType, offset, limit int) ([]*GroupPowerMonthStar, error) { + var res []*GroupPowerMonthStar + month := time.Now().Format("200601") + if err := model.DB().Model(GroupPowerMonthStar{}).Where("month = ? AND group_power_id = ? AND `type` = ?", month, groupPowerId, _type). + Order("score desc").Offset(offset).Limit(limit).Find(&res).Error; err != nil { + model.Log.Errorf("GetGroupPowerMonthStarRank fail:%v", err) + return res, err + } + return res, nil +} diff --git a/domain/service/event_s/event_init.go b/domain/service/event_s/event_init.go index 1285f2c5a8ab3ae6405e02f67b1cae30da249ec4..f32652f3ab28bdf0aadf8a00faef5115a4e23456 100644 --- a/domain/service/event_s/event_init.go +++ b/domain/service/event_s/event_init.go @@ -6,6 +6,7 @@ import ( "git.hilo.cn/hilo-common/resource/mysql" "git.hilo.cn/hilo-common/rpc" "git.hilo.cn/hilo-common/sdk/tencentyun" + "hilo-group/_const/enum/groupPower_e" "hilo-group/_const/enum/group_e" "hilo-group/_const/enum/msg_e" "hilo-group/_const/enum/task_e" @@ -417,4 +418,36 @@ func SendGift() { } return nil }) + // 家族之星-送礼/收礼 + gift_ev.AddSendGiftEventAsync(func(model *domain.Model, event interface{}) error { + sendGiftEvent, ok := event.(*gift_ev.SendGiftEvent) + if !ok { + model.Log.Errorf("AddSendGiftEventAsync event type err") + return nil + } + var userIds = []mysql.ID{sendGiftEvent.SendUserId} + userIds = append(userIds, sendGiftEvent.ReceiveUserIds...) + groupPowers, err := groupPower_m.BatchGetGroupPowerUser(model, userIds) + if err != nil { + model.Log.Errorf("AddSendGiftEventAsync fail:%v", err) + return err + } + // 送礼加分 + if data, ok := groupPowers[sendGiftEvent.SendUserId]; ok { + diamonds := sendGiftEvent.GiftN * sendGiftEvent.ResGift.DiamondNum * mysql.Num(len(sendGiftEvent.ReceiveUserIds)) + if err := groupPower_m.IncrGroupPowerMonthStarScore(model, data.GroupPowerId, data.UserId, groupPower_e.GroupPowerStarTypeFamous, diamonds); err != nil { + model.Log.Errorf("IncrGroupPowerMonthStarScore famous fail:%v", err) + } + } + // 收礼加分 + for _, userId := range sendGiftEvent.ReceiveUserIds { + if data, ok := groupPowers[userId]; ok { + diamonds := sendGiftEvent.GiftN * sendGiftEvent.ResGift.DiamondNum + if err := groupPower_m.IncrGroupPowerMonthStarScore(model, data.GroupPowerId, data.UserId, groupPower_e.GroupPowerStarTypeCharm, diamonds); err != nil { + model.Log.Errorf("IncrGroupPowerMonthStarScore charm fail:%v", err) + } + } + } + return nil + }) } diff --git a/route/group_power_r/group_rank.go b/route/group_power_r/group_rank.go index ee704aa6ab38e4a5ffb36a3318c61df72bf36d8a..891c3e90c0e514f19075ddffe2ce233b8b52129c 100644 --- a/route/group_power_r/group_rank.go +++ b/route/group_power_r/group_rank.go @@ -9,7 +9,9 @@ import ( "github.com/jinzhu/now" "hilo-group/_const/enum/groupPower_e" "hilo-group/cv/group_power_cv" + "hilo-group/cv/user_cv" "hilo-group/domain/model/groupPower_m" + "hilo-group/domain/model/user_m" "hilo-group/myerr/bizerr" "hilo-group/req" "hilo-group/resp" @@ -33,7 +35,6 @@ func GroupPowerRank(c *gin.Context) (*mycontext.MyContext, error) { if period != "day" && period != "week" && period != "month" { return myContext, bizerr.InvalidParameter } - // day var beginDate, endDate string switch period { case "day": @@ -93,3 +94,58 @@ func GroupPowerRank(c *gin.Context) (*mycontext.MyContext, error) { resp.ResponseOk(c, response) return myContext, nil } + +type GroupPowerStarReq struct { + GroupPowerId mysql.ID `form:"groupPowerId" binding:"required"` + Type groupPower_e.GroupPowerStarType `form:"type" binding:"required"` + PageSize int `form:"pageSize" binding:"required"` + PageIndex int `form:"pageIndex" binding:"required"` +} + +// @Tags 国家势力 +// @Summary 家族之星 +// @Param token header string true "token" +// @Param nonce header string true "随机数字" +// @Param groupPowerId query int true "分页大小 默认:10" default(10) +// @Param type query string true "类型 1:送礼 2:活跃 3:收礼物" +// @Param pageSize query int false "分页大小 默认:10" default(10) +// @Param pageIndex query int false "第几个分页,从1开始 默认:1" default(1) +// @Success 200 {object} []group_power_cv.CvGroupPowerStarData +// @Router /v1/groupPower/star [get] +func GroupPowerStar(c *gin.Context) (*mycontext.MyContext, error) { + myContext := mycontext.CreateMyContext(c.Keys) + param := new(GroupPowerStarReq) + if err := c.ShouldBindQuery(param); err != nil { + return myContext, err + } + if param.PageIndex <= 0 { + param.PageIndex = 1 + } + var model = domain.CreateModelContext(myContext) + offset, limit := (param.PageIndex-1)*param.PageSize, param.PageSize + rank, err := groupPower_m.GetGroupPowerMonthStarRank(model, param.GroupPowerId, param.Type, offset, limit) + if err != nil { + return myContext, err + } + var response []group_power_cv.CvGroupPowerStarData + var userIds []mysql.ID + for _, row := range rank { + userIds = append(userIds, row.UserId) + } + users, err := user_m.GetUserMapByIds(model, userIds) + for _, row := range rank { + user := users[row.UserId] + response = append(response, group_power_cv.CvGroupPowerStarData{ + CvUserBase: user_cv.CvUserBase{ + Id: &user.ID, + ExternalId: &user.ExternalId, + Code: &user.Code, + Nick: &user.Nick, + Avatar: &user.Avatar, + }, + Score: row.Score, + }) + } + resp.ResponseOk(c, response) + return myContext, nil +} diff --git a/route/router.go b/route/router.go index 89bcc8c1776704893e06cbca0fa5bef79bfd6c58..c1f6c0fd5beb93f88aca88940afb157dcb928bdf 100644 --- a/route/router.go +++ b/route/router.go @@ -126,6 +126,7 @@ func InitRouter() *gin.Engine { groupPower.GET("/billboard/week", wrapper(group_power_r.GroupPowerBillboardWeek)) groupPower.GET("/billboard/owner/week", wrapper(group_power_r.GroupPowerBillboardOwnerWeek)) groupPower.GET("/rank/:period", wrapper(group_power_r.GroupPowerRank)) + groupPower.GET("/star", wrapper(group_power_r.GroupPowerStar)) } return r }