|
@@ -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) {
|
|
|
//项目总金额占比
|