Explorar el Código

fix:项目规模占比

xuemingyang hace 3 años
padre
commit
41ae353d29

+ 120 - 2
src/jfw/modules/bigmember/src/entity/marketAnalysis/customized_analysis.go

@@ -1,23 +1,30 @@
 package marketAnalysis
 
 import (
+	"encoding/json"
 	"fmt"
+	elastic1 "gopkg.in/olivere/elastic.v1"
+	"log"
+	"qfw/util"
+	"qfw/util/elastic"
+	"runtime"
 	"strings"
 )
 
 const (
 	query_aggs_sortprice       = `"sortprice_ranges": {"range":{"field":"sortprice","ranges":[%s]},"aggs":{"sum_sortprice":{"sum":{"field":"sortprice"}}}}`
 	aggs_area                  = `"area_distribution": {"terms": {"field": "area","size": %d},"aggs": {"area_amount": {"sum": {"field": "sortprice"}},"area_total": {"filter": {}}}}`
-	query_top10                = `"sort": [{"sortprice": "desc"}],"size": 10"sort": [{"sortprice": "desc"}],"from": 0,"size": 10`
+	query_top10                = `"sort": [{"sortprice": "desc"}],"from": 0,"size": 10`
 	aggs_area_amounttop3       = `"area_amount_top3":{"terms":{"field":"area","order":[{"area_amount":"desc"}],"size":3},"aggs":{"area_amount":{"sum":{"field":"sortprice"}},"winner_top":{"terms":{"field":"s_winner","order":[{"area_winner_amount":"desc"}],"size":3},"aggs":{"area_winner_amount":{"sum":{"field":"sortprice"}}}}}}`
 	aggs_area_counttop3        = `"area_count_top3":{"terms":{"field":"area","order":[{"area_count":"desc"}],"size":3},"aggs":{"area_count":{"filter":{}},"winner_top":{"terms":{"field":"s_winner","order":[{"area_winner_count":"desc"}],"size":3},"aggs":{"area_winner_count":{"filter":{}}}}}}`
 	aggs_buyerclass            = `"buyerclass_scale":{"terms":{"field":"buyerclass"},"aggs":{"buyerclass_amount":{"sum":{"field":"sortprice"}},"buyerclass_total":{"filter":{}}}}`
 	aggs_buyerclass_counttop3  = `"buyerclass_count_top3":{"terms":{"field":"buyerclass","order":[{"buyerclass_count":"desc"}],"size":3},"aggs":{"buyerclass_count":{"filter":{}},"bidcount_top":{"terms":{"field":"s_winner","order":[{"buyer_winner_count":"desc"}],"size":3},"aggs":{"buyer_winner_count":{"filter":{}}}}}}`
 	aggs_buyerclass_amounttop3 = `"buyerclass_amount_top3":{"terms":{"field":"buyerclass","order":[{"buyerclass_amount":"desc"}],"size":3},"aggs":{"buyerclass_amount":{"sum":{"field":"sortprice"}},"winner_top":{"terms":{"field":"s_winner","order":[{"buyer_winner_amount":"desc"}],"size":3},"aggs":{"buyer_winner_amount":{"sum":{"field":"sortprice"}}}}}}`
 	sortprice_str              = `{"key":"<10万","from":1,"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}`
+	aggs_all_c_m               = `"project_count": {"filter": {}},"project_amount": {"sum": {"field": "sortprice"}}`
 )
 
-func ProjectSize(buyerclass, area string) (qstr, top10 string) {
+func ProjectSize1(buyerclass, area string) (qstr, top10 string) {
 	var aggs_str []string
 	buyers := strings.Split(buyerclass, ",")
 	areas := strings.Split(area, ",")
@@ -41,6 +48,117 @@ func ProjectSize(buyerclass, area string) (qstr, top10 string) {
 	return
 }
 
+//项目规模分布
+func (mae *MarketAnalysisEntity) ProjectScale() (rMap map[string]interface{}, err error) {
+	aggs_sortprice := aggs_all_c_m + "," + fmt.Sprintf(query_aggs_sortprice, sortprice_str)
+	finalSql := fmt.Sprintf(mae.GetCommonQuerySqlWithAggs(), aggs_sortprice)
+
+	rMap = map[string]interface{}{}
+	res, docCount, _ := GetAggs("projectset", "projectset", finalSql)
+	log.Println("xxxx", docCount, res)
+	if res == nil || len(res) == 0 {
+		return
+	}
+	type scaleRefineRow struct {
+		Total   int64   `json:"doc_count"`
+		Value   float64 `json:"value"`
+		Buckets []struct {
+			Name         string `json:"key"`
+			Total        int64  `json:"doc_count"`
+			SumSortprice struct {
+				Value float64 `json:"value"`
+			} `json:"sum_sortprice"`
+		}
+	}
+	thisRow := scaleRefineRow{}
+	for _, object := range res {
+		fmt.Println("obj", object)
+		bArr, err := object.MarshalJSON()
+		if len(bArr) == 0 || err != nil {
+			continue
+		}
+		if json.Unmarshal(bArr, &thisRow) != nil {
+			continue
+		}
+		fmt.Println("tt", thisRow)
+	}
+	ammount := thisRow.Value
+	total := thisRow.Total
+	buckets := thisRow.Buckets
+	type Scale struct {
+		Name      string
+		Persent_c float64
+		Persent_a float64
+	}
+	var data []interface{}
+	for _, v := range buckets {
+		name := v.Name
+		percent_c := Formula(float64(v.Total), float64(total))
+		percent_a := Formula(v.SumSortprice.Value, ammount)
+		sc := Scale{
+			Name:      name,
+			Persent_c: percent_c,
+			Persent_a: percent_a,
+		}
+		data = append(data, sc)
+	}
+	rMap["projectScale"] = data
+	return
+}
+
+//top10
+func (mae *MarketAnalysisEntity) ProjectTop10() (rMap map[string]interface{}, err error) {
+	var hArr []string
+	finalSql := fmt.Sprintf(mae.GetCommonQuerySql(), query_top10)
+	_, _, hits := GetAggs("projectset", "projectset", finalSql)
+	rMap = map[string]interface{}{}
+	if len(hits) == 0 {
+		return rMap, fmt.Errorf("无数据")
+	}
+	for _, v := range hits {
+		hit := string(*v.Source)
+		hArr = append(hArr, hit)
+	}
+	rMap["ProjectTop10"] = hArr
+	return
+}
+
+//GetAggs 聚合查询
+func GetAggs(index, itype, query string) (aggs elastic1.Aggregations, count int64, hits []*elastic1.SearchHit) {
+	defer util.Catch()
+	client := elastic.GetEsConn()
+	defer func() {
+		go elastic.DestoryEsConn(client)
+	}()
+	if client != nil {
+		defer func() {
+			if r := recover(); r != nil {
+				log.Println("[E]", r)
+				for skip := 1; ; skip++ {
+					_, file, line, ok := runtime.Caller(skip)
+					if !ok {
+						break
+					}
+					go log.Printf("%v,%v\n", file, line)
+				}
+			}
+		}()
+		searchResult, err := client.Search().Index(index).Type(itype).Source(query).Do()
+		if err != nil {
+			log.Println("从ES查询出错", err.Error())
+		}
+		//fmt.Println("+++++",string(*searchResult.Hits.Hits[1].Source))
+		if len(searchResult.Hits.Hits) == 0 {
+			hits = []*elastic1.SearchHit{}
+		} else {
+			hits = searchResult.Hits.Hits
+		}
+		count = searchResult.Hits.TotalHits
+		aggs = searchResult.Aggregations
+	}
+	return
+}
+
 //项目规模分布占比
 func PorjectPercent(amount_s, count_s []float64, amount, count float64) (percent_amount, percent_count []float64) {
 	//项目总金额占比