|
@@ -2,24 +2,39 @@ package entity
|
|
|
|
|
|
//中标单位画像查询
|
|
|
import (
|
|
|
+ "config"
|
|
|
"encoding/json"
|
|
|
"fmt"
|
|
|
"log"
|
|
|
qutil "qfw/util"
|
|
|
"qfw/util/elastic"
|
|
|
"strings"
|
|
|
+ "time"
|
|
|
)
|
|
|
|
|
|
var (
|
|
|
- winner_query_top = `{"query":{"filtered":{"filter":{"bool":{"must":[{"term":{"s_winner":"%s"}},{"range":{"firsttime":{"gte":1451577600}}}],"must_not":[{"term":{"bidstatus":"废标"}}]}}}},"size":10,"_source":["firsttime","bidstatus","area","list.infoid","list.title","list.subtype","projectname"],"sort":[{"bidamount":"desc"}]}`
|
|
|
- winner_query_other = `{"query":{"filtered":{"filter":{"bool":{"must":[{"term":{"s_winner":"%s"}},{"range":{"firsttime":{"gte":1451577600}}}]}}}},"aggs":{"area_count":{"cardinality":{"field":"area"}},"buyer_count":{"cardinality":{"field":"buyer"}},"bidamount_count":{"sum":{"field":"bidamount"}},"year_ranges":{"range":{"field":"firsttime","ranges":[{"key":"2016","from":1451577600,"to":1483200000},{"key":"2017","from":1483200000,"to":1514736000},{"key":"2018","from":1514736000,"to":1546272000},{"key":"2019","from":1546272000,"to":1577808000},{"key":"2020","from":1577808000,"to":1609430400}]},"aggs":{"count":{"sum":{"field":"bidamount"}},"avg_rate":{"filter":{"range":{"project_rate":{"gte":0}}},"aggs":{"p_avg":{"avg":{"field":"project_rate"}}}},"rate_range":{"range":{"field":"project_rate","ranges":[{"key":"5","from":0,"to":0.05},{"key":"10","from":0.05,"to":0.1},{"key":"30","from":0.1,"to":0.3},{"key":"50","from":0.3,"to":0.5},{"key":"100","from":0.5,"to":1.1}]}}}},"group_area":{"terms":{"field":"area","size":40}},"group_topscopeclass":{"terms":{"field":"topscopeclass","size":1}},"group_buyer":{"terms":{"field":"buyer","size":300,"order":{"_count":"desc"}}}},"size":0}`
|
|
|
- //winner_compare = `{"query":{"filtered":{"filter":{"bool":{"must":[{"terms":{"buyer":["%s"]}},{"term":{"topscopeclass":"%s"}},{"range":{"firsttime":{"gt":1451577600}}}]}}}},"aggs":{"group_by_buyerclass":{"terms":{"field":"buyerclass","size": 6},"aggs":{"g_winner":{"terms":{"field":"package1.winner","order":[{"count_b":"desc"}],"size":5},"aggs":{"count_b":{"sum":{"field":"package1.bidamount"}}}}}}},"size":0}`
|
|
|
- winner_compare = `{"query":{"filtered":{"filter":{"bool":{"must":[{"terms":{"buyer":["%s"]}},{%s},{"range":{"firsttime":{"gt":1451577600}}}]}}}},"aggs":{"group_by_buyerclass":{"terms":{"field":"buyerclass","size": 6},"aggs":{"g_winner":{"terms":{"field":"package1.winner","order":[{"count_b":"desc"}],"size":5},"aggs":{"count_b":{"sum":{"field":"package1.bidamount"}}}}}}},"size":0}`
|
|
|
+ winner_query_top = `{"query":{"filtered":{"filter":{"bool":{"must":[{"term":{"s_winner":"%s"}},{"range":{"firsttime":{"gte":%s}}}],"must_not":[{"term":{"bidstatus":"废标"}}]}}}},"size":10,"_source":["firsttime","bidstatus","area","list.infoid","list.title","list.subtype","projectname"],"sort":[{"bidamount":"desc"}]}`
|
|
|
+ winner_query_other = `{"query":{"filtered":{"filter":{"bool":{"must":[{"term":{"s_winner":"%s"}},{"range":{"firsttime":{"gte":%s}}}]}}}},"aggs":{"area_count":{"cardinality":{"field":"area"}},"buyer_count":{"cardinality":{"field":"buyer"}},"bidamount_count":{"sum":{"field":"bidamount"}},"year_ranges":{"range":{"field":"firsttime","ranges":[%s]},"aggs":{"count":{"sum":{"field":"bidamount"}},"avg_rate":{"filter":{"range":{"project_rate":{"gte":0}}},"aggs":{"p_avg":{"avg":{"field":"project_rate"}}}},"rate_range":{"range":{"field":"project_rate","ranges":[{"key":"5","from":0,"to":0.05},{"key":"10","from":0.05,"to":0.1},{"key":"30","from":0.1,"to":0.3},{"key":"50","from":0.3,"to":0.5},{"key":"100","from":0.5,"to":1.1}]}}}},"group_area":{"terms":{"field":"area","size":40}},"group_topscopeclass":{"terms":{"field":"topscopeclass","size":1}},"group_buyer":{"terms":{"field":"buyer","size":300,"order":{"_count":"desc"}}}},"size":0}`
|
|
|
+ winner_compare = `{"query":{"filtered":{"filter":{"bool":{"must":[{"terms":{"buyer":["%s"]}},{%s},{"range":{"firsttime":{"gt":%s}}}]}}}},"aggs":{"group_by_buyerclass":{"terms":{"field":"buyerclass","size": 6},"aggs":{"g_winner":{"terms":{"field":"package1.winner","order":[{"count_b":"desc"}],"size":5},"aggs":{"count_b":{"sum":{"field":"package1.bidamount"}}}}}}},"size":0}`
|
|
|
+ yearRange = `{"key":"2016","from":1451577600,"to":1483200000},{"key":"2017","from":1483200000,"to":1514736000},{"key":"2018","from":1514736000,"to":1546272000},{"key":"2019","from":1546272000,"to":1577808000},{"key":"2020","from":1577808000,"to":1609430400}`
|
|
|
)
|
|
|
|
|
|
+func init() {
|
|
|
+ start := config.Config.DataStarttime
|
|
|
+ startStamp := qutil.Int64All(start)
|
|
|
+ if startStamp > 0 {
|
|
|
+ newYearRange := ``
|
|
|
+ for i := 0; i < 5; i++ {
|
|
|
+ thisTime := time.Unix(startStamp, 0).AddDate(i, 0, 0)
|
|
|
+ newYearRange += fmt.Sprintf(`{"key":"%d","from":%d,"to":%d},`, thisTime.Year(), thisTime.Unix(), thisTime.AddDate(1, 0, 0).Unix())
|
|
|
+ }
|
|
|
+ yearRange = newYearRange[:len(newYearRange)-1]
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
//项目动态 招标金额最大的前10个项目
|
|
|
func GetWinnerTop10Project(entName string) []map[string]interface{} {
|
|
|
- topProject := elastic.Get("projectset", "projectset", fmt.Sprintf(winner_query_top, entName))
|
|
|
+ topProject := elastic.Get("projectset", "projectset", fmt.Sprintf(winner_query_top, entName, config.Config.DataStarttime))
|
|
|
if topProject == nil || len(*topProject) == 0 {
|
|
|
return nil
|
|
|
}
|
|
@@ -51,14 +66,14 @@ func GetWinnerTop10Project(entName string) []map[string]interface{} {
|
|
|
//项目画像图谱数据(年度项目统计、折扣率分布、主要分布市场、竞争关系图谱)
|
|
|
func GetWinnerPortrait(entName string, subscopeclass []string) (hx_data map[string]interface{}) {
|
|
|
defer qutil.Catch()
|
|
|
- log.Println("WinnerPortrait query", fmt.Sprintf(winner_query_other, entName))
|
|
|
- res, count := GetAggs("projectset", "projectset", fmt.Sprintf(winner_query_other, entName))
|
|
|
+ log.Println("WinnerPortrait query", fmt.Sprintf(winner_query_other, entName, config.Config.DataStarttime, yearRange))
|
|
|
+ res, count := GetAggs("projectset", "projectset", fmt.Sprintf(winner_query_other, entName, config.Config.DataStarttime, yearRange))
|
|
|
if res == nil {
|
|
|
return
|
|
|
}
|
|
|
//---year_ranges 年度统计、金额、折扣率
|
|
|
hx_data = make(map[string]interface{})
|
|
|
-
|
|
|
+ hx_data["startYear"] = config.Config.DataStarttime
|
|
|
//项目数量、中标总额、地区数量、客户数量
|
|
|
for _, dataType := range []string{"bidamount_count", "area_count", "buyer_count"} {
|
|
|
if b, err := json.Marshal(res[dataType]); err == nil {
|
|
@@ -208,8 +223,8 @@ func GetWinnerPortrait(entName string, subscopeclass []string) (hx_data map[stri
|
|
|
} else { //用户设置的行业
|
|
|
classQuery = fmt.Sprintf(`"terms":{"subscopeclass":["%s"]}`, strings.Join(subscopeclass, `","`))
|
|
|
}
|
|
|
- compareRes, _ := GetAggs("projectset", "projectset", fmt.Sprintf(winner_compare, strings.Join(buyers, `","`), classQuery))
|
|
|
- log.Println("competeData query", fmt.Sprintf(winner_compare, strings.Join(buyers, `","`), classQuery))
|
|
|
+ compareRes, _ := GetAggs("projectset", "projectset", fmt.Sprintf(winner_compare, strings.Join(buyers, `","`), classQuery, config.Config.DataStarttime))
|
|
|
+ log.Println("competeData query", fmt.Sprintf(winner_compare, strings.Join(buyers, `","`), classQuery, config.Config.DataStarttime))
|
|
|
if g, ok := compareRes.Children("group_by_buyerclass"); ok {
|
|
|
var compareRangeData []map[string]interface{}
|
|
|
bs, _ := g.Aggregations["buckets"].MarshalJSON()
|