|
@@ -0,0 +1,190 @@
|
|
|
+package front
|
|
|
+
|
|
|
+import (
|
|
|
+ "app.yhyue.com/moapp/jybase/common"
|
|
|
+ elastic "app.yhyue.com/moapp/jybase/es"
|
|
|
+ "app.yhyue.com/moapp/jybase/go-xweb/xweb"
|
|
|
+ "app.yhyue.com/moapp/jybase/redis"
|
|
|
+ "fmt"
|
|
|
+ "github.com/gogf/gf/v2/util/gconv"
|
|
|
+ "jy/src/jfw/config"
|
|
|
+ "math/rand"
|
|
|
+ "strings"
|
|
|
+ "time"
|
|
|
+)
|
|
|
+
|
|
|
+const (
|
|
|
+ NewMustSearch = `{"query":{"bool":{"must":[%s],"must_not":[{"terms":{"toptype":["采购意向","拟建"]}}]}}%s}`
|
|
|
+ biddingIndex, biddingType = "bidding", "bidding"
|
|
|
+ projectSet = "projectset"
|
|
|
+ qyxy = "qyxy"
|
|
|
+)
|
|
|
+
|
|
|
+var (
|
|
|
+ WinnerRecommend, BuyerRecommend []map[string]interface{}
|
|
|
+)
|
|
|
+
|
|
|
+type RecommendationProject struct {
|
|
|
+ *xweb.Action
|
|
|
+ portraitRecommendation xweb.Mapper `xweb:"/front/bootstrap/specification"` //画像登录右侧推荐
|
|
|
+}
|
|
|
+
|
|
|
+func init() {
|
|
|
+ xweb.AddAction(&RecommendationProject{})
|
|
|
+ InitEnterprises()
|
|
|
+}
|
|
|
+
|
|
|
+func (l *RecommendationProject) PortraitRecommendation() {
|
|
|
+ l.GetString("isWinner")
|
|
|
+ l.ServeJson(map[string]interface{}{
|
|
|
+ "error_code": 0,
|
|
|
+ "error_msg": nil,
|
|
|
+ "data": config.Sysconfig["bootstrap_specification"],
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+func InitEnterprises() {
|
|
|
+ winnerConfig := strings.Split(common.InterfaceToStr(config.Sysconfig["winner"]), ",")
|
|
|
+ WinnerRecommend = getWinnerSeoIdByNameNew("company_name", false, winnerConfig...)
|
|
|
+ buyerConfig := strings.Split(common.InterfaceToStr(config.Sysconfig["buyer"]), ",")
|
|
|
+ BuyerRecommend = getBuyerSeoIdByNameNew(false, buyerConfig...)
|
|
|
+}
|
|
|
+
|
|
|
+// RelevanceData 关联单位
|
|
|
+func RelevanceData(name string, isWinner bool) (randomMaps []map[string]interface{}) {
|
|
|
+ if name == "" {
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+ redisKey := fmt.Sprintf("portrait_relevance_%v_%s", isWinner, name)
|
|
|
+ getFullArr, fromCache := func() (data []map[string]interface{}, fromCache bool) {
|
|
|
+ gVal := redis.Get(RedisNameNew, redisKey)
|
|
|
+ if gVal != nil {
|
|
|
+ redisData := gVal.([]interface{})
|
|
|
+ randomMaps = common.ObjArrToMapArr(redisData)
|
|
|
+ fromCache = true
|
|
|
+ return
|
|
|
+ }
|
|
|
+ data = []map[string]interface{}{}
|
|
|
+ querySql := `{"query": {"bool": {"must": [%s]}},"_source":["buyer","s_winner","entidlist"],"size": 200}`
|
|
|
+ var mustSql string
|
|
|
+ if isWinner {
|
|
|
+ mustSql = fmt.Sprintf(`{"terms": {"entidlist": ["%s"]}},{"exists": {"field": "buyer"}}`, name)
|
|
|
+ } else {
|
|
|
+ mustSql = fmt.Sprintf(`{"match": {"buyer": "%s"}},{"exists": {"field": "s_winner"}},{"exists": {"field": "entidlist"}}`, name)
|
|
|
+ }
|
|
|
+ getData := elastic.Get(biddingIndex, biddingType, fmt.Sprintf(querySql, mustSql))
|
|
|
+ if getData != nil && len(*getData) > 0 {
|
|
|
+ queryMap := make(map[string]bool)
|
|
|
+ if !isWinner { //采购关联企业 校验正确性
|
|
|
+ var queryArr []string
|
|
|
+ for _, v := range *getData {
|
|
|
+ for _, entId := range gconv.Strings(v["entidlist"]) {
|
|
|
+ if queryMap[entId] {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ queryArr = append(queryArr, entId)
|
|
|
+ queryMap[entId] = true
|
|
|
+ }
|
|
|
+ }
|
|
|
+ data = getWinnerSeoIdByNameNew("_id", false, queryArr...)
|
|
|
+ } else {
|
|
|
+ var queryArr []string
|
|
|
+ for _, v := range *getData {
|
|
|
+ buyerName := gconv.String(v["buyer"])
|
|
|
+ if queryMap[buyerName] {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ queryArr = append(queryArr, buyerName)
|
|
|
+ queryMap[buyerName] = true
|
|
|
+ }
|
|
|
+ data = getBuyerSeoIdByNameNew(false, queryArr...)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
+ }()
|
|
|
+ if !fromCache {
|
|
|
+ redis.Put(RedisNameNew, redisKey, getFullArr, 60*60*24)
|
|
|
+ }
|
|
|
+ randomMaps = getFullArr
|
|
|
+ if len(getFullArr) > 10 { //大于10 随机取10个
|
|
|
+ rand.Seed(time.Now().UnixNano())
|
|
|
+ start := rand.Intn(len(getFullArr) - 10)
|
|
|
+ randomMaps = getFullArr[start : start+10]
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// RecommendedData 其他推荐
|
|
|
+// name 名称 province 省份 isWinner 来源是否中标企业画像 false 来源企业画像
|
|
|
+func RecommendedData(name, province string, isWinner bool) (rData []map[string]interface{}) {
|
|
|
+ redisKey := fmt.Sprintf("jyseo_portrait_recommended_%v_%s", isWinner, province)
|
|
|
+ getFullArr, formCache := func() (data []map[string]interface{}, formCache bool) {
|
|
|
+ if name == "" || province == "" || province == "全国" {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ data = []map[string]interface{}{}
|
|
|
+ gVal := redis.Get(RedisNameNew, redisKey)
|
|
|
+ if gVal != nil {
|
|
|
+ redisData := gVal.([]interface{})
|
|
|
+ data = common.ObjArrToMapArr(redisData)
|
|
|
+ formCache = true
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ sql := fmt.Sprintf(`{"query":{"bool":{"must":[{"term":{"area":"%s"}},%s]}},"sort":[{"lasttime":"desc"}],"_source":["entidlist","buyer"],"from":0,"size":200}`, province, "%s")
|
|
|
+ if isWinner {
|
|
|
+ sql = fmt.Sprintf(sql, `{"exists": {"field": "s_winner"}},{"exists": {"field": "entidlist"}}`)
|
|
|
+ } else {
|
|
|
+ sql = fmt.Sprintf(sql, `{"exists": {"field": "buyer"}}`)
|
|
|
+ }
|
|
|
+
|
|
|
+ getData := elastic.Get(projectSet, projectSet, sql)
|
|
|
+ if getData != nil && len(*getData) > 0 {
|
|
|
+ queryMap := make(map[string]bool)
|
|
|
+ if isWinner { //采购关联企业 校验正确性
|
|
|
+ var queryArr []string
|
|
|
+ for _, v := range *getData {
|
|
|
+ for _, entId := range gconv.Strings(v["entidlist"]) {
|
|
|
+ if queryMap[entId] {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ queryArr = append(queryArr, entId)
|
|
|
+ queryMap[entId] = true
|
|
|
+ }
|
|
|
+ }
|
|
|
+ data = getWinnerSeoIdByNameNew("_id", false, queryArr...)
|
|
|
+ } else {
|
|
|
+ var queryArr []string
|
|
|
+ for _, v := range *getData {
|
|
|
+ buyerName := gconv.String(v["buyer"])
|
|
|
+ if queryMap[buyerName] {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ queryArr = append(queryArr, buyerName)
|
|
|
+ queryMap[buyerName] = true
|
|
|
+ }
|
|
|
+ data = getBuyerSeoIdByNameNew(false, queryArr...)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
+ }()
|
|
|
+ if !formCache {
|
|
|
+ redis.Put(RedisNameNew, redisKey, getFullArr, 60*60*24)
|
|
|
+ }
|
|
|
+
|
|
|
+ finalArr := getFullArr
|
|
|
+ if len(finalArr) == 0 {
|
|
|
+ if isWinner {
|
|
|
+ finalArr = WinnerRecommend
|
|
|
+ } else {
|
|
|
+ finalArr = BuyerRecommend
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if len(finalArr) > 10 {
|
|
|
+ rand.Seed(time.Now().UnixNano())
|
|
|
+ start := rand.Intn(len(finalArr) - 10)
|
|
|
+ return finalArr[start : start+10]
|
|
|
+ }
|
|
|
+ return finalArr
|
|
|
+}
|