package svc import ( "applet/app/md" "applet/app/utils" md2 "code.fnuoos.com/EggPlanet/egg_system_rules.git/md" es2 "code.fnuoos.com/EggPlanet/egg_system_rules.git/utils/es" "code.fnuoos.com/go_rely_warehouse/zyos_go_es.git/es" "context" "encoding/json" "errors" "github.com/olivere/elastic/v7" "time" ) func GetEggPointRecordBase(now time.Time, uid int64, page int, limit int) ([]md.EggPointRecordNode, string, int, error) { aliasName := md2.EggEnergyUserEggScoreEsAlias // 1. 判断当周分数是否生效 getLastWeek := true if now.Weekday() > time.Wednesday || (now.Weekday() > time.Wednesday && now.Hour() > 14) { getLastWeek = false } // 2. 计算有效周数数量 aliases, err := es.EsClient.Aliases(). Index(aliasName). // 指定别名 Do(context.Background()) if err != nil { return nil, "", 0, err } indexNum := len(aliases.Indices) if getLastWeek == true { // 如果当期未生效 有效周数 - 1 indexNum-- } if indexNum < 1 { return nil, "", 0, errors.New("no data") } // 3. 获取最老有效索引及年份周数 oldestIndex := aliasName + "_" + "999999" for key, _ := range aliases.Indices { if key < oldestIndex { oldestIndex = key } } oldestYearStr, oldestWeekStr := GetYearsAndWeekStr(oldestIndex) oldestYear := utils.StrToInt(oldestYearStr) oldestWeek := utils.StrToInt(oldestWeekStr) // 4. 获取当期有效蛋蛋分 nowIndex := md2.EggEnergyUserEggScoreEsAlias + "_" + es2.GetLatestEffectiveIndexFromAlias(now) boolQuery := elastic.NewBoolQuery() boolQuery.Filter(elastic.NewTermQuery("uid", uid)) searchResult, err := es.EsClient.Search(). Index(nowIndex). Query(boolQuery). Pretty(true). Do(context.Background()) if searchResult == nil { return nil, "", 0, errors.New("failed to get current egg score") } var results []md.UserEggFlowReqRespList if searchResult.Hits.TotalHits.Value != 0 { // 解析结果 for _, hit := range searchResult.Hits.Hits { var doc md.UserEggFlowReqRespList err = json.Unmarshal(hit.Source, &doc) if err != nil { return nil, "", 0, errors.New("failed to unmarshal") } results = append(results, doc) } } nowScore := utils.Float64ToStr(results[0].ScoreValue) indexes := make([]string, 0, limit) // 5. 构造分页索引列表 查询历史蛋蛋分 for i := 0; i < limit; i++ { var tempDays int if getLastWeek { tempDays = 7 * ((page-1)*limit + i + 1) } else { tempDays = 7 * ((page-1)*limit + i) } tempTime := now.AddDate(0, 0, -tempDays) tempYear, tempWeek := tempTime.ISOWeek() // 判断跳转到的时间是否大于最老索引时间 if tempYear == oldestYear { if tempWeek < oldestWeek { break } } else if tempYear < oldestYear { break } tempIndex := es2.GetAppointIndexFromAlias(utils.IntToStr(tempYear), utils.IntToStr(tempWeek)) indexes = append(indexes, tempIndex) } // 构建查询条件 recordBoolQuery := elastic.NewBoolQuery() recordBoolQuery.Filter(elastic.NewTermQuery("uid", uid)) searchRecordResult, err := es.EsClient.Search(). Index(indexes...). Query(boolQuery). Pretty(true). Do(context.Background()) if searchRecordResult == nil { return nil, "", 0, errors.New("failed to get egg score flows") } var recordResults []md.UserEggFlowReqRespList // 检查是否有结果 if searchRecordResult.Hits.TotalHits.Value != 0 { // 解析结果 for _, hit := range searchResult.Hits.Hits { var doc md.UserEggFlowReqRespList err = json.Unmarshal(hit.Source, &doc) if err != nil { return nil, "", 0, errors.New("failed to unmarshal") } recordResults = append(recordResults, doc) } } list := make([]md.EggPointRecordNode, len(results)) for i, result := range recordResults { year, week, startAt, endAt := GetWeekInfo(result.UpdatedAt) list[i].Score = utils.Float64ToStr(result.ScoreValue) list[i].Year = year list[i].Week = week list[i].StartAt = startAt list[i].EndAt = endAt } return list, nowScore, indexNum, nil }