|
@@ -16,7 +16,7 @@ import (
|
|
|
|
|
|
const (
|
|
|
buyer_query_address = `{"query":{"bool":{"must":[{"term":{"buyer_name":"%s"}}]}},"size":1,"_source":["city","province","buyerclass"]}`
|
|
|
- buyerPortraitSearchSql = `{"query":{"bool":{"must":[%s]}},"aggs":{"year_bidamount":{"range":{"field":"jgtime","ranges":[%s]},"aggs":{"count":{"sum":{"field":"bidamount"}}}},"fail_count":{"filter":{"bool":{"must":[{"term":{"bidstatus":"流标"}}]}}},"winner_count":{"cardinality":{"field":"entidlist"}},"bidamount_count":{"sum":{"field":"bidamount"}},"moneyRange":{"filter":{"bool":{"must":{"range":{"project_rate":{"gte":0,"lte":0.6}}}}},"aggs":{"moneyRangeValue":{"range":{"field":"bidamount","ranges":[%s]},"aggs":{"bidamount_count":{"sum":{"field":"bidamount"}},"budget_count":{"sum":{"field":"budget"}}}}}},"bidtypeData":{"filter":{"bool":{"must":{"terms":{"bidtype":["招标","邀标","询价","单一","竞价","竞谈"]}}}},"aggs":{"bidtype_group":{"terms":{"field":"bidtype"},"aggs":{"bidamount_count":{"sum":{"field":"bidamount"}}}},"bidamount_count":{"sum":{"field":"bidamount"}}}},"topScopeclassData":{"terms":{"field":"topscopeclass","size":12,"order":[{"bidamount_count":"desc"}]},"aggs":{"bidamount_count":{"sum":{"field":"bidamount"}},"top_scopeclass_rate_time_avg":` + YearRate + `}},"allScopeclassData":` + YearRate + `,"topAgencyData":{"terms":{"field":"agency","size":10,"order":[{"_count":"desc"},{"last_with_time":"desc"}]},"aggs":{"last_with_time":{"max":{"field":"jgtime"}}}},"topWinner":{"terms":{"field":"entidlist","order":[{"count_bidamount":"desc"},{"_count":"desc"},{"last_with_time":"desc"}]},"aggs":{"last_with_time":{"max":{"field":"jgtime"}},"count_bidamount":{"sum":{"field":"bidamount"}},"avg_data":{"filter":{"bool":{"must":{"range":{"project_rate":{"gte":0,"lte":0.6}}}}},"aggs":{"bidamount_count":{"sum":{"field":"bidamount"}},"budget_count":{"sum":{"field":"budget"}}}}}},"firstWinner":{"terms":{"field":"first_cooperation"}},"allWinnerList":{"terms":{"field":"entidlist","size":4000},"aggs":{"count_bidamount":{"sum":{"field":"bidamount"}},"avg_data":` + BaseRate + `}}},"size":0}`
|
|
|
+ buyerPortraitSearchSql = `{"query":{"bool":{"must":[%s]}},"aggs":{"year_bidamount":{"range":{"field":"jgtime","ranges":[%s]},"aggs":{"count":{"sum":{"field":"bidamount"}}}},"fail_count":{"filter":{"bool":{"must":[{"term":{"bidstatus":"流标"}}]}}},"winner_count":{"cardinality":{"field":"entidlist"}},"bidamount_count":{"sum":{"field":"bidamount"}},"moneyRange":{"filter":{"bool":{"must":{"range":{"project_rate":{"gte":0,"lte":0.6}}}}},"aggs":{"moneyRangeValue":{"range":{"field":"bidamount","ranges":[%s]},"aggs":{"bidamount_count":{"sum":{"field":"bidamount"}},"budget_count":{"sum":{"field":"budget"}}}}}},"bidtypeData":{"filter":{"bool":{"must":{"terms":{"bidtype":["招标","邀标","询价","单一","竞价","竞谈"]}}}},"aggs":{"bidtype_group":{"terms":{"field":"bidtype"},"aggs":{"bidamount_count":{"sum":{"field":"bidamount"}}}},"bidamount_count":{"sum":{"field":"bidamount"}}}},"topScopeclassData":{"terms":{"field":"topscopeclass","size":12,"order":[{"bidamount_count":"desc"}]},"aggs":{"bidamount_count":{"sum":{"field":"bidamount"}},"top_scopeclass_rate_time_avg":` + YearRate + `}},"allScopeclassData":` + YearRate + `,"topAgencyData":{"terms":{"field":"agency","size":10,"order":[{"_count":"desc"},{"last_with_time":"desc"}]},"aggs":{"last_with_time":{"max":{"field":"jgtime"}}}},"topWinner":{"terms":{"field":"entidlist","order":[{"count_bidamount":"desc"},{"_count":"desc"},{"last_with_time":"desc"}]},"aggs":{"last_with_time":{"max":{"field":"jgtime"}},"count_bidamount":{"sum":{"field":"bidamount"}},"avg_data":{"filter":{"bool":{"must":{"range":{"project_rate":{"gte":0,"lte":0.6}}}}},"aggs":{"bidamount_count":{"sum":{"field":"bidamount"}},"budget_count":{"sum":{"field":"budget"}}}}}},"firstWinner":{"terms":{"field":"first_cooperation"}},"allWinnerList":{"terms":{"field":"entidlist","size":10000},"aggs":{"count_bidamount":{"sum":{"field":"bidamount"}},"avg_data":` + BaseRate + `}}},"size":0}`
|
|
|
queryTermByIdSql = `{"terms":{"_id":[%s]}}`
|
|
|
|
|
|
queryMustSql = `{"query":{"bool":{"must":[%s]}}}`
|
|
@@ -24,12 +24,6 @@ const (
|
|
|
buyerWithEntPortraitSqlPage = `{"query":{"bool":{"must":[%s]}},"_source":["_id","company_area","capital","establish_date","tag_business"],"from":%d,"size":%d}`
|
|
|
)
|
|
|
|
|
|
-// GetBuyerNewProjectCount 采购单位最新中标动态数量查询
|
|
|
-func GetBuyerNewProjectCount(buyer string) int64 {
|
|
|
- defer qutil.Catch()
|
|
|
- return elastic.Count("projectset", "projectset", fmt.Sprintf(`{"query":{"bool":{"must":[{"term": {"buyer": "%s"}},{"range":{"jgtime":{"gte":%d}}}]}}}`, buyer, time.Now().AddDate(-5, 0, 0).Unix()))
|
|
|
-}
|
|
|
-
|
|
|
// GetBuyerMsg 获取采购单位基本信息
|
|
|
func GetBuyerMsg(entName string) (city, province, buyerclass string) {
|
|
|
list := elastic.Get("buyer", "buyer", fmt.Sprintf(buyer_query_address, entName))
|
|
@@ -52,7 +46,7 @@ func GetBuyerPortraitData(screen *PortraitScreen) (map[string]interface{}, error
|
|
|
|
|
|
if AllWinner, ok := buyerPortraitData["allWinnerList"]; ok {
|
|
|
province := qutil.ObjToString(buyerPortraitData["province"])
|
|
|
- withPorTraitData, thisProvincesWinnerCount, withErr := GetWithEntPortraitData(AllWinner, province, buyerPortraitData["bidamount_count"])
|
|
|
+ withPorTraitData, thisProvincesWinnerCount, withErr := GetWithEntPortraitData(AllWinner, province, buyerPortraitData["bidamount_count"], buyerPortraitData["project_count"])
|
|
|
if withErr != nil {
|
|
|
log.Println("GetWithEntPortraitData err", withErr)
|
|
|
}
|
|
@@ -132,7 +126,7 @@ func BuyerPortraitSearch(screen *PortraitScreen) (map[string]interface{}, error)
|
|
|
|
|
|
tBegin := time.Now()
|
|
|
doSearchSql := fmt.Sprintf(buyerPortraitSearchSql, strings.Join(mustQueryArr, ","), bidamountTimeRange, getMoneyRange(), comminTimeRange, comminTimeRange)
|
|
|
- res, count := util.GetAggs("projectset", "projectset", doSearchSql)
|
|
|
+ res, count := util.GetAggsWithCount("projectset", "projectset", doSearchSql)
|
|
|
//log.Println("buyerSearchSql", doSearchSql)
|
|
|
if res == nil {
|
|
|
return nil, errors.New(fmt.Sprintf("%s采购单位画像查询异常\n", screen.Ent))
|
|
@@ -554,7 +548,7 @@ type AllWinner struct {
|
|
|
}
|
|
|
|
|
|
// GetWithEntPortraitData 查询采购单位合作企业画像
|
|
|
-func GetWithEntPortraitData(listDataItf interface{}, province string, bidamountObj interface{}) (map[string]interface{}, int, error) {
|
|
|
+func GetWithEntPortraitData(listDataItf interface{}, province string, bidamountObj11, project_count11 interface{}) (map[string]interface{}, int, error) {
|
|
|
listData := &[]AllWinner{}
|
|
|
if err := InterfaceToStruct(listDataItf, listData); err != nil {
|
|
|
return nil, 0, err
|
|
@@ -565,10 +559,24 @@ func GetWithEntPortraitData(listDataItf interface{}, province string, bidamountO
|
|
|
//根据注册资本聚合
|
|
|
var winnerIdList []string
|
|
|
allWinnerMap := map[string]AllWinner{}
|
|
|
+
|
|
|
+ capitalAggs := map[int][]string{} //注册资本
|
|
|
+ areaAggs := map[string][]string{} //地区
|
|
|
+ establishAggs := map[int][]string{} //成立日期
|
|
|
+ businessAggs := map[string][]string{} //企业标签
|
|
|
+
|
|
|
+ hasTagTotalBidAmount, hasTagProjectCount := 0.0, 0 //有企业分类中标总金额,其他归为"其他分类"
|
|
|
+ totalBidAmount, totalProjectCount := 0.0, 0
|
|
|
+
|
|
|
for _, winner := range *listData {
|
|
|
- winnerIdList = append(winnerIdList, winner.WinnerId)
|
|
|
- allWinnerMap[winner.WinnerId] = winner
|
|
|
+ if !(winner.WinnerId == "" || winner.WinnerId == "-") {
|
|
|
+ winnerIdList = append(winnerIdList, winner.WinnerId)
|
|
|
+ allWinnerMap[winner.WinnerId] = winner
|
|
|
+ }
|
|
|
+ totalBidAmount += winner.BidamountCount
|
|
|
+ totalProjectCount += winner.ProjectCount
|
|
|
}
|
|
|
+
|
|
|
tBegin := time.Now()
|
|
|
doSearchSql := fmt.Sprintf(queryTermByIdSql, `"`+strings.Join(winnerIdList, `","`)+`"`)
|
|
|
searchNum := elastic.Count("qyxy", "qyxy", fmt.Sprintf(queryMustSql, doSearchSql))
|
|
@@ -603,12 +611,7 @@ func GetWithEntPortraitData(listDataItf interface{}, province string, bidamountO
|
|
|
if entMsgList == nil || len(entMsgList) == 0 {
|
|
|
return nil, 0, errors.New("中标企业查询结果为空")
|
|
|
}
|
|
|
-
|
|
|
- capitalAggs := map[int][]string{} //注册资本
|
|
|
- areaAggs := map[string][]string{} //地区
|
|
|
- establishAggs := map[int][]string{} //成立日期
|
|
|
- businessAggs := map[string][]string{} //企业标签
|
|
|
-
|
|
|
+ var has_TagBusiness []string
|
|
|
for _, entMsg := range entMsgList {
|
|
|
if len(entMsg) < 2 {
|
|
|
continue
|
|
@@ -633,8 +636,24 @@ func GetWithEntPortraitData(listDataItf interface{}, province string, bidamountO
|
|
|
if businessStr := qutil.ObjToString(entMsg["tag_business"]); businessStr != "" {
|
|
|
firstTag := strings.Split(businessStr, ",")[0]
|
|
|
businessAggs[firstTag] = append(businessAggs[firstTag], companyId)
|
|
|
+ has_TagBusiness = append(has_TagBusiness, companyId)
|
|
|
}
|
|
|
}
|
|
|
+ //计算所有有企业标签的企业中标金额总数、及项目数量
|
|
|
+ for _, winner := range *listData {
|
|
|
+ isOther := true
|
|
|
+ for _, _id := range has_TagBusiness {
|
|
|
+ if winner.WinnerId == _id {
|
|
|
+ isOther = false
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if !isOther {
|
|
|
+ hasTagTotalBidAmount += winner.BidamountCount
|
|
|
+ hasTagProjectCount += winner.ProjectCount
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
thisProvinceWinnerCount := 0
|
|
|
if province != "" {
|
|
|
province = excludeAddressReg.ReplaceAllString(province, "") //去掉城市后缀
|
|
@@ -715,7 +734,6 @@ func GetWithEntPortraitData(listDataItf interface{}, province string, bidamountO
|
|
|
}
|
|
|
//核算企业标签
|
|
|
if len(businessAggs) > 0 {
|
|
|
- bidamount := qutil.Float64All(bidamountObj)
|
|
|
var businessData []map[string]interface{}
|
|
|
for businessName, winnerNames := range businessAggs {
|
|
|
mCount, _, pCount, rAvg := mAggsSum(winnerNames, allWinnerMap)
|
|
@@ -726,14 +744,29 @@ func GetWithEntPortraitData(listDataItf interface{}, province string, bidamountO
|
|
|
if b <= 0 {
|
|
|
return nil
|
|
|
}
|
|
|
- return mCount / bidamount
|
|
|
- }(mCount, bidamount), //采购规模占比
|
|
|
+ return mCount / totalBidAmount
|
|
|
+ }(mCount, totalBidAmount), //采购规模占比
|
|
|
"money_count": mCount, //采购规模
|
|
|
"project_count": pCount, //项目数量
|
|
|
"rate_avg": rAvg, //平均节支率
|
|
|
})
|
|
|
}
|
|
|
}
|
|
|
+ // 根据entid未查到企业信息、项目中entidlist数据不存在、项目中entidlist为[-],统一划分为【其他】类型、以保证占比相加等于1
|
|
|
+ if mCount := totalBidAmount - hasTagTotalBidAmount; mCount > 0 {
|
|
|
+ businessData = append(businessData, map[string]interface{}{
|
|
|
+ "business_name": "其他",
|
|
|
+ "money_prop": func(m, b float64) interface{} {
|
|
|
+ if b <= 0 {
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+ return mCount / totalBidAmount
|
|
|
+ }(mCount, totalBidAmount), //采购规模占比
|
|
|
+ "money_count": mCount, //采购规模
|
|
|
+ "project_count": qutil.IntAll(totalProjectCount) - hasTagProjectCount, //项目数量
|
|
|
+ "rate_avg": 0, //平均节支率(因包含未抽取到中标企业,中标企业id为-,无法计算)
|
|
|
+ })
|
|
|
+ }
|
|
|
returnData["withBusinessData"] = businessData
|
|
|
}
|
|
|
go func() {
|