by Robin at 20240725
This commit is contained in:
parent
d74af2c693
commit
2ea3ebb6aa
|
@ -10,6 +10,7 @@ var ErrCodeMsgMap = map[ErrCode]string{
|
|||
ErrCodeApolloReadFail: "Apollo配置读取失败,请立即联系管理员",
|
||||
ErrCodeApolloVersionFormatError: "Apollo版本号配置格式错误",
|
||||
ErrCodeUserVersionFormatError: "用户上送版本号格式错误",
|
||||
ErrCodeIndexOutOfRange: "数组越界",
|
||||
ErrCodeAssertionFail: "严重错误:类型断言异常,请立即联系管理员",
|
||||
ErrCodeSelfOnlyOperation: "权限不足:该操作仅可对当前登录用户执行",
|
||||
ErrCodeRolePrivilegesNotEnough: "权限不足:当前用户角色禁止执行该操作",
|
||||
|
@ -238,6 +239,7 @@ const (
|
|||
ErrCodeAssertionFail ErrCode = -12 // 类型断言异常
|
||||
ErrCodeApolloVersionFormatError ErrCode = -13 // Apollo版本号配置格式错误
|
||||
ErrCodeUserVersionFormatError ErrCode = -14 // 用户上送版本号格式错误
|
||||
ErrCodeIndexOutOfRange ErrCode = -15 // 数组越界
|
||||
ErrCodeSelfOnlyOperation ErrCode = -20 // 权限不足:该操作仅可对当前登录用户执行
|
||||
ErrCodeRolePrivilegesNotEnough ErrCode = -21 // 权限不足: 当前用户角色禁止执行该操作
|
||||
ErrCodeOpRoleOnlyOperation ErrCode = -22 // 权限不足: 后台系统仅允许超级管理员和运营操作
|
||||
|
|
|
@ -10,6 +10,7 @@ type ApiListVO struct {
|
|||
UserId int64 `json:"user_id"` // 用户id
|
||||
Age int64 `json:"age"` // 年龄
|
||||
TotalScore float64 `json:"total_score"` // 总得分
|
||||
IQ int64 `json:"IQ"` // 智商值
|
||||
*apollostruct.IQResult
|
||||
ClassScoreList []*ApiClassScoreVO `json:"class_score_list"` // 大类得分list
|
||||
}
|
||||
|
@ -30,12 +31,13 @@ func (vo *ApiListVO) CopyRavenIQTest(test *dbstruct.RavenIQTest) *ApiListVO {
|
|||
vo.UserId = test.GetUserId()
|
||||
vo.Age = test.GetAge()
|
||||
vo.TotalScore = test.GetTotalScore()
|
||||
vo.IQ = test.GetIQ()
|
||||
vo.IQBlockId = test.GetIQBlockId()
|
||||
vo.ClassScoreList = make([]*ApiClassScoreVO, 0)
|
||||
for _, score := range test.ClassScoreList {
|
||||
vo.ClassScoreList = append(vo.ClassScoreList, &ApiClassScoreVO{
|
||||
ClassBlockId: score.GetClassBlockId(),
|
||||
Score: score.GetScore(),
|
||||
Score: score.GetConvertedScore(),
|
||||
ClassInfo: &apollostruct.ClassInfo{
|
||||
ClassId: score.GetClassId(),
|
||||
},
|
||||
|
|
|
@ -12,11 +12,13 @@ type RavenIQTestQuestion struct {
|
|||
}
|
||||
|
||||
type IQResult struct {
|
||||
IQBlockId int64 `json:"IQ_Block_Id"` // IQ分段id
|
||||
IQGrade string `json:"IQ_grade"` // 智商等级
|
||||
Percentile int64 `json:"percentile"` // 百分位
|
||||
Description string `json:"description"` // 描述
|
||||
Suggestions []string `json:"suggestions"` // 建议
|
||||
IQBlockId int64 `json:"IQ_Block_Id"` // IQ分段id
|
||||
IQGrade string `json:"IQ_grade"` // 智商等级
|
||||
Percentile int64 `json:"percentile"` // 百分位
|
||||
IQLowerBound int64 `json:"IQ_lower_bound"` // IQ下界
|
||||
IQUpperBound int64 `json:"IQ_upper_bound"` // IQ上界
|
||||
Description string `json:"description"` // 描述
|
||||
Suggestions []string `json:"suggestions"` // 建议
|
||||
}
|
||||
|
||||
type AgeScore2IQResultMapCfg struct {
|
||||
|
@ -40,8 +42,10 @@ type ClassResult struct {
|
|||
}
|
||||
|
||||
type ClassInfo struct {
|
||||
ClassId int64 `json:"class_id"` // 大类id
|
||||
ClassName string `json:"class_name"` // 大类名称
|
||||
ClassId int64 `json:"class_id"` // 大类id
|
||||
ClassName string `json:"class_name"` // 大类名称
|
||||
ClassTotalScore int64 `json:"class_total_score"` // 大类总分
|
||||
ClassFullScore int64 `json:"class_full_score"` // 大类满分
|
||||
}
|
||||
|
||||
type Suggestion struct {
|
||||
|
@ -57,4 +61,5 @@ type Tip struct {
|
|||
type ClassResultMapCfg struct {
|
||||
Map map[int64]*ClassResult `json:"map"`
|
||||
ClassInfoMap map[int64]*ClassInfo `json:"class_info_map"`
|
||||
FullScore int64 `json:"full_score"` // 满分
|
||||
}
|
||||
|
|
|
@ -2,6 +2,7 @@ package service
|
|||
|
||||
import (
|
||||
"fmt"
|
||||
"math"
|
||||
"service/api/base"
|
||||
"service/api/consts"
|
||||
"service/api/errcode"
|
||||
|
@ -3594,29 +3595,19 @@ func (s *Service) ApiCreateRavenIQTest(ctx *gin.Context, req *Raven_IQ_testproto
|
|||
|
||||
// 缓存数据准备
|
||||
questionMapcfg := apollostruct.QuestionMapCfg{}
|
||||
err := apollo.GetJson(consts.QuestionMapKey, &questionMapcfg, apollo.ApolloOpts().SetNamespace("Raven_IQ_test"))
|
||||
ageScore2IQResultMapCfg := apollostruct.AgeScore2IQResultMapCfg{}
|
||||
classScore2ClassResultMapCfg := apollostruct.ClassScore2ClassResultMapCfg{}
|
||||
IQResultMpcfg := apollostruct.IQResultMapCfg{}
|
||||
classResultMpCfg := apollostruct.ClassResultMapCfg{}
|
||||
keys := []string{consts.QuestionMapKey, consts.AgeScore2IQResultMapKey, consts.ClassScore2ClassResultMapKey, consts.IQResultMapKey, consts.ClassResultMapKey}
|
||||
cfgs := []any{&questionMapcfg, &ageScore2IQResultMapCfg, &classScore2ClassResultMapCfg, &IQResultMpcfg, &classResultMpCfg}
|
||||
err := apollo.GetJsons(keys, cfgs, apollo.ApolloOpts().SetNamespace("Raven_IQ_test"))
|
||||
if err != nil {
|
||||
logger.Error("Apollo read failed : %v", err)
|
||||
return -1, errcode.ErrCodeApolloReadFail
|
||||
}
|
||||
|
||||
ageScore2IQResultMapCfg := apollostruct.AgeScore2IQResultMapCfg{}
|
||||
err = apollo.GetJson(consts.AgeScore2IQResultMapKey, &ageScore2IQResultMapCfg, apollo.ApolloOpts().SetNamespace("Raven_IQ_test"))
|
||||
if err != nil {
|
||||
logger.Error("Apollo read failed : %v", err)
|
||||
ec = errcode.ErrCodeApolloReadFail
|
||||
return
|
||||
}
|
||||
|
||||
classScore2ClassResultMapCfg := apollostruct.ClassScore2ClassResultMapCfg{}
|
||||
err = apollo.GetJson(consts.ClassScore2ClassResultMapKey, &classScore2ClassResultMapCfg, apollo.ApolloOpts().SetNamespace("Raven_IQ_test"))
|
||||
if err != nil {
|
||||
logger.Error("Apollo read failed : %v", err)
|
||||
ec = errcode.ErrCodeApolloReadFail
|
||||
return
|
||||
}
|
||||
|
||||
// 计算总得分
|
||||
// 计算大类得分、总得分情况
|
||||
classScoreMap := make(map[int64]int64)
|
||||
for _, classId := range questionMapcfg.ClassList {
|
||||
classScoreMap[classId] = 0
|
||||
|
@ -3634,18 +3625,25 @@ func (s *Service) ApiCreateRavenIQTest(ctx *gin.Context, req *Raven_IQ_testproto
|
|||
req.ClassScoreList = make([]*dbstruct.RavenIQTestClassScore, 0)
|
||||
totalScore := float64(0)
|
||||
for classId, score := range classScoreMap {
|
||||
classInfo := classResultMpCfg.ClassInfoMap[classId]
|
||||
covertedScore := int64(math.Ceil(((float64(score) / float64(classInfo.ClassTotalScore) * float64(classResultMpCfg.FullScore)) + float64(classInfo.ClassFullScore)) / 2))
|
||||
req.ClassScoreList = append(req.ClassScoreList, &dbstruct.RavenIQTestClassScore{
|
||||
ClassId: goproto.Int64(classId),
|
||||
Score: goproto.Int64(score),
|
||||
ClassId: goproto.Int64(classId),
|
||||
Score: goproto.Int64(score),
|
||||
ConvertedScore: goproto.Int64(covertedScore),
|
||||
})
|
||||
totalScore += float64(score)
|
||||
}
|
||||
req.TotalScore = goproto.Float64(totalScore)
|
||||
|
||||
// 换算智商及百分位
|
||||
// 获取IQ分组id
|
||||
ageBlockIdx := util.GetLastLessOrEqualForInt64(ageScore2IQResultMapCfg.AgeBlockList, req.GetAge())
|
||||
list := ageScore2IQResultMapCfg.AgeBlockIndex2ScoreBlockListMap[ageBlockIdx]
|
||||
scoreBlockIdx := util.GetLastLessOrEqualForFloat64(list, req.GetTotalScore())
|
||||
if scoreBlockIdx == -1 || scoreBlockIdx >= len(list)-1 {
|
||||
logger.Error("array index out of bound...")
|
||||
return -1, errcode.ErrCodeIndexOutOfRange
|
||||
}
|
||||
IQBlockId := ageScore2IQResultMapCfg.ScoreBlockIndex2IQBlockIdMap[scoreBlockIdx]
|
||||
|
||||
for _, classScore := range req.ClassScoreList {
|
||||
|
@ -3656,6 +3654,13 @@ func (s *Service) ApiCreateRavenIQTest(ctx *gin.Context, req *Raven_IQ_testproto
|
|||
|
||||
req.IQBlockId = goproto.Int64(IQBlockId)
|
||||
|
||||
// 计算智商
|
||||
totalScoreLowerBound := list[scoreBlockIdx]
|
||||
totalScoreUpperBound := list[scoreBlockIdx+1]
|
||||
IQLowerBound := float64(IQResultMpcfg.Map[IQBlockId].IQLowerBound)
|
||||
IQUpperBound := float64(IQResultMpcfg.Map[IQBlockId].IQUpperBound)
|
||||
req.IQ = goproto.Int64(int64(math.Ceil(float64(totalScore-totalScoreLowerBound)/float64(totalScoreUpperBound-totalScoreLowerBound)*(IQUpperBound-IQLowerBound) + IQLowerBound)))
|
||||
|
||||
err = _DefaultRavenIQTest.OpCreate(ctx, &Raven_IQ_testproto.OpCreateReq{
|
||||
BaseRequest: req.BaseRequest,
|
||||
RavenIQTest: req.RavenIQTest,
|
||||
|
|
|
@ -6,6 +6,7 @@ type RavenIQTest struct {
|
|||
Age *int64 `json:"age" bson:"age"` // 年龄
|
||||
TotalScore *float64 `json:"total_score" bson:"total_score"` // 总得分
|
||||
IQBlockId *int64 `json:"IQ_block_id" bson:"IQ_block_id"` // 智商值key
|
||||
IQ *int64 `json:"IQ" bson:"IQ"` // 智商值
|
||||
AnswerList []*RavenIQTestAnswer `json:"answer_list" bson:"answer_list"` // 答案list
|
||||
ClassScoreList []*RavenIQTestClassScore `json:"class_score_list" bson:"class_score_list"` // 大类得分list
|
||||
Ct *int64 `json:"ct" bson:"ct"` // 创建时间
|
||||
|
@ -19,9 +20,10 @@ type RavenIQTestAnswer struct {
|
|||
}
|
||||
|
||||
type RavenIQTestClassScore struct {
|
||||
ClassId *int64 `json:"class_id" bson:"class_id"` // 大类id
|
||||
Score *int64 `json:"score" bson:"score"` // 得分
|
||||
ClassBlockId *int64 `json:"class_block_id" bson:"class_block_id"` // 大类得分key
|
||||
ClassId *int64 `json:"class_id" bson:"class_id"` // 大类id
|
||||
Score *int64 `json:"score" bson:"score"` // 得分
|
||||
ClassBlockId *int64 `json:"class_block_id" bson:"class_block_id"` // 大类得分key
|
||||
ConvertedScore *int64 `json:"converted_score" bson:"converted_score"` // 折算后得分
|
||||
}
|
||||
|
||||
func (p *RavenIQTest) GetId() int64 {
|
||||
|
@ -59,6 +61,13 @@ func (p *RavenIQTest) GetIQBlockId() int64 {
|
|||
return *p.IQBlockId
|
||||
}
|
||||
|
||||
func (p *RavenIQTest) GetIQ() int64 {
|
||||
if p == nil || p.IQ == nil {
|
||||
return 0
|
||||
}
|
||||
return *p.IQ
|
||||
}
|
||||
|
||||
func (p *RavenIQTestAnswer) GetQuestionId() int64 {
|
||||
if p == nil || p.QuestionId == nil {
|
||||
return 0
|
||||
|
@ -87,6 +96,13 @@ func (p *RavenIQTestClassScore) GetScore() int64 {
|
|||
return *p.Score
|
||||
}
|
||||
|
||||
func (p *RavenIQTestClassScore) GetConvertedScore() int64 {
|
||||
if p == nil || p.ConvertedScore == nil {
|
||||
return 0
|
||||
}
|
||||
return *p.ConvertedScore
|
||||
}
|
||||
|
||||
func (p *RavenIQTestClassScore) GetClassBlockId() int64 {
|
||||
if p == nil || p.ClassBlockId == nil {
|
||||
return 0
|
||||
|
|
|
@ -147,3 +147,23 @@ func GetFloat64Value(key string, opts ...*ApolloOptions) (value float64, err err
|
|||
}
|
||||
return
|
||||
}
|
||||
|
||||
func GetJsons(keys []string, vs []interface{}, opts ...*ApolloOptions) (err error) {
|
||||
opt := mergeApolloOptions(opts...)
|
||||
for i, key := range keys {
|
||||
var value string
|
||||
if opt.GetNamespace() != "" {
|
||||
value = defaultApolloClient.GetConfig(opt.GetNamespace()).GetStringValue(key, opt.GetDefaultValue())
|
||||
} else {
|
||||
value = defaultApolloClient.GetStringValue(key, opt.GetDefaultValue())
|
||||
}
|
||||
if value != "" {
|
||||
err = json.Unmarshal([]byte(value), vs[i])
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue