From 58e5c6ab1de252e1b9a638394a3f7550ea4633c3 Mon Sep 17 00:00:00 2001 From: Leufolium Date: Tue, 20 Aug 2024 17:35:50 +0800 Subject: [PATCH] by Robin at 20240820 --- .../streamer_acct/proto/streamer_acct_op.go | 2 + api/proto/zone/proto/zone_op.go | 6 ++ apollostruct/streamer_filter.go | 2 + app/mix/dao/elasticsearch.go | 12 ++- app/mix/service/apiservice.go | 12 +-- app/mix/service/logic/es_decorated.go | 74 +++++++++++++++++-- app/mix/service/service.go | 37 +++++++++- dbstruct/streamer_acct.go | 4 + 8 files changed, 133 insertions(+), 16 deletions(-) diff --git a/api/proto/streamer_acct/proto/streamer_acct_op.go b/api/proto/streamer_acct/proto/streamer_acct_op.go index 4d714be0..e7bb2cbc 100644 --- a/api/proto/streamer_acct/proto/streamer_acct_op.go +++ b/api/proto/streamer_acct/proto/streamer_acct_op.go @@ -49,6 +49,8 @@ type OpFilterReq struct { Fans *util.Int64Filter `json:"fans"` Height *util.Int64Filter `json:"height"` Weight *util.Int64Filter `json:"weight"` + WechatCoinPrice *util.Int64Filter `json:"wechat_coin_price"` + ZoneAdmissionPrice *util.Int64Filter `json:"zone_admission_price"` City *string `json:"city"` Constellation *string `json:"constellation"` IsActiveWithinAWeek *int64 `json:"is_active_within_a_week"` diff --git a/api/proto/zone/proto/zone_op.go b/api/proto/zone/proto/zone_op.go index 49d3bfb8..37071184 100644 --- a/api/proto/zone/proto/zone_op.go +++ b/api/proto/zone/proto/zone_op.go @@ -9,6 +9,12 @@ import ( type OpCreateReq struct { base.BaseRequest *dbstruct.Zone + AdmissionPrice int64 `json:"admission_price"` // 空间解锁价格, 单位: 分 + IronfanshipPrice int64 `json:"ironfanship_price"` // 铁粉解锁价格, 单位: 分 + IsSuperfanshipEnabled int `json:"is_superfanship_enabled"` // 是否开启超粉空间 0: 关闭, 1: 开启 + SuperfanshipPrice int64 `json:"superfanship_price"` // 超粉价格, 单位: 分 + SuperfanshipValidPeriod int `json:"superfanship_valid_period"` // 超粉有效期类型, SuperfanshipValidPeriod* + IsSuperfanshipGiveWechat int `json:"is_superfanship_give_wechat"` // 是否开启超粉空间赠送微信 0: 不赠送, 1: 赠送 } type OpCreateData struct { diff --git a/apollostruct/streamer_filter.go b/apollostruct/streamer_filter.go index bc38d979..4dea5e59 100644 --- a/apollostruct/streamer_filter.go +++ b/apollostruct/streamer_filter.go @@ -7,6 +7,8 @@ type StreamerFilterCfg struct { Fans *util.Int64Filter `json:"fans"` Height *util.Int64Filter `json:"height"` Weight *util.Int64Filter `json:"weight"` + WechatCoinPrice *util.Int64Filter `json:"wechat_coin_price"` + ZoneAdmissionPrice *util.Int64Filter `json:"zone_admission_price"` CityWeight float64 `json:"city_weight"` ConstellationWeight float64 `json:"constellation_weight"` IsActiveWithinAWeekWeight float64 `json:"is_active_within_a_week_weight"` diff --git a/app/mix/dao/elasticsearch.go b/app/mix/dao/elasticsearch.go index a09189df..1d522f0b 100644 --- a/app/mix/dao/elasticsearch.go +++ b/app/mix/dao/elasticsearch.go @@ -193,12 +193,14 @@ func (es *ElasticSearch) FilterStreamerAcctList(ctx *gin.Context, req *streamera funcScoreQuery.MaxBoost(3.4028235e38) funcScoreQuery.Boost(1.0) - // 写入关于年龄、粉丝量、身高、体重的高斯衰减打分 + // 写入关于年龄、粉丝量、身高、体重、微信价格、空间价格的高斯衰减打分 matchall := elastic.NewMatchAllQuery().Boost(1.0) agefunc := util.CreateGaussDecayFunction("age", req.Age, req.RefStreamerFilter.Age) fansfunc := util.CreateGaussDecayFunction("fans", req.Fans, req.RefStreamerFilter.Fans) heightfunc := util.CreateGaussDecayFunction("height", req.Height, req.RefStreamerFilter.Height) weightfunc := util.CreateGaussDecayFunction("weight", req.Weight, req.RefStreamerFilter.Weight) + wechatcoinpricefunc := util.CreateGaussDecayFunction("wechat_coin_price", req.WechatCoinPrice, req.RefStreamerFilter.WechatCoinPrice) + zoneadmissionpricefunc := util.CreateGaussDecayFunction("zone_admission_price", req.ZoneAdmissionPrice, req.RefStreamerFilter.ZoneAdmissionPrice) if agefunc != nil { funcScoreQuery.Add(matchall, agefunc) @@ -216,6 +218,14 @@ func (es *ElasticSearch) FilterStreamerAcctList(ctx *gin.Context, req *streamera funcScoreQuery.Add(matchall, weightfunc) fullscore += 1.0 } + if wechatcoinpricefunc != nil { + funcScoreQuery.Add(matchall, wechatcoinpricefunc) + fullscore += 1.0 + } + if zoneadmissionpricefunc != nil { + funcScoreQuery.Add(matchall, zoneadmissionpricefunc) + fullscore += 1.0 + } // 写入关于城市、星座的脚本打分 if req.City != nil { diff --git a/app/mix/service/apiservice.go b/app/mix/service/apiservice.go index 7e7d7fe7..8c6825af 100644 --- a/app/mix/service/apiservice.go +++ b/app/mix/service/apiservice.go @@ -2645,8 +2645,9 @@ func (s *Service) ApiCreateZone(ctx *gin.Context, req *zoneproto.ApiCreateReq) ( req.Zone.VideoCount = goproto.Int64(0) req.Zone.IsZoneThirdPartnerHided = goproto.Int64(consts.IsHided_No) req.Zone.Profile = goproto.String(defaultZoneText) - err, zid := _DefaultZone.OpCreate(ctx, &zoneproto.OpCreateReq{ - Zone: req.Zone, + err, zid := _DefaultZoneDecrtByEs.OpCreate(ctx, &zoneproto.OpCreateReq{ + Zone: req.Zone, + AdmissionPrice: req.AdmissionPrice, }) if err != nil { logger.Error("OpCreate fail, req: %v, err: %v", util.ToJson(req), err) @@ -2725,8 +2726,9 @@ func (s *Service) ApiUpdateZone(ctx *gin.Context, req *zoneproto.ApiUpdateReq) ( profile := req.Zone.GetProfile() req.Zone.Profile = nil - err = _DefaultZone.OpUpdate(ctx, &zoneproto.OpUpdateReq{ - Zone: req.Zone, + err = _DefaultZoneDecrtByEs.OpUpdate(ctx, &zoneproto.OpUpdateReq{ + Zone: req.Zone, + AdmissionPrice: req.AdmissionPrice, }) if err == qmgo.ErrNoSuchDocuments { ec = errcode.ErrCodeZoneNotExist @@ -2767,7 +2769,7 @@ func (s *Service) ApiUpdateZone(ctx *gin.Context, req *zoneproto.ApiUpdateReq) ( func (s *Service) ApiDeleteZone(ctx *gin.Context, id int64) (ec errcode.ErrCode) { ec = errcode.ErrCodeZoneSrvOk - err := _DefaultZone.OpDelete(ctx, id) + err := _DefaultZoneDecrtByEs.OpDelete(ctx, id) if err != nil { logger.Error("OpDelete fail, id: %v, err: %v", id, err) ec = errcode.ErrCodeZoneSrvFail diff --git a/app/mix/service/logic/es_decorated.go b/app/mix/service/logic/es_decorated.go index 213da9c6..6a0e54e1 100644 --- a/app/mix/service/logic/es_decorated.go +++ b/app/mix/service/logic/es_decorated.go @@ -32,12 +32,13 @@ func (p *StreamerDecrtByEs) OpUpdate(ctx *gin.Context, req *streamerproto.OpUpda } // 更新es if err := p.StreamerAcct.OpUpdateSelectively(ctx, &dbstruct.EsStreamerAcctUpdater{ - Mid: req.Streamer.Mid, - Age: req.Streamer.Age, - Height: req.Streamer.Height, - Weight: req.Streamer.Weight, - City: req.Streamer.City, - Constellation: req.Streamer.Constellation, + Mid: req.Streamer.Mid, + Age: req.Streamer.Age, + Height: req.Streamer.Height, + Weight: req.Streamer.Weight, + City: req.Streamer.City, + Constellation: req.Streamer.Constellation, + WechatCoinPrice: req.Streamer.WechatCoinPrice, }); err != nil { logger.Error("OpUpdateSelectively fail, req: %v, err: %v", util.ToJson(req), err) return err @@ -57,6 +58,67 @@ func NewZoneDecrtByEs(streamerAcct *StreamerAcct, zone *Zone) *ZoneDecrtByEs { } } +func (p *ZoneDecrtByEs) OpCreate(ctx *gin.Context, req *zoneproto.OpCreateReq) (error, int64) { + err, id := p.Zone.OpCreate(ctx, req) + if err != nil { + logger.Error("CreateZone fail, req: %v, err: %v", util.ToJson(req), err) + return err, id + } + + // 更新es + if err := p.StreamerAcct.OpUpdateSelectively(ctx, &dbstruct.EsStreamerAcctUpdater{ + Mid: req.Zone.Mid, + ZoneAdmissionPrice: goproto.Int64(req.AdmissionPrice), + }); err != nil { + logger.Error("OpUpdateSelectively fail, req: %v, err: %v", util.ToJson(req), err) + return err, id + } + return nil, id +} + +func (p *ZoneDecrtByEs) OpUpdate(ctx *gin.Context, req *zoneproto.OpUpdateReq) error { + err := p.Zone.OpUpdate(ctx, req) + if err != nil { + logger.Error("UpdateZone fail, err: %v", err) + return err + } + + // 更新es + if err := p.StreamerAcct.OpUpdateSelectively(ctx, &dbstruct.EsStreamerAcctUpdater{ + Mid: goproto.Int64(req.BaseRequest.Mid), + ZoneAdmissionPrice: goproto.Int64(req.AdmissionPrice), + }); err != nil { + logger.Error("OpUpdateSelectively fail, req: %v, err: %v", util.ToJson(req), err) + return err + } + return nil +} + +func (p *ZoneDecrtByEs) OpDelete(ctx *gin.Context, id int64) error { + + zone, err := p.Zone.GetById(ctx, id) + if err != nil { + logger.Error("Zone GetById fail, err: %v", err) + return err + } + + err = p.Zone.OpDelete(ctx, id) + if err != nil { + logger.Error("DeleteZone fail, err: %v", err) + return err + } + + // 更新es + if err := p.StreamerAcct.OpUpdateSelectively(ctx, &dbstruct.EsStreamerAcctUpdater{ + Mid: zone.Mid, + ZoneAdmissionPrice: goproto.Int64(-1), + }); err != nil { + logger.Error("OpUpdateSelectively fail, err: %v", err) + return err + } + return nil +} + func (p *ZoneDecrtByEs) OpUpdateByIds(ctx *gin.Context, req *zoneproto.OpUpdateReq, ids []int64) error { err := p.Zone.OpUpdateByIds(ctx, req, ids) if err != nil { diff --git a/app/mix/service/service.go b/app/mix/service/service.go index ebc0cf64..2a2a2f89 100644 --- a/app/mix/service/service.go +++ b/app/mix/service/service.go @@ -1891,7 +1891,7 @@ func (s *Service) OpApproveStreamerAuthApproval(ctx *gin.Context, req *streamera return } streamerAccts := make([]*dbstruct.EsStreamerAcct, 0) - for _, streamer := range streamerList { + for i, streamer := range streamerList { acct := accountMp[streamer.GetMid()] streamerAccts = append(streamerAccts, &dbstruct.EsStreamerAcct{ Mid: acct.GetMid(), @@ -1904,6 +1904,8 @@ func (s *Service) OpApproveStreamerAuthApproval(ctx *gin.Context, req *streamera City: streamer.GetCity(), Constellation: streamer.GetConstellation(), LastZoneMomentCreateDayStart: 0, + WechatCoinPrice: util.DerefInt64(list[i].WechatCoinPrice), + ZoneAdmissionPrice: -1, // es只用于过滤搜索,设置为-1不影响付款 Ct: acct.GetCt(), Ut: acct.GetUt(), DelFlag: acct.GetDelFlag(), @@ -2264,6 +2266,8 @@ func (s *Service) OpApproveStreamerAuthApprovalDetails(ctx *gin.Context, req *st City: streamer.GetCity(), Constellation: streamer.GetConstellation(), LastZoneMomentCreateDayStart: 0, + WechatCoinPrice: util.DerefInt64(streamerAuthApprovalDetails.WechatCoinPrice), + ZoneAdmissionPrice: -1, // es只用于过滤搜索,设置为-1不影响付款 Ct: acct.GetCt(), Ut: acct.GetUt(), DelFlag: acct.GetDelFlag(), @@ -3877,7 +3881,7 @@ func (s *Service) OpGetAccountCancellationList(ctx *gin.Context, req *account_ca func (s *Service) OpCreateZone(ctx *gin.Context, req *zoneproto.OpCreateReq) (ec errcode.ErrCode) { ec = errcode.ErrCodeZoneSrvOk req.Zone.IsZoneThirdPartnerHided = goproto.Int64(consts.IsHided_No) - err, _ := _DefaultZone.OpCreate(ctx, req) + err, _ := _DefaultZoneDecrtByEs.OpCreate(ctx, req) if err != nil { logger.Error("OpCreate fail, req: %v, err: %v", util.ToJson(req), err) ec = errcode.ErrCodeZoneSrvFail @@ -3888,7 +3892,32 @@ func (s *Service) OpCreateZone(ctx *gin.Context, req *zoneproto.OpCreateReq) (ec func (s *Service) OpUpdateZone(ctx *gin.Context, req *zoneproto.OpUpdateReq) (ec errcode.ErrCode) { ec = errcode.ErrCodeZoneSrvOk - err := _DefaultZone.OpUpdate(ctx, req) + + // 转为更新自己空间请求 + selfReq := &zoneproto.OpUpdateReq{ + BaseRequest: req.BaseRequest, + Zone: req.Zone, + AdmissionPrice: req.AdmissionPrice, + IronfanshipPrice: req.IronfanshipPrice, + IsSuperfanshipEnabled: req.IsSuperfanshipEnabled, + SuperfanshipPrice: req.SuperfanshipPrice, + SuperfanshipValidPeriod: req.SuperfanshipValidPeriod, + IsSuperfanshipGiveWechat: req.IsSuperfanshipGiveWechat, + } + zone, err := _DefaultZone.GetById(ctx, req.Zone.GetId()) + if err == qmgo.ErrNoSuchDocuments { + ec = errcode.ErrCodeZoneNotExist + err = nil + return + } + if err != nil { + logger.Error("Zone GetById fail, err: %v", err) + ec = errcode.ErrCodeZoneSrvFail + return + } + selfReq.BaseRequest.Mid = zone.GetMid() + + err = _DefaultZoneDecrtByEs.OpUpdate(ctx, selfReq) if err == qmgo.ErrNoSuchDocuments { ec = errcode.ErrCodeZoneNotExist err = nil @@ -3924,7 +3953,7 @@ func (s *Service) OpUpdateZone(ctx *gin.Context, req *zoneproto.OpUpdateReq) (ec func (s *Service) OpDeleteZone(ctx *gin.Context, id int64) (ec errcode.ErrCode) { ec = errcode.ErrCodeZoneSrvOk - err := _DefaultZone.OpDelete(ctx, id) + err := _DefaultZoneDecrtByEs.OpDelete(ctx, id) if err != nil { logger.Error("OpDelete fail, id: %v, err: %v", id, err) ec = errcode.ErrCodeZoneSrvFail diff --git a/dbstruct/streamer_acct.go b/dbstruct/streamer_acct.go index de502b27..bc55648f 100644 --- a/dbstruct/streamer_acct.go +++ b/dbstruct/streamer_acct.go @@ -11,6 +11,8 @@ type EsStreamerAcct struct { City string `json:"city"` // 所在城市 Constellation string `json:"constellation"` // 星座 LastZoneMomentCreateDayStart int64 `json:"last_zone_moment_create_day_start"` // 最后空间动态创建日始整点 + WechatCoinPrice int64 `json:"wechat_coin_price"` // 微信金币价格 + ZoneAdmissionPrice int64 `json:"zone_admission_price"` // 空间解锁价格, 单位: 分 Ct int64 `json:"ct"` // 创建时间 Ut int64 `json:"ut"` // 更新时间 DelFlag int64 `json:"del_flag"` // 删除标记,0-否,1-是 @@ -27,6 +29,8 @@ type EsStreamerAcctUpdater struct { City *string `json:"city" bson:"city"` // 所在城市 Constellation *string `json:"constellation" bson:"constellation"` // 星座 LastZoneMomentCreateDayStart *int64 `json:"last_zone_moment_create_day_start" bson:"last_zone_moment_create_day_start"` // 最后空间动态创建日始整点 + WechatCoinPrice *int64 `json:"wechat_coin_price"` // 微信金币价格 + ZoneAdmissionPrice *int64 `json:"zone_admission_price"` // 空间解锁价格, 单位: 分 } func (p *EsStreamerAcctUpdater) GetMid() int64 {