|
|
@ -6,10 +6,11 @@ import ( |
|
|
"Knowledge_Test_Go/utility/response" |
|
|
"Knowledge_Test_Go/utility/response" |
|
|
"context" |
|
|
"context" |
|
|
"fmt" |
|
|
"fmt" |
|
|
"github.com/gogf/gf/v2/util/gconv" |
|
|
|
|
|
"regexp" |
|
|
"regexp" |
|
|
"strconv" |
|
|
"strconv" |
|
|
|
|
|
|
|
|
|
|
|
"github.com/gogf/gf/v2/util/gconv" |
|
|
|
|
|
|
|
|
"github.com/gogf/gf/v2/database/gdb" |
|
|
"github.com/gogf/gf/v2/database/gdb" |
|
|
"github.com/gogf/gf/v2/errors/gerror" |
|
|
"github.com/gogf/gf/v2/errors/gerror" |
|
|
"github.com/gogf/gf/v2/frame/g" |
|
|
"github.com/gogf/gf/v2/frame/g" |
|
|
@ -36,7 +37,7 @@ func (s *sQuestionBank) GetQuestions(ctx context.Context, req *v1.QuestionOutput |
|
|
// 添加查询条件
|
|
|
// 添加查询条件
|
|
|
if req.Stem != "" { |
|
|
if req.Stem != "" { |
|
|
// 对题干进行模糊查询
|
|
|
// 对题干进行模糊查询
|
|
|
db = db.Where("qb.stem LIKE ?", "%"+req.Stem+"%") |
|
|
|
|
|
|
|
|
db = db.WhereLike("qb.stem", "%"+req.Stem+"%") |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if req.QuestionTypeId != "" { |
|
|
if req.QuestionTypeId != "" { |
|
|
@ -60,20 +61,20 @@ func (s *sQuestionBank) GetQuestions(ctx context.Context, req *v1.QuestionOutput |
|
|
func (s *sQuestionBank) buildSortCondition(db *gdb.Model, req *v1.QuestionOutputReq) *gdb.Model { |
|
|
func (s *sQuestionBank) buildSortCondition(db *gdb.Model, req *v1.QuestionOutputReq) *gdb.Model { |
|
|
// 默认排序(按ID倒序)
|
|
|
// 默认排序(按ID倒序)
|
|
|
if req.SortField == "" { |
|
|
if req.SortField == "" { |
|
|
return db.OrderDesc("a.created_at") //! 尽量不要用id进行排序
|
|
|
|
|
|
|
|
|
return db.OrderDesc("qb.created_at") //! 尽量不要用id进行排序
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 根据排序字段构建排序条件
|
|
|
// 根据排序字段构建排序条件
|
|
|
switch req.SortField { |
|
|
switch req.SortField { |
|
|
case "error_count": |
|
|
case "error_count": |
|
|
return db.Order("a.error_count " + req.SortOrder) |
|
|
|
|
|
|
|
|
return db.Order("qb.error_count " + req.SortOrder) |
|
|
case "error_rate": |
|
|
case "error_rate": |
|
|
return db.Order("a.error_rate " + req.SortOrder) |
|
|
|
|
|
|
|
|
return db.Order("qb.error_rate " + req.SortOrder) |
|
|
case "id": |
|
|
case "id": |
|
|
return db.Order("a.id " + req.SortOrder) |
|
|
|
|
|
|
|
|
return db.Order("qb.id " + req.SortOrder) |
|
|
default: |
|
|
default: |
|
|
// 默认按ID倒序
|
|
|
// 默认按ID倒序
|
|
|
return db.OrderDesc("a.created_at") |
|
|
|
|
|
|
|
|
return db.OrderDesc("qb.created_at") |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@ -133,17 +134,17 @@ func (s *sQuestionBank) QuestionDel(ctx context.Context, req *v1.QuestionDelReq) |
|
|
|
|
|
|
|
|
// UserScoreOutput 获取用户成绩列表
|
|
|
// UserScoreOutput 获取用户成绩列表
|
|
|
func (s *sQuestionBank) UserScoreOutput(ctx context.Context, req *v1.UserScoreOutputReq) (res []*v1.UserScoreOutputRes, total int, err error) { |
|
|
func (s *sQuestionBank) UserScoreOutput(ctx context.Context, req *v1.UserScoreOutputReq) (res []*v1.UserScoreOutputRes, total int, err error) { |
|
|
db := g.Model("user a"). //! 别名尽量别用a, b, c之类的
|
|
|
|
|
|
RightJoin("total_score b", "a.jwcode = b.jwcode"). |
|
|
|
|
|
Fields("a.id", "a.user_name", "a.user_identity", "a.jwcode", "b.created_at", "b.score") |
|
|
|
|
|
|
|
|
db := g.Model("user u"). //! 别名尽量别用a, b, c之类的
|
|
|
|
|
|
RightJoin("total_score ts", "u.jwcode = ts.jwcode"). |
|
|
|
|
|
Fields("u.id", "u.user_name", "u.user_identity", "u.jwcode", "ts.created_at", "ts.score") |
|
|
|
|
|
|
|
|
// 添加查询条件
|
|
|
// 添加查询条件
|
|
|
if req.UserName != "" { |
|
|
if req.UserName != "" { |
|
|
db = db.Where("a.user_name LIKE ?", "%"+req.UserName+"%") |
|
|
|
|
|
|
|
|
db = db.WhereLike("u.user_name", "%"+req.UserName+"%") |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if req.UserIdentity != "" { |
|
|
if req.UserIdentity != "" { |
|
|
db = db.Where("a.user_identity = ?", req.UserIdentity) |
|
|
|
|
|
|
|
|
db = db.Where("u.user_identity = ?", req.UserIdentity) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 预编译正则:匹配8位数字(^表示开头,$表示结尾,\d{8}表示8位数字)
|
|
|
// 预编译正则:匹配8位数字(^表示开头,$表示结尾,\d{8}表示8位数字)
|
|
|
@ -155,30 +156,9 @@ func (s *sQuestionBank) UserScoreOutput(ctx context.Context, req *v1.UserScoreOu |
|
|
return nil, 0, fmt.Errorf("Jwcode必须是8位数字") |
|
|
return nil, 0, fmt.Errorf("Jwcode必须是8位数字") |
|
|
} |
|
|
} |
|
|
// 校验通过,添加查询条件
|
|
|
// 校验通过,添加查询条件
|
|
|
db = db.Where("a.jwcode = ?", req.Jwcode) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
//// 1. 定义时间格式(根据业务实际格式调整)
|
|
|
|
|
|
//const timeLayout = "2006-01-02 15:04:05"
|
|
|
|
|
|
//// 2. 解析开始时间和结束时间(校验格式)
|
|
|
|
|
|
//var startTime, endTime time.Time
|
|
|
|
|
|
//
|
|
|
|
|
|
//if req.StartTime != "" {
|
|
|
|
|
|
// if startTime, err = time.Parse(timeLayout, req.StartTime); err != nil {
|
|
|
|
|
|
// return nil, 0, fmt.Errorf("开始时间格式错误,需为 %s", timeLayout)
|
|
|
|
|
|
// }
|
|
|
|
|
|
//}
|
|
|
|
|
|
//if req.EndTime != "" {
|
|
|
|
|
|
// if endTime, err = time.Parse(timeLayout, req.EndTime); err != nil {
|
|
|
|
|
|
// return nil, 0, fmt.Errorf("结束时间格式错误,需为 %s", timeLayout)
|
|
|
|
|
|
// }
|
|
|
|
|
|
//}
|
|
|
|
|
|
//// 3. 校验结束时间不能早于开始时间(两者都存在时)
|
|
|
|
|
|
//if req.StartTime != "" && req.EndTime != "" {
|
|
|
|
|
|
// if endTime.Before(startTime) { // 用time.Before()判断时间顺序
|
|
|
|
|
|
// return nil, 0, fmt.Errorf("结束时间不能早于开始时间")
|
|
|
|
|
|
// }
|
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
db = db.Where("u.jwcode = ?", req.Jwcode) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
if req.StartTime != "" && req.EndTime != "" { |
|
|
if req.StartTime != "" && req.EndTime != "" { |
|
|
if req.StartTime > req.EndTime { |
|
|
if req.StartTime > req.EndTime { |
|
|
return nil, 0, fmt.Errorf("结束时间不能早于开始时间") |
|
|
return nil, 0, fmt.Errorf("结束时间不能早于开始时间") |
|
|
@ -186,11 +166,11 @@ func (s *sQuestionBank) UserScoreOutput(ctx context.Context, req *v1.UserScoreOu |
|
|
} |
|
|
} |
|
|
// 4.时间范围查询
|
|
|
// 4.时间范围查询
|
|
|
if req.StartTime != "" && req.EndTime != "" { |
|
|
if req.StartTime != "" && req.EndTime != "" { |
|
|
db = db.Where("b.created_at BETWEEN ? AND ?", req.StartTime, req.EndTime) |
|
|
|
|
|
|
|
|
db = db.Where("ts.created_at BETWEEN ? AND ?", req.StartTime, req.EndTime) |
|
|
} else if req.StartTime != "" { |
|
|
} else if req.StartTime != "" { |
|
|
db = db.Where("b.created_at >= ?", req.StartTime) |
|
|
|
|
|
|
|
|
db = db.WhereGTE("ts.created_at", req.StartTime) |
|
|
} else if req.EndTime != "" { |
|
|
} else if req.EndTime != "" { |
|
|
db = db.Where("b.created_at <= ?", req.EndTime) |
|
|
|
|
|
|
|
|
db = db.WhereLTE("ts.created_at ", req.EndTime) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 添加排序逻辑
|
|
|
// 添加排序逻辑
|
|
|
@ -204,7 +184,7 @@ func (s *sQuestionBank) UserScoreOutput(ctx context.Context, req *v1.UserScoreOu |
|
|
func (s *sQuestionBank) buildUserScoreSortCondition(db *gdb.Model, req *v1.UserScoreOutputReq) *gdb.Model { |
|
|
func (s *sQuestionBank) buildUserScoreSortCondition(db *gdb.Model, req *v1.UserScoreOutputReq) *gdb.Model { |
|
|
// 默认排序(按创建时间倒序)
|
|
|
// 默认排序(按创建时间倒序)
|
|
|
if req.SortField == "" { |
|
|
if req.SortField == "" { |
|
|
return db.OrderDesc("b.created_at") |
|
|
|
|
|
|
|
|
return db.OrderDesc("ts.created_at") |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 确定排序方向
|
|
|
// 确定排序方向
|
|
|
@ -216,12 +196,12 @@ func (s *sQuestionBank) buildUserScoreSortCondition(db *gdb.Model, req *v1.UserS |
|
|
// 根据排序字段构建排序条件
|
|
|
// 根据排序字段构建排序条件
|
|
|
switch req.SortField { |
|
|
switch req.SortField { |
|
|
case "score": |
|
|
case "score": |
|
|
return db.Order("b.score " + order) |
|
|
|
|
|
|
|
|
return db.Order("ts.score " + order) |
|
|
case "created_at": |
|
|
case "created_at": |
|
|
return db.Order("b.created_at " + order) |
|
|
|
|
|
|
|
|
return db.Order("ts.created_at " + order) |
|
|
default: |
|
|
default: |
|
|
// 默认按创建时间倒序
|
|
|
// 默认按创建时间倒序
|
|
|
return db.OrderDesc("b.created_at") |
|
|
|
|
|
|
|
|
return db.OrderDesc("ts.created_at") |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|