Merge branch 'feat-IRONFANS-231-Robin' into main-IRONFANS-231

This commit is contained in:
Leufolium 2024-10-22 16:01:05 +08:00
commit b1e1ef2db9
9 changed files with 158 additions and 53 deletions

View File

@ -100,8 +100,3 @@ const (
)
const ZoneAdmissionPrice_NoZone = int64(-999999)
const (
RavenIQTestVisit_PV = 0
RavenIQTestVisit_UV = 1
)

View File

@ -328,3 +328,15 @@ const (
Email_Success = 1 // 已发送
Email_Fail = 2 // 发送失败
)
// 瑞文智商测试c_type
const (
RavenIQTest_CType_PV = 0 // pv
RavenIQTest_CType_UV = 1 // uv
)
// 瑞文智商测试v_type
const (
RavenIQTest_VType_Visit = 0 // 访问
RavenIQTest_VType_Paid = 1 // 付款
)

View File

@ -54,14 +54,15 @@ type ApiListResp struct {
// op 计数
type ApiCountReq struct {
base.BaseRequest
VType *int64 `json:"v_type" bson:"v_type"` // 访问类型
CType *int64 `json:"c_type" bson:"c_type"` // 计数类型
CtLowerBound *int64 `json:"ct_lb" bson:"ct_lb"` // 访问时间下界
CtUpperBound *int64 `json:"ct_ub" bson:"ct_ub"` // 访问时间上界
}
type ApiCountData struct {
Count int64 `json:"count" bson:"count"`
VisitCount int64 `json:"visit_count" bson:"visit_count"`
PaidCount int64 `json:"paid_count" bson:"paid_count"`
TotalCount int64 `json:"total_count" bson:"total_count"`
}
type ApiCountResp struct {

View File

@ -36,10 +36,8 @@ type OpDeleteResp struct {
// op 计数
type OpCountReq struct {
base.BaseRequest
VType *int64 `json:"v_type" bson:"v_type"` // 访问类型
CType *int64 `json:"c_type" bson:"c_type"` // 计数类型
CtLowerBound *int64 `json:"ct_lb" bson:"ct_lb"` // 访问时间下界
CtUpperBound *int64 `json:"ct_ub" bson:"ct_ub"` // 访问时间上界
CtLowerBound *int64 `json:"ct_lb" bson:"ct_lb"` // 访问时间下界
CtUpperBound *int64 `json:"ct_ub" bson:"ct_ub"` // 访问时间上界
}
type OpCountData struct {

View File

@ -16,7 +16,6 @@ func (p *ApiCreateReq) ProvideNotNullValue() (params []*validator.JsonParam) {
// op 计数
func (p *ApiCountReq) ProvideNotNullValue() (params []*validator.JsonParam) {
params = make([]*validator.JsonParam, 0)
params = append(params, validator.NewInt64PtrParam("请确认访问类型", p.VType))
params = append(params, validator.NewInt64PtrParam("请确认计数类型", p.CType))
return
}

View File

@ -1,6 +1,7 @@
package controller
import (
"service/api/consts"
"service/api/errcode"
Raven_IQ_test_visitproto "service/api/proto/Raven_IQ_test_visit/proto"
"service/app/mix/service"
@ -24,7 +25,7 @@ func ApiCreateRavenIQTestVisit(ctx *gin.Context) {
func ApiGetRavenIQTestVisitCount(ctx *gin.Context) {
req := ctx.MustGet("client_req").(*Raven_IQ_test_visitproto.ApiCountReq)
count, ec := service.DefaultService.ApiGetRavenIQTestVisitCount(ctx, req)
countMap, ec := service.DefaultService.ApiGetRavenIQTestVisitCount(ctx, req)
if ec != errcode.ErrCodeRavenIQTestVisitSrvOk {
logger.Error("ApiCreateRavenIQTestVisit fail, req: %v, ec: %v", util.ToJson(req), ec)
ReplyErrCodeMsg(ctx, ec)
@ -32,7 +33,9 @@ func ApiGetRavenIQTestVisitCount(ctx *gin.Context) {
}
data := &Raven_IQ_test_visitproto.ApiCountData{
Count: count,
VisitCount: countMap[consts.RavenIQTest_VType_Visit],
PaidCount: countMap[consts.RavenIQTest_VType_Paid],
TotalCount: countMap[consts.RavenIQTest_VType_Visit] + countMap[consts.RavenIQTest_VType_Paid],
}
ReplyOk(ctx, data)

View File

@ -6339,39 +6339,98 @@ func (m *Mongo) DeleteRavenIQTestVisit(ctx *gin.Context, id int64) error {
return err
}
func (m *Mongo) GetRavenIQTestVisitCount(ctx *gin.Context, req *Raven_IQ_test_visitproto.OpCountReq) (int64, error) {
func (m *Mongo) GetRavenIQTestVisitPV(ctx *gin.Context, req *Raven_IQ_test_visitproto.OpCountReq) (results []map[string]any, err error) {
col := m.getColRavenIQTestVisit()
filterInClause := []qmgo.M{}
if req.CtLowerBound != nil {
filterInClause = append(filterInClause, qmgo.M{
"ct": qmgo.M{
"$gte": util.DerefInt64(req.CtLowerBound),
},
})
}
if req.CtUpperBound != nil {
filterInClause = append(filterInClause, qmgo.M{
"ct": qmgo.M{
"$lte": util.DerefInt64(req.CtUpperBound),
},
})
}
if len(filterInClause) == 0 {
return 0, nil
}
query := qmgo.M{
"v_type": util.DerefInt64(req.VType),
"$and": filterInClause,
filterClause := qmgo.M{
"del_flag": 0,
}
if util.DerefInt64(req.CType) == consts.RavenIQTestVisit_PV {
return col.Find(ctx, query).Count()
} else if util.DerefInt64(req.CType) == consts.RavenIQTestVisit_UV {
return col.Find(ctx, query).Count()
ctClause := qmgo.M{}
if req.CtLowerBound != nil {
ctClause["$gte"] = util.DerefInt64(req.CtLowerBound)
}
return 0, nil
if req.CtUpperBound != nil {
ctClause["$lte"] = util.DerefInt64(req.CtUpperBound)
}
if len(ctClause) > 0 {
filterClause["ct"] = ctClause
}
matchClause := bson.D{{
Key: "$match", Value: filterClause,
}}
groupClause := bson.D{
{Key: "$group", Value: bson.D{
{Key: "_id", Value: "$v_type"},
{Key: "pv", Value: bson.M{
"$sum": 1,
}},
},
},
}
pipeline := qmgo.Pipeline{matchClause, groupClause}
err = col.Aggregate(ctx, pipeline).All(&results)
if err != nil {
logger.Error("err : %v", err)
return
}
return
}
func (m *Mongo) GetRavenIQTestVisitUV(ctx *gin.Context, req *Raven_IQ_test_visitproto.OpCountReq) (results []map[string]any, err error) {
col := m.getColRavenIQTestVisit()
filterClause := qmgo.M{
"del_flag": 0,
}
ctClause := qmgo.M{}
if req.CtLowerBound != nil {
ctClause["$gte"] = util.DerefInt64(req.CtLowerBound)
}
if req.CtUpperBound != nil {
ctClause["$lte"] = util.DerefInt64(req.CtUpperBound)
}
if len(ctClause) > 0 {
filterClause["ct"] = ctClause
}
matchClause := bson.D{{
Key: "$match", Value: filterClause,
}}
distinctClause := bson.D{
{Key: "$group", Value: bson.D{
{Key: "_id", Value: bson.M{
"v_type": "$v_type",
"user_id": "$user_id",
}},
},
},
}
groupClause := bson.D{
{Key: "$group", Value: bson.D{
{Key: "_id", Value: "$_id.v_type"},
{Key: "uv", Value: bson.M{
"$sum": 1,
}},
},
},
}
pipeline := qmgo.Pipeline{matchClause, distinctClause, groupClause}
err = col.Aggregate(ctx, pipeline).All(&results)
if err != nil {
logger.Error("err : %v", err)
return
}
return
}

View File

@ -4315,16 +4315,22 @@ func (s *Service) ApiCreateRavenIQTestVisit(ctx *gin.Context, req *Raven_IQ_test
return
}
func (s *Service) ApiGetRavenIQTestVisitCount(ctx *gin.Context, req *Raven_IQ_test_visitproto.ApiCountReq) (count int64, ec errcode.ErrCode) {
func (s *Service) ApiGetRavenIQTestVisitCount(ctx *gin.Context, req *Raven_IQ_test_visitproto.ApiCountReq) (countMap map[int64]int64, ec errcode.ErrCode) {
ec = errcode.ErrCodeRavenIQTestVisitSrvOk
count, err := _DefaultRavenIQTestVisit.OpCount(ctx, &Raven_IQ_test_visitproto.OpCountReq{
VType: req.VType,
CType: req.CType,
var countFunc func(ctx *gin.Context, req *Raven_IQ_test_visitproto.OpCountReq) (map[int64]int64, error)
if util.DerefInt64(req.CType) == consts.RavenIQTest_CType_PV {
countFunc = _DefaultRavenIQTestVisit.OpCountPV
} else {
countFunc = _DefaultRavenIQTestVisit.OpCountUV
}
countMap, err := countFunc(ctx, &Raven_IQ_test_visitproto.OpCountReq{
CtLowerBound: req.CtLowerBound,
CtUpperBound: req.CtUpperBound,
})
if err != nil {
logger.Error("OpCreate fail, req: %v, err: %v", util.ToJson(req), err)
logger.Error("countFunc fail, req: %v, err: %v", util.ToJson(req), err)
ec = errcode.ErrCodeRavenIQTestVisitSrvFail
return
}

View File

@ -1,6 +1,7 @@
package logic
import (
"fmt"
"service/api/consts"
Raven_IQ_test_visitproto "service/api/proto/Raven_IQ_test_visit/proto"
"service/app/mix/dao"
@ -42,11 +43,42 @@ func (p *RavenIQTestVisit) OpDelete(ctx *gin.Context, id int64) error {
return nil
}
func (p *RavenIQTestVisit) OpCount(ctx *gin.Context, req *Raven_IQ_test_visitproto.OpCountReq) (int64, error) {
count, err := p.store.GetRavenIQTestVisitCount(ctx, req)
func (p *RavenIQTestVisit) OpCountPV(ctx *gin.Context, req *Raven_IQ_test_visitproto.OpCountReq) (map[int64]int64, error) {
countMap := make(map[int64]int64)
mapList, err := p.store.GetRavenIQTestVisitPV(ctx, req)
if err != nil {
logger.Error("GetRavenIQTestVisitCount fail, err: %v", err)
return 0, err
return make(map[int64]int64), err
}
return count, err
for _, _map := range mapList {
id, ok1 := _map["_id"].(int64)
pv, ok2 := _map["pv"].(int32)
if ok1 && ok2 {
countMap[id] = int64(pv)
} else {
logger.Error("assertion err")
return nil, fmt.Errorf("assertion err")
}
}
return countMap, err
}
func (p *RavenIQTestVisit) OpCountUV(ctx *gin.Context, req *Raven_IQ_test_visitproto.OpCountReq) (map[int64]int64, error) {
countMap := make(map[int64]int64)
mapList, err := p.store.GetRavenIQTestVisitUV(ctx, req)
if err != nil {
logger.Error("GetRavenIQTestVisitCount fail, err: %v", err)
return make(map[int64]int64), err
}
for _, _map := range mapList {
id, ok1 := _map["_id"].(int64)
uv, ok2 := _map["uv"].(int32)
if ok1 && ok2 {
countMap[id] = int64(uv)
} else {
logger.Error("assertion err")
return nil, fmt.Errorf("assertion err")
}
}
return countMap, err
}