wangshan 6 сар өмнө
parent
commit
03f3e41dbd

+ 1 - 0
marketanalysis/consts.go

@@ -56,6 +56,7 @@ const (
 	CollMarketProjectAllData  = "marketanalysisreport_all"    //项目规模 地区分布 客户分布 地区客户top3
 	CollMarketScaleRefine     = "marketanalysisreport_refine" //细化市场
 	CollMarketBuyerAndWinner  = "marketanalysisreport_bw"     //市场-采购单位&&中标企业
+	ValueError                = -1                            // 分析数据过大
 	ValueOffline              = 1                             // 离线
 	ValueRealTime             = 2                             // 实时
 	TablejianyuMarUserAccount = "jianyu.mar_user_account"     // 离线市场报告分析关键词标准信息表

+ 14 - 0
marketanalysis/entity.go

@@ -1,5 +1,19 @@
 package marketanalysis
 
+type BWBuckets struct {
+	Buyerterms struct {
+		Buckets []struct {
+			Key      string `json:"key"`
+			DocCount int    `json:"doc_count"`
+		} `json:"buckets"`
+	} `json:"buyerterms"`
+	Winnerterms struct {
+		Buckets []struct {
+			Key      string `json:"key"`
+			DocCount int    `json:"doc_count"`
+		} `json:"buckets"`
+	} `json:"winnerterms"`
+}
 type marketTime struct {
 	Thismarket struct {
 		Buckets []marketBuckets `json:"buckets"`

+ 73 - 19
marketanalysis/marketanalysis.go

@@ -22,6 +22,8 @@ var (
 	MATimeout         int
 	MAProjectNumLimit int
 	MAKeyWordsCount   int
+	MinKeyWordsCount  int //关键词数量最低值 小于此数量,默认走线上
+	MaxPCount         int //项目最大限制数量
 	ProjectCount      int
 	PtIndex           = "projectset"
 	PtType            = "projectset"
@@ -29,7 +31,7 @@ var (
 	Fields            = `"projectname.pname"`
 )
 
-func MAInit(limit, timeOut, projectNumLimit, keyWordsCount, pCount int, ptIndex, ptType string, fields []string) {
+func MAInit(limit, timeOut, projectNumLimit, keyWordsCount, pCount, minKCount, maxPCount int, ptIndex, ptType string, fields []string) {
 	if limit == 0 {
 		limit = 5
 	}
@@ -49,6 +51,15 @@ func MAInit(limit, timeOut, projectNumLimit, keyWordsCount, pCount int, ptIndex,
 		keyWordsCount = 300
 	}
 	MAKeyWordsCount = keyWordsCount
+
+	if minKCount <= 0 {
+		minKCount = 100
+	}
+	MinKeyWordsCount = minKCount
+	if maxPCount <= 0 {
+		maxPCount = 5000000
+	}
+	MaxPCount = maxPCount
 	//项目数量
 	ProjectCount = pCount
 	//es 索引
@@ -674,15 +685,52 @@ func (a *AnalysisEntity) GetPartResult(flag int) (map[string]interface{}, error)
 	return rData, err
 }
 
+// 离线  获取采购单位和中部单位数据
+func (a *AnalysisEntity) BWData() (buyers []string, winners []string) {
+	sql := `"buyer_terms": {"terms": {"field": "buyer","size": 50000}},"winner_terms": {"terms": {"field": "winner","size": 50000}}`
+	finalSql := fmt.Sprintf(a.GetCommonQuerySqlWithAggs(), sql)
+	res := GetAggs(PtIndex, PtType, finalSql)
+	if res == nil || len(res) == 0 {
+		return
+	}
+	var bw = BWBuckets{}
+	for name, object := range res {
+		bArr, err := object.MarshalJSON()
+		if len(bArr) == 0 || err != nil {
+			continue
+		}
+		if name == "buyer_terms" {
+			if json.Unmarshal(bArr, &bw.Buyerterms) != nil {
+				continue
+			}
+		} else if name == "winner_terms" {
+			if json.Unmarshal(bArr, &bw.Winnerterms) != nil {
+				continue
+			}
+		}
+	}
+	for _, bv := range bw.Buyerterms.Buckets {
+		buyers = append(buyers, bv.Key)
+	}
+	for _, wv := range bw.Winnerterms.Buckets {
+		winners = append(winners, wv.Key)
+	}
+	return
+}
+
 // 实时查询
 func (a *AnalysisEntity) RealTimeQuery(flag int) (map[string]interface{}, error) {
 	switch flag {
 	case MarketScaleMain:
 		rData, err := a.MarketTime()
 		//非离线
-		if a.Offline != 1 && err != nil { //若无报告内容,删除报告记录
+		if a.Offline != ValueOffline && err != nil { //若无报告内容,删除报告记录
 			go a.removeEmptyRecord()
 		}
+		if a.Offline == ValueOffline {
+			//采购单位和中部单位 数据
+			rData["buyers"], rData["winners"] = a.BWData()
+		}
 		return rData, err
 	case MarketTopProject:
 		return a.ProjectTop10()
@@ -769,8 +817,19 @@ func (a *AnalysisEntity) GetAnalyzingReport() string {
 }
 
 // IsOffline 判断是否符合在线分析的条件
-func (a *AnalysisEntity) IsOffline() (offline bool) {
+func (a *AnalysisEntity) IsOffline() {
 	//离线生成:订阅词(关键词+排除词)超过300个(数量支持配置),或单次分析数据超过60万条,则离线生成;
+	//  查询数据量
+	countSql := fmt.Sprintf(a.GetCommonQuerySql(), "")
+	log.Println("IsOffline count SQL:", countSql)
+	now := time.Now()
+	dataCount := elastic.Count(PtIndex, PtType, countSql)
+	if dataCount > int64(MaxPCount) { //提示用户 数据量过大,修改生成报告条件
+		a.Offline = ValueError
+		return
+	}
+	log.Println("IsOffline 数据量:", dataCount)
+	a.OriginalTotal = dataCount
 	keyCount := 0
 	for i := 0; i < len(a.FormatParam.KeysItems); i++ {
 		items := a.FormatParam.KeysItems[i]
@@ -787,36 +846,31 @@ func (a *AnalysisEntity) IsOffline() (offline bool) {
 			}
 		}
 	}
+	a.KeysTotal = int64(keyCount)
+	//关键词数量 < 100 ,默认走线上
+	if keyCount < MinKeyWordsCount {
+		a.Offline = ValueRealTime
+		return
+	}
 	if keyCount > MAKeyWordsCount {
 		// 查询配置
 		if mac := a.getMarUserAccount(); mac != nil {
 			if keyCount >= mac.Threshold {
 				a.Offline = ValueOffline
-				a.KeysTotal = int64(keyCount)
-				return true
+				return
 			}
 		} else {
 			a.Offline = ValueOffline
-			a.KeysTotal = int64(keyCount)
-			return true
+			return
 		}
 	}
-
-	//  查询数据量
-	countSql := fmt.Sprintf(a.GetCommonQuerySql(), "")
-	log.Println("IsOffline count SQL:", countSql)
-	now := time.Now()
-	dataCount := elastic.Count(PtIndex, PtType, countSql)
-	b := time.Since(now)
-	log.Println("IsOffline 统计数据量耗时:", b)
-	log.Println("IsOffline 数据量:", dataCount)
-	a.OriginalTotal = dataCount
+	log.Println("IsOffline 统计数据量耗时:", time.Since(now))
 	if int(dataCount) > MAProjectNumLimit {
 		a.Offline = ValueOffline
-		return true
+		return
 	}
 	a.Offline = ValueRealTime
-	return false
+	return
 }
 
 type MarUserAccount struct {