浏览代码

Merge branch 'dev/v4.8.28_dx' of qmx/jy into release/v4.8.28

duxin 2 年之前
父节点
当前提交
bd65650d4e

+ 31 - 0
src/jfw/modules/bigmember/src/service/analysis/decision.go

@@ -337,6 +337,37 @@ func (this *Analysis) HotWinnerTop() {
 				getRes.BuyerContent = BuyerContentStruct(getRes.BuyerContent)
 				decQuery := DecWinnerQuery(getRes.Area, getRes.BuyerContent, getRes.Buyer, getRes.LimitTime, getRes.SearchItem, getRes.HotWinnerType)
 				aggsArr := getDecInfo(decQuery, buyer_buyerClass, getRes, 0)
+				//top明细数量错误问题特殊处理 数量重新查询
+				var rMap = sync.Map{}
+				sy := sync.WaitGroup{}
+				winnerAmount, _ := aggsArr["winnerAmount"].([]*DecWinnerInfo)
+				if len(winnerAmount) > 0 {
+					for _, v := range winnerAmount {
+						sy.Add(1)
+						go func(winner string) {
+							defer sy.Done()
+							winnerSql := DecQueryNewSimilarMsgByBW(winner, getRes, 0)
+							_, count, _ := elastic.GetAggs(P_INDEX, P_TYPE, winnerSql)
+							rMap.Store(winner, count)
+						}(v.Key)
+					}
+					sy.Wait()
+					rMaps := make(map[string]interface{})
+					rMap.Range(func(key, value interface{}) bool {
+						rMaps[qutil.InterfaceToStr(key)] = value
+						return true
+					})
+					for _, v := range winnerAmount {
+						v.Doc_count = qutil.Float64All(rMaps[v.Key])
+					}
+					sortkey := "total_project" //默认金额
+					if getRes.HotWinnerType == 0 {
+						sortkey = "doc_count"
+					}
+					util.SortData(&winnerAmount, sortkey, true) //排序
+					aggsArr["winnerAmount"] = winnerAmount
+				}
+
 				regMap.Data = map[string]interface{}{
 					"PAnalysis": aggsArr,
 				}

+ 150 - 0
src/jfw/modules/bigmember/src/service/analysis/esquery.go

@@ -292,6 +292,156 @@ func AnalyzeNumber(area map[string]interface{}, business_scope []ViewKeyWord, bu
 	return all_count, area_count, buyer_count
 }
 
+// //投标决策分析查询语句-中标企业和采购单位 类似项目明细
+func DecQueryNewSimilarMsgByBW(Winner string, this *DecParam, SearchType int) (qstr string) {
+	//基础查询
+	bools := []string{}
+	musts := []string{}
+	var BWExists = 0
+	var (
+		query_bool = `{"bool":{"should":[%s],"minimum_should_match":%d}}`
+		query      = `{"track_total_hits": true,"query":{"bool":{"must":[%s]}},"size":0}`
+	)
+	//中标单位 类似项目合作历史||采购单位类似项目
+	if Winner != "" {
+		BWExists += 1
+		winnerterms := `{"terms":{"s_winner":[`
+		for k, v := range strings.Split(Winner, ",") {
+			if k > 0 {
+				winnerterms += `,`
+			}
+			winnerterms += `"` + v + `"`
+		}
+		winnerterms += `]}}`
+		musts = append(musts, winnerterms)
+	}
+	//中标单位 类似项目合作历史||采购单位类似项目
+	if this.Buyer != "" && this.SearchItem == 1 {
+		buyerterms := fmt.Sprintf(`{"query_string": {"default_field": "buyer","query": "*%s*"}}`, this.Buyer)
+		BWExists += 1
+		musts = append(musts, buyerterms)
+	}
+	//searchType ==1; buyer & winner 不能为空
+	if BWExists < 2 && SearchType == 1 {
+		SearchType = 0
+	}
+	if this.SearchItem == 2 {
+		//省份
+		areaCity := []string{}
+		citys := []string{}
+		if len(this.Area) > 0 {
+			areaquery := `{"terms":{"area":[`
+			var i = 0
+			for k, v := range this.Area {
+				if len(qutil.ObjArrToStringArr(v.([]interface{}))) == 0 {
+					if i > 0 {
+						areaquery += `,`
+					}
+					areaquery += `"` + strings.ReplaceAll(strings.ReplaceAll(k, "省", ""), "市", "") + `"`
+					i += 1
+				} else {
+					citys = append(citys, qutil.ObjArrToStringArr(v.([]interface{}))...)
+				}
+			}
+			areaquery += `]}}`
+			if i > 0 {
+				areaCity = append(areaCity, areaquery)
+			}
+		}
+		//城市
+		if len(citys) > 0 {
+			//城市对应前三十个
+			if len(citys) > 30 {
+				citys = citys[:30]
+			}
+			areaquery := `{"terms":{"city":[`
+			for k, v := range citys {
+				if k > 0 {
+					areaquery += `,`
+				}
+				areaquery += `"` + v + `"`
+			}
+			areaquery += `]}}`
+			areaCity = append(areaCity, areaquery)
+		}
+		if len(areaCity) > 0 {
+			musts = append(musts, strings.Join(areaCity, ","))
+		}
+	}
+
+	//检索日期
+	var (
+		gteTime time.Time
+		gte     int64
+	)
+	sTime := time.Now()
+	switch this.LimitTime {
+	case "oneYear":
+		gteTime = sTime.AddDate(-1, 0, 0)
+	case "threeYear":
+		gteTime = sTime.AddDate(-3, 0, 0)
+	case "fiveYear": // 默认近五年
+		gteTime = sTime.AddDate(-5, 0, 0)
+	default:
+		gte = qutil.Int64All(entity.P_Starttime)
+	}
+	if this.LimitTime != "" {
+		gte = time.Date(gteTime.Year(), 1, 1, 0, 0, 0, 0, time.Local).Unix()
+	}
+	//检索日期
+	if gte > 0 {
+		musts = append(musts, fmt.Sprintf(`{"range":{"jgtime":{"gte":%d,"lt":%d}}}`, gte, sTime.Unix()))
+	}
+	//中标项目
+	if entity.PSearch_DecMust != "" {
+		musts = append(musts, fmt.Sprintf(query_bool_must, entity.PSearch_DecMust))
+	}
+
+	boolsNum := 0
+	//should
+	if len(this.BuyerContent) > 0 {
+		boolsNum = 1
+		findfields := `"projectname.pname","purchasing"`
+		multi_match := fmt.Sprintf(multi_match_public, "%s", findfields)
+		for _, kv := range this.BuyerContent {
+			shoulds := []string{}
+			must_not := []string{}
+			//关键词
+			for _, v := range kv.Keyword {
+				shoulds = append(shoulds, fmt.Sprintf(multi_match, "\""+v+"\""))
+			}
+			//附加词
+			if len(kv.Appended) > 0 {
+				for _, vv := range kv.Appended {
+					shoulds = append(shoulds, fmt.Sprintf(multi_match, "\""+vv+"\""))
+				}
+			}
+			if len(kv.Exclude) > 0 {
+				//排除词
+				for _, vv := range kv.Exclude {
+					must_not = append(must_not, fmt.Sprintf(multi_match, "\""+vv+"\""))
+				}
+			}
+			//添加
+			if len(shoulds) > 0 {
+				notStr := ""
+				if len(must_not) > 0 {
+					notStr = fmt.Sprintf(`,"must_not":[%s]`, strings.Join(must_not, ","))
+				}
+				bools = append(bools, fmt.Sprintf(query_bool_must_and, strings.Join(shoulds, ","), notStr))
+			}
+		}
+	}
+
+	if len(bools) > 0 {
+		musts = append(musts, fmt.Sprintf(query_bool, strings.Join(bools, ","), boolsNum))
+	}
+
+	qstr = fmt.Sprintf(query, strings.Join(musts, ","))
+	log.Println("投标决策分析查询语句-中标企业和采购单位 类似项目明细", qstr)
+	return qstr
+}
+
 // 投标决策分析查询语句 - 中标单位top10
 func DecWinnerQuery(area map[string]interface{}, business_scope []ViewKeyWord, buyer, limitTime string, searchItem, hotWinnerType int) string {
 	//类似项目热点中标企业

+ 91 - 0
src/jfw/modules/bigmember/src/util/util.go

@@ -1,7 +1,11 @@
 package util
 
 import (
+	"encoding/json"
+	"fmt"
+	"reflect"
 	"regexp"
+	"sort"
 
 	"app.yhyue.com/moapp/jybase/encrypt"
 )
@@ -21,3 +25,90 @@ func DecodeId(eid string) string {
 	}
 	return encrypt.DecodeArticleId2ByCheck(eid)[0]
 }
+
+// 排序 排序键必须为数字类型
+type SortBy struct {
+	Data    []map[string]interface{}
+	Sortkey string
+}
+
+func (a SortBy) Len() int { return len(a.Data) }
+
+func (a SortBy) Swap(i, j int) {
+	a.Data[i], a.Data[j] = a.Data[j], a.Data[i]
+}
+
+func (a SortBy) Less(i, j int) bool {
+	//return Float64(a.Data[i][a.Sortkey]) < Float64(a.Data[j][a.Sortkey])
+	m := a.Data[i][a.Sortkey]
+	n := a.Data[j][a.Sortkey]
+	w := reflect.ValueOf(m)
+	v := reflect.ValueOf(n)
+	switch v.Kind() {
+	case reflect.String:
+		return w.String() < v.String()
+	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+		return w.Int() < v.Int()
+	case reflect.Float64, reflect.Float32:
+		return w.Float() < v.Float()
+	default:
+		return fmt.Sprintf("%v", w) < fmt.Sprintf("%v", v)
+	}
+}
+
+// 根据指定字符排序
+//
+//	m := []map[string]int{
+//	   {"k": 2},
+//	   {"k": 1},
+//	   {"k": 3},
+//	}
+//
+// customer.SortData(&m, "k", true)
+// ture  倒序3, 2, 1
+// fmt.Println(m)
+func SortData(data interface{}, sortkey string, reverse bool) {
+	//func SortData(data interface{}, sortkey string, reverse bool) {
+	var db []map[string]interface{}
+	err := Bind(data, &db)
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+	stb := SortBy{db, sortkey}
+	if !reverse {
+		sort.Sort(stb)
+	} else {
+		sort.Sort(sort.Reverse(stb))
+	}
+	err = Bind(stb.Data, data)
+	if err != nil {
+		fmt.Println(err)
+	}
+
+}
+
+func Bind(data interface{}, ret interface{}) error {
+	v := reflect.ValueOf(ret)
+	if v.Kind() != reflect.Ptr {
+		return fmt.Errorf("ptr input ret needed as type as input type %s", v.Kind())
+	}
+	havdata := false
+	var bk interface{}
+	if v.Elem().Kind() == reflect.Slice {
+		t := reflect.Zero(reflect.TypeOf(v.Elem().Interface()))
+		bk = v.Elem().Interface()
+		v.Elem().Set(t)
+		havdata = true
+	}
+	_data, _ := json.MarshalIndent(data, "", "    ")
+	err := json.Unmarshal(_data, ret)
+	if err != nil {
+		fmt.Println(err)
+		if havdata {
+			v.Elem().Set(reflect.ValueOf(bk))
+		}
+		return err
+	}
+	return nil
+}