浏览代码

wip:数据细化

wangshan 5 月之前
父节点
当前提交
a5268ae040
共有 4 个文件被更改,包括 122 次插入29 次删除
  1. 39 8
      marketanalysis/common.go
  2. 14 9
      marketanalysis/consts.go
  3. 50 12
      marketanalysis/marketanalysis.go
  4. 19 0
      marketanalysis/scalerefine.go

+ 39 - 8
marketanalysis/common.go

@@ -100,7 +100,11 @@ func WinningAnalysis(thisWinnerRow BuyerWinnerRow, rMap *sync.Map, entArrMap map
 			}*/
 			ss = append(ss, _dd)
 		}
-		_d.Data = ss
+		if len(ss) > Top3 {
+			_d.Data = ss[:Top3]
+		} else {
+			_d.Data = ss
+		}
 		countMap = append(countMap, _d)
 	}
 
@@ -143,7 +147,11 @@ func WinningAnalysis(thisWinnerRow BuyerWinnerRow, rMap *sync.Map, entArrMap map
 			}*/
 			ss = append(ss, _dd)
 		}
-		_d.Data = ss
+		if len(ss) > Top3 {
+			_d.Data = ss[:Top3]
+		} else {
+			_d.Data = ss
+		}
 		amountMap = append(amountMap, _d)
 	}
 	rMap.Store("winner_time_distribution", buyerMap)
@@ -279,7 +287,11 @@ func BuyerAnalysis(thisBuyerRow BuyerWinnerRow, rMap *sync.Map, winnerName map[s
 			}*/
 			ss = append(ss, _dd)
 		}
-		_d.Data = ss
+		if len(ss) > Top3 {
+			_d.Data = ss[:Top3]
+		} else {
+			_d.Data = ss
+		}
 		countMap = append(countMap, _d)
 	}
 
@@ -324,7 +336,11 @@ func BuyerAnalysis(thisBuyerRow BuyerWinnerRow, rMap *sync.Map, winnerName map[s
 
 			ss = append(ss, _dd)
 		}
-		_d.Data = ss
+		if len(ss) > Top3 {
+			_d.Data = ss[:Top3]
+		} else {
+			_d.Data = ss
+		}
 		amountMap = append(amountMap, _d)
 	}
 	rMap.Store("buyer_time_distribution", buyerMap)
@@ -333,7 +349,7 @@ func BuyerAnalysis(thisBuyerRow BuyerWinnerRow, rMap *sync.Map, winnerName map[s
 }
 
 // top3数量计算
-func CountCompute(thisRow AreaCTop, types string, eid map[string]string) (rData []map[string]interface{}) {
+func CountCompute(thisRow AreaCTop, types string, eid map[string]string, Offline bool) (rData []map[string]interface{}) {
 	if types == "area" {
 		area_infos := thisRow.AreaCountTop3
 		for _, v := range area_infos.Buckets {
@@ -358,10 +374,14 @@ func CountCompute(thisRow AreaCTop, types string, eid map[string]string) (rData
 				rW["winner_total"] = va.WinnerTotal
 				rWinner = append(rWinner, rW)
 			}
-			if len(rWinner) == 0 {
+			if !Offline && len(rWinner) == 0 {
 				continue
 			}
 			rM["winner"] = rWinner
+			//实时分析 取前三个
+			if len(rWinner) > Top3 && !Offline {
+				rM["winner"] = rWinner[:Top3]
+			}
 			if thisRow.Total != 0 {
 				vv := float64(v.Total) / float64(thisRow.Total)
 				rM["area_scale"] = vv
@@ -399,6 +419,10 @@ func CountCompute(thisRow AreaCTop, types string, eid map[string]string) (rData
 				continue
 			}
 			rM["winner"] = rWinner
+			//实时分析 取前三个
+			if len(rWinner) > Top3 && !Offline {
+				rM["winner"] = rWinner[:Top3]
+			}
 			if thisRow.Total != 0 {
 				vv := float64(v.Total) / float64(thisRow.Total)
 				rM["buyclass_scale"] = vv
@@ -413,7 +437,7 @@ func CountCompute(thisRow AreaCTop, types string, eid map[string]string) (rData
 }
 
 // top3金额计算
-func AmountCompute(thisRow AreaCTop, types string, eid map[string]string) (rData []map[string]interface{}) {
+func AmountCompute(thisRow AreaCTop, types string, eid map[string]string, Offline bool) (rData []map[string]interface{}) {
 	if types == "area" {
 		area_infos := thisRow.AreaAmountTop3
 		for _, v := range area_infos.Buckets {
@@ -440,6 +464,10 @@ func AmountCompute(thisRow AreaCTop, types string, eid map[string]string) (rData
 				rWinner = append(rWinner, rW)
 			}
 			rM["winner"] = rWinner
+			//实时分析 取前三个
+			if len(rWinner) > Top3 && !Offline {
+				rM["winner"] = rWinner[:Top3]
+			}
 			if thisRow.Amount.Value != 0 {
 				vv := v.AreaAmount.Amount / thisRow.Amount.Value
 				rM["area_scale"] = vv
@@ -474,13 +502,16 @@ func AmountCompute(thisRow AreaCTop, types string, eid map[string]string) (rData
 				rWinner = append(rWinner, rW)
 			}
 			rM["winner"] = rWinner
+			//实时分析 取前三个
+			if len(rWinner) > Top3 && !Offline {
+				rM["winner"] = rWinner[:Top3]
+			}
 			if thisRow.Amount.Value != 0 {
 				vv := v.AreaAmount.Amount / thisRow.Amount.Value
 				rM["buyclass_scale"] = vv
 			} else {
 				rM["buyclass_scale"] = 0
 			}
-
 			rData = append(rData, rM)
 		}
 	}

+ 14 - 9
marketanalysis/consts.go

@@ -18,23 +18,23 @@ const (
 	//采购单位聚合查询
 	buyerProcurementScale = `"buyer_amount_distribution": {"terms": {"field": "buyer","order": [{"amount": "desc"}],"size":100000},"aggs": {"amount": {"sum": {"field": "sortprice"}}}}`
 	//采购单位top3(价格)buyer_sortprice
-	buyerSortprice = `"buyer_amount_top3": {"terms": {"field": "buyer","order": [{"buyer_amount": "desc"}],"size": 30},"aggs": {"buyer_amount": {"sum": {"field": "sortprice"}},"s_winner_top": {"terms": {"field": "entidlist","exclude":["-"],"order": [{"buyer_winner_amount": "desc"}],"size": 3},"aggs": {"buyer_winner_amount": {"sum": {"field": "sortprice"}}}}}}`
+	buyerSortprice = `"buyer_amount_top3": {"terms": {"field": "buyer","order": [{"buyer_amount": "desc"}],"size": %d},"aggs": {"buyer_amount": {"sum": {"field": "sortprice"}},"s_winner_top": {"terms": {"field": "entidlist","exclude":["-"],"order": [{"buyer_winner_amount": "desc"}],"size": %d},"aggs": {"buyer_winner_amount": {"sum": {"field": "sortprice"}}}}}}`
 	//采购单位top3(数量)
-	buyerCount = `"buyer_count_top3": {"terms": {"field": "buyer","order": [{"buyer_count": "desc"}],"size": 30},"aggs": {"buyer_count": {"filter":{"match_all":{}}},"s_winner_top": {"terms": {"field": "entidlist","exclude":["-"],"order": [{"buyer_winner_count": "desc"}],"size": 3},"aggs": { "buyer_winner_count": {"filter":{"match_all":{}}}}}}}`
+	buyerCount = `"buyer_count_top3": {"terms": {"field": "buyer","order": [{"buyer_count": "desc"}],"size": %d},"aggs": {"buyer_count": {"filter":{"match_all":{}}},"s_winner_top": {"terms": {"field": "entidlist","exclude":["-"],"order": [{"buyer_winner_count": "desc"}],"size": %d},"aggs": { "buyer_winner_count": {"filter":{"match_all":{}}}}}}}`
 	//中标单位
 	winnerProcurementScale = `"winner_amount_distribution": {"filter": {"script": {"script": "doc['entidlist'].length == 1"}},"aggs": {"entidlist_terms": {"terms": {"field": "entidlist","order": {"amount": "desc"},"size": 100000},"aggs": {"amount": {"sum": {"field": "sortprice"}}}}}}`
 	//中标单位top3(价格)
-	winnerSortprice = `"winner_amount_top3": {"terms": {"field": "entidlist","exclude":["-"],"order": [{"s_winner_amount": "desc"}],"size": 30},"aggs": {"s_winner_amount": {"sum": {"field": "sortprice"}},"buyer_top": {"terms": {"field": "buyer","order": [{"buyer_winner_amount": "desc"}],"size": 3},"aggs": {"buyer_winner_amount": {"sum": {"field": "sortprice"}}}}}}`
+	winnerSortprice = `"winner_amount_top3": {"terms": {"field": "entidlist","exclude":["-"],"order": [{"s_winner_amount": "desc"}],"size": %d},"aggs": {"s_winner_amount": {"sum": {"field": "sortprice"}},"buyer_top": {"terms": {"field": "buyer","order": [{"buyer_winner_amount": "desc"}],"size": %d},"aggs": {"buyer_winner_amount": {"sum": {"field": "sortprice"}}}}}}`
 	//中标单位(数量)
-	winnerCount              = `"winner_count_top3": {"terms": {"field": "entidlist","exclude":["-"],"order": [{"s_winner_count": "desc"}],"size": 30},"aggs": {"s_winner_count": {"filter":{"match_all":{}}},"buyer_top": {"terms": {"field": "buyer","order": [{"buyer_winner_count": "desc"}],"size": 3},"aggs": {"buyer_winner_count": {"filter":{"match_all":{}}}}}}}`
+	winnerCount              = `"winner_count_top3": {"terms": {"field": "entidlist","exclude":["-"],"order": [{"s_winner_count": "desc"}],"size": %d},"aggs": {"s_winner_count": {"filter":{"match_all":{}}},"buyer_top": {"terms": {"field": "buyer","order": [{"buyer_winner_count": "desc"}],"size": %d},"aggs": {"buyer_winner_count": {"filter":{"match_all":{}}}}}}}`
 	queryAggsSortprice       = `"sortprice_ranges": {"range":{"field":"sortprice","ranges":[%s]},"aggs":{"sum_sortprice":{"sum":{"field":"sortprice"}}}}`
 	aggsArea                 = `"area_distribution": {"terms": {"field": "area","size": 40},"aggs": {"area_amount": {"sum": {"field": "sortprice"}},"area_total": {"filter": {"match_all":{}}},"city_group": {"terms": {"field": "city","size": 40},"aggs": {"city_amount": {"sum": {"field": "sortprice"}}}}}}`
 	queryTop10               = `,"sort": [{"sortprice": "desc"}],"from": 0,"size": 10`
-	aggsAreaAmounttop3       = `"area_amount_top3":{"terms":{"field":"area","exclude":["全国"],"order":[{"area_amount":"desc"}],"size":34},"aggs":{"area_amount":{"sum":{"field":"sortprice"}},"winner_top":{"terms":{"field":"entidlist","exclude": ["-"],"order":[{"area_winner_amount":"desc"}],"size":3},"aggs":{"area_winner_amount":{"sum":{"field":"sortprice"}}}}}}`
-	aggsAreaCounttop3        = `"area_count_top3":{"terms":{"field":"area","exclude":["全国"],"order":[{"area_count":"desc"}],"size":40},"aggs":{"area_count":{"filter":{"match_all":{}}},"winner_top":{"terms":{"field":"entidlist","exclude": ["-"],"order":[{"area_winner_count":"desc"}],"size":3},"aggs":{"area_winner_count":{"filter":{"match_all":{}}}}}}}`
+	aggsAreaAmounttop3       = `"area_amount_top3":{"terms":{"field":"area","exclude":["全国"],"order":[{"area_amount":"desc"}],"size":34},"aggs":{"area_amount":{"sum":{"field":"sortprice"}},"winner_top":{"terms":{"field":"entidlist","exclude": ["-"],"order":[{"area_winner_amount":"desc"}],"size":%d},"aggs":{"area_winner_amount":{"sum":{"field":"sortprice"}}}}}}`
+	aggsAreaCounttop3        = `"area_count_top3":{"terms":{"field":"area","exclude":["全国"],"order":[{"area_count":"desc"}],"size":40},"aggs":{"area_count":{"filter":{"match_all":{}}},"winner_top":{"terms":{"field":"entidlist","exclude": ["-"],"order":[{"area_winner_count":"desc"}],"size":%d},"aggs":{"area_winner_count":{"filter":{"match_all":{}}}}}}}`
 	aggsBuyerclass           = `"buyerclass_scale":{"terms":{"field":"buyerclass","size":2000,"exclude":["其它",""]},"aggs":{"buyerclass_amount":{"sum":{"field":"sortprice"}},"buyerclass_total":{"filter":{"match_all":{}}}}}`
-	aggsBuyerclassCounttop3  = `"buyerclass_count_top3":{"terms":{"field":"buyerclass","exclude":["其它",""],"order":[{"buyerclass_count":"desc"}],"size":70},"aggs":{"buyerclass_count":{"filter":{"match_all":{}}},"bidcount_top":{"terms":{"field":"entidlist","exclude": ["-"],"order":[{"buyer_winner_count":"desc"}],"size":3},"aggs":{"buyer_winner_count":{"filter":{"match_all":{}}}}}}}`
-	aggsBuyerclassAmounttop3 = `"buyerclass_amount_top3":{"terms":{"field":"buyerclass","exclude":["其它",""],"order":[{"buyerclass_amount":"desc"}],"size":70},"aggs":{"buyerclass_amount":{"sum":{"field":"sortprice"}},"winner_top":{"terms":{"field":"entidlist","exclude": ["-"],"order":[{"buyer_winner_amount":"desc"}],"size":3},"aggs":{"buyer_winner_amount":{"sum":{"field":"sortprice"}}}}}}`
+	aggsBuyerclassCounttop3  = `"buyerclass_count_top3":{"terms":{"field":"buyerclass","exclude":["其它",""],"order":[{"buyerclass_count":"desc"}],"size":70},"aggs":{"buyerclass_count":{"filter":{"match_all":{}}},"bidcount_top":{"terms":{"field":"entidlist","exclude": ["-"],"order":[{"buyer_winner_count":"desc"}],"size":%d},"aggs":{"buyer_winner_count":{"filter":{"match_all":{}}}}}}}`
+	aggsBuyerclassAmounttop3 = `"buyerclass_amount_top3":{"terms":{"field":"buyerclass","exclude":["其它",""],"order":[{"buyerclass_amount":"desc"}],"size":70},"aggs":{"buyerclass_amount":{"sum":{"field":"sortprice"}},"winner_top":{"terms":{"field":"entidlist","exclude": ["-"],"order":[{"buyer_winner_amount":"desc"}],"size":%d},"aggs":{"buyer_winner_amount":{"sum":{"field":"sortprice"}}}}}}`
 	sortpriceStr             = `{"key":"<10万","from":0.0000000000001,"to":100000},{"key":"10万-50万","from":100000,"to":500000},{"key":"50万-100万","from":500000,"to":1000000},{"key":"100万-500万","from":1000000,"to":5000000},{"key":"500万-1000万","from":5000000,"to":10000000},{"key":"1000万-1亿","from":10000000,"to":100000000},{"key":"≥1亿","from":100000000}`
 	aggsAllCM                = `"project_count": {"filter": {"match_all":{}}},"project_count_not0": {"filter": {"range": {"sortprice": {"gt": 0}}}},"project_amount": {"sum": {"field": "sortprice"}}`
 
@@ -60,7 +60,12 @@ const (
 	ValueOffline              = 1                             // 离线
 	ValueRealTime             = 2                             // 实时
 	TablejianyuMarUserAccount = "jianyu.mar_user_account"     // 离线市场报告分析关键词标准信息表
-
+	Top3                      = 3
+	Top5                      = 5
+	Top10                     = 10
+	Top20                     = 20
+	Top30                     = 30
+	Top1000                   = 1000
 )
 
 var (

+ 50 - 12
marketanalysis/marketanalysis.go

@@ -29,9 +29,10 @@ var (
 	PtType            = "projectset"
 	FieldsDetail      = `"purchasing","projectname.pname"`
 	Fields            = `"projectname.pname"`
+	BWCount           = Top1000
 )
 
-func MAInit(limit, timeOut, projectNumLimit, keyWordsCount, pCount, minKCount, maxPCount int, ptIndex, ptType string, fields []string) {
+func MAInit(limit, timeOut, projectNumLimit, keyWordsCount, pCount, minKCount, maxPCount, bwc int, ptIndex, ptType string, fields []string) {
 	if limit == 0 {
 		limit = 5
 	}
@@ -72,6 +73,10 @@ func MAInit(limit, timeOut, projectNumLimit, keyWordsCount, pCount, minKCount, m
 		Fields = fmt.Sprintf(`"%s"`, fields[0])
 		FieldsDetail = fmt.Sprintf(`"%s"`, strings.Join(fields, `","`))
 	}
+	//
+	if bwc > 0 {
+		BWCount = bwc
+	}
 }
 
 // AnalysisRequestParam 接口原请求参数
@@ -1261,11 +1266,23 @@ func (a *AnalysisEntity) AllData() (rMap map[string]interface{}, err error) {
 	buyclass := a.FormatParam.BuyerClass
 	aggs = append(aggs, aggsAllCM, fmt.Sprintf(queryAggsSortprice, sortpriceStr), aggsArea)
 	if (len(area) + len(city)) != 1 {
-		aggs = append(aggs, aggsAreaAmounttop3, aggsAreaCounttop3)
+		aaat3 := fmt.Sprintf(aggsAreaAmounttop3, Top30)
+		aact3 := fmt.Sprintf(aggsAreaCounttop3, Top30)
+		if a.Offline == ValueOffline {
+			aaat3 = fmt.Sprintf(aggsAreaAmounttop3, Top30)
+			aact3 = fmt.Sprintf(aggsAreaCounttop3, Top30)
+		}
+		aggs = append(aggs, aaat3, aact3)
 	}
 	if len(buyclass) != 1 {
+		abat3 := fmt.Sprintf(aggsBuyerclassAmounttop3, Top30)
+		abct3 := fmt.Sprintf(aggsBuyerclassCounttop3, Top30)
+		if a.Offline == ValueOffline {
+			abat3 = fmt.Sprintf(aggsBuyerclassAmounttop3, Top30)
+			abct3 = fmt.Sprintf(aggsBuyerclassCounttop3, Top30)
+		}
 		//aggs = append(aggs, aggs_buyerclass, aggs_buyerclass_other, aggs_buyerclass_amounttop3, aggs_buyerclass_counttop3)
-		aggs = append(aggs, aggsBuyerclass, aggsBuyerclassAmounttop3, aggsBuyerclassCounttop3)
+		aggs = append(aggs, aggsBuyerclass, abat3, abct3)
 	}
 	finalSql := fmt.Sprintf(a.GetCommonQuerySqlWithAggs(), strings.Join(aggs, ","))
 	log.Println("allData sql:", finalSql)
@@ -1356,11 +1373,13 @@ func (a *AnalysisEntity) AllData() (rMap map[string]interface{}, err error) {
 	rMap["area_infos"] = area_data
 	rMap["customer_scale"] = customerData
 	rMap["customer_scale_other"] = customerOther //客户分布(其它)
-	rMap["scaleAreaAmountTop"] = AmountCompute(thisRow, "area", eid)
-	rMap["scaleBuyclassAmountTop"] = AmountCompute(thisRow, "buyclass", eid)
-	rMap["scaleAreaCountTop"] = CountCompute(thisRow, "area", eid)
-	rMap["scaleBuyclassCountTop"] = CountCompute(thisRow, "buyclass", eid)
-	rMap["count_not_0"] = thisRow.CountNot0.Count
+	rMap["scaleAreaAmountTop"] = AmountCompute(thisRow, "area", eid, a.Offline == ValueOffline)
+	rMap["scaleBuyclassAmountTop"] = AmountCompute(thisRow, "buyclass", eid, a.Offline == ValueOffline)
+	rMap["scaleAreaCountTop"] = CountCompute(thisRow, "area", eid, a.Offline == ValueOffline)
+	rMap["scaleBuyclassCountTop"] = CountCompute(thisRow, "buyclass", eid, a.Offline == ValueOffline)
+	if a.Offline == ValueOffline {
+		rMap["count_not_0"] = thisRow.CountNot0.Count
+	}
 	return
 }
 
@@ -1380,7 +1399,14 @@ func (a *AnalysisEntity) MarketScaleRefineQuery() (rMap map[string]interface{},
 			}
 		}
 		if len(bools) > 0 {
-			aggsGroup = append(aggsGroup, fmt.Sprintf(`"%s":{"filter":{"bool":{"should":[%s],"minimum_should_match": 1}},"aggs":{"project_count":{"filter":{"match_all":{}}},"project_amount":{"sum":{"field":"sortprice"}},"winner_total_top":{"terms":{"field":"entidlist","exclude":["-"],"order":[{"refine_winner_total":"desc"}],"size":%d},"aggs":{"refine_winner_total":{"filter":{"match_all":{}}}}},"winner_amount_top":{"terms":{"field":"entidlist","exclude":["-"],"order":[{"refine_winner_amount":"desc"}],"size":%d},"aggs":{"refine_winner_amount":{"sum":{"field":"sortprice"}}}}}}`, group.ItemName, strings.Join(bools, ","), topWinnerLimit, topWinnerLimit))
+			//临时调整 进行数据验证 Top3
+			rwt := Top30
+			rwa := Top30
+			if a.Offline == ValueOffline { //离线
+				rwt = Top30
+				rwa = Top30
+			}
+			aggsGroup = append(aggsGroup, fmt.Sprintf(`"%s":{"filter":{"bool":{"should":[%s],"minimum_should_match": 1}},"aggs":{"project_count":{"filter":{"match_all":{}}},"project_amount":{"sum":{"field":"sortprice"}},"winner_total_top":{"terms":{"field":"entidlist","exclude":["-"],"order":[{"refine_winner_total":"desc"}],"size":%d},"aggs":{"refine_winner_total":{"filter":{"match_all":{}}}}},"winner_amount_top":{"terms":{"field":"entidlist","exclude":["-"],"order":[{"refine_winner_amount":"desc"}],"size":%d},"aggs":{"refine_winner_amount":{"sum":{"field":"sortprice"}}}}}}`, group.ItemName, strings.Join(bools, ","), rwt, rwa))
 		}
 		itemDataMap[group.ItemName] = group.UpdateTime
 	}
@@ -1391,7 +1417,7 @@ func (a *AnalysisEntity) MarketScaleRefineQuery() (rMap map[string]interface{},
 	if res == nil || len(res) == 0 {
 		return
 	}
-	scale := scaleRefineData{IdSwitch: map[string]string{}}
+	scale := scaleRefineData{IdSwitch: map[string]string{}, IsOffline: a.Offline == ValueOffline}
 	for name, object := range res {
 		bArr, err := object.MarshalJSON()
 		if len(bArr) == 0 || err != nil {
@@ -1434,12 +1460,24 @@ func (a *AnalysisEntity) BuyerWinnerAnalysis() map[string]interface{} {
 	//buyer_scalefmt := fmt.Sprintf(buyer_procurement_scale, sortprice_str)
 
 	//采购单位-项目数量 采购单位-项目金额
-	datas = append(datas, buyerProcurementScale, buyerCount, buyerSortprice)
+	bc := fmt.Sprintf(buyerCount, Top30, Top30)
+	bs := fmt.Sprintf(buyerSortprice, Top30, Top30)
+	if a.Offline == ValueOffline {
+		bc = fmt.Sprintf(buyerCount, BWCount, Top30)
+		bs = fmt.Sprintf(buyerSortprice, BWCount, Top30)
+	}
+	datas = append(datas, buyerProcurementScale, bc, bs)
 	//中标单位-规模分布
 	//winner_scalefmt := fmt.Sprintf(winner_procurement_scale, sortprice_str)
 
 	//中标单位-项目数量 中标单位-项目金额
-	datas = append(datas, winnerProcurementScale, winnerCount, winnerSortprice)
+	wc := fmt.Sprintf(winnerCount, Top30, Top30)
+	ws := fmt.Sprintf(winnerSortprice, Top30, Top30)
+	if a.Offline == ValueOffline {
+		bc = fmt.Sprintf(winnerCount, BWCount, Top30)
+		bs = fmt.Sprintf(winnerSortprice, BWCount, Top30)
+	}
+	datas = append(datas, winnerProcurementScale, wc, ws)
 	finalSql := fmt.Sprintf(a.GetCommonQuerySqlWithAggs(), strings.Join(datas, ","))
 	log.Printf("final PurchasingAnalysiseQuery sql: %s", finalSql)
 	t := time.Now()

+ 19 - 0
marketanalysis/scalerefine.go

@@ -21,6 +21,7 @@ type scaleRefineData struct {
 		Overall             []map[string]interface{}
 		TotalTop, AmountTop []*returnItem
 	}
+	IsOffline bool
 }
 
 type simpleTotal struct {
@@ -83,16 +84,34 @@ func (srd *scaleRefineData) doIdSwitch() {
 	}
 	srd.IdSwitch = GetEntNameByIds(ids)
 	for _, v := range srd.ReturnData.TotalTop {
+		var ents []*entValue
 		for _, vv := range v.TopList {
+			if !srd.IsOffline && len(ents) > Top3 {
+				break
+			}
 			vv.Name, _ = srd.IdSwitch[vv.Id]
+			if vv.Name == "" {
+				continue
+			}
 			vv.Id = encodeId(vv.Id)
+			ents = append(ents, vv)
 		}
+		v.TopList = ents
 	}
 	for _, v := range srd.ReturnData.AmountTop {
+		var ents []*entValue
 		for _, vv := range v.TopList {
+			if !srd.IsOffline && len(ents) > Top3 {
+				break
+			}
 			vv.Name, _ = srd.IdSwitch[vv.Id]
+			if vv.Name == "" {
+				continue
+			}
 			vv.Id = encodeId(vv.Id)
+			ents = append(ents, vv)
 		}
+		v.TopList = ents
 	}
 }