You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
151 lines
4.2 KiB
151 lines
4.2 KiB
package dao |
|
|
|
import ( |
|
"context" |
|
"encoding/json" |
|
"fmt" |
|
"sort" |
|
"time" |
|
|
|
"go-common/app/admin/main/answer/model" |
|
"go-common/library/log" |
|
xtime "go-common/library/time" |
|
) |
|
|
|
// Page search page info |
|
type Page struct { |
|
Num int64 `json:"num"` |
|
Size int64 `json:"size"` |
|
Total int64 `json:"total"` |
|
} |
|
|
|
// SearchSubjectLog get subject logs |
|
type SearchSubjectLog struct { |
|
Page *Page |
|
Result []*struct { |
|
MID int64 `json:"mid"` |
|
Business string `json:"business"` |
|
Action string `json:"action"` |
|
ExtraData string `json:"extra_data"` |
|
Ctime string `json:"ctime"` |
|
} |
|
} |
|
|
|
// const . |
|
const ( |
|
answerLogID = 15 |
|
answerUpdate = "answer_update" |
|
|
|
basePass = "basePass" |
|
extraStartTime = "extraStartTime" |
|
extraCheck = "extraCheck" |
|
proQues = "proQues" |
|
proCheck = "proCheck" |
|
captcha = "captchaPass" |
|
level = "level" |
|
) |
|
|
|
// HistoryES search archives by es. |
|
func (d *Dao) HistoryES(c context.Context, arg *model.ArgHistory) (reply []*model.AnswerHistoryDB, err error) { |
|
var index []string |
|
for year := time.Now().Year(); year >= 2018; year-- { // 2018.12 开始接入日志 |
|
index = append(index, fmt.Sprintf("log_user_action_%d_%d", answerLogID, year)) |
|
} |
|
r := d.es.NewRequest("log_user_action").Index(index...) |
|
r.Fields("mid", "action", "ctime", "extra_data") |
|
r.WhereEq("mid", arg.Mid) |
|
r.Pn(arg.Pn).Ps(arg.Ps) |
|
res := &SearchSubjectLog{} |
|
if err = r.Scan(c, &res); err != nil || res == nil { |
|
log.Error("HistoryES:Scan params(%s) error(%v)", r.Params(), err) |
|
return |
|
} |
|
log.Error("HistoryES:%+v", res) |
|
mmh := make(map[int64]map[string]*model.AnswerHistory) |
|
for _, v := range res.Result { |
|
mh := make(map[string]*model.AnswerHistory) |
|
if err = json.Unmarshal([]byte(v.ExtraData), &mh); err != nil { |
|
log.Error("json.Unmarshal(%s) error(%v)", v.ExtraData, err) |
|
return |
|
} |
|
for k, v := range mh { |
|
if mmh[v.Hid] == nil { |
|
mmh[v.Hid] = make(map[string]*model.AnswerHistory) |
|
} |
|
mmh[v.Hid][k] = v |
|
} |
|
} |
|
data := make([]*model.AnswerHistory, 0) |
|
for _, v := range mmh { |
|
if v == nil { |
|
continue |
|
} |
|
h := new(model.AnswerHistory) |
|
if eh, ok := v[basePass]; ok && eh != nil { |
|
h = eh |
|
} |
|
if eh, ok := v[extraStartTime]; ok && eh != nil { |
|
h.StepExtraStartTime = eh.StepExtraStartTime |
|
h.Mtime = eh.Mtime |
|
} |
|
if eh, ok := v[extraCheck]; ok && eh != nil { |
|
h.StepExtraCompleteTime = eh.StepExtraCompleteTime |
|
h.Score = eh.Score |
|
h.StepExtraScore = eh.StepExtraScore |
|
h.Mtime = eh.Mtime |
|
} |
|
if eh, ok := v[proQues]; ok && eh != nil { |
|
h.StepTwoStartTime = eh.StepTwoStartTime |
|
h.Mtime = eh.Mtime |
|
} |
|
if eh, ok := v[proCheck]; ok && eh != nil { |
|
h.CompleteResult = eh.CompleteResult |
|
h.CompleteTime = eh.CompleteTime |
|
h.Score = eh.Score |
|
h.IsFirstPass = eh.IsFirstPass |
|
h.RankID = eh.RankID |
|
h.Mtime = eh.Mtime |
|
} |
|
if eh, ok := v[captcha]; ok && eh != nil { |
|
h.IsPassCaptcha = eh.IsPassCaptcha |
|
h.Mtime = eh.Mtime |
|
} |
|
if eh, ok := v[level]; ok && eh != nil { |
|
h.IsFirstPass = eh.IsFirstPass |
|
h.PassedLevel = eh.PassedLevel |
|
h.Mtime = eh.Mtime |
|
} |
|
data = append(data, h) |
|
} |
|
sort.Sort(model.Histories(data)) |
|
return convent(data), nil |
|
} |
|
|
|
func convent(src []*model.AnswerHistory) []*model.AnswerHistoryDB { |
|
res := make([]*model.AnswerHistoryDB, 0, len(src)) |
|
for _, s := range src { |
|
r := &model.AnswerHistoryDB{ |
|
ID: s.ID, |
|
Hid: s.Hid, |
|
Mid: s.Mid, |
|
StartTime: xtime.Time(s.StartTime.Unix()), |
|
StepOneErrTimes: s.StepOneErrTimes, |
|
StepOneCompleteTime: s.StepOneCompleteTime, |
|
StepExtraStartTime: xtime.Time(s.StepExtraStartTime.Unix()), |
|
StepExtraCompleteTime: s.StepExtraCompleteTime, |
|
StepExtraScore: s.StepExtraScore, |
|
StepTwoStartTime: xtime.Time(s.StepTwoStartTime.Unix()), |
|
CompleteTime: xtime.Time(s.CompleteTime.Unix()), |
|
CompleteResult: s.CompleteResult, |
|
Score: s.Score, |
|
IsFirstPass: s.IsFirstPass, |
|
IsPassCaptcha: s.IsPassCaptcha, |
|
PassedLevel: s.PassedLevel, |
|
RankID: s.RankID, |
|
Ctime: xtime.Time(s.Ctime.Unix()), |
|
Mtime: xtime.Time(s.Mtime.Unix()), |
|
} |
|
res = append(res, r) |
|
} |
|
return res |
|
}
|
|
|