wangshan 2 жил өмнө
parent
commit
271c6b430c
100 өөрчлөгдсөн 5800 нэмэгдсэн , 3694 устгасан
  1. 11 0
      src/config.json
  2. 4 0
      src/go.mod
  3. 5 0
      src/go.sum
  4. 50 21
      src/jfw/front/classificationTag.go
  5. 13 1
      src/jfw/front/entsearch.go
  6. 6 28
      src/jfw/front/frontRouter.go
  7. 7 0
      src/jfw/front/pcIndex.go
  8. 249 71
      src/jfw/front/shorturl.go
  9. 3 3
      src/jfw/front/swordfish.go
  10. 4 4
      src/jfw/front/tags.go
  11. 2 0
      src/jfw/modules/app/src/app/filter/loginfilter.go
  12. 1 1
      src/jfw/modules/app/src/app/front/bigMember.go
  13. 166 21
      src/jfw/modules/app/src/app/front/shorturl.go
  14. 2 2
      src/jfw/modules/app/src/app/front/swordfish.go
  15. 11 0
      src/jfw/modules/app/src/config.json
  16. 2 2
      src/jfw/modules/app/src/config.yaml
  17. 1 1
      src/jfw/modules/app/src/db.json
  18. 207 33
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/css/analysis_result.css
  19. BIN
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/image/bid_bg.png
  20. BIN
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/image/landpage_new/itemA_05.jpg
  21. BIN
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/image/landpage_new/toubiaoImg/itemB1.png
  22. BIN
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/image/landpage_new/toubiaoImg/itemB2.png
  23. BIN
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/image/landpage_new/toubiaoImg/itemB3.png
  24. BIN
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/image/landpage_new/toubiaoImg/itemB4.png
  25. BIN
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/image/landpage_new/toubiaoImg/itemB5.png
  26. BIN
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/image/landpage_new/toubiaoImg/itemB6.png
  27. 258 0
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/analysis_pro_list.js
  28. 609 240
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/analysis_result.js
  29. 6 6
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/chart_options.js
  30. 13 13
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/contrast_trial.js
  31. 1 1
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/main_root_data.js
  32. 1 1
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/mock.js
  33. 43 2
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/unit_portrayal.js
  34. 239 0
      src/jfw/modules/app/src/web/staticres/jyapp/dataSmt/css/index.css
  35. BIN
      src/jfw/modules/app/src/web/staticres/jyapp/dataSmt/images/data-market-text.png
  36. BIN
      src/jfw/modules/app/src/web/staticres/jyapp/dataSmt/images/header-banner.png
  37. BIN
      src/jfw/modules/app/src/web/staticres/jyapp/dataSmt/images/icon-1.png
  38. 102 0
      src/jfw/modules/app/src/web/staticres/jyapp/dataSmt/js/index.js
  39. BIN
      src/jfw/modules/app/src/web/staticres/jyapp/images/no-login-content.png
  40. 35 2
      src/jfw/modules/app/src/web/templates/big-member/page_ai_add.html
  41. 1 1
      src/jfw/modules/app/src/web/templates/big-member/page_analysis_filter.html
  42. 299 223
      src/jfw/modules/app/src/web/templates/big-member/page_analysis_result.html
  43. 103 0
      src/jfw/modules/app/src/web/templates/big-member/page_bid_analysis_pro_list.html
  44. 0 0
      src/jfw/modules/app/src/web/templates/big-member/page_contrast.html
  45. 1 1
      src/jfw/modules/app/src/web/templates/big-member/page_landingPage.html
  46. 1 1
      src/jfw/modules/app/src/web/templates/big-member/page_landingPage_old.html
  47. 6 6
      src/jfw/modules/app/src/web/templates/big-member/page_landingPage_old_1.html
  48. 1 1
      src/jfw/modules/app/src/web/templates/big-member/page_ontrial_landingPage.html
  49. 2 2
      src/jfw/modules/app/src/web/templates/big-member/page_pro_follow_detail.html
  50. 8 5
      src/jfw/modules/app/src/web/templates/big-member/page_unit_portrayal.html
  51. 178 1
      src/jfw/modules/app/src/web/templates/dataSmt/index.html
  52. 22 2
      src/jfw/modules/app/src/web/templates/dataSmt/list.html
  53. 3 4
      src/jfw/modules/app/src/web/templates/vipsubscribe/vip_introduce.html
  54. 11 19
      src/jfw/modules/app/src/web/templates/weixin/wxinfocontent.html
  55. 264 77
      src/jfw/modules/bigmember/src/entity/analysis.go
  56. 261 204
      src/jfw/modules/bigmember/src/entity/analysisEntName.go
  57. 41 7
      src/jfw/modules/bigmember/src/entity/portrait.go
  58. 4 4
      src/jfw/modules/bigmember/src/entity/portrait_manager.go
  59. 1 0
      src/jfw/modules/bigmember/src/entity/portrait_screen.go
  60. 50 44
      src/jfw/modules/bigmember/src/go.mod
  61. 79 472
      src/jfw/modules/bigmember/src/go.sum
  62. 77 41
      src/jfw/modules/bigmember/src/service/analysis/analysis.go
  63. 967 793
      src/jfw/modules/bigmember/src/service/analysis/decision.go
  64. 691 179
      src/jfw/modules/bigmember/src/service/analysis/esquery.go
  65. 2 0
      src/jfw/modules/bigmember/src/service/analysis/power.go
  66. 9 11
      src/jfw/modules/bigmember/src/service/analysis/util.go
  67. 1 0
      src/jfw/modules/bigmember/src/service/chatShare/obtainDetails.go
  68. 15 14
      src/jfw/modules/bigmember/src/service/portrait/memberPortraitAction.go
  69. 7 2
      src/jfw/modules/bigmember/src/service/portrait/subvipPortraitAction.go
  70. 2 2
      src/jfw/modules/bigmember/src/service/report/marketAnalysis.go
  71. 6 0
      src/jfw/modules/bigmember/src/service/report/report.go
  72. 2 1
      src/jfw/modules/bigmember/src/service/search/search.go
  73. 91 0
      src/jfw/modules/bigmember/src/util/util.go
  74. 51 45
      src/jfw/modules/publicapply/src/go.mod
  75. 81 473
      src/jfw/modules/publicapply/src/go.sum
  76. 1 1
      src/jfw/modules/publicapply/src/npsValue/service/action.go
  77. 51 44
      src/jfw/modules/subscribepay/src/go.mod
  78. 86 498
      src/jfw/modules/subscribepay/src/go.sum
  79. 5 5
      src/jfw/modules/subscribepay/src/service/dataExportPay.go
  80. BIN
      src/web/staticres/big-member/image/landpage_new/itemA_05.jpg
  81. BIN
      src/web/staticres/big-member/image/landpage_new/toubiaoImg/itemB1.png
  82. BIN
      src/web/staticres/big-member/image/landpage_new/toubiaoImg/itemB2.png
  83. BIN
      src/web/staticres/big-member/image/landpage_new/toubiaoImg/itemB3.png
  84. BIN
      src/web/staticres/big-member/image/landpage_new/toubiaoImg/itemB4.png
  85. BIN
      src/web/staticres/big-member/image/landpage_new/toubiaoImg/itemB5.png
  86. BIN
      src/web/staticres/big-member/image/landpage_new/toubiaoImg/itemB6.png
  87. BIN
      src/web/staticres/big-member/image/new_info/item-tb1.png
  88. BIN
      src/web/staticres/big-member/image/new_info/item-tb2-1.png
  89. BIN
      src/web/staticres/big-member/image/new_info/item-tb2-2.png
  90. BIN
      src/web/staticres/big-member/image/new_info/item-tb2-3.png
  91. BIN
      src/web/staticres/big-member/image/new_info/item-tb2-4.png
  92. BIN
      src/web/staticres/big-member/image/new_info/item-tb2-5.png
  93. 5 5
      src/web/staticres/big-member/js/chart_options.js
  94. 13 13
      src/web/staticres/big-member/js/contrast_trial.js
  95. 13 13
      src/web/staticres/big-member/js/meauContact.js
  96. 26 26
      src/web/staticres/big-member/js/previewTable.js
  97. 2 1
      src/web/staticres/big-member/js/unit_portrayal.js
  98. 209 0
      src/web/staticres/common-module/analysis-filter/css/analysis-filter.css
  99. BIN
      src/web/staticres/common-module/analysis-filter/image/icon_close.png
  100. BIN
      src/web/staticres/common-module/analysis-filter/image/right.png

+ 11 - 0
src/config.json

@@ -389,6 +389,17 @@
     "expurasingtime": true,
     "winnerMap": true
   },
+  "detailMosaic":"免费注册即可查看",
+  "detailNeedMosaic":{
+    "buyerperson":true,
+    "buyertel":true,
+    "winnerperson":true,
+    "winnertel":true,
+    "agencyperson":true,
+    "agencytel":true,
+    "budget":true,
+    "bidamount":true
+  },
   "keywordsLimitNologin": 25,
   "messageCenter": {
     "appid": "10000",

+ 4 - 0
src/go.mod

@@ -6,7 +6,11 @@ require (
 	app.yhyue.com/moapp/jyMarketing v0.0.2-0.20230308011651-df591d32df88
 	app.yhyue.com/moapp/jybase v0.0.0-20230614085041-f8f20842d5cb
 	app.yhyue.com/moapp/jylog v0.0.0-20230522075550-05d7230ca545
+<<<<<<< HEAD
 	app.yhyue.com/moapp/jypkg v0.0.0-20230627072535-2f1a67f51167
+=======
+	app.yhyue.com/moapp/jypkg v0.0.0-20230627060822-53aa53e4d064
+>>>>>>> feature/v4.8.33
 	bp.jydev.jianyu360.cn/BaseService/userCenter v1.2.13
 	github.com/SKatiyar/qr v0.0.0-20151201054752-25b6bdf44e67
 	github.com/fsnotify/fsnotify v1.6.0

+ 5 - 0
src/go.sum

@@ -9,8 +9,13 @@ app.yhyue.com/moapp/jybase v0.0.0-20230614085041-f8f20842d5cb h1:fT7FIKElKjkRHTm
 app.yhyue.com/moapp/jybase v0.0.0-20230614085041-f8f20842d5cb/go.mod h1:D40Ae0rQilH8Hc5o2Vtt04Tjh/DNEFpcS3/WkJMPJb8=
 app.yhyue.com/moapp/jylog v0.0.0-20230522075550-05d7230ca545 h1:+Lak4m1zgsigQloOsvp8AJ+0XeX/+PGp9QP550xlbBQ=
 app.yhyue.com/moapp/jylog v0.0.0-20230522075550-05d7230ca545/go.mod h1:uFrsdUBFbETiJlEmr4PtJWPsZlUpPj2bHQRhryu6ggk=
+<<<<<<< HEAD
 app.yhyue.com/moapp/jypkg v0.0.0-20230627072535-2f1a67f51167 h1:WO3F0w/jqPj5fS30rmzCvmN3F/aLmtx51Pfcps6y7+E=
 app.yhyue.com/moapp/jypkg v0.0.0-20230627072535-2f1a67f51167/go.mod h1:JBkMSnaOQbfV80laTPwjzjfP6nLXOQpJBaNUdvKV2tw=
+=======
+app.yhyue.com/moapp/jypkg v0.0.0-20230627060822-53aa53e4d064 h1:iHqmyjzumVbeWeN1f4l+cpuRBizCO/VZvOUyGD5b/EM=
+app.yhyue.com/moapp/jypkg v0.0.0-20230627060822-53aa53e4d064/go.mod h1:JBkMSnaOQbfV80laTPwjzjfP6nLXOQpJBaNUdvKV2tw=
+>>>>>>> feature/v4.8.33
 app.yhyue.com/moapp/message v0.0.0-20221223100203-6402e389d9ae h1:6rDDaz6yxvE8viTSzEBwKYOFWq14TMfuBivSazUZMz4=
 app.yhyue.com/moapp/message v0.0.0-20221223100203-6402e389d9ae/go.mod h1:b0zZHev3gmJao1Fo+2Z2KPVjsuLOJVvVxf+kCnu9WkA=
 bp.jydev.jianyu360.cn/BaseService/entManageApplication v0.0.0-20230214091519-89a98c01ab0e h1:h+VEI3o1qC0jeCzkFGTrLI4f27cfa/W/y+0sXokWMgE=

+ 50 - 21
src/jfw/front/classificationTag.go

@@ -1,27 +1,28 @@
 package front
 
 import (
-	"encoding/json"
-	"fmt"
-	"jy/src/jfw/config"
-	"jy/src/jfw/jyutil"
-	"jy/src/jfw/paging"
-	"log"
-	"math"
-	"math/rand"
-	"strconv"
-	"sync"
-	"time"
+    qu "app.yhyue.com/moapp/jybase/common"
+    "app.yhyue.com/moapp/jybase/encrypt"
+    elastic "app.yhyue.com/moapp/jybase/es"
+    "app.yhyue.com/moapp/jybase/redis"
+    "app.yhyue.com/moapp/jypkg/common/src/qfw/util/bidsearch"
+    "app.yhyue.com/moapp/jypkg/public"
+    "encoding/json"
+    "fmt"
+    "jy/src/jfw/config"
+    "jy/src/jfw/jyutil"
+    "jy/src/jfw/paging"
+    "log"
+    "math"
+    "math/rand"
+    "strconv"
+    "sync"
+    "time"
 
-	"net/http"
+    "net/http"
 
-	qu "app.yhyue.com/moapp/jybase/common"
-	"app.yhyue.com/moapp/jybase/date"
-	"app.yhyue.com/moapp/jybase/encrypt"
-	"app.yhyue.com/moapp/jybase/go-xweb/httpsession"
-	"app.yhyue.com/moapp/jybase/redis"
-	"app.yhyue.com/moapp/jypkg/common/src/qfw/util/bidsearch"
-	"app.yhyue.com/moapp/jypkg/public"
+    "app.yhyue.com/moapp/jybase/date"
+    "app.yhyue.com/moapp/jybase/go-xweb/httpsession"
 )
 
 type KeyType struct {
@@ -271,6 +272,34 @@ func GetIndustry(industryHref string) []map[string]interface{} {
 	return m
 }
 
+type BuyerList struct {
+	Name string `json:"name"`
+	Url  string `json:"url"`
+}
+
+// 热门采购单位
+func HotBuyerList(entIsNew bool) []*BuyerList {
+	// 使用当前时间作为随机数生成器的种子
+	randGen := rand.New(rand.NewSource(time.Now().UnixNano()))
+	// 获取一个范围在 [0, 100) 的随机整数
+	start := randGen.Intn(100)
+	buyerQuery := fmt.Sprintf(`{"query": {"bool": {"must": [{"exists": {"field": "name"}}]}},"from": %d,"size": %d}`, start, 200)
+	log.Println("buyerQuery:", buyerQuery)
+	data := elastic.Get("buyer", "buyer", buyerQuery)
+	if len(*data) > 0 {
+		var buyerList []*BuyerList
+		for _, b := range *data {
+			name := qu.ObjToString(b["name"])
+			buyerList = append(buyerList, &BuyerList{
+				Name: name,
+				Url:  qu.If(entIsNew, fmt.Sprintf("/entpc/unit_portrayal/%s", name), fmt.Sprintf("/swordfish/page_big_pc/unit_portrayal/%s", name)).(string),
+			})
+		}
+		return buyerList
+	}
+	return nil
+}
+
 func GetIncludedInfo() map[string]interface{} {
 	if bytes, err := redis.GetBytes(RedisNameNew, "jyIncludedInfo"); err == nil && bytes != nil {
 		rData := map[string]interface{}{}
@@ -393,8 +422,8 @@ func NewIndexbids(session *httpsession.Session, r *http.Request) []map[string]in
 	return *lists
 }
 
-//格式输出数据
-//亿亿、万亿、亿、万 只有一位的时候保留1位小数点 两位及以上不保留  1.1亿  11亿
+// 格式输出数据
+// 亿亿、万亿、亿、万 只有一位的时候保留1位小数点 两位及以上不保留  1.1亿  11亿
 func formdataNum(num int64) (floatNum float64, unit string) {
 	s_num := strconv.Itoa(int(num))
 	len_m := len(s_num)

+ 13 - 1
src/jfw/front/entsearch.go

@@ -1,6 +1,7 @@
 package front
 
 import (
+	"app.yhyue.com/moapp/jypkg/common/src/qfw/util/jy"
 	"fmt"
 	"jy/src/jfw/config"
 	"strconv"
@@ -47,6 +48,17 @@ func (e *Entsearch) PushSearchIndex() error {
 	if len(shareid) == 0 {
 		shareid = "10"
 	}
+	e.T["isLogin"] = 0
+	if userId, _ := e.GetSession("userId").(string); userId != "" {
+		userInfo := jy.GetVipState(e.Session(), *config.Middleground, userId)
+		e.T["isVip"] = userInfo.VipState > 0
+		e.T["isMember"] = userInfo.BigMember > 0
+		e.T["isEntniche"] = userInfo.EntMember > 0
+		e.T["isEntnicheNew"] = userInfo.IsNewEnt
+		e.T["isEntService"] = userInfo.EntService
+		e.T["isLogin"] = 1
+	}
+	e.T["login"] = e.Session().Get("user")
 	e.T["shareid"] = se.EncodeString(shareid)
 	e.T["searchvalue"] = e.GetString("searchvalue")
 	e.T["logid"] = config.Seoconfig["jyzbqyss"].(string)
@@ -170,7 +182,7 @@ func getSearchResult(searchvalue, area string, minprice, maxprice float64, curre
 	return count, totalPage, list
 }
 
-//异步请求方法
+// 异步请求方法
 func (e *Entsearch) PcSearchZbqyAjax() error {
 	defer util.Catch()
 	userid := util.ObjToString(e.GetSession("userId"))

+ 6 - 28
src/jfw/front/frontRouter.go

@@ -3,11 +3,11 @@ package front
 import (
 	"fmt"
 	"jy/src/jfw/config"
+	"jy/src/jfw/jyutil"
 	"jy/src/jfw/wx"
 	"net/url"
 	"regexp"
-
-	"jy/src/jfw/jyutil"
+	"strings"
 
 	"app.yhyue.com/moapp/jypkg/public"
 
@@ -190,6 +190,8 @@ func (this *CommonRouter) EntpcPage(htmlPage string) error {
 	return this.doEntpcPage()
 }
 func (this *CommonRouter) doEntpcPage() error {
+	//P325 采购单位搜索调整,未登录用户也能访问采购单位画像
+	///entpc/unit_portrayal/天津银行股份有限公司
 	userid, _ := this.GetSession("userId").(string)
 	if userid == "" {
 		return this.Redirect("/notin/page")
@@ -212,34 +214,10 @@ var bigVipFreePageReg = regexp.MustCompile(`set_.*|free|unit_portrayal|analysis_
 func (this *CommonRouter) doPcBigPage(pageSign, types string) error {
 	//page := pageSign
 	userid, _ := this.GetSession("userId").(string)
-	//没有登录跳转登录页面
-	if userid == "" {
+	//没有登录跳转登录页面(采购单位画像除外)
+	if !strings.Contains(pageSign, "unit_portrayal") && userid == "" {
 		return this.Redirect("/notin/page")
 	}
-	//没有购买大会员跳转大会员介绍页(PC端订阅列表 所有用户都能进去)
-	//if !strings.HasPrefix(pageSign, "svip/ent_ser_portrait") && pageSign != "big_subscribe" {
-	// for _, v := range strings.Split(pageSign, "/") {
-	// 	if v == "" || v == "desktop" {
-	// 		continue
-	// 	}
-	// 	pageSign = v
-	// 	break
-	// }
-	//bigBaseMsg := jy.GetBigVipUserBaseMsg(userid, public.Mysql, public.MQFW)
-	// if !bigVipFreePageReg.MatchString(pageSign) && pageSign != "index" {
-	// 	if bigBaseMsg.Status <= 0 && bigBaseMsg.Vip_BuySet.Upgrade != 1 {
-	// 		return this.Redirect("/big/page/index")
-	// 	}
-	// 	//大会员页面权限判断
-	// 	if pageSign != "" && !bigBaseMsg.CheckBigVipFrontPower(pageSign) {
-	// 		return this.Redirect("/big/page/index")
-	// 	}
-	// }
-	//限制超级订阅用户不能进入购买页
-	//if page == "free/svip/buy" && bigBaseMsg.VipStatus > 0 && types != "upgrade" {
-	//	return this.Redirect("/front/subscribe.html")
-	//}
-	//}
 	return this.Render(fmt.Sprintf("/frontRouter/pc/page_big_pc/sess/index.html"))
 }
 

+ 7 - 0
src/jfw/front/pcIndex.go

@@ -107,6 +107,11 @@ func (m *PcIndex) NewSordfish(flag string) error {
 		} else if flag == "tmp" {
 			return m.Render("/pc/index_tmp.html", &m.T)
 		} else {
+			var entIsNew bool
+			if m.GetSession("userId") != "" {
+				bigBaseMsg := jy.GetBigVipUserBaseMsg(m.Session(), *config.Middleground)
+				entIsNew = bigBaseMsg.EntIsNew
+			}
 			//按地区、信息类型、热门招标
 			for k, v := range RegionAndInformationAndTender() {
 				m.T[k] = v
@@ -117,6 +122,8 @@ func (m *PcIndex) NewSordfish(flag string) error {
 			m.T["recommend"] = ContentRecommendation()
 			//推荐标讯专区
 			m.T["recommendBeacon"] = RecommendationBeacon()
+			//热门采购单位
+			m.T["hotBuyers"] = HotBuyerList(entIsNew)
 			m.T["hasLogin"] = util.ObjToString(m.GetSession("userId")) != ""
 			m.T["includedInfo"] = GetIncludedInfo()
 			m.T["newbids"] = NewIndexbids(m.Session(), m.Request)

+ 249 - 71
src/jfw/front/shorturl.go

@@ -11,18 +11,17 @@ import (
 	"net/url"
 	"strconv"
 
+	"github.com/gogf/gf/v2/util/gconv"
+
 	"jy/src/jfw/jyutil"
 
 	"app.yhyue.com/moapp/jypkg/public"
 
 	util "app.yhyue.com/moapp/jybase/common"
 	"app.yhyue.com/moapp/jybase/date"
-
-	. "app.yhyue.com/moapp/jybase/mongodb"
+	mg "app.yhyue.com/moapp/jybase/mongodb"
 
 	elastic "app.yhyue.com/moapp/jybase/es"
-	"app.yhyue.com/moapp/jybase/fsw"
-
 	"regexp"
 	"strings"
 	"time"
@@ -43,19 +42,44 @@ type Short struct {
 	nologinArticle xweb.Mapper `xweb:"/nologin/(\\w+)/(.*).html"`   //([pm]) 无需登录
 }
 
-var mobileReg = regexp.MustCompile("(?i)(Android|Mobile|Phone)")
-var DateFullLayout = "2006-01-02 15:04:05"
-var Map_stype = map[string]bool{
-	"content":         true,
-	"entservice":      true,
-	"bdprivate":       true,
-	"mailprivate":     true,
-	"bdcontent":       true,
-	"indexcontent":    true,
-	"advancedProject": true,
-}
-
-var seoAgentReg = regexp.MustCompile("Baiduspider|360Spider|bingbot|Googlebot")
+var (
+	mobileReg      = regexp.MustCompile("(?i)(Android|Mobile|Phone)")
+	DateFullLayout = "2006-01-02 15:04:05"
+	Map_stype      = map[string]bool{
+		"content":         true,
+		"entservice":      true,
+		"bdprivate":       true,
+		"mailprivate":     true,
+		"bdcontent":       true,
+		"indexcontent":    true,
+		"advancedProject": true,
+	}
+	seoAgentReg      = regexp.MustCompile("Baiduspider|360Spider|bingbot|Googlebot")
+	detailNeedMosaic map[string]interface{}
+	TypeCodeMap      = map[string]string{
+		"拟建":   "拟建项目",
+		"采购意向": "采购意向",
+		"预告":   "招标预告",
+		"预审":   "资格预审",
+		"预审结果": "资格预审结果",
+		"论证意见": "论证意见",
+		"需求公示": "需求公示",
+		"招标":   "公开招标",
+		"邀标":   "邀请招标",
+		"询价":   "询价采购",
+		"竞谈":   "竞争性谈判",
+		"单一":   "单一来源采购",
+		"竞价":   "竞价公告",
+		"变更":   "变更公告",
+		"中标":   "中标公示",
+		"成交":   "成交公告",
+		"废标":   "废标公告",
+		"流标":   "流标公告",
+		"合同":   "合同公告信息",
+		"验收":   "验收公告信息",
+		"违规":   "违规信息",
+	}
+)
 
 func (s *Short) Article(stype, id string) error {
 	userId, _ := s.GetSession("userId").(string)
@@ -150,6 +174,8 @@ func (s *Short) LoginCommon(userId, stype, id string) error {
 						retMap["subtype"], _ = obj["subtype"].(string)
 						retMap["subscopeclass"], _ = obj["s_subscopeclass"].(string)
 						retMap["publishtime"] = util.IntAll(obj["publishtime"])
+						retMap["keywords"] = KeyWordHandle(obj)
+						retMap["description"] = DescriptionHandle(stype, obj)
 					}
 					s.T["shareid"] = config.Seoconfig["baiduSEM-p"].(string)
 					s.T["logid"] = config.Seoconfig["baiduSEM-p"].(string)
@@ -231,11 +257,11 @@ func (s *Short) LoginCommon(userId, stype, id string) error {
 					obj["publishtimeShorDate"] = time.Unix(util.Int64All(obj["publishtime"]), 0).Format(date.Date_Short_Layout)
 				}
 				s.T["url"] = s.Uri()
+				obj["keywords"] = KeyWordHandle(obj)
+				obj["description"] = DescriptionHandle(stype, obj)
 				s.T["obj"] = obj
-
 				content, _ := s.Render4Cache("/pc/biddetail_rec.html", &s.T)
-				timeout := 60 * 20
-				redis.Put("newother", catchKey, string(content), timeout)
+				redis.Put("newother", catchKey, string(content), 60*20)
 				return s.SetBody(content)
 			}
 		} else {
@@ -250,7 +276,7 @@ func (s *Short) LoginCommon(userId, stype, id string) error {
 	if userId == "" && ssOpenid != nil {
 		res, ok = mongodb.FindOneByField("user", bson.M{"s_m_openid": ssOpenid, "s_unionid": bson.M{"$ne": ssOpenid}}, `{"i_vip_status":1,"i_member_status":1,"s_m_phone":1,"s_phone":1,"l_vip_starttime":1}`)
 		if ok {
-			userId = BsonIdToSId((*res)["_id"])
+			userId = mg.BsonIdToSId((*res)["_id"])
 		}
 	} else if userId != "" {
 		//判断用户是否是vip
@@ -334,7 +360,7 @@ func (s *Short) LoginCommon(userId, stype, id string) error {
 		canRead := false
 		if ((isVip && isOldVip) || isMember || isEntniche) || //老版本vip、大会员、商机管理
 			((isVip && !isOldVip) && (!(util.ObjToString(obj["subtype"]) == "拟建" || util.ObjToString(obj["subtype"]) == "采购意向"))) || //新超级订阅非采购意向”和“拟建项目”
-			stype == "mailprivate" || stype == "indexcontent" { //邮箱推送
+			stype == "mailprivate" || stype == "indexcontent" || stype == "bdprivate" { //邮箱推送
 			canRead = true
 		} else {
 			canRead = SeeDetailLimit(obj, userId, sid)
@@ -418,6 +444,8 @@ func (s *Short) LoginCommon(userId, stype, id string) error {
 			s.T["advertUrl"] = config.Sysconfig["advertUrl"]
 			s.T["canRead"] = canRead
 			obj["industry"] = industry
+			obj["keywords"] = KeyWordHandle(obj)
+			obj["description"] = DescriptionHandle(stype, obj)
 			s.T["obj"] = obj
 			//获取打赏文案
 			s.T["rewardText"], s.T["advertText"] = getRewardText()
@@ -453,7 +481,7 @@ func (s *Short) LoginCommon(userId, stype, id string) error {
 			var node bool
 			if ((isVip && isOldVip) || isMember || isEntniche) || //老版本vip、大会员、商机管理
 				((isVip && !isOldVip) && (!(util.ObjToString(obj["subtype"]) == "拟建" || util.ObjToString(obj["subtype"]) == "采购意向"))) || //新超级订阅非采购意向”和“拟建项目”
-				stype == "mailprivate" || stype == "indexcontent" { //邮箱推送
+				stype == "mailprivate" || stype == "indexcontent" || stype == "bdprivate" { //邮箱推送
 				node = true
 			} else {
 				_, _, _, objc := pcVRT(sid, indust, stype, isVip || isMember || isEntniche)
@@ -560,7 +588,8 @@ func (s *Short) LoginCommon(userId, stype, id string) error {
 			if ssOpenid != nil {
 				obj["ucbsId"] = encrypt.EncodeArticleId2ByCheck("ucbs#" + ssOpenid.(string) + "#" + id)
 			}
-
+			obj["keywords"] = KeyWordHandle(obj)
+			obj["description"] = DescriptionHandle(stype, obj)
 			s.T["obj"] = obj
 			s.T["url"] = s.Uri()
 			return s.Render("/pc/biddetail_rec.html", &s.T)
@@ -674,7 +703,7 @@ func UserPermission(userId string, ssOpenid interface{}) (bool, bool, bool) {
 	)
 	if userId == "" && ssOpenid != nil {
 		res, _ = mongodb.FindOneByField("user", bson.M{"s_m_openid": ssOpenid, "s_unionid": bson.M{"$ne": ssOpenid}}, `{"i_vip_status":1,"i_member_status":1,"s_m_phone":1,"s_phone":1}`)
-		userId = BsonIdToSId((*res)["_id"])
+		userId = mg.BsonIdToSId((*res)["_id"])
 	} else {
 		//判断用户是否是vip
 		res = jyutil.Compatible.Select(userId, `{"i_vip_status":1,"i_member_status":1,"s_m_phone":1,"s_phone":1}`)
@@ -882,7 +911,7 @@ func getwinnertel(company interface{}) string {
 func GetUserId(openid string) string {
 	data, ok := public.MQFW.FindOne("user", map[string]interface{}{"s_m_openid": openid})
 	if data != nil && len(*data) > 0 && ok {
-		userid := BsonIdToSId((*data)["_id"])
+		userid := mg.BsonIdToSId((*data)["_id"])
 		return userid
 	}
 	return ""
@@ -925,30 +954,57 @@ func ReplaceStringByRegex(str, rule, replace string) (string, error) {
 // 未登录用户进行数据过滤 name 配置文件
 func Filter(obj map[string]interface{}) map[string]interface{} {
 	detail := fmt.Sprint(obj["detail"])
-	mosaicText := util.ObjToString(config.Sysconfig["detailMosaicTxt"])
-	for k, _ := range obj {
-		needMosaic, _ := config.Sysconfig["needMosaic"].(map[string]interface{})
-		if ok, _ := needMosaic[k].(bool); ok {
-			if util.ObjToString(obj[k]) != "" {
-				detail = strings.ReplaceAll(detail, util.ObjToString(obj[k]), mosaicText)
-				//敏感词过滤
+	mosaicText := fmt.Sprintf(`<span style="color:#2ABED1;">%s</span>`, util.ObjToString(config.Sysconfig["detailMosaic"]))
+	detailText := fmt.Sprintf(`<span class="noLoginMosaic" style="color: #2ABED1;">%s</span>`, util.ObjToString(config.Sysconfig["detailMosaic"]))
+	//for k, _ := range obj {
+	//	if ok, _ := detailNeedMosaic[k].(bool); ok {
+	//		if util.ObjToString(obj[k]) != "" {
+	//			detail = strings.ReplaceAll(detail, util.ObjToString(obj[k]), detailText)
+	//		}
+	//		//中标企业信息
+	//		if k == "winnerMap" && obj[k] != nil {
+	//			winnerNewMap := map[string]interface{}{}
+	//			winnerMap := util.ObjToMap(obj[k])
+	//			for _, wv := range *winnerMap {
+	//				winnerNewMap[mosaicText] = wv
+	//			}
+	//			obj[k] = winnerNewMap
+	//		} else {
+	//			obj[k] = mosaicText
+	//		}
+	//	}
+	//}
+	//
+	for dk, dv := range detailNeedMosaic {
+		if !dv.(bool) {
+			continue
+		}
+		//if util.ObjToString(obj[dk]) != "" {
+		//	detail = strings.ReplaceAll(detail, util.ObjToString(obj[dk]), detailText)
+		//}
+		if util.InterfaceToStr(obj[dk]) != "" {
+			value, b := obj[dk].(float64)
+			if b {
+				replaceStr := fmt.Sprintf("%v", int64(value))
+				detail = strings.ReplaceAll(detail, replaceStr, detailText)
+			} else {
+				detail = strings.ReplaceAll(detail, util.InterfaceToStr(obj[dk]), detailText)
 			}
-			if k == "winnerMap" {
-				winnerMap, _ := obj[k].(map[string]interface{})
-				mosaicMap := map[string]interface{}{}
-				for i := 0; i < len(winnerMap); i++ {
-					mosaicMap[mosaicText] = mosaicText
+		}
+		//中标企业信息
+		if dk == "winnerMap" {
+			winnerNewMap := map[string]interface{}{}
+			if obj[dk] != nil {
+				winnerMap := util.ObjToMap(obj[dk])
+				for _, wv := range *winnerMap {
+					winnerNewMap[mosaicText] = wv
 				}
-				obj["winnerMap"] = mosaicMap
-			} else {
-				obj[k] = mosaicText
 			}
-
+			obj[dk] = winnerNewMap
+		} else {
+			obj[dk] = mosaicText
 		}
 	}
-	//数字打码
-	detail = RegDetail(detail)
-	detail = fsw.Repl(detail)
 	obj["detail"] = detail
 	return obj
 }
@@ -956,31 +1012,53 @@ func Filter(obj map[string]interface{}) map[string]interface{} {
 // 未登录用户进行数据过滤 name 配置文件
 func SearchFilter(obj map[string]interface{}) map[string]interface{} {
 	//detail := fmt.Sprint(obj["detail"])
-	mosaicText := util.ObjToString(config.Sysconfig["detailMosaicTxt"])
-	for k, _ := range obj {
-		needMosaic, _ := config.Sysconfig["searchMosaic"].(map[string]interface{})
-		if ok, _ := needMosaic[k].(bool); ok {
-			//if util.ObjToString(obj[k]) != "" {
-			//	detail = strings.ReplaceAll(detail, util.ObjToString(obj[k]), mosaicText)
-			//	//敏感词过滤
-			//}
-			if k == "winnerMap" {
-				winnerMap, _ := obj[k].(map[string]interface{})
-				mosaicMap := map[string]interface{}{}
-				for i := 0; i < len(winnerMap); i++ {
-					mosaicMap[mosaicText] = mosaicText
-				}
-				obj["winnerMap"] = mosaicMap
-			} else {
-				obj[k] = mosaicText
-			}
-
-		}
-	}
+	//mosaicText := fmt.Sprintf(`<span style="cursor:pointer;">%s</span>`, util.ObjToString(config.Sysconfig["detailMosaic"]))
+	//for k, _ := range obj {
+	//	needMosaic, _ := config.Sysconfig["detailNeedMosaic"].(map[string]interface{})
+	//	if ok, _ := needMosaic[k].(bool); ok {
+	//		//if util.ObjToString(obj[k]) != "" {
+	//		//	detail = strings.ReplaceAll(detail, util.ObjToString(obj[k]), mosaicText)
+	//		//	//敏感词过滤
+	//		//}
+	//		if k == "winnerMap" {
+	//			winnerMap, _ := obj[k].(map[string]interface{})
+	//			mosaicMap := map[string]interface{}{}
+	//			for i := 0; i < len(winnerMap); i++ {
+	//				mosaicMap[mosaicText] = mosaicText
+	//			}
+	//			obj["winnerMap"] = mosaicMap
+	//		} else {
+	//			obj[k] = mosaicText
+	//		}
+	//
+	//	}
+	//}
 	//数字打码
 	//detail = RegDetail(detail)
 	//detail = fsw.Repl(detail)
 	//obj["detail"] = detail
+
+	if detailNeedMosaic == nil {
+		detailNeedMosaic, _ = config.Sysconfig["detailNeedMosaic"].(map[string]interface{})
+	}
+	for dk, dv := range detailNeedMosaic {
+		if !dv.(bool) {
+			continue
+		}
+		//中标企业信息
+		if dk == "winnerMap" {
+			winnerNewMap := map[string]interface{}{}
+			if obj[dk] != nil {
+				winnerMap := util.ObjToMap(obj[dk])
+				for _, wv := range *winnerMap {
+					winnerNewMap[util.ObjToString(config.Sysconfig["detailMosaic"])] = wv
+				}
+			}
+			obj[dk] = winnerNewMap
+		} else {
+			obj[dk] = util.ObjToString(config.Sysconfig["detailMosaic"])
+		}
+	}
 	return obj
 }
 
@@ -994,6 +1072,9 @@ func (s *Short) NologinArticle(stype, id string) error {
 	if userId != "" { //已登录用户直接跳转至正常三级页
 		return s.LoginCommon(userId, stype, id)
 	}
+	if detailNeedMosaic == nil {
+		detailNeedMosaic, _ = config.Sysconfig["detailNeedMosaic"].(map[string]interface{})
+	}
 	return s.NologinCommon(userId, stype, id, sids[0])
 }
 
@@ -1008,9 +1089,10 @@ func (s *Short) NologinCommon(userId, stype, id, sid string) error {
 		}
 		s.T["logid"] = config.Seoconfig["jysskzy"].(string)
 		s.T["shareid"] = se.EncodeString(shareid)
-		s.T["keywords"] = s.GetString("kds")
+		//s.T["keywords"] = s.GetString("kds")
+
 		s.DisableHttpCache()
-		po, bo, wo, obj := pcVRT(sid, industry, stype, false || false || false)
+		po, bo, wo, obj := pcVRT(sid, industry, stype, false)
 		if obj != nil && len(obj) > 0 {
 			if len(po) > 0 {
 				s.T["projectOther"] = po
@@ -1024,6 +1106,7 @@ func (s *Short) NologinCommon(userId, stype, id, sid string) error {
 			FieldProcessing(obj, "", industry, id, "", userId, stype, false)
 			obj["urlpath"] = s.Uri()
 			obj["industry"] = industry
+
 			if userId == "" {
 				obj["winnerTitle"] = obj["winner"]
 				obj["buyerTitle"] = obj["buyer"]
@@ -1031,19 +1114,21 @@ func (s *Short) NologinCommon(userId, stype, id, sid string) error {
 				obj["projectcodeTitle"] = obj["projectcode"]
 				log.Println(time.Now().UnixNano())
 				obj = Filter(obj)
-				obj["description"] = fmt.Sprintf("%s,%s。", obj["title"], baseInfo(obj))
+				//obj["description"] = fmt.Sprintf("%s,%s。", obj["title"], baseInfo(obj))
 			}
+			obj["agency"] = ""
 			if obj["publishtime"] != nil {
 				obj["publishtimeShorDate"] = time.Unix(util.Int64All(obj["publishtime"]), 0).Format(date.Date_Short_Layout)
 			}
+			obj["keywords"] = KeyWordHandle(obj)
+			obj["description"] = DescriptionHandle("nologin", obj)
 			s.T["obj"] = obj
 			s.T["url"] = s.Uri()
 			s.T["newBidInfoList"] = tg.GetNewBidInfo()
 			s.T["industryInfoList"] = tg.GetConsult()
 			s.T["hotLabelList"] = tg.GetHotLabel(30)
 			content, _ := s.Render4Cache("/pc/tags/detail.html", &s.T)
-			timeout := 60 * 60 * 24
-			redis.Put("newother", catchKey, string(content), timeout)
+			redis.Put("newother", catchKey, string(content), 60*2)
 			return s.SetBody(content)
 		}
 	} else {
@@ -1121,3 +1206,96 @@ func RegDetail(html string) string {
 	}
 	return ""
 }
+
+func KeyWordHandle(obj map[string]interface{}) string {
+	keywordArr := []string{}
+	owner := util.InterfaceToStr(obj["owner"])
+	buyer := util.InterfaceToStr(obj["buyer"])
+	if buyer == "" {
+		buyer = owner
+	}
+	if buyer != "" && buyer != config.Sysconfig["detailMosaicTxt"] {
+		keywordArr = append(keywordArr, buyer)
+	}
+	if util.InterfaceToStr(obj["s_winner"]) != "" && util.InterfaceToStr(obj["s_winner"]) != config.Sysconfig["detailMosaicTxt"] {
+		keywordArr = append(keywordArr, util.InterfaceToStr(obj["s_winner"]))
+	}
+	if obj["purchasinglist"] != nil && obj["purchasinglist"] != "" {
+		i := 0
+		for _, v := range gconv.SliceMap(obj["purchasinglist"]) {
+			if i == 5 {
+				break
+			}
+			if util.InterfaceToStr(v["itemname"]) != "" && util.InterfaceToStr(obj["s_winner"]) != config.Sysconfig["detailMosaicTxt"] {
+				keywordArr = append(keywordArr, util.InterfaceToStr(v["itemname"]))
+				i++
+			}
+		}
+	}
+	if util.InterfaceToStr(obj["subtype"]) != "" && util.InterfaceToStr(obj["subtype"]) != "其它" {
+		keywordArr = append(keywordArr, TypeCodeMap[util.InterfaceToStr(obj["subtype"])])
+	}
+	if util.InterfaceToStr(obj["area"]) != "" {
+		keywordArr = append(keywordArr, util.InterfaceToStr(obj["area"])+"招标")
+	}
+	if util.InterfaceToStr(obj["city"]) != "" {
+		keywordArr = append(keywordArr, util.InterfaceToStr(obj["city"])+"招标")
+	}
+	keywordArr = append(keywordArr, "剑鱼标讯")
+	keyword := strings.Join(keywordArr, ",")
+	return keyword
+}
+func DescriptionHandle(stype string, obj map[string]interface{}) string {
+	description := ""
+	publishtime := util.Int64All(obj["l_publishtime"])
+	if publishtime == 0 {
+		publishtime = util.Int64All(obj["publishtime"])
+	}
+	pushTime := time.Unix(publishtime, 0)
+	title := util.InterfaceToStr(obj["title"])
+	owner := util.InterfaceToStr(obj["owner"])
+	buyer := util.InterfaceToStr(obj["buyer"])
+	if buyer == "" {
+		buyer = owner
+	}
+	s_winner := util.InterfaceToStr(obj["s_winner"])
+	area := util.InterfaceToStr(obj["area"])
+	city := util.InterfaceToStr(obj["city"])
+	if stype == "bdprivate" {
+		//bdprivate
+		//{项目标题},采购单位:{采购单位名称},成交供应商:{中标企业名称},公告日期:{公告日期}。
+		descriptionArr := []string{}
+		if title != "" {
+			descriptionArr = append(descriptionArr, title)
+		}
+		if buyer != "" {
+			descriptionArr = append(descriptionArr, fmt.Sprintf("采购单位:%s", buyer))
+		}
+		if s_winner != "" {
+			descriptionArr = append(descriptionArr, fmt.Sprintf("成交供应商:%s", s_winner))
+		}
+		if publishtime != 0 {
+			descriptionArr = append(descriptionArr, fmt.Sprintf("公告日期:%s", pushTime.Format("2006年01月02日")))
+		}
+		descriptionArr = append(descriptionArr, "查看该项目信息详情请访问剑鱼标讯官网。")
+		description = strings.Join(descriptionArr, ",")
+	} else {
+		//descriptionStr = "%s,项目所属地区是%s%s,项目采购单位是%s,项目发布时间是%s"
+		descriptionArr := []string{}
+		if title != "" {
+			descriptionArr = append(descriptionArr, title)
+		}
+		if area != "" || city != "" {
+			descriptionArr = append(descriptionArr, fmt.Sprintf("项目所属地区是%s%s", area, city))
+		}
+		if buyer != "" {
+			descriptionArr = append(descriptionArr, fmt.Sprintf("项目采购单位是%s", buyer))
+		}
+		if publishtime != 0 {
+			descriptionArr = append(descriptionArr, fmt.Sprintf("项目发布时间是%s", pushTime.Format("2006年01月02日")))
+		}
+		descriptionArr = append(descriptionArr, "查看该项目信息详情请访问剑鱼标讯官网。")
+		description = strings.Join(descriptionArr, ",")
+	}
+	return description
+}

+ 3 - 3
src/jfw/front/swordfish.go

@@ -691,13 +691,13 @@ func wxvisitD(sid, userId, openId, content string, isPayUser bool) (objdata map[
 
 // wx pc obj字段统一处理
 func ObjData(isPayUser bool, sid, content string, lent int) (t bool, obj map[string]interface{}) {
-	brobj, ok := mongodb.Find("bidding_rec", bson.M{"s_id": sid}, `{"l_recoverydate":-1}`, public.MgoBiddingFields, false, 0, 1)
+	brobj, ok := mongodb.Find("bidding_rec", bson.M{"s_id": sid}, `{"l_recoverydate":-1}`, nil, false, 0, 1)
 	if ok && (*brobj) != nil && len(*brobj) == 1 && (*brobj)[0] != nil {
 		obj = (*brobj)[0]
 	} else {
-		aobj, ok := public.Mgo_Bidding.FindById(public.DbConf.Mongodb.Bidding.Collection, sid, public.MgoBiddingFields)
+		aobj, ok := public.Mgo_Bidding.FindById(public.DbConf.Mongodb.Bidding.Collection, sid, nil)
 		if ok && (aobj == nil || *aobj == nil || len(*aobj) == 0) {
-			aobj, ok = public.Mgo_Bidding.FindById(public.DbConf.Mongodb.Bidding.Collection_back, sid, public.MgoBiddingFields)
+			aobj, ok = public.Mgo_Bidding.FindById(public.DbConf.Mongodb.Bidding.Collection_back, sid, nil)
 		}
 		obj = *aobj
 	}

+ 4 - 4
src/jfw/front/tags.go

@@ -408,7 +408,7 @@ func (this *Tags) GetIndustry(industryHref string) interface{} {
 				v: industryMap[v],
 			})
 		}
-		redis.Put("other", rediskey, m, 2*60*60)
+		redis.Put("other", rediskey, m, 2*60)
 		return m
 	}
 	return nil
@@ -493,7 +493,7 @@ func (this *Tags) GetStype(href string) (list []map[string]interface{}) {
 			}
 		}
 		list = m
-		redis.Put("other", rediskey, list, 2*60*60)
+		redis.Put("other", rediskey, list, 2*60)
 	}
 	return list
 }
@@ -677,8 +677,8 @@ func (this *Tags) GetBidding(industry, area, city, stype, keyword string, reques
 					industry = strings.Split(industry, "_")[0]
 				}
 				public.BidListConvert(industry, datas)
-				redis.Put("other", rediskey, datas, 2*60*60)
-				redis.Put("other", rediskeyCount, count, 2*60*60)
+				redis.Put("other", rediskey, datas, 2*60)
+				redis.Put("other", rediskeyCount, count, 2*60)
 				return *datas, count, false
 			}
 		}

+ 2 - 0
src/jfw/modules/app/src/app/filter/loginfilter.go

@@ -26,6 +26,8 @@ var urls = []*regexp.Regexp{
 	regexp.MustCompile("^/jyapp/exhibition/.*"),
 	regexp.MustCompile("^/jyapp/bank/scheme"),
 	regexp.MustCompile("^/jyapp/datasmt"),
+	regexp.MustCompile("^/jyapp/big/page/unit_portrayal"),
+	regexp.MustCompile("^/jyapp/big/page/free_high_set"),
 }
 
 type loginFilter struct {

+ 1 - 1
src/jfw/modules/app/src/app/front/bigMember.go

@@ -16,7 +16,7 @@ type NewBigMemberAction struct {
 	powerClear     xweb.Mapper `xweb:"/jyapp/bigMember/powerClear"` //大会员清除redis 服务id缓存
 }
 
-var freePageReg = regexp.MustCompile(`full|landingPage|pro_follow_detail|buy_commit|push_setting_detail|land_setting|push_settings|contrast|orderdetail_.*|write_infor|init|set_.*|ontrial_commit|bid_.*|free_.*|ent_portrait|bigvip_subreport_.*|report_detail_.*|analysis_(search|filter)|client_*|pro_follow_list|report_analysis|report_table`)
+var freePageReg = regexp.MustCompile(`full|landingPage|pro_follow_detail|buy_commit|push_setting_detail|land_setting|push_settings|contrast|orderdetail_.*|write_infor|init|set_.*|ontrial_commit|bid_.*|free_.*|ent_portrait|bigvip_subreport_.*|report_detail_.*|analysis_(search|filter)|client_*|pro_follow_list|report_analysis|report_table|unit_portrayal`)
 
 func init() {
 	jy.InitBigVipService(public.Mysql)

+ 166 - 21
src/jfw/modules/app/src/app/front/shorturl.go

@@ -11,9 +11,10 @@ import (
 	"strings"
 	"time"
 
+	"github.com/gogf/gf/v2/util/gconv"
+
 	"app.yhyue.com/moapp/jybase/date"
 	"app.yhyue.com/moapp/jybase/encrypt"
-	"app.yhyue.com/moapp/jybase/fsw"
 
 	//"math/rand"
 	. "jy/src/jfw/modules/app/src/app/jyutil"
@@ -39,6 +40,29 @@ func init() {
 
 var DateFullLayout = "2006-01-02 15:04:05"
 var suffix_msgt = "_SX"
+var TypeCodeMap = map[string]string{
+	"拟建":   "拟建项目",
+	"采购意向": "采购意向",
+	"预告":   "招标预告",
+	"预审":   "资格预审",
+	"预审结果": "资格预审结果",
+	"论证意见": "论证意见",
+	"需求公示": "需求公示",
+	"招标":   "公开招标",
+	"邀标":   "邀请招标",
+	"询价":   "询价采购",
+	"竞谈":   "竞争性谈判",
+	"单一":   "单一来源采购",
+	"竞价":   "竞价公告",
+	"变更":   "变更公告",
+	"中标":   "中标公示",
+	"成交":   "成交公告",
+	"废标":   "废标公告",
+	"流标":   "流标公告",
+	"合同":   "合同公告信息",
+	"验收":   "验收公告信息",
+	"违规":   "违规信息",
+}
 
 func (s *Short) Article(stype, id string) error {
 	//先判断是否有session
@@ -267,6 +291,8 @@ func (s *Short) Article(stype, id string) error {
 		s.T["advertName"] = config.Sysconfig["advertName"]
 		s.T["advertUrl"] = config.Sysconfig["advertUrl"]
 		obj["industry"] = industry
+		obj["keywords"] = KeyWordHandle(obj)
+		obj["description"] = DescriptionHandle(stype, obj)
 		s.T["obj"] = obj
 		s.T["isIosExam"], s.T["isIosExamPhone"], _, _ = IosExamInfo(s.Action, false, false)
 		content, err := s.Render4Cache("/weixin/wxinfocontent.html", &s.T)
@@ -333,8 +359,10 @@ func NoLoginArticle(stype, sid string) map[string]interface{} {
 		obj["buyerTitle"] = obj["buyer"]
 		obj["projectnameTitle"] = obj["projectname"]
 		obj["projectcodeTitle"] = obj["projectcode"]
+		obj["keywords"] = KeyWordHandle(obj)
+		obj["description"] = DescriptionHandle("nologin", obj)
 		obj = Filter(obj)
-		redis.Put("other", catchKey, obj, 60*60*2)
+		redis.Put("other", catchKey, obj, 60*2)
 	}
 	return obj
 }
@@ -342,30 +370,58 @@ func NoLoginArticle(stype, sid string) map[string]interface{} {
 // 未登录用户进行数据过滤
 func Filter(obj map[string]interface{}) map[string]interface{} {
 	detail := fmt.Sprint(obj["detail"])
-	mosaicText := util.ObjToString(config.Sysconfig["detailMosaicTxt"])
-	for k, _ := range obj {
-		needMosaic, _ := config.Sysconfig["needMosaic"].(map[string]interface{})
-		if ok, _ := needMosaic[k].(bool); ok {
-			if util.ObjToString(obj[k]) != "" {
-				detail = strings.ReplaceAll(detail, util.ObjToString(obj[k]), mosaicText)
-				//敏感词过滤
+	//mosaicText := fmt.Sprintf(`<span class="noLoginMosaic">%s</span>`, util.ObjToString(config.Sysconfig["detailMosaic"]))
+	mosaicText := fmt.Sprintf(`<span style="color: #2ABED1;">%s</span>`, util.ObjToString(config.Sysconfig["detailMosaic"]))
+	detailText := fmt.Sprintf(`<span class="noLoginMosaic" style="color: #2ABED1;">%s</span>`, util.ObjToString(config.Sysconfig["detailMosaic"]))
+	detailNeedMosaic, _ := config.Sysconfig["detailNeedMosaic"].(map[string]interface{})
+	//for k, _ := range obj {
+	//	if ok, _ := detailNeedMosaic[k].(bool); ok {
+	//		if util.ObjToString(obj[k]) != "" {
+	//			detail = strings.ReplaceAll(detail, util.ObjToString(obj[k]), detailText)
+	//		}
+	//		//中标企业信息
+	//		if k == "winnerMap" && obj[k] != nil {
+	//			winnerNewMap := map[string]interface{}{}
+	//			winnerMap := util.ObjToMap(obj[k])
+	//			for _, wv := range *winnerMap {
+	//				winnerNewMap[mosaicText] = wv
+	//			}
+	//			obj[k] = winnerNewMap
+	//		} else {
+	//			obj[k] = mosaicText
+	//		}
+	//	}
+	//}
+	for dk, dv := range detailNeedMosaic {
+		if !dv.(bool) {
+			continue
+		}
+		//if util.ObjToString(obj[dk]) != "" {
+		//	detail = strings.ReplaceAll(detail, util.ObjToString(obj[dk]), detailText)
+		//}
+		if util.InterfaceToStr(obj[dk]) != "" {
+			value, b := obj[dk].(float64)
+			if b {
+				replaceStr := fmt.Sprintf("%v", int64(value))
+				detail = strings.ReplaceAll(detail, replaceStr, detailText)
+			} else {
+				detail = strings.ReplaceAll(detail, util.InterfaceToStr(obj[dk]), detailText)
 			}
-			if k == "winnerMap" {
-				winnerMap, _ := obj[k].(map[string]interface{})
-				mosaicMap := map[string]interface{}{}
-				for i := 0; i < len(winnerMap); i++ {
-					mosaicMap[mosaicText] = mosaicText
+		}
+		//中标企业信息
+		if dk == "winnerMap" {
+			winnerNewMap := map[string]interface{}{}
+			if obj[dk] != nil {
+				winnerMap := util.ObjToMap(obj[dk])
+				for _, wv := range *winnerMap {
+					winnerNewMap[mosaicText] = wv
 				}
-				obj["winnerMap"] = mosaicMap
-			} else {
-				obj[k] = mosaicText
 			}
-
+			obj[dk] = winnerNewMap
+		} else {
+			obj[dk] = mosaicText
 		}
 	}
-	//数字打码
-	detail = RegDetail(detail)
-	detail = fsw.Repl(detail)
 	obj["detail"] = detail
 	return obj
 }
@@ -612,3 +668,92 @@ func baseInfo(obj map[string]interface{}) string {
 	}
 	return info
 }
+func KeyWordHandle(obj map[string]interface{}) string {
+	keywordArr := []string{}
+	owner := util.InterfaceToStr(obj["owner"])
+	buyer := util.InterfaceToStr(obj["buyer"])
+	if buyer == "" {
+		buyer = owner
+	}
+	if buyer != "" && buyer != config.Sysconfig["detailMosaicTxt"] {
+		keywordArr = append(keywordArr, util.InterfaceToStr(obj["buyer"]))
+	}
+	if util.InterfaceToStr(obj["s_winner"]) != "" && util.InterfaceToStr(obj["s_winner"]) != config.Sysconfig["detailMosaicTxt"] {
+		keywordArr = append(keywordArr, util.InterfaceToStr(obj["s_winner"]))
+	}
+	if obj["purchasinglist"] != nil && obj["purchasinglist"] != "" {
+		i := 0
+		for _, v := range gconv.SliceMap(obj["purchasinglist"]) {
+			if i == 5 {
+				break
+			}
+			if util.InterfaceToStr(v["itemname"]) != "" && util.InterfaceToStr(obj["s_winner"]) != config.Sysconfig["detailMosaicTxt"] {
+				keywordArr = append(keywordArr, util.InterfaceToStr(v["itemname"]))
+				i++
+			}
+		}
+	}
+	if util.InterfaceToStr(obj["subtype"]) != "" && util.InterfaceToStr(obj["subtype"]) != "其它" {
+		keywordArr = append(keywordArr, TypeCodeMap[util.InterfaceToStr(obj["subtype"])])
+	}
+	if util.InterfaceToStr(obj["area"]) != "" {
+		keywordArr = append(keywordArr, util.InterfaceToStr(obj["area"])+"招标")
+	}
+	if util.InterfaceToStr(obj["city"]) != "" {
+		keywordArr = append(keywordArr, util.InterfaceToStr(obj["city"])+"招标")
+	}
+	keywordArr = append(keywordArr, "剑鱼标讯")
+	keyword := strings.Join(keywordArr, ",")
+	return keyword
+}
+func DescriptionHandle(stype string, obj map[string]interface{}) string {
+	description := ""
+	pushTime := time.Unix(util.Int64All(obj["l_publishtime"]), 0)
+	title := util.InterfaceToStr(obj["title"])
+	owner := util.InterfaceToStr(obj["owner"])
+	buyer := util.InterfaceToStr(obj["buyer"])
+	if buyer == "" {
+		buyer = owner
+	}
+	s_winner := util.InterfaceToStr(obj["s_winner"])
+	publishtime := util.Int64All(obj["l_publishtime"])
+	area := util.InterfaceToStr(obj["area"])
+	city := util.InterfaceToStr(obj["city"])
+	if stype == "bdprivate" {
+		//bdprivate
+		//{项目标题},采购单位:{采购单位名称},成交供应商:{中标企业名称},公告日期:{公告日期}。
+		descriptionArr := []string{}
+		if title != "" {
+			descriptionArr = append(descriptionArr, title)
+		}
+		if buyer != "" {
+			descriptionArr = append(descriptionArr, fmt.Sprintf("采购单位:%s", buyer))
+		}
+		if s_winner != "" {
+			descriptionArr = append(descriptionArr, fmt.Sprintf("成交供应商:%s", s_winner))
+		}
+		if publishtime != 0 {
+			descriptionArr = append(descriptionArr, fmt.Sprintf("公告日期:%s", pushTime.Format("2006年01月02日")))
+		}
+		descriptionArr = append(descriptionArr, "查看该项目信息详情请访问剑鱼标讯官网。")
+		description = strings.Join(descriptionArr, ",")
+	} else {
+		//descriptionStr = "%s,项目所属地区是%s%s,项目采购单位是%s,项目发布时间是%s"
+		descriptionArr := []string{}
+		if title != "" {
+			descriptionArr = append(descriptionArr, title)
+		}
+		if area != "" || city != "" {
+			descriptionArr = append(descriptionArr, fmt.Sprintf("项目所属地区是%s%s", area, city))
+		}
+		if buyer != "" {
+			descriptionArr = append(descriptionArr, fmt.Sprintf("项目采购单位是%s", buyer))
+		}
+		if publishtime != 0 {
+			descriptionArr = append(descriptionArr, fmt.Sprintf("项目发布时间是%s", pushTime.Format("2006年01月02日")))
+		}
+		descriptionArr = append(descriptionArr, "查看该项目信息详情请访问剑鱼标讯官网。")
+		description = strings.Join(descriptionArr, ",")
+	}
+	return description
+}

+ 2 - 2
src/jfw/modules/app/src/app/front/swordfish.go

@@ -516,9 +516,9 @@ func wxvisitD(sid, userId string, isPayUser bool) (objdata map[string]interface{
 	defer util.Catch()
 	var obj map[string]interface{}
 	if len(sid) > 5 {
-		aobj, ok := public.Mgo_Bidding.FindById(public.DbConf.Mongodb.Bidding.Collection, sid, public.MgoBiddingFields)
+		aobj, ok := public.Mgo_Bidding.FindById(public.DbConf.Mongodb.Bidding.Collection, sid, nil)
 		if ok && (aobj == nil || *aobj == nil || len(*aobj) == 0) {
-			aobj, ok = public.Mgo_Bidding.FindById(public.DbConf.Mongodb.Bidding.Collection_back, sid, public.MgoBiddingFields)
+			aobj, ok = public.Mgo_Bidding.FindById(public.DbConf.Mongodb.Bidding.Collection_back, sid, nil)
 		}
 		//aobj, ok := elastic.GetByIdField("bidding", "bidding", sid, ""), true
 		obj = *aobj

+ 11 - 0
src/jfw/modules/app/src/config.json

@@ -216,6 +216,17 @@
     "expurasingtime":true,
     "winnerMap":true
   },
+  "detailMosaic":"免费注册即可查看",
+  "detailNeedMosaic":{
+    "buyerperson":true,
+    "buyertel":true,
+    "winnerperson":true,
+    "winnertel":true,
+    "agencyperson":true,
+    "agencytel":true,
+    "budget":true,
+    "bidamount":true
+  },
   "keepShowRedSpot": true,
   "detail_element": [
     "table",

+ 2 - 2
src/jfw/modules/app/src/config.yaml

@@ -1,6 +1,6 @@
 etcd:
   hosts:
-  - 127.0.0.1:2379
+  - 192.168.3.149:2379
 userCenterKey: "usercenter.rpc" #用户中台rpc
 powerCheckCenterKey: "powercheck.rpc" #权益校验中台
-entManageApplication: "entmanageapplication.rpc" #企业管理中台
+entManageApplication: "entmanageapplication.rpc" #企业管理中台

+ 1 - 1
src/jfw/modules/app/src/db.json

@@ -20,7 +20,7 @@
 			"password": "jy@DevGroup"
 		},
 		"bidding": {
-			"address": "192.168.3.206:27001,192.168.3.206:27002",
+			"address": "192.168.3.206:27002",
 	 		"size": 5,
 	 		"dbName": "qfw_data",
 			"collection": "bidding",

+ 207 - 33
src/jfw/modules/app/src/web/staticres/jyapp/big-member/css/analysis_result.css

@@ -1,3 +1,24 @@
+#analysis-result .head-tip{
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  width: 100%;
+  height: .88rem;
+  background: #EAF8FA;
+  color: #2ABED1;
+  font-size: .26rem;
+}
+#analysis-result .bid_forcast_com{
+  padding-top: .24rem;
+  width: 100%;
+  height: 1.3rem;
+  line-height: .4rem;
+  background: url('../image/bid_bg.png') no-repeat;
+  background-size: 100% 100%;
+  color: #171826;
+  font-size: .26rem;
+  text-align: center;
+}
 #analysis-result .skeleton{
     height: 100%;
     display: flex;
@@ -98,10 +119,6 @@
     margin-top: -0.02rem;
 }
 
-#analysis-result .filter {
-    margin-top: .16rem;
-}
-
 #analysis-result .filter-title {
     padding: .32rem .32rem .12rem;
     background: #fff;
@@ -114,7 +131,6 @@
     font-size: .36rem;
     line-height: .52rem;
     color: #171826;
-    font-weight: bold;
 }
 
 #analysis-result .filter-title>span::after {
@@ -156,7 +172,7 @@
 #analysis-result .cur-value {
     color: #2ABED1;
 }
-#analysis-result .van-tabs__wrap {
+#analysis-result .van-tabs__wrap, .setTop .van-tabs__wrap{
     height: .96rem;
 }
 #analysis-result .van-tabs__wrap::after{
@@ -173,7 +189,7 @@
     background: transparent;
 }
 
-#analysis-result .van-tabs__line {
+#analysis-result .van-tabs__line, .setTop .van-tabs__line {
     width: 24px;
     background: linear-gradient(#25BEEE, #2ABED1);
     border-radius: 1px;
@@ -185,7 +201,10 @@
 }
 #analysis-result .summary{
     background-color: #fff;
-    margin-bottom: .16rem;
+    margin-top: .16rem;
+}
+#analysis-result .projects {
+  margin-top: .16rem;
 }
 #analysis-result .summary-container{
     display: flex;
@@ -223,7 +242,7 @@
 }
 
 #analysis-result .a-item {
-    margin-bottom: .2rem;
+    margin: .16rem 0 .2rem;
     background-color: #fff;
     overflow: hidden;
 }
@@ -331,36 +350,102 @@
     font-size: .32rem;
     line-height: .48rem;
     color: #171826;
-    font-weight: bold;
 }
 #analysis-result .win-capital{
-  padding: 8px 24px;
-  font-size: .22rem;
-  color: #171826;
+  padding: .16rem 0 .16rem .48rem;
+  font-size: .24rem;
+  color: #5F5E64;
   line-height: .36rem;
 }
+#analysis-result .win-capital>span:last-child{
+  margin-left: .64rem;
+}
 #analysis-result .win-info{
+  padding: .22rem .16rem;
   background: linear-gradient(180deg, rgba(108, 218, 237, 0.2) 0%, rgba(255, 255, 255, 0) 100%);
   border-radius: 6px;
 }
 #analysis-result .w-title{
   display: flex;
-  align-items: center;
+  flex-direction: column;
   justify-content: space-between;
-  padding: 9px 8px 0;
+}
+#analysis-result .w-title .w-title-head {
+  font-size: .24rem;
+  color: #5F5E64;
+}
+#analysis-result .switchTab{
+  display: flex;
+  justify-content: flex-end;
+  align-items: center;
+  width: 100%;
+  height: .64rem;
+}
+.switchTab .switch-tab{
+  position: relative;
+  height: .44rem;
+  margin-left: .32rem;
+  font-size: .28rem;
+  color: #171826;
+}
+.switchTab .switch-tab.textColor{
+  color: #2ABED1;
+}
+.switchTab .switch-tab .line {
+  position: absolute;
+  bottom: 0;
+  left: .3rem;
+  width: .48rem;
+  height: .04rem;
+  background: #2ABED1;
+  border-radius: .02rem;
+}
+
+.switchTab .switch-tab {
+  margin-top: .18rem;
+}
+#analysis-result .switchTab .switch_label{
+  color: #9B9CA3;
+  font-size: .24rem;
+}
+#analysis-result .switchTab .switch_tab_list{
+  /* width: 2.56rem; */
+  height: 100%;
+}
+/* #analysis-result .switch_tab_list.winner_0 .van-tabs__line{
+  transform: translateX(.79rem) translateX(-50%);
+}
+#analysis-result .switch_tab_list.history_0 .van-tabs__line{
+  transform: translateX(.79rem) translateX(-50%);
+}
+#analysis-result .switch_tab_list.history_1 .van-tabs__line{
+  transform: translateX(2.15rem) translateX(-50%);
+} */
+/* #analysis-result .switch_tab_list.winner_1 .van-tabs__line{
+  transform: translateX(.79rem) translateX(-50%);
+} */
+#analysis-result .switch_tab_list .van-tabs__wrap {
+  height: 100%;
+}
+#analysis-result .switch_tab_list .van-tabs__wrap .van-tab{
+  padding: 0 .16rem;
+}
+#analysis-result .switch_tab_list .van-tab--active{
+  color: #2ABED1;
 }
 .w-title-label{
-  font-size: .26rem;
-  color: #1d1d1d;
-  line-height: .36rem;
+  margin-top: .08rem;
+  font-size: .28rem;
+  color: #171826;
+  line-height: .48rem;
 }
 #analysis-result .company-info{
     display: flex;
-    align-items: center;
+    flex-direction: column;
     justify-content: space-between;
-    padding: 5px 8px 8px;
+    margin-top: .08rem;
     color: #5F5E64;
-    font-size: .2rem;
+    font-size: .24rem;
     line-height: .36rem;
 }
 #analysis-result .company-info span{
@@ -434,7 +519,14 @@
     background-color: #fff;
     padding: 0 .32rem .32rem;
 }
-
+.ranking .filter-title {
+  display: flex;
+  align-items: center;
+}
+.ranking .filter-title .switchTab{
+  width: auto;
+  flex: 1;
+}
 .ranking .progress-bar-item {
     display: flex;
     flex-direction: column;
@@ -449,10 +541,17 @@
 }
 
 .ranking .progress-bar-item .item-label .item-name {
+    width: 1.04rem;
     font-size: .26rem;
     line-height:.4rem;
     color: #5F5E64;
-    flex: 1;
+}
+
+.ranking .progress-bar-item .item-label .item-time {
+  /* width: 1.6rem; */
+  font-size: .26rem;
+  line-height:.4rem;
+  color: #5F5E64;
 }
 
 .ranking .progress-bar-item .item-label .item-count {
@@ -483,6 +582,27 @@
 .ranking .blue-progress{
     background: linear-gradient(to right,#8DE0EB, #2ABED1);
 }
+.navBar{
+  display: flex;
+  align-items: center;
+  padding: 0 .32rem;
+  height: 1.08rem;
+  color: #9B9CA3;
+  font-size: .28rem;
+}
+.navBar .link-btn{
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  margin-left: .16rem;
+  border-radius: 4px;
+  padding: .08rem .16rem;
+  background: rgba(42, 190, 209, 0.05);
+  line-height: .4rem;
+  color: #2ABED1;
+  font-size: .26rem;
+  border: 0.5px solid #2ABED1;
+}
 #analysis-result .ve-map{
     width: auto;
     /* padding: .16rem .32rem; */
@@ -494,33 +614,61 @@
     /* width: calc(100% - 0.96rem)!important; */
     /* height: 100%; */
 }
+#analysis-result .more {
+  padding: .28rem 0;
+  text-align: center;
+  color: #2ABED1;
+  font-size: .28rem;
+  line-height: .4rem;
+  background: #fff;
+}
 #analysis-result .project-list{
     padding: .24rem .32rem;
     background: #fff;
     border-radius: 8px;
-    margin: .2rem.32rem;
+    /* margin: .2rem.32rem; */
 }
 #analysis-result .pl-title{
     font-size: .32rem;
     line-height: .48rem;
     color: #171826;
 }
+#analysis-result .pl-tags{
+  margin: .16rem 0 .2rem;
+}
+#analysis-result .pl-tags>span{
+  padding: .02rem .16rem;
+  margin-right: .08rem;
+  color: #5F5E64;
+  font-size: .24rem;
+  background: #F7F9FA;
+/* Line/#000000_5% */
+  border: 0.5px solid rgba(0, 0, 0, 0.05);
+  border-radius: 4px;
+}
 #analysis-result .pl-info{
     display: flex;
-    align-items: center;
-    margin-top: .22rem;
+    /* align-items: center; */
+    margin-top: .04rem;
+    line-height: .4rem;
 }
-#analysis-result .pl-info span:nth-child(1){
+#analysis-result .pl-info>span:nth-child(1){
     display: inline-block;
     color: #9B9CA3;
-    font-size:.22rem;
+    font-size:.26rem;
 }
-#analysis-result .pl-info span:nth-child(2){
+#analysis-result .pl-info>span:nth-child(2){
     display: inline-block;
-    color: #2ABED1;
-    font-size:.22rem;
+    font-size:.26rem;
     flex: 1;
-    line-height: 1.4;
+}
+#analysis-result .pl-info .winner-list{
+  display: flex;
+  flex-wrap: wrap;
+  flex: 1;
+}
+.can-click {
+  color: #2ABED1;
 }
 #analysis-result .pl-price{
     display: flex;
@@ -584,10 +732,18 @@
   width: 5rem;
   text-align: center;
 }
+#analysis-result .jy-main-empty{
+  width: 100%;
+}
+#analysis-result .jy-main-empty .navBar{
+  height: .6rem;
+  background-color: transparent;
+  justify-content: center;
+}
 .jy-empty-img{
   width: 4rem;
   height: 4rem;
-  background: url('/common-module/public/image/jy-chagrin.png') no-repeat center center;
+  background: url('/common-module/public/image/jy-back.png') no-repeat center center;
   background-size: contain;
 }
 .jy-empty-text{
@@ -595,4 +751,22 @@
   color: #9B9BA3!important;
   line-height: .4rem;
   padding-bottom: .24rem;
+}
+
+.bottom-tip{
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  height: .88rem;
+  background: #FFF4E8;
+  color: #FF9F40;
+  font-size: .26rem;
+}
+
+.setTop {
+  position: fixed;
+  /* top: 1rem; */
+  width: 100%;
+  background: #fff;
+  z-index: 2002;
 }

BIN
src/jfw/modules/app/src/web/staticres/jyapp/big-member/image/bid_bg.png


BIN
src/jfw/modules/app/src/web/staticres/jyapp/big-member/image/landpage_new/itemA_05.jpg


BIN
src/jfw/modules/app/src/web/staticres/jyapp/big-member/image/landpage_new/toubiaoImg/itemB1.png


BIN
src/jfw/modules/app/src/web/staticres/jyapp/big-member/image/landpage_new/toubiaoImg/itemB2.png


BIN
src/jfw/modules/app/src/web/staticres/jyapp/big-member/image/landpage_new/toubiaoImg/itemB3.png


BIN
src/jfw/modules/app/src/web/staticres/jyapp/big-member/image/landpage_new/toubiaoImg/itemB4.png


BIN
src/jfw/modules/app/src/web/staticres/jyapp/big-member/image/landpage_new/toubiaoImg/itemB5.png


BIN
src/jfw/modules/app/src/web/staticres/jyapp/big-member/image/landpage_new/toubiaoImg/itemB6.png


+ 258 - 0
src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/analysis_pro_list.js

@@ -0,0 +1,258 @@
+var vNode = {
+    delimiters: ['${', '}'],
+    el: '#analysis-result',
+    data () {
+        return {
+            projectListDetail:[],
+            filterData: {},
+            projectData: {},
+            listParams: {
+              page: 1,
+              pageSize: 10,
+              loading: false,
+              finished: false
+            }
+        }
+    },
+    created () {
+      // const entId = utils.getParam('entId')
+      // if(analysis_result_proDetail) {
+      //   analysis_result_proDetail = JSON.parse(analysis_result_proDetail)
+      //   if(entId) {
+      //     this.entId = entId
+      //     let arr = []
+      //     analysis_result_proDetail.forEach(item => {
+      //       if(item.entidlist) {
+      //         item.entidlist.forEach(v => {
+      //           if(v === entId) {
+      //             arr.push(item)
+      //           }
+      //         })
+      //       }
+      //     })
+      //     this.projectListDetail = arr
+      //   } else {
+      //     this.projectListDetail = analysis_result_proDetail
+      //   }
+      // }
+      
+    },
+    mounted() {
+        const recover = this.restoreData()
+        if(!recover) {
+          const searchItem = sessionStorage.getItem('searchItem')
+          if(searchItem) {
+            let $dataAnalysisResult = sessionStorage.getItem('$data-analysis-result_' + searchItem)
+            if($dataAnalysisResult) {
+              $dataAnalysisResult = JSON.parse($dataAnalysisResult)
+              this.filterData = $dataAnalysisResult.filterData
+              this.getProjectDetail($dataAnalysisResult.filterData)
+            }
+          }
+        }
+    },
+    methods: {
+        showLoading: function () {
+          var loading = this.$toast.loading({
+            duration: 0,
+            forbidClick: true,
+            message: 'loading...',
+          })
+          return loading
+        },
+        // 金额转换
+        formatterMoney: function(data) {
+            return utils.moneyUnit(data);
+        },
+        // 时间转换
+        formatterTime: function(data) {
+          return new Date(Number(data + '000')).pattern('yyyy/MM/dd')
+        },
+        // 跳企业画像
+        goEntImg:function(name) {
+            this.savePageData()
+            location.href = './ent_portrait?eId=' + encodeURIComponent(name)
+        },
+        onLoad: function () {
+          this.listParams.page++
+          this.getProjectDetail(this.filterData)
+        },
+        // 跳到项目信息详情
+        goProjectDetail: function (id) {
+            var that = this;
+            that.savePageData()
+            $.ajax({
+                type:'POST',
+                url:'/bigmember/follow/project/check',
+                data:{
+                    sid: id
+                },
+                success:function(res) {
+                    if(res.error_code == 0) {
+                        var obj = {
+                            fid: res.data.fig ? res.data.fig : '',
+                            sid: id
+                        }
+                        sessionStorage.setItem('bigvip-fid', JSON.stringify(obj))
+                        location.href = "./pro_follow_detail"
+                    }else{
+                        console.log(res.error_code)
+                    }
+                },
+                error:function(err) {
+                    console.log(err)
+                }
+            })
+        },
+        // 单独查同类项目明细接口
+        getProjectDetail: function(res) {
+          var that = this;
+          var loading = null
+          if(that.listParams.page === 1) {
+            loading = that.showLoading()
+          }
+          that.listParams.loading = true
+          const { area, buyer, limitTime, searchType, pname, projectScope, winner, keys, pid, sid, expertName, searchItem} = res
+          var data = {
+              area: {
+                [area]: []
+              },
+              buyerContent: keys,
+              mobileModel: that.mobileModel,
+              appVersion: that.appVersion,
+              searchType: searchType,
+              winner: winner,
+              buyer: buyer,
+              searchItem: searchItem,
+              limitTime: limitTime,
+              // 专家名称
+              expertName: expertName || '',
+              projectScope: projectScope,
+              page: this.listParams.page,
+              pageSize: this.listParams.pageSize
+          }
+          $.ajax({
+            type:'POST',
+            url:'/bigmember/decision/projectInfoByBW',
+            contentType: 'application/json;charset=utf-8' ,
+            data:JSON.stringify(data),
+            success:function(res) {
+              if(loading) {
+                loading.clear()
+              }
+              if(res.error_code == 0) {
+                // 同类项目明细数据
+                that.projectData = res.data
+                that.listParams.loading = false
+                if(res.data.res && res.data.res.length > 0){
+                  res.data.res.forEach(function (item,i) {
+                    if (item.budget && item.budget !== '') {
+                        item.budget = (item.budget / 10000).fixed(2)
+                    }
+                    if (item.bidamount && item.bidamount !== '') {
+                        item.bidamount = (item.bidamount / 10000).fixed(2)
+                    }
+                    if(item.review_experts){
+                        item.review_experts = item.review_experts.join(',')
+                    }
+                    if(item.project_rate){
+                        item.project_rate = (item.project_rate*100).fixed(2) + '%'
+                    }
+                    if(item.jgtime){
+                        item.jgtime = new Date(Number(item.jgtime + '000')).pattern('yyyy-MM-dd')
+                    }
+                    let winnerArrList = []
+                    if (Array.isArray(item.s_winner)) {
+                      winnerArrList = item.s_winner
+                    } else if (item.s_winner) {
+                      winnerArrList = item.s_winner.split(',')
+                    }
+                    const winners = winnerArrList.map((w, index) => {
+                      let id = null
+                      if (Array.isArray(item.entidlist)) {
+                        id = item.entidlist[index]
+                      }
+                      return {
+                        name: w,
+                        id
+                      }
+                    })
+                    item.s_winner = winners.filter(w => w.name)
+                  })
+                  if(that.listParams.page === 1) {
+                    that.projectListDetail = res.data.res;
+                  } else {
+                    that.projectListDetail = that.projectListDetail.concat(res.data.res)
+                  }
+                  const pageTotalNum = res.data.count / that.listParams.pageSize
+                  const pageResidue = res.data.count % that.listParams.pageSize
+                  if (pageResidue > 0) {
+                    if (that.listParams.page > pageTotalNum) {
+                      that.listParams.finished = true
+                    } else {
+                      that.listParams.finished = false
+                    }
+                  } else {
+                    if (that.listParams.page >= pageTotalNum) {
+                      that.listParams.finished = true
+                    } else {
+                      that.listParams.finished = false
+                    }
+                  }
+                }
+              } else {
+                that.listParams.loading = false
+              }
+            },
+            error:function(err) {
+              that.listParams.loading = false
+              console.log(err)
+            }
+          })
+        },
+        // 跳转中标预测
+        goForecast: function () {
+            sessionStorage.removeItem('big-ai-add-data')
+            this.savePageData()
+            location.href = "./ai_add?id=" + this.project.pId
+        },
+        // 跳转采购单位画像
+        goUnitImage:function(name){
+            this.savePageData()
+            location.href = "./unit_portrayal?entName=" + encodeURIComponent(name)
+        },
+        // 存储页面数据
+        savePageData: function(){
+            var data = {
+                projectListDetail: this.projectListDetail,
+                filterData: this.filterData,
+                projectData: this.projectData,
+                listParams: this.listParams,
+                scrollTop: this.$refs.wrapper.scrollTop
+            }
+            // console.log(data)
+            sessionStorage.setItem('$data-analysis-result-pro-list',JSON.stringify(data))
+        },
+        // 恢复页面数据
+        restoreData:function(){
+            var $data = sessionStorage.getItem('$data-analysis-result-pro-list')
+            if ($data) {
+                $data = JSON.parse($data)
+                this.projectListDetail = $data.projectListDetail
+                this.scrollTop = $data.scrollTop
+                this.filterData = $data.filterData
+                this.projectData = $data.projectData
+                this.listParams = $data.listParams
+                var _this = this
+                this.$nextTick(function(){
+                  setTimeout(() => {
+                    _this.$refs.wrapper.scrollTop = $data.scrollTop || 0
+                  }, 200)
+                })
+                sessionStorage.removeItem('$data-analysis-result-pro-list')
+            }
+            return !!$data
+        }
+    }
+}
+var result = new Vue(vNode)

+ 609 - 240
src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/analysis_result.js

@@ -1,6 +1,17 @@
+window.afterClickBack = function () {
+  sessionStorage.removeItem('$data-analysis-result_1')
+  sessionStorage.removeItem('$data-analysis-result_2')
+  sessionStorage.removeItem('$data-analysis-result_3')
+  sessionStorage.removeItem('searchItem')
+  sessionStorage.removeItem('analysis-filter-data')
+  sessionStorage.removeItem('analysis_result_proDetail')
+}
 var vNode = {
     delimiters: ['${', '}'],
     el: '#analysis-result',
+    components: {
+      analysisCom: analysisComponent
+    },
     data () {
         // 柱状图标记
         this.barChartMarkPoint = {
@@ -24,11 +35,11 @@ var vNode = {
         }
         this.chartSettings = {
             xAxisName: ['标书编制周期'],
-            yAxisName: ['类项目数量(个)']
+            yAxisName: ['类项目数量(个)']
         }
         return {
             year:'',
-            skeletonShow: true,
+            skeletonShow: false,
             scroll: 90,
             stickyTop: 80,
             project:{
@@ -62,7 +73,7 @@ var vNode = {
             // 专家分析排行数据
             expertWinArr:[],
             projectListDetail:[],
-            // 类采购历史
+            // 类采购历史
             historyList:[],
             hotWin:[],
             showAll:false,
@@ -71,22 +82,24 @@ var vNode = {
                 rows: []
             },
             pieChartData: {
-                columns: ['行业', '类项目数量','类项目规模','平均折扣率','当前采购单位类型'],
+                columns: ['行业', '类项目数量','类项目规模','平均折扣率','当前采购单位类型'],
                 rows: []
             },
             mapChartData:{
-                columns: ['省份', '类项目数量','类项目规模'],
+                columns: ['省份', '类项目数量','类项目规模'],
                 rows: []
             },
             screenWidth:document.body.clientWidth,
             isShow:{
-                showHistory: true,
-                showWinner: true,
-                bidCycle: true,
-                showHotMap: true,
-                showMap: true,
-                showPie: true,
-                showExperts:true
+                showProjectList: false,
+                showSummary: false,
+                showHistory: false,
+                showWinner: false,
+                bidCycle: false,
+                showHotMap: false,
+                showMap: false,
+                showPie: false,
+                showExperts: false
             },
             // 热力图减去数据为0的行
             minusRows:0,
@@ -103,10 +116,40 @@ var vNode = {
             scrollTop: 0,
             defaultProjectDetail: [],
             hotChartRef: null,
-            pieChartRef: null
+            pieChartRef: null,
+            showListBtn: false,
+            showWinBtn: false,
+            filterData: {},
+            // 同类项目热点中标企业TOP10
+            hotWinnerEnt: {
+              hotTabActive: 0
+            },
+            // 历史合作评标专家
+            historyExpert: {
+              historyTabActive: 0
+            },
+            listCount: {
+              pCount: 0, // 全国数据条数
+              AreaCount: 0, // 地区数据条数
+              BuyerCount: 0, // 采购单位数据条数
+            },
+            powerInfo: {},
+            id: '',
+            isHaveTop: false, // 是否需要置顶tab
+            setHeight: 0, // 置顶高度
+            setHeightActive: '',
+            loadingEmpty: false
         }
     },
     computed: {
+        isHaveTrue: function () {
+          const hasTrueValue = Object.values(this.isShow).includes(true);
+          if (hasTrueValue) {
+            return true
+          } else {
+            return false
+          }
+        },
         showHistoryList: function () {
             return this.showAll ? this.historyList : this.historyList.slice(0,3)
         },
@@ -115,18 +158,30 @@ var vNode = {
         },
         heatMapHeight: function(){
             return 320 - 22*this.minusRows  + 'px'
+        },
+        setShowListBtn: function () {
+          return this.showListBtn ? this.projectListDetail.slice(0, 3) : this.projectListDetail
+        },
+        isShowWinBtn: function () {
+          return this.showWinBtn ? this.hotWin.slice(0, 3) : this.hotWin
+        },
+        is15: function () {
+          if(this.powerInfo.power) {
+            return this.powerInfo.power.includes(15)
+          } else {
+            return false
+          }
         }
     },
     watch: {
+      setHeight: {
+        handler (newval) {
+          this.setHeightActive = 'top:' + newval +'px'
+        },
+        immediate: true
+      },
       active: function(newVal) {
-        // 监听切换到类似项目明细 页面滚动到筛选条件位置
-        if (newVal == 1) {
-          this.$nextTick(function() {
-            if (this.$refs.detailFilter) {
-              this.$refs.detailFilter.scrollIntoView()
-            }
-          })
-        }
+        this.active = newVal
       },
       // 监听热力图
       hotChartRef: function (newVal) {
@@ -152,6 +207,7 @@ var vNode = {
         } catch (error) {
             console.log(error)
         }
+        this.getPower()
         // 取上个页面的sessionStorage
         var prevState = JSON.parse(sessionStorage.getItem('big-analysis_filter'));
         if(prevState) {
@@ -171,7 +227,7 @@ var vNode = {
             this.currentVal.money = prevState.currentVal.money;
             this.currentVal.buyerClass = prevState.currentVal.buyerClass;
         }
-        this.isFollowProject();
+        // this.isFollowProject();
     },
     beforeDestroy() {
         window.removeEventListener("resize", this.init,20);
@@ -183,18 +239,78 @@ var vNode = {
         // }
     },
     mounted() {
-        var restore = this.restoreData()
-        if (!restore) {
-            this.getChartData();
-            this.getBaseInfo();
-        }
-        this.year = new Date().getFullYear() - 2;
+        this.restoreData()
         // 动态调整sticky距离顶部的高度
         this.getStickyTop()
         window.addEventListener('scroll', this.handleScroll, true);
         this.init();
+        this.setInterSection()
     },
     methods: {
+        setInterSection () {
+          this.isHaveTop = false
+          const observer = new IntersectionObserver(this.handleIntersection, {
+            root: null, // 默认为浏览器视窗
+            threshold: 0, // 交叉比例,0为完全进入视窗
+          });
+          console.log(this.$refs.analysisTab)
+          observer.observe(this.$refs.analysisTab)
+        },
+        handleIntersection(entries) {
+          if(!entries[0].isIntersecting) {
+            this.isHaveTop = true
+            this.calcStickyOffset()
+          } else {
+            this.isHaveTop = false
+          }
+          // entries.forEach((entry) => {
+          //   // 元素不可见
+          //   console.log(entry.isIntersecting)
+          //   if (!entry.isIntersecting) {
+          //     this.isHaveTop = true
+          //     this.calcStickyOffset()
+          //   } else {
+          //     this.isHaveTop = false
+          //   }
+          // })
+        },
+        calcStickyOffset: function () {
+          var headerHeight = $('.jy-app-header')[0].clientHeight
+          this.setHeight = headerHeight - 2
+        },
+        getPower:function () {
+          var _this = this
+          $.ajax({
+            type:'POST',
+            url:'/bigmember/use/isAdd',
+            success:function(res) {
+              _this.powerInfo = res.data
+            }
+          })
+        },
+        onTabWinnerClick (newval) {
+          this.hotWinnerEnt.hotTabActive = newval
+          this.filterData.HotWinnerType = newval
+          this.loading = this.showLoading()
+          this.getProjectWinnerEnt()
+        },
+        onTabHistoryClick (newval) {
+          this.historyExpert.historyTabActive = newval
+          if(newval === 0) {
+            this.filterData.projectScope = 1
+          } else {
+            this.filterData.projectScope = 0
+          }
+          this.loading = this.showLoading()
+          this.getHistoryExpert()
+        },
+        setMoenyColor (str) {
+          let pattern = /^(\d+(\.\d+)?)([^\d]*)$/;
+          let match = str.match(pattern);
+          let value = match[1]; // 匹配到的数字部分
+          let unit = match[3]; // 匹配到的单位部分
+          return `<span style="color: #2ABED1">${value}</span> ${unit}`
+        },
         showLoading: function () {
           var loading = this.$toast.loading({
             duration: 0,
@@ -211,6 +327,9 @@ var vNode = {
         formatterTime: function(data) {
           return new Date(Number(data + '000')).pattern('yyyy/MM/dd')
         },
+        formatterLineTime: function(data) {
+          return new Date(Number(data + '000')).pattern('yyyy-MM-dd')
+        },
         // 返回筛选条件
         setBack:function(){
             history.back()
@@ -240,6 +359,24 @@ var vNode = {
                 this.goProjectDetail(id)
             }
         },
+        // 同类项目明细查看更多
+        setViewMore: function (data) {
+          if(data) {
+            // 历史合作评标专家
+            this.filterData.searchType = 3
+            if(this.historyExpert.historyTabActive === 0) {
+              this.filterData.projectScope = 1
+            } else {
+              this.filterData.projectScope = 0
+            }
+            this.filterData.expertName = data.key
+          } else {
+            this.filterData.searchType = 0
+          }
+          this.savePageData()
+          // sessionStorage.setItem('analysis_result_proDetail', JSON.stringify(this.defaultProjectDetail))
+          location.href = '/jyapp/big/page/bid_analysis_pro_list'
+        },
         // 跳到项目信息详情
         goProjectDetail: function (id) {
             var that = this;
@@ -267,12 +404,6 @@ var vNode = {
                 }
             })
         },
-        // 跳转中标预测
-        goForecast: function () {
-            sessionStorage.removeItem('big-ai-add-data')
-            this.savePageData()
-            location.href = "./ai_add?id=" + this.project.pId
-        },
         // 跳转采购单位画像
         goUnitImage:function(name){
             this.savePageData()
@@ -353,29 +484,9 @@ var vNode = {
             })
         },
         // 获取项目基本信息(同跟筛选条件)
-        getBaseInfo: function(){
-            var that = this;
-            $.ajax({
-                type:'POST',
-                url:'/bigmember/analysis/projectInfo',
-                data:{
-                    ptid: that.project.pId,
-                    sourceinfoid: that.project.infoId,
-                    D: 'detail'
-                },
-                success:function(res) {
-                    if(res.error_code == 0 && res.data) {
-                        if(res.data.s_subscopeclass) {
-                            if(res.data.s_subscopeclass.indexOf('_') > -1) {
-                                res.data.s_subscopeclass = res.data.s_subscopeclass.substring(0,res.data.s_subscopeclass.indexOf('_'))
-                            }
-                        }
-                        that.baseInfo = res.data
-                    } else {
-                        console.log(res.error_code)
-                    }
-                }
-            })
+        getBaseInfo: function(data){
+            // var that = this;
+            this.baseInfo = data
         },
         // 处理行业提交数据
         formatterIndustryData:function(data) {
@@ -403,105 +514,176 @@ var vNode = {
                 }
             }
         },
+        setModuleState () {
+          Object.keys(this.isShow).forEach(key => {
+            if (this.isShow[key] === true) {
+              this.isShow[key] = false;
+            }
+          })
+        },
+        // 开始分析
+        setAjaxFilters (data) {
+          // 清除老数据,初始化页面
+          this.setModuleState()
+          this.filterData = data
+          this.filterData.searchItem = 1
+          this.filterData.projectScope = 1
+          this.active = 0
+          sessionStorage.removeItem('$data-analysis-result_1')
+          sessionStorage.removeItem('$data-analysis-result_2')
+          sessionStorage.removeItem('$data-analysis-result_3')
+          // 请求新数据
+          this.setYearData()
+          this.getChartData()
+          this.getProjectWinnerEnt()
+          this.getProjectDetail()
+          this.getHistoryExpert()
+          if(data.searchItem === 1) {
+            this.historyExpert.historyTabActive = 0
+          } else {
+            this.historyExpert.historyTabActive = 1
+          }
+          setTimeout(() => {
+            var targetEle = document.getElementById('analysis-tabs')
+            targetEle.scrollIntoView()
+            this.isHaveTop = false
+          }, 1000)
+        },
+        setYearData () {
+          let num = 1
+          const limitTime = this.filterData.limitTime
+          if(limitTime === 'oneYear') {
+            num = 1
+          } else if(limitTime === 'threeYear') {
+            num = 3
+          } else {
+            num = 5
+          }
+          let month = new Date().getMonth() + 1; // 获取月份,需要加1,因为月份从0开始计数
+          let day = new Date().getDate(); // 获取日期
+          if(month < 10) {
+            month = '0' + month
+          }
+          if(day < 10) {
+            day = '0' + day
+          }
+          this.year = new Date().getFullYear() - num + '/' + month + '/' + day;
+        },
         // 获取详情页数据
         getChartData:function() {
             var that = this;
+            that.loadingEmpty = false
+            var loading = this.showLoading()
+            const {pname, buyer, area, limitTime, keys, searchItem} = this.filterData
             var data = {
-                area: that.areaData,
-                buyerContent: that.contentData,
-                buyerClass: that.buyerClassData,
-                minPrice: utils.deepCompare(that.moneyData, []) ? '' : Number(that.moneyData[0]),
-                maxPrice: Number(that.moneyData[1]) || '',
-                industry: that.industriesData ? that.formatterIndustryData(that.industriesData).toString() : '',
-                pname: that.project.projectName,
-                pid: that.project.pId,
-                sid: that.project.infoId,
-                buyer: that.project.buyer,
-                mobileModel: that.mobileModel,
-                appVersion: that.appVersion
+              appVersion: that.appVersion,
+              searchItem: searchItem ? searchItem : 1,
+              area: {
+                [area]: []
+              },
+              buyer: buyer,
+              buyerContent: keys,
+              pname: pname,
+              limitTime: limitTime
             }
             $.ajax({
-                type:'POST',
+                type:'post',
                 url:'/bigmember/decision/decInfo',
-                contentType: 'application/json;charset=utf-8' ,
-                data:JSON.stringify(data),
+                // url:'/json/analysis.js',
+                data: JSON.stringify(data),
+                contentType: 'application/json',
                 success:function(res) {
+                  console.log(res)
+                  that.loadingEmpty = true
                     if(res.error_code == 0) {
+                        if(res.data.PCount) {
+                          that.listCount.pCount = res.data.PCount
+                        }
+                        if(res.data.AreaCount) {
+                          that.listCount.AreaCount = res.data.AreaCount
+                        }
+                        if(res.data.BuyerCount) {
+                          that.listCount.BuyerCount = res.data.BuyerCount
+                        }
                         if(res.data.status == -2) {
                             that.isShow.showHistory = false;
-                            that.isShow.showWinner = false;
                             that.isShow.bidCycle = false;
                             that.isShow.showHotMap = false;
                             that.isShow.showMap = false;
                             that.isShow.showPie = false;
-                            that.isShow.showExperts = false;
-                        }
-                        // 类似项目明细数据
-                        if(res.data.PDeatils){
-                            res.data.PDeatils.forEach(function (item,i) {
-                                if (item.budget && item.budget !== '') {
-                                    item.budget = (item.budget / 10000).fixed(2)
-                                } else {
-                                    item.budget = '-'
-                                }
-                                if (item.bidamount && item.bidamount !== '') {
-                                    item.bidamount = (item.bidamount / 10000).fixed(2)
-                                } else {
-                                    item.bidamount = '--'
-                                }
-                                if(item.review_experts){
-                                    item.review_experts = item.review_experts.join(',')
-                                }
-                                if(item.project_rate){
-                                    item.project_rate = (item.project_rate*100).fixed(2) + '%'
-                                }
-                                if(item.firsttime){
-                                    item.firsttime = new Date(Number(item.firsttime + '000')).pattern('yyyy/MM/dd')
-                                }
-                            })
-                            that.defaultProjectDetail = res.data.PDeatils
-                            that.projectListDetail = res.data.PDeatils; // 类似项目明细
                         }
-                        // 类项目分析
+                        // 同类项目分析
                         if (res.data.PAnalysis && Object.keys(res.data.PAnalysis).length > 0) {
                             for (var key in res.data.PAnalysis) {
                                 that.cacheImgData[key] = res.data.PAnalysis[key]
                             }
+                            if(that.filterData.searchItem === 1) {
+                              delete that.cacheImgData.group_buyerclass
+                            } else if(that.filterData.searchItem === 2) {
+                              delete that.cacheImgData.group_area
+                            }
+                            that.setProjectDetail()
                             that.initChartData()
+                        } else {
+                          delete that.cacheImgData.all_counts
+                          delete that.cacheImgData.all_money
+                          delete that.cacheImgData.all_review_experts
+                          delete that.cacheImgData.all_winners
+                          delete that.cacheImgData.group_area
+                          delete that.cacheImgData.bidcycle_ranges
+                          delete that.cacheImgData.budgetAnalysis
+                          delete that.cacheImgData.bidcycle_ranges
                         }
-                        that.skeletonShow = false;
-                    }else{
-                        that.skeletonShow = true;
-                        setTimeout(function(){
-                            history.back()
-                        }, 3000)
                     }
+                    loading.clear();
                 },
-                error:function(err) {
-                    console.log(err)
+                error:function() {
+                  that.loadingEmpty = true
+                    loading.clear()
                 }
             })
         },
-        // 单独查类似项目明细接口
-        getProjectDetail: function(type, winner, buyer) {
+        setProjectDetail () {
+          let {all_counts, all_money, all_review_experts, all_winners} = this.cacheImgData
+          if(all_counts == 0) {
+            all_counts = parseInt(all_counts)
+          }
+          if(all_money == 0) {
+            all_money = parseInt(all_money)
+          }
+          if(all_review_experts == 0) {
+            all_review_experts = parseInt(all_review_experts)
+          }
+          if(all_winners == 0) {
+            all_winners = parseInt(all_winners)
+          }
+          if(!all_counts && !all_money && !all_review_experts && !all_winners) {
+            this.isShow.showSummary = false
+          } else {
+            this.isShow.showSummary = true
+            this.$set(this.isShow, 'showSummary', true)
+          }
+          this.$forceUpdate()
+        },
+        // 单独查同类项目明细接口
+        getProjectDetail: function() {
           var that = this;
-          var loading = that.showLoading()
+          const { area, buyer, limitTime, pname, keys, searchItem} = this.filterData
           var data = {
-              area: that.areaData,
-              buyerContent: that.contentData,
-              buyerClass: that.buyerClassData,
-              minPrice: utils.deepCompare(that.moneyData, []) ? '' : Number(that.moneyData[0]),
-              maxPrice: Number(that.moneyData[1]) || '',
-              industry: that.industriesData ? that.formatterIndustryData(that.industriesData).toString() : '',
-              pname: that.project.projectName,
-              pid: that.project.pId,
-              sid: that.project.infoId,
+              area: {
+                [area]: []
+              },
+              buyerContent: keys,
               mobileModel: that.mobileModel,
               appVersion: that.appVersion,
-              // 以下为新增
-              searchType: type,
-              winner: winner,
+              searchType: 0,
+              pname: pname,
               buyer: buyer,
+              searchItem: searchItem,
+              limitTime: limitTime,
+              // 专家名称
+              page: 1,
+              pageSize: 10
           }
           $.ajax({
             type:'POST',
@@ -510,72 +692,204 @@ var vNode = {
             data:JSON.stringify(data),
             success:function(res) {
               if(res.error_code == 0) {
-                loading.clear()
-                // 类似项目明细数据
-                if(res.data){
-                  res.data.forEach(function (item,i) {
-                    if (item.budget && item.budget !== '') {
-                        item.budget = (item.budget / 10000).fixed(2)
-                    } else {
-                        item.budget = '-'
-                    }
-                    if (item.bidamount && item.bidamount !== '') {
-                        item.bidamount = (item.bidamount / 10000).fixed(2)
-                    } else {
-                        item.bidamount = '--'
-                    }
-                    if(item.review_experts){
-                        item.review_experts = item.review_experts.join(',')
-                    }
-                    if(item.project_rate){
-                        item.project_rate = (item.project_rate*100).fixed(2) + '%'
-                    }
-                    if(item.firsttime){
-                        item.firsttime = new Date(Number(item.firsttime + '000')).pattern('yyyy/MM/dd')
-                    }
+                // 同类项目明细数据
+                if(res.data && res.data.res && res.data.res.length > 0){
+                  res.data.res.forEach(function (item,i) {
+                      if (item.budget && item.budget !== '') {
+                          item.budget = (item.budget / 10000).fixed(2)
+                      }
+                      if (item.bidamount && item.bidamount !== '') {
+                          item.bidamount = (item.bidamount / 10000).fixed(2)
+                      }
+                      if(item.review_experts){
+                          item.review_experts = item.review_experts.join('、')
+                      }
+                      if(item.project_rate){
+                          item.project_rate = (item.project_rate*100).fixed(2) + '%'
+                      }
+                      if(item.jgtime){
+                          item.jgtime = new Date(Number(item.jgtime + '000')).pattern('yyyy-MM-dd')
+                      }
+                      let winnerArrList = []
+                      if (Array.isArray(item.s_winner)) {
+                        winnerArrList = item.s_winner
+                      } else if (item.s_winner) {
+                        winnerArrList = item.s_winner.split(',')
+                      }
+                      const winners = winnerArrList.map((w, index) => {
+                        let id = null
+                        if (Array.isArray(item.entidlist)) {
+                          id = item.entidlist[index]
+                        }
+                        return {
+                          name: w,
+                          id
+                        }
+                      })
+                      item.s_winner = winners.filter(w => w.name)
                   })
-                  that.projectListDetail = res.data;
+                  that.defaultProjectDetail = res.data.res
+                  that.projectListDetail = res.data.res;
+                  if (res.data.res.length > 3) {
+                    that.showListBtn = true
+                  } else {
+                    that.showListBtn = false
+                  }
+                  that.isShow.showProjectList = true
+                } else {
+                  that.projectListDetail = []
+                  that.defaultProjectDetail = []
+                  that.isShow.showProjectList = false
                 }
-              } else {
-                loading.clear()
               }
             },
             error:function(err) {
-              loading.clear()
               console.log(err)
             }
           })
         },
+        // 单独查同类项目中标企业TOP10
+        getProjectWinnerEnt:function() {
+          var that = this;
+          const {pname, buyer, area, limitTime, keys, HotWinnerType, searchItem} = this.filterData
+          var data = {
+            appVersion: that.appVersion,
+            searchItem: searchItem ? searchItem : 1,
+            area: {
+              [area]: []
+            },
+            buyer: buyer,
+            buyerContent: keys,
+            pname: pname,
+            limitTime: limitTime,
+            // 以下为新增
+            HotWinnerType: HotWinnerType ? HotWinnerType : 0,
+          }
+          $.ajax({
+              type:'post',
+              url:'/bigmember/decision/hotWinnerTop',
+              data: JSON.stringify(data),
+              contentType: 'application/json',
+              success:function(res) {
+                console.log(res)
+                  if(res.error_code == 0) {
+                      if(res.data.status == -2) {
+                          that.isShow.showWinner = false;
+                      }
+                      // 同类项目分析
+                      if (res.data.PAnalysis && Object.keys(res.data.PAnalysis).length > 0) {
+                        for (var key in res.data.PAnalysis) {
+                            that.cacheImgData[key] = res.data.PAnalysis[key]
+                        }
+                        that.disWinnerAmount(that.cacheImgData.winnerAmount);
+                      } else {
+                        delete that.cacheImgData.winnerAmount
+                      }
+                  }
+                  if(that.loading) {
+                    that.loading.clear()
+                  }
+              },
+              error:function(err) {
+                if(that.loading) {
+                  that.loading.clear()
+                }
+              }
+          })
+        },
+        // 单独查历史合作评标专家
+        getHistoryExpert: function() {
+          var that = this;
+          const {pname, buyer, area, limitTime, keys, searchItem, projectScope, pid, sid} = that.filterData
+          var data = {
+            appVersion: that.appVersion,
+            searchItem: searchItem ? searchItem : 1,
+            area: {
+              [area]: []
+            },
+            buyer: buyer,
+            buyerContent: keys,
+            pname: pname,
+            limitTime: limitTime,
+            pid: pid,
+            sid: sid,
+            projectScope: projectScope ? projectScope : 0
+          }
+          $.ajax({
+              type:'post',
+              url:'/bigmember/decision/decReviewExperts',
+              data: JSON.stringify(data),
+              contentType: 'application/json',
+              success:function(res) {
+                console.log(res)
+                  if(res.error_code == 0) {
+                      if(res.data.status == -2) {
+                          that.isShow.showExperts = false;
+                      }
+                      if (res.data.PAnalysis && Object.keys(res.data.PAnalysis).length > 0) {
+                          that.isShow.showExperts = true
+                          for (var key in res.data.PAnalysis) {
+                              that.cacheImgData[key] = res.data.PAnalysis[key]
+                          }
+                          that.disReviewExperts(that.cacheImgData.reviewExperts);
+                      } else {
+                        delete that.cacheImgData.reviewExperts
+                        that.isShow.showExperts = false
+                      }
+                  }
+                  if(that.loading) {
+                    that.loading.clear()
+                  }
+              },
+              error:function() {
+                  if(that.loading) {
+                    that.loading.clear()
+                  }
+              }
+          })
+        },
+        // 跳转到中标企业预测
+        goBidForcast () {
+          const { pid, sid } = this.filterData
+          this.savePageData()
+          if(pid && sid) {
+            location.href = '/jyapp/big/page/ai_add?fromType=analysis&id=' + pid + '&sId=' + sid
+          } else {
+            location.href = '/jyapp/big/page/ai_add?fromType=analysis'
+          }
+        },
         // 初始化画像数据
         initChartData:function(){
             var item = this.cacheImgData;
             this.disBuyerHistory(item.buyerHistroyList);
-            this.disWinnerAmount(item.winnerAmount);
             this.disBidCycle(item.bidcycle_ranges);
             this.disBudgetFound(item.budgetAnalysis);
             this.disGroupArea(item.group_area);
             this.disBuyerClass(item.group_buyerclass);
-            this.disReviewExperts(item.reviewExperts);
         },
-        // 1.类似项目采购历史数据
+        // 1.类项目采购历史数据
         disBuyerHistory:function(data) {
             if(data && data.length > 0) {
+                this.isShow.showHistory = true
                 this.historyList = data
             } else {
                 this.isShow.showHistory = false;
             }
         },
-        // 2.类似项目热点中标企业数据
+        // 2.类项目热点中标企业数据
         disWinnerAmount:function(data) {
             if(data && data.length > 0) {
+                this.isShow.showWinner = true
+                this.showWinBtn = data.length > 3
                 this.hotWin = data;
             } else {
                 this.isShow.showWinner = false
             }
         },
-        // 3.类似项目标书编制周期发布
+        // 3.类项目标书编制周期发布
         disBidCycle: function (data) {
             if(data && data.length > 0) {
+                this.isShow.bidCycle = true
                 var arr = [];
                 data.forEach(function(item) {
                     arr.push({
@@ -596,10 +910,11 @@ var vNode = {
                 this.isShow.bidCycle = false
             }
         },
-        // 4.类项目预算分布
+        // 4.类项目预算分布
         disBudgetFound:function(data) {
             if(data && data.length > 0) {
                 // 数据都为0 隐藏
+                this.isShow.showHotMap = true
                 var countArr = data.map(function(v){
                     return v.doc_count;
                 })
@@ -615,15 +930,16 @@ var vNode = {
                 this.isShow.showHotMap = false;
             }
         },
-        // 5.类项目区域分布
+        // 5.类项目区域分布
         disGroupArea:function(data){
             if (data && data.length > 0) {
+                this.isShow.showMap = true
                 var rows = [];
                 data.forEach(function(item){
                     rows.push({
                         '省份': item.key,
-                        '类项目数量': item.doc_count,
-                        '类项目规模': utils.moneyUnit(item.bidamount_sum)
+                        '类项目数量': item.doc_count,
+                        '类项目规模': utils.moneyUnit(item.bidamount_sum)
                     })
                 })
                 this.mapChartData.rows = rows.map(function (v) {
@@ -636,9 +952,10 @@ var vNode = {
                 this.isShow.showMap = false
             }
         },
-        // 6.类项目采购单位类型分布
+        // 6.类项目采购单位类型分布
         disBuyerClass:function(data) {
             if (data && data.length > 0) {
+                this.isShow.showPie = true
                 this.$nextTick(function(){
                     this.getPieCharData(data)
                 })
@@ -653,9 +970,11 @@ var vNode = {
                     v.parent = v.doc_count / data[0].doc_count*100 + "%";
                 })
                 this.expertWinArr = data;
+                this.isShow.showExperts = true
             } else {
                 this.isShow.showExperts = false
             }
+            this.$forceUpdate()
         },
 
         // 热力图+散点图数据获取及自定义配置
@@ -687,7 +1006,6 @@ var vNode = {
                 v[1] = v[1] - waitDelCount;
                 return v
             })
-            console.log(waitDelCount,'减掉几行数据为0的')
             that.minusRows = waitDelCount;
             chartOptions.hotChart.series[0].data = data;
             chartOptions.hotChart.series[1].data = curBudget && curBudget != 0 ? [that.getCoordinateInfo(data,curBudget)] : []; // 蓝点
@@ -705,9 +1023,9 @@ var vNode = {
             chartOptions.hotChart.graphic[chartOptions.hotChart.graphic.length - 2].children[0].style.text = maxNum > 10 ? maxNum.toString() : '10';
             chartOptions.hotChart.series[0].tooltip.formatter = function(params){
                 var tip = '';
-                var count = '<span>类项目数量:' + params.value[3] + '个</span></br>';
+                var count = '<span>类项目数量:' + params.value[3] + '个</span></br>';
                 var rate = (typeof params.value[2] == 'number' && !isNaN(params.value[2])) ? '<span>平均折扣率:' + (params.value[2]*100).fixed(2) + '%</span></br>' : '';
-                var budget = '<span>类项目预算:' + params.value[4] + '</span></br>';
+                var budget = '<span>类项目预算:' + params.value[4] + '</span></br>';
                 tip = budget + count + rate;
                 return tip;
             }
@@ -715,9 +1033,9 @@ var vNode = {
                 var arr = chartOptions.hotChart.series[1].data[0]; // 蓝点数据
                 var tip = '';
                 params.marker = '<span style="display:inline-block;margin-right:5px;border-radius:8px;width:8px;height:8px;background-color:' + params.color +'"></span>';
-                var count = '<span style="padding-left:13px;">类项目数量:' + arr[3] + '个</span></br>';
+                var count = '<span style="padding-left:13px;">类项目数量:' + arr[3] + '个</span></br>';
                 var rate = (typeof arr[2] == 'number' && !isNaN(arr[2])) ? '<span style="padding-left:13px;">平均折扣率:' + (arr[2]*100).fixed(2) + '%</span></br>' : '';
-                var budget = '<span style="padding-left:13px;">类项目预算:' + arr[4] + '</span></br>';
+                var budget = '<span style="padding-left:13px;">类项目预算:' + arr[4] + '</span></br>';
                 tip = params.marker +  '当前项目预算:' + (curBudget/10000).fixed(2) + '万元<br/>' + budget + count + rate;
                 return tip;
             }
@@ -816,7 +1134,6 @@ var vNode = {
                 arr.push(data[i]['编制周期'].replace('天','').split('-'))
             }
             var curIndex = this.getArrayIndex(arr,curCycle,'cycle')
-            console.log('当前编制周期所在下标:',curIndex,curCycle)
             params.grid.top = 15;
             params.grid.right = 15;
             params.yAxis[0].name = '';
@@ -842,17 +1159,18 @@ var vNode = {
             data.forEach(function(item){
                 arr.push(item.key,item.doc_money,item.doc_count,item.avg,item.main)
             })
-            var normal =['行业','类项目规模', '类项目数量','平均折扣率','是否当前项目'];
+            var normal =['行业','类项目规模', '类项目数量','平均折扣率','是否当前项目'];
             var newArr = that.arrTrans(5,arr);
             newArr.unshift(normal)
+            chartOptions.deformPieChart.roseType = false;
             chartOptions.deformPieChart.dataset.source = newArr;
             chartOptions.deformPieChart.tooltip.formatter = function(params){
                 var tip = '';
                 var data = params.data;
                 params.marker = '<span style="display:inline-block;margin-right:5px;border-radius:8px;width:8px;height:8px;background-color:' + params.color +'"></span>';
                 var percent = '<span style="padding-left:13px;">采购规模占比:' + params.percent + '%</span></br>';
-                var scale = '<span style="padding-left:13px;">类项目规模:' + (data[1]/10000).fixed(2) + '万元</span></br>';
-                var count = '<span style="padding-left:13px;">类项目数量:' + data[2] + '个</span></br>';
+                var scale = '<span style="padding-left:13px;">类项目规模:' + (data[1]/10000).fixed(2) + '万元</span></br>';
+                var count = '<span style="padding-left:13px;">类项目数量:' + data[2] + '个</span></br>';
                 var rate = (typeof data[3] == 'number' && !isNaN(data[3])) ? '<span style="padding-left:13px;">平均折扣率:' + (data[3]*100).fixed(2) + '%</span></br>' : '';
                 tip = params.marker + params.name +'<br/>' + percent + scale + count + rate
                 return tip;
@@ -891,7 +1209,7 @@ var vNode = {
         // 地图配单独置项
         mapConfig: function(options) {
             var arr = this.mapChartData.rows;
-            var maxNum = Math.max.apply(Math, arr.map(function(o) {return o['类项目数量']}))
+            var maxNum = Math.max.apply(Math, arr.map(function(o) {return o['类项目数量']}))
             options.graphic[options.graphic.length - 1].children[0].style.text = maxNum > 100 ? maxNum : 100;
             options.graphic[options.graphic.length - 1].children[1].style.text = 1;
             options.graphic[0].children[0].style.text = '项目数量(个)'
@@ -903,12 +1221,12 @@ var vNode = {
                 var counts = '';
                 for (var i = 0; i < data.length; i++) {
                     for (var j = 0; j < data[i].data.length; j++) {
-                        if(data[i].name == '类项目数量') {
+                        if(data[i].name == '类项目数量') {
                             if(params.name == data[i].data[j].name) {
                                 counts = data[i].data[j].value
                             }
                         }
-                        if(data[i].name == '类项目规模') {
+                        if(data[i].name == '类项目规模') {
                             if(params.name == data[i].data[j].name) {
                                 scaleVal = data[i].data[j].value
                             }
@@ -917,8 +1235,8 @@ var vNode = {
                 }
                 var tip = '';
                 var area = counts && counts != '' ? params.name + '</br>' : '';
-                var count = counts &&  counts != '' ? '<span>类项目数量:' + counts  + '个</span></br>' : '';
-                var scale = scaleVal && scaleVal != '' ? '<span>类项目规模:' + scaleVal + '</span></br>' : '';
+                var count = counts &&  counts != '' ? '<span>类项目数量:' + counts  + '个</span></br>' : '';
+                var scale = scaleVal && scaleVal != '' ? '<span>类项目规模:' + scaleVal + '</span></br>' : '';
                 tip = area + count + scale;
                 return tip;
             }
@@ -976,7 +1294,13 @@ var vNode = {
         },
         // 存储页面数据
         savePageData: function(){
+            if(this.filterData.searchItem === 1) {
+              delete this.cacheImgData.group_buyerclass
+            } else if(this.filterData.searchItem === 2) {
+              delete this.cacheImgData.group_area
+            }
             var data = {
+                active: this.active,
                 cacheImgData: this.cacheImgData,
                 projectListDetail: this.projectListDetail,
                 defaultProjectDetail: this.defaultProjectDetail,
@@ -986,99 +1310,144 @@ var vNode = {
                 screenWidth: this.screenWidth,
                 year: this.year,
                 baseInfo: this.baseInfo,
-                scrollTop: this.$refs.wrapper.scrollTop
-            }
+                showListBtn: this.showListBtn,
+                scrollTop: this.$refs.wrapper.scrollTop,
+                filterData: this.filterData,
+                showListBtn: this.showListBtn,
+                showWinBtn: this.showWinBtn,
+                hotWinnerEnt: this.hotWinnerEnt,
+                historyExpert: this.historyExpert,
+                listCount: this.listCount,
+                isHaveTop: this.isHaveTop,
+                loadingEmpty: this.loadingEmpty
+                }
             // console.log(data)
-            sessionStorage.setItem('$data-analysis-result',JSON.stringify(data))
+            sessionStorage.setItem('searchItem', this.filterData.searchItem)
+            sessionStorage.setItem('$data-analysis-result_' + this.filterData.searchItem,JSON.stringify(data))
         },
         // 恢复页面数据
         restoreData:function(){
-            var $data = sessionStorage.getItem('$data-analysis-result')
+            const analysisFilterData = sessionStorage.getItem('analysis-filter-data')
+            if(analysisFilterData) {
+              this.id = ''
+            } else {
+              // 如果有id查询/bigmember/analysis/projectInfo
+              const id = utils.getParam('id')
+              if(id) {
+                this.id = id
+              }
+            }
+            const $data_searchItem = sessionStorage.getItem('searchItem')
+            var $data = sessionStorage.getItem('$data-analysis-result_' + $data_searchItem)
             if ($data) {
                 $data = JSON.parse($data)
+                this.isShow = $data.isShow
+                this.filterData = $data.filterData
+                if(this.filterData.searchItem === 1) {
+                  delete $data.cacheImgData.group_buyerclass
+                } else if(this.filterData.searchItem === 2) {
+                  delete $data.cacheImgData.group_area
+                }
                 this.cacheImgData = $data.cacheImgData || {}
                 this.projectListDetail = $data.projectListDetail
                 this.defaultProjectDetail = $data.projectListDetail
+                if($data.projectListDetail.length > 0) {
+                  this.isShow.showProjectList = true
+                } else {
+                  this.isShow.showProjectList = false
+                }
+                this.setProjectDetail()
                 this.skeletonShow = $data.skeletonShow
-                this.isShow = $data.isShow
                 this.minusRows = $data.minusRows
                 this.screenWidth = $data.screenWidth
                 this.year = $data.year
                 this.baseInfo = $data.baseInfo
+                this.showListBtn = $data.showListBtn
                 this.scrollTop = $data.scrollTop
+                this.showListBtn = $data.showListBtn
+                this.showWinBtn = $data.showWinBtn
+                this.hotWinnerEnt = $data.hotWinnerEnt
+                this.historyExpert = $data.historyExpert
+                this.listCount = $data.listCount
+                this.active = $data.active
+                this.isHaveTop = $data.isHaveTop
+                this.loadingEmpty = $data.loadingEmpty
                 var _this = this
                 this.$nextTick(function(){
-                  _this.$refs.wrapper.scrollTop = $data.scrollTop || 0
+                  setTimeout(() => {
+                    _this.$refs.wrapper.scrollTop = $data.scrollTop || 0
+                  }, 500)
                 })
                 this.initChartData()
-                sessionStorage.removeItem('$data-analysis-result')
+                this.disWinnerAmount(this.cacheImgData.winnerAmount);
+                this.disReviewExperts(this.cacheImgData.reviewExperts);
+                this.setInterSection()
+                // sessionStorage.removeItem('$data-analysis-result' + this.filterData.searchItem)
             }
             return !!$data
         },
-        goDetail (winner, buyer) {
-          this.active = 1
-          this.activeNames = ['1']
-          this.winnerVal = winner ? winner : ''
-          this.buyerVal = buyer ? buyer : ''
-          this.scrollTop = this.$refs.wrapper.scrollTop
-          if (buyer) {
-            this.getProjectDetail(0, winner, buyer)
-          } else {
-            this.getProjectDetail(0, winner)
+        goProDetail (data) {
+          if(data) {
+            this.filterData.winner = data.key
+            this.filterData.searchType = 2
           }
+          this.savePageData()
+          // sessionStorage.setItem('analysis_result_proDetail', JSON.stringify(this.defaultProjectDetail))
+          location.href = '/jyapp/big/page/bid_analysis_pro_list'
         },
         onTabClick (page) {
-          if (page == 1) {
-            var loading = this.showLoading()
-            var _this = this
-            setTimeout(function() {
-              _this.projectListDetail = _this.defaultProjectDetail
-              loading.clear()
-            }, 50)
-          } else {
-            var _this = this
-            this.$nextTick(function(){
-              _this.$refs.wrapper.scrollTop = this.scrollTop
-            })
-          }
-          this.activeNames = []
-          this.winnerVal = ''
-          this.buyerVal = ''
-        },
-        // 类似项目明细搜素
-        onSearch () {
-          if (!this.winnerVal && !this.buyerVal) return
-          if (this.winnerVal && this.buyerVal) {
-            this.getProjectDetail(0, this.winnerVal, this.buyerVal)
-          } else {
-            this.getProjectDetail(0, this.winnerVal, this.buyerVal)
-          }
-        },
-        // 跳转其他项目明细页面
-        goOtherDetail (winner, buyer) {
+          this.setModuleState()
+          // this.filterData.projectScope
+          // historyExpert.historyTabActive
           this.savePageData()
-          var data = {
-            area: this.areaData,
-            buyerContent: this.contentData,
-            buyerClass: this.buyerClassData,
-            minPrice: utils.deepCompare(this.moneyData, []) ? '' : Number(this.moneyData[0]),
-            maxPrice: Number(this.moneyData[1]) || '',
-            industry: this.industriesData ? this.formatterIndustryData(this.industriesData).toString() : '',
-            pname: this.project.projectName,
-            pid: this.project.pId,
-            sid: this.project.infoId,
-            buyer: this.project.buyer,
-            mobileModel: this.mobileModel,
-            appVersion: this.appVersion,
-            // 以下为新增
-            winner: winner,
-            searchType: 1
+          switch (page) {
+            case 0:
+              this.filterData.searchItem = 1
+              this.filterData.projectScope = 1
+              this.historyExpert.historyTabActive = 0
+              break;
+            case 1:
+              this.filterData.searchItem = 2
+              this.filterData.projectScope = 1
+              this.historyExpert.historyTabActive = 0
+              break;
+            case 2:
+              this.filterData.searchItem = 3
+              this.filterData.projectScope = 1
+              this.historyExpert.historyTabActive = 0
+              break;
+            default:
+              break;
           }
-          if (winner || buyer) {
-            sessionStorage.setItem('analysis_other_project', JSON.stringify(data))
-            location.href = "./free_other_project?winner=" + winner + '&buyer=' + buyer
+          sessionStorage.setItem('searchItem', this.filterData.searchItem)
+          const $data_searchItem = sessionStorage.getItem('searchItem')
+          if($data_searchItem) {
+            if(this.filterData.searchItem == $data_searchItem) {
+              const recover = this.restoreData()
+              if (!recover) {
+                this.setYearData()
+                this.getChartData()
+                this.getProjectWinnerEnt()
+                this.getProjectDetail()
+                this.getHistoryExpert()
+                setTimeout(() => {
+                  var targetEle = document.getElementById('analysis-tabs')
+                  targetEle.scrollIntoView()
+                  this.isHaveTop = false
+                }, 500)
+              }
+            } else {
+              this.setYearData()
+              this.getChartData()
+              this.getProjectWinnerEnt()
+              this.getProjectDetail()
+              this.getHistoryExpert()
+            }
           }
-        }
+          setTimeout(() => {
+            this.active = page
+          }, 200)
+        },
     }
 }
 var result = new Vue(vNode)

+ 6 - 6
src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/chart_options.js

@@ -120,7 +120,7 @@ var chartOptions = {
                     top: 'middle',
                     style: {
                         fill: '#333',
-                        text: '类项目数量(个)',
+                        text: '类项目数量(个)',
                         font: '10px Microsoft YaHei'
                     }
                 }]
@@ -243,7 +243,7 @@ var chartOptions = {
             itemGap: 30,
         },
         series: [{
-            name: '类项目数量',
+            name: '类项目数量',
             type: 'heatmap',
             label: {
                 show: false
@@ -363,7 +363,7 @@ var chartOptions = {
         series: [
             {
                 type:'bar',
-                name:'类项目标书编制周期',
+                name:'类项目标书编制周期',
                 barWidth: 10,
                 barMaxWidth: 10,
                 itemStyle:{
@@ -425,7 +425,7 @@ var chartOptions = {
                         top: 'middle',
                         style: {
                             fill: '#333',
-                            text: '类项目标书编制周期',
+                            text: '类项目标书编制周期',
                             font: '11px Microsoft YaHei',
                             x: 8
                         }
@@ -778,7 +778,7 @@ var chartOptions = {
         series: {
             name: '半径模式',
             type: 'pie',
-            bottom:20,
+            bottom: 60,
             avoidLabelOverlap: true,
             stillShowZeroSum: false,
             radius:[2, '85%'],
@@ -790,7 +790,7 @@ var chartOptions = {
                 x:0,
                 y:1,
                 itemName: '行业',
-                value: "类项目规模", 
+                value: "类项目规模", 
             },
             labelLine: {
                 show:false

+ 13 - 13
src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/contrast_trial.js

@@ -55,7 +55,7 @@ var CustomData = {
             sm: '利用招标大数据,结合项目知识工程,预测潜在新项目',
             merge: true,
             '预测采购项目': ['利用招标大数据,预测潜在项目的采购内容。', '2个'],
-            '类项目联系方式': ['提供类项目的联系人、联系方式等。', '2个'],
+            '类项目联系方式': ['提供类项目的联系人、联系方式等。', '2个'],
         },
         '中标企业预测': {
             sm: '通过大数据和AI技术,预测项目中标企业',
@@ -65,18 +65,18 @@ var CustomData = {
             '企业联系方式': ['提供企业的联系方式,一键可拨打联系人。', '2个'],
         },
         '投标决策分析': {
-            sm: '分析类项目,帮助企业决策是否投标或合作投标、以及投标报价金额等。',
-            '类项目动态': ['提供类项目的招标日期、招标截至日期、采购单位、代理机构、项目行业、金额等', '✅'],
-            '类项目筛选': ['通过项目行业、地区、采购内容、金额区间、采购单位类型筛选符合条件项目信息。', '✅'],
-            '类项目分析': ['通过大数据统计分析,提供近2-3年类项目数量、项目金额、涉及中标企业数量、涉及评标专家数量。', '✅'],
-            '类项目明细': ['提供类项目明细,包含项目的名称、采购方式、中标企业、评标专家、项目时间、预算、中标价、折扣率、中标候选人等。', '✅'],
-            '类项目采购历史': ['提供类项目的历史采购动态,项目名称、采购方式、时间等。', '✅'],
-            '类项目热点中标企业': ['根据类项目的历史中标数量、中标金额等综合评定企业竞争力,提供排名前十的企业。', '✅'],
-            '类项目标书编制周期发布': ['提供类项目的历史招标文件发放至投标截止时间(开标)时间间隔、项目数量,为投标人编制标书提供参考。', '✅'],
-            '类项目采购单位类型分布': ['提供采购规模排名前十的采购单位类型及规模占比、类项目规模、类项目数量、平均折扣率。', '✅'],
-            '类项目评标专家': ['通过大数据分析统计,提供类项目评标专家的频次排名。', '✅'],
-            '类项目区域分布': ['提供类项目的采购区域热度分布。', '✅'],
-            '类项目预算分布': ['提供类似采购项目的预算金额分布。', '✅'],
+            sm: '分析类项目,帮助企业决策是否投标或合作投标、以及投标报价金额等。',
+            '类项目动态': ['提供类项目的招标日期、招标截至日期、采购单位、代理机构、项目行业、金额等', '✅'],
+            '类项目筛选': ['通过项目行业、地区、采购内容、金额区间、采购单位类型筛选符合条件项目信息。', '✅'],
+            '类项目分析': ['通过大数据统计分析,提供近2-3年类项目数量、项目金额、涉及中标企业数量、涉及评标专家数量。', '✅'],
+            '类项目明细': ['提供类项目明细,包含项目的名称、采购方式、中标企业、评标专家、项目时间、预算、中标价、折扣率、中标候选人等。', '✅'],
+            '类项目采购历史': ['提供类项目的历史采购动态,项目名称、采购方式、时间等。', '✅'],
+            '类项目热点中标企业': ['根据类项目的历史中标数量、中标金额等综合评定企业竞争力,提供排名前十的企业。', '✅'],
+            '类项目标书编制周期发布': ['提供类项目的历史招标文件发放至投标截止时间(开标)时间间隔、项目数量,为投标人编制标书提供参考。', '✅'],
+            '类项目采购单位类型分布': ['提供采购规模排名前十的采购单位类型及规模占比、类项目规模、类项目数量、平均折扣率。', '✅'],
+            '类项目评标专家': ['通过大数据分析统计,提供类项目评标专家的频次排名。', '✅'],
+            '类项目区域分布': ['提供类项目的采购区域热度分布。', '✅'],
+            '类项目预算分布': ['提供类似采购项目的预算金额分布。', '✅'],
         }
     },
     '招标大数据服务': {

+ 1 - 1
src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/main_root_data.js

@@ -80,7 +80,7 @@ var staticData = [
                 b_gray_icon:'icon-gray-zhongbiaoxmfx',
                 b_gold_icon:'icon-gold-zhongbiaoxmfx',
                 b_high:'投标决策分析',
-                b_content:'分析类项目,帮助企业决策是否投标或合作投标、以及投标报价金额等。'
+                b_content:'分析类项目,帮助企业决策是否投标或合作投标、以及投标报价金额等。'
             }
         ]
     },

+ 1 - 1
src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/mock.js

@@ -352,7 +352,7 @@ var competeData = [
         ]
     },
 ];
-// 类项目明细
+// 类项目明细
 var projectListDetail = [
     {
         "_id": "ABCY2FCZT0%2FOy87JHxhcHUJJzACHj1mZnB%2FPx4kNi9FaGdzcBlUCjQ%3D",

+ 43 - 2
src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/unit_portrayal.js

@@ -127,7 +127,8 @@ var vNode = {
         isFree: false,
         vipStatus: 0,
         viper: false,
-        entniche: false
+        entniche: false,
+        isLogin: false // 用户是否登录
       },
       usageInfo: {
         total: 0,
@@ -195,9 +196,12 @@ var vNode = {
     getfreeBuyerPort: function () {
       return this.userInfo.isFree && this.userInfo.freeBuyerPort == 0;
     },
+    // 是否登录
+    isLogin: function () {
+      return this.userInfo.isLogin
+    },
     // 展示超级订阅浏览次数
     superVipPort: function () {
-      console.log(this.userInfo.vipStatus, this.userInfo.viper)
       return this.userInfo.vipStatus > 0 && this.userInfo.viper && this.power.indexOf(5) == -1
     },
     // 超级订阅用户对应的按钮
@@ -251,6 +255,7 @@ var vNode = {
     }
   },
   created () {
+    this.getUserSimpleInfo()
     this.getPowerInfo()
     setTimeout(() => {
       this.getIsSc()
@@ -267,6 +272,12 @@ var vNode = {
     }
     // 获取站内社交分享参数
     this.getShareParams()
+    // 设置页面TDK,仅h5需要设置
+    if (utils.$envs.inH5) {
+      try {
+        setPageTdk('unit_portrayal', this.buyer.name)
+      } catch (error) {}
+    }
   },
   beforeDestroy () {
     window.removeEventListener("resize", this.init, 20);
@@ -282,6 +293,21 @@ var vNode = {
         })
       }
     }, 300),
+    // 判断当前用户是登录
+    getUserSimpleInfo() {
+      const _this = this
+      $.ajax({
+        type: 'POST',
+        url: '/jypay/user/getSimpleData',
+        success: function (res) {
+          if(res && res.userId) {
+            _this.userInfo.isLogin = true
+          }
+        },error:function (e) {
+          _this.userInfo.isLogin = false
+        }
+      })
+    },
     getShareParams () {
       this.unitParams = {
         type: '5',
@@ -363,6 +389,8 @@ var vNode = {
             _this.getUsage(); // 超级订阅用户剩余次数
             _this.getNewMsg(); // 中标动态
             _this.getChartData(); // 企业画像
+          } else {
+            _this.userInfo.isLogin = false
           }
         },
         error: function (error) {
@@ -466,6 +494,11 @@ var vNode = {
     },
     // 跳转招标动态新页面
     goProjectPage: function () {
+      // 未登录跳转登录
+      if(!this.isLogin) {
+        window.location.href = "/jyapp/free/login?to=back";
+        return
+      }
       // 无权限的弹出弹框提醒
       let _this = this
       if (this.getStatus) {
@@ -510,6 +543,10 @@ var vNode = {
     },
     //数据导出
     onExport () {
+      if(!this.isLogin) {
+        window.location.href = "/jyapp/free/login?to=back";
+        return
+      }
       var storageSet = JSON.parse(sessionStorage.getItem('buyer_high_set'))
       // var isMember = this.bigStatus > 0 && this.power.indexOf(5) > -1
       var data = {
@@ -536,6 +573,10 @@ var vNode = {
     },
     //收藏
     addKeepStatus (item) {
+      if(!this.isLogin) {
+        window.location.href = "/jyapp/free/login?to=back";
+        return
+      }
       if (vKeepComponent) {
         let canKeep = this.idx.indexOf(item.id) > -1
         vKeepComponent.changeBid(item.id, !canKeep)

+ 239 - 0
src/jfw/modules/app/src/web/staticres/jyapp/dataSmt/css/index.css

@@ -0,0 +1,239 @@
+ul,li{
+    list-style: none;
+    padding:0;
+    margin:0;
+}
+.data-sam-main{
+    overflow-y:hidden ;
+}
+.header-banner{
+    position: relative;
+}
+.bottom-handle-box{
+    position: absolute;
+    bottom: 0;
+    z-index:1;
+    background: #fff;
+    height: 1.32rem;
+    width: 100%;
+    padding:  .16rem .32rem .24rem .32rem;
+}
+.bottom-handle-box .confirm-btn{
+    height: .92rem;
+    border-radius: 8px;
+    background: #2ABED1;
+    text-align: center;
+    font-size: .36rem;
+    line-height: .92rem;
+    color: #fff;
+}
+.fixed{
+    position: fixed;
+    bottom: 0;
+}
+/*bannner部分*/
+.header-box{
+    position: absolute;
+    bottom: 0.88rem;
+    padding: 0 0.58rem;
+}
+.header-box .supermarket-img{
+    height: 0.64rem;
+}
+.header-banner-img{
+    width:100%;
+}
+.header-box .sub-description {
+    color: #5F5E64;
+    font-size:0.24rem;
+    line-height:.4rem;
+    margin: .16rem 0;
+    width:4.16rem;
+}
+.header-box .example-list li{
+   float: left;
+    min-width: 2.08rem;
+    display: flex;
+    align-items: center;
+    color: #1D1D1D;
+    font-size: .28rem;
+    margin-bottom: .16rem;
+    text-align: left;
+}
+.header-box .example-list img{
+    width:.32rem;
+    height:.32rem;
+    margin-right: .08rem;
+}
+.header-box .example-list  li:nth-of-type(2n-1) {
+    margin-right: .64rem;
+}
+.content-container{
+    position: relative;
+}
+/*搜索框*/
+.section-search-com{
+    position: absolute;
+    top: -0.48rem;
+    padding: 0 .48rem;
+}
+.search-component{
+    width: 6.54rem;
+    height: .96rem;
+    box-shadow: 0 .04rem .16rem 0 rgba(54, 147, 179, 0.05);
+    border-radius: 8px;
+    background:#fff;
+    display: flex;
+    align-items: center;
+    padding: .24rem;
+}
+.search-component input{
+    height: .52rem;
+    margin-left: .16rem;
+    width: 100%;
+    font-size:.28rem;
+}
+/*条件选择模块*/
+.select-component{
+    margin-top: .96rem;
+    padding: 0 .24rem 0 .48rem;
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    font-size: .28rem;
+
+}
+.select-component .cell-left .data-type{
+    color: #2ABED1;
+    margin: .24rem .08rem;
+}
+.select-component .cell-right{
+     color: #2ABED1;
+}
+.select-component .cell-right span:nth-of-type(1) {
+    text-decoration: underline;
+}
+.select-component .cell-right .icon-help1{
+    width: .32rem;
+    height: .32rem;
+    margin-left:.08rem;
+}
+.select-component .cell-left, .select-component .cell-right{
+    display: flex;
+    align-items: center;
+}
+
+.icon-search::before{
+    content: ''
+}
+.icon-duihao {
+    display: flex;
+    width: 0.48rem;
+    height: 0.48rem;
+    color: #2ABED1;
+    font-size: .48rem;
+}
+.icon-youbian{
+    color: #C0C4CC;
+    width: 0.22rem;
+    height: .32rem;
+}
+
+.custom-pop .pop-title{
+    height: 1.28rem;
+    font-size: .4rem;
+    line-height: 1.28rem;
+    padding-left: .36rem;
+    color: #171826;
+}
+.custom-pop .pop-content{
+    height: 7rem;
+    overflow-y: auto;
+}
+.custom-pop .van-cell{
+    padding: 15px 16px 13px 16px;
+    font-size: .32rem;
+}
+.van-popup__close-icon{
+    font-size: .32rem;
+}
+.van-popup__close-icon--top-right{
+    top: .46rem;
+}
+.explain-pop .van-cell{
+    font-weight: bold;
+    padding-top:8px;
+    padding-bottom:8px;
+}
+.explain-pop .van-cell .van-cell__label{
+    color: #5F5E64;
+    font-size:.28rem;
+    font-weight: normal;
+    line-height: .4rem;
+    margin-top: 8px;
+}
+
+/*数据列表*/
+.list-component.j-container{
+    height: calc(100vh - 8.56rem);
+    min-height: 45%;
+}
+.list-component .j-main{
+    /*min-height: 45%;*/
+    padding: 0 .24rem;
+    margin-bottom: .24rem;
+}
+.list-component .list-row{
+    background: #fff;
+    margin-top: .24rem;
+    padding: .48rem .24rem;
+    border-radius: .16rem;
+    position: relative;
+}
+.list-component .label-info{
+    color: #171826;
+    font-size: .3rem;
+    line-height: .48rem;
+}
+.corner-mark{
+    position: absolute;
+    left:0;
+    top:0;
+    display: inline-flex;
+    padding: 1px 12px;
+    flex-direction: column;
+    align-items: center;
+    border-radius: 8px 0;
+    background: linear-gradient(135deg, #FC6 0%, #FF9F40 100%);
+    color: #fff;
+    text-align: center;
+    text-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.15);
+    font-size: .28rem;
+    line-height: .36rem;
+
+}
+.corner-color-1, .corner-color-6{
+    background: linear-gradient(135deg, #FC6 0%, #FF9F40 100%);
+}
+.corner-color-2, .corner-color-5{
+    background: linear-gradient(315deg, #39F 0%, #00D1FF 100%);
+}
+.corner-color-3{
+    background: linear-gradient(135deg, #0BD991 0%, #00B031 100%);
+}
+.corner-color-4{
+    background: linear-gradient(315deg, #1DB5E5 0%, #2ABED1 100%);
+}
+.list-component .row-tags{
+    margin-top: .16rem;
+    color: #5F5E64;
+    font-size: .24rem;
+}
+.list-component .tag-item{
+    padding: 1px 8px;
+    border-radius: 4px;
+    border: 0.5px solid rgba(0, 0, 0, 0.05);
+    background: #F7F9FA;
+}
+
+

BIN
src/jfw/modules/app/src/web/staticres/jyapp/dataSmt/images/data-market-text.png


BIN
src/jfw/modules/app/src/web/staticres/jyapp/dataSmt/images/header-banner.png


BIN
src/jfw/modules/app/src/web/staticres/jyapp/dataSmt/images/icon-1.png


+ 102 - 0
src/jfw/modules/app/src/web/staticres/jyapp/dataSmt/js/index.js

@@ -0,0 +1,102 @@
+
+$(function () {
+})
+function searchFocus () {
+  location.replace('/jyapp/datasmt/list')
+}
+var vNode = {
+  el: '#select-component',
+  delimiters: ['${', '}'],
+  data: {
+    showDataType: false,
+    dataType: 0,
+    selectType: 0,
+    typeList: [
+      {
+        label: '全部',
+        value: 0
+      },
+      {
+        label: '采购意向',
+        value: 1
+      },
+      {
+        label: '拟建项目',
+        value: 2
+      },
+      {
+        label: '招标数据',
+        value: 3
+      },
+      {
+        label: '中标数据',
+        value: 4
+      },
+      {
+        label: '企业工商数据',
+        value: 5
+      },
+      {
+        label: '中标单位数据',
+        value: 6
+      },
+      {
+        label: '采购单位数据',
+        value: 7
+      }
+    ],
+    showExplain: false,
+    explainList: [
+      {
+        title: '采购意向',
+        label: '匹配关键词、省份、城市、公告标题、公告类别、公告内容、发布时间、公告地址、剑鱼标讯地址、项目名称、项目范围、预算金额、采购单位名称'
+      },
+      {
+        title: '拟建项目',
+        label: '匹配关键词、省份、城市、区县、公告标题、公告类别、公告内容、发布时间、公告地址、剑鱼标讯地址、项目名称、总投资、业主单位、建设规模(内容)、建设地点、竣工时间、开工时间、项目类型(申报方式)、审批结果'
+      },
+      {
+        title: '招标数据',
+        label: '匹配关键词、省份、城市、区县、公告标题、公告类别、公告内容、发布时间、公告地址、剑鱼标讯地址、项目名称、项目编号、项目范围、预算金额、报名截止日期、开标日期、投标截止日期、采购单位信息(采购单位名称、采购单位联系人、采购单位联系电话、采购单位地址)、招标代理机构'
+      },
+      {
+        title: '中标数据',
+        label: '匹配关键词、省份、城市、区县、公告标题、公告类别、公告内容、发布时间、公告地址、剑鱼标讯地址、项目名称、项目编号、项目范围、预算金额、中标金额、报名截止日期、开标日期、投标截止日期、采购单位信息(采购单位名称、采购单位联系人、采购单位联系电话、采购单位地址)、招标代理机构、中标单位信息(中标单位名称、中标单位联系人、中标单位联系电话)(来源:招标公告网站)、中标单位信息(中标单位联系人、中标单位联系电话、电子邮箱)(来源:国家企业公示网站)'
+      },
+      {
+        title: '企业工商数据',
+        label: '企业名称、曾用名、登记状态、企业类型、经营范围、法定代表人、注册资本、统一社会信用代码、纳税人识别号、注册号、组织机构代码、成立日期、登记机关、核准日期、所属省份、所属城市、所属区县、企业电话、企业地址、企业邮箱、人员规模'
+      },
+      {
+        title: '中标单位数据',
+        label: '中标单位、统一信用代码、省份、城市、区县、经营范围、招标信息通讯录(联系人、联系方式、地址)、近3年中标项目规模、近3年中标项目数量、业务覆盖区域、客户群体、TOP5客户信息(客户名称、客户所在省份、客户所在城市、客户分类、中标金额)'
+      },
+      {
+        title: '采购单位数据',
+        label: '采购单位、统一信用代码、单位类别、省份、城市、区县、经营范围、招标信息通讯录(联系人、联系方式、地址)、近3年招标项目规模、近3年招标项目数量、TOP5中标单位信息(中标单位名称、中标单位所在省份、中标单位所在城市、合作金额)'
+      }
+    ]
+  },
+  computed: {
+    typeText () {
+       var obj = this.typeList.find(item => {
+        return item.value === this.dataType
+      })
+      return obj ? obj.label : '全部'
+    }
+  },
+  methods: {
+    showTypeHandle () {
+      this.selectType = this.dataType
+      this.showDataType = true
+    },
+    changeDataType (item) {
+      this.selectType = item.value
+    },
+    typeConfirmHandle () {
+      this.dataType = this.selectType
+      this.showDataType = false
+    }
+  }
+}
+var auth = new Vue(vNode)

BIN
src/jfw/modules/app/src/web/staticres/jyapp/images/no-login-content.png


+ 35 - 2
src/jfw/modules/app/src/web/templates/big-member/page_ai_add.html

@@ -368,6 +368,13 @@
                 this.firstSearch()
             }
             this.initPurchaseList();
+            // 从投标决策分析跳转过来
+            if(utils.getParam('fromType') == 'analysis') {
+              let analysisFilterData = sessionStorage.getItem('analysis-filter-data')
+              if(analysisFilterData) {
+                this.analysisFilterData = JSON.parse(analysisFilterData)
+              }
+            }
             // var searchData = JSON.parse(sessionStorage.getItem('big-ai-search'));
             var addCont = JSON.parse(sessionStorage.getItem('big-ai-add-data'))
             if(addCont) {
@@ -406,6 +413,12 @@
             },
             // 封装预测查询方法(首次查询参数传空、点击查询参数不能为空)
             forecastFn: function(data){
+                const id = utils.getParam('id')
+                const sid = utils.getParam('sId')
+                if(id || sid) {
+                  data.id = id
+                  data.infoid = sid
+                }
                 var that = this;
                 $.ajax({
                     type:'POST',
@@ -589,6 +602,19 @@
             getFilterData: function(){
                 var history = JSON.parse(localStorage.getItem('BIG_AI_LIST'))
                 var that = this;
+                var anaBuyerContent = []
+                var anaBuyer = ''
+                if(that.analysisFilterData.buyerContent) {
+                  anaBuyerContent = that.analysisFilterData.buyerContent.reduce((acc, item) => acc.concat(item.key), []).flat();
+                }
+                if(that.analysisFilterData.filters) {
+                  if(that.analysisFilterData.filters.buyer) {
+                    anaBuyer = that.analysisFilterData.filters.buyer
+                  }
+                  if(that.analysisFilterData.filters.pname) {
+                    that.project.pName = that.analysisFilterData.filters.pname
+                  }
+                }
                 $.ajax({
                     type:'POST',
                     url:'/bigmember/analysis/projectInfo',
@@ -612,11 +638,15 @@
                                         if(that.project.pName == ele.projectname) {
                                             if(ele.purchaseList){
                                                 that.purchaseList = ele.purchaseList
+                                            } else if(anaBuyerContent.length > 0) {
+                                              that.getApiData('content', anaBuyerContent);
                                             } else {
                                                 that.getApiData('content',res.data.purchasing);
                                             }
                                             if(ele.buyer) {
                                                 that.formData.buyer = ele.buyer
+                                            } else if(anaBuyer) {
+                                              that.getApiData('buyer', anaBuyer)
                                             } else {
                                                 that.getApiData('buyer',res.data.buyer)
                                             }
@@ -643,6 +673,11 @@
                                             that.getApiData('area',res.data.area)
                                         }
                                     }
+                                } else if(that.analysisFilterData) {
+                                  that.getApiData('content', anaBuyerContent);
+                                  that.getApiData('buyer', anaBuyer)
+                                  that.getApiData('budget',res.data.budget)
+                                  that.getApiData('area',res.data.area)
                                 } else {
                                     // 2. 读接口中的数据
                                     that.getApiData('content',res.data.purchasing);
@@ -658,8 +693,6 @@
                                     }
                                 });
                             }
-                        }else{
-                            // that.$toast(res.error_msg)
                         }
                     },
                     error:function(err) {

+ 1 - 1
src/jfw/modules/app/src/web/templates/big-member/page_analysis_filter.html

@@ -85,7 +85,7 @@
         <div class="a-header">${project.projectName}</div>
         <div class="a-filter">
             <div class="filter-title">
-                <span>类项目筛选条件</span>
+                <span>类项目筛选条件</span>
             </div>
             <div class="filter-content">
                 <van-cell  @click="toSetPage('industry')" :value-class="currentVal.industry == '请选择行业' ? '' : 'cur-value'" title="行业" is-link :value="currentVal.industry" ></van-cell>

+ 299 - 223
src/jfw/modules/app/src/web/templates/big-member/page_analysis_result.html

@@ -16,6 +16,8 @@
     <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/index.css />
     <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/icon/local.css />
     <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/v-charts/1.19.0/style.min.css>
+    <link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/css/index.css?v={{Msg "seo" "version"}}' />
+    <link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/analysis-filter/css/analysis-filter.css?v={{Msg "seo" "version"}}' />
     <link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/big-member/css/analysis_result.css?v={{Msg "seo" "version"}}' />
     <!--E-当前页面的css资源-->
 </head>
@@ -24,18 +26,18 @@
     {{include "/big-member/header.html"}}
     <div class="j-main" id="analysis-result" v-cloak ref="wrapper">
         <!-- 骨架屏 -->
-        <div class="skeleton" v-if="skeletonShow">
+        <!-- <div class="skeleton" v-if="skeletonShow">
             <img class="working" src="/jyapp/big-member/image/working.gif" alt="">
-        </div>
-        <div v-else>
-            <div class="result-top">
+        </div> -->
+        <div>
+          <div class="head-tip">分析同类项目,优化投标分析流程,提高企业投标决策效率</div>
+            <!-- <div class="result-top">
                 <div class="project-name">${baseInfo.projectname}</div>
                 <div class="project-date">
                     <span>招标日期:${baseInfo.zbtime || '--'}</span>
                     <span>招标截至日期:${baseInfo.bidopentime || '--'}</span>
                 </div>
                 <div>
-                    <!-- <p class="region-item">地区:${project.region}</p> -->
                     <p class="unit-item">
                         <span>采购单位:<a class="buyer" v-if="baseInfo.buyer" @click="goUnitImage(baseInfo.buyer)">${baseInfo.buyer}</a> <em v-else>--</em></span>
                     </p>
@@ -56,242 +58,314 @@
                         <span>中标预测 </span>
                     </div>
                 </div>
-            </div>
+            </div> -->
             <div class="filter">
                 <div class="filter-title">
-                    <span>类似项目筛选条件</span>
+                    <span>分析条件</span>
                 </div>
-                <div class="filter-content">
+                <!-- <div class="filter-content">
                     <van-cell @click="setBack" :value-class="currentVal.industry == '请选择行业' ? '' : 'cur-value'" title="行业" is-link :value="currentVal.industry" ></van-cell>
                     <van-cell @click="setBack" :value-class="currentVal.region == '请选择地区' ? '' : 'cur-value'" title="地区" is-link :value="currentVal.region"></van-cell>
                     <van-cell @click="setBack" :value-class="currentVal.content == '请选择采购内容' ? '' : 'cur-value'" title="采购内容" is-link :value="currentVal.content" ></van-cell>
                     <van-cell @click="setBack" :value-class="currentVal.money == '请选择金额区间' ? '' : 'cur-value'" title="金额区间" is-link :value="currentVal.money" ></van-cell>
                     <van-cell  @click="setBack" :value-class="currentVal.buyerClass == '请选择采购单位类型' ? '' : 'cur-value'" title="采购单位类型" is-link :value="currentVal.buyerClass" ></van-cell>
-                </div>
+                </div> -->
+                <analysis-com @action="getBaseInfo" @click="setAjaxFilters" :id="id"></analysis-com>
             </div>
             <div class="contents">
                 <div class="tabs" ref="backTop">
-                    <van-tabs v-model="active" background="#fff" title-active-color="#2ABED1" line-width="24" sticky offset-top="21.33333vw" @click="onTabClick">
-                        <van-tab title="类似项目分析">
-                            <div class="tab-item">
-                                <div class="summary">
-                                    <div class="summary-container">
-                                        <div class="summary-item">
-                                            <span>项目数量</span>
-                                            <span v-if="cacheImgData.all_counts">${cacheImgData.all_counts}个</span>
-                                            <span v-else>--</span>
-                                        </div>
-                                        <div class="summary-item">
-                                            <span>项目金额</span>
-                                            <span v-if="cacheImgData.all_money">${formatterMoney(cacheImgData.all_money)}</span>
-                                            <span v-else>--</span>
-                                        </div>
-                                        <div class="summary-item">
-                                            <span>涉及中标企业</span>
-                                            <span v-if="cacheImgData.all_winners">${cacheImgData.all_winners}个</span>
-                                            <span v-else>--</span>
-                                        </div>
-                                        <div class="summary-item">
-                                            <span>涉及评标专家</span>
-                                            <span v-if="cacheImgData.all_review_experts">${cacheImgData.all_review_experts}人</span>
-                                            <span v-else>--</span>
-                                        </div>
-                                    </div>
-                                    <div class="summary-tip">
-                                        <p class="van-hairline--top">数据统计范围:${year}/01/01 至今</p>
-                                    </div>
-                                </div>
-                                <div class="a-item purchase-history" v-show="isShow.showHistory">
-                                    <p class="a-title ">${baseInfo.buyer}类似项目采购历史</p>
-                                    <div class="history-content">
-                                        <div class="d_list" v-for="(item,index) in showHistoryList" @click="goBuyerDetail(item.infoid)">
-                                            <p class="i_title">${item.projectname}</p>
-                                            <div class="i_info">
-                                                <p class="area_type">
-                                                    <span v-if="item.area" class="i_area">${item.area}</span>
-                                                    <span v-if="item.bidstatus" class="i_type">${item.bidstatus}</span>
-                                                    <span v-if="item.bidamount" class="i_type">${formatterMoney(item.bidamount)}</span>
-                                                </p>
-                                                <p class="i_time">${item.firsttime}</p>
-                                            </div>
-                                        </div>
-                                        <div v-if="historyList.length > 3 && !showAll">
-                                            <div class="more">
-                                                <span @click="showAll = true">查看更多</span>
-                                            </div>
-                                        </div>
-                                    </div>
-                                </div>
-                                <div class="a-item hot-win" v-show="isShow.showWinner">
-                                    <p class="a-title">类似项目热点中标企业</p>
-                                    <div class="win-content">
-                                        <div class="van-hairline--bottom win-list" v-for="(hs,i) in hotWin" :key="i">
-                                            <div class="win-name">
-                                                <span v-if="i === 0" class="index first-index">${i + 1}</span>
-                                                <span v-else-if="i === 1" class="index second-index">${i + 1}</span>
-                                                <span v-else-if="i === 2" class="index third-index">${i + 1}</span>
-                                                <span v-else class="index">${i + 1}</span>
-                                                <span class="title" @click="goEntImg(hs.entId)">${hs.key}</span>
-                                            </div>
-                                            <div class="win-capital">注册资本:${formatterMoney(hs.capital)}</div>
-                                            <div class="win-info" @click="goDetail(hs.key)">
-                                              <div class="w-title">
-                                                <span class="w-title-label">类似项目明细</span>
-                                                <van-icon class="win-arrow" name="arrow"></van-icon>
-                                              </div>
-                                              <div class="company-info">
-                                                <span>项目数量:${hs.doc_count}个</span>
-                                                <span>项目金额:${formatterMoney(hs.total_project)}</span>
-                                                <!-- <span>注册资本:${formatterMoney(hs.capital)}</span> -->
-                                                <span>最近中标:${formatterTime(hs.max_jytime)}</span>
-                                              </div>
-                                            </div>
-
-                                            <div class="same-history" v-if="hs.buyer_similar_list.doc_count > 0 || hs.buyer_similar_list.total_project > 0" @click="goDetail(hs.key, hs.buyer_similar_list.buyer)">
-                                                <div class="same-title">
-                                                  <span>与${hs.buyer_similar_list.buyer}有<em class="highLight">类似项目</em>合作历史</span>
-                                                  <van-icon class="win-arrow" name="arrow"></van-icon>
-                                                </div>
-                                                <div class="same-info">
-                                                    <span>项目数量:${hs.buyer_similar_list.doc_count}个</span>
-                                                    <span>项目金额:${formatterMoney(hs.buyer_similar_list.total_project)}</span>
-                                                    <span>最近中标:${hs.buyer_similar_list.bid_winner_time || '--'}</span>
-                                                </div>
-                                            </div>
-                                            <div class="other-history" v-if="hs.buyer_other_list.doc_count > 0 || hs.buyer_other_list.total_project > 0" @click="goOtherDetail(hs.key, hs.buyer_similar_list.buyer)">
-                                                <div class="other-title">
-                                                  <span>与${hs.buyer_other_list.buyer}有<em class="highLight">其他项目</em>合作历史</span>
-                                                  <van-icon class="win-arrow" name="arrow"></van-icon>
-                                                </div>
-                                                <div class="other-info">
-                                                    <span>项目数量:${hs.buyer_other_list.doc_count}个</span>
-                                                    <span>项目金额:${formatterMoney(hs.buyer_other_list.total_project)}</span>
-                                                    <span>最近中标:${hs.buyer_other_list.bid_winner_time || '--'}</span>
-                                                </div>
-                                            </div>
-                                        </div>
-                                    </div>
-                                </div>
-                                <!-- 类似项目标书编制周期分布 -->
-                                <div class="a-item" v-show="isShow.bidCycle">
-                                    <p class="a-title">类似项目标书编制周期分布</p>
-                                    <div class="much-bar">
-                                        <div style="padding: 0 12px;font-size: 10px;color: #9B9CA3;line-height: 14px;">类似项目数量(个)</div>
-                                        <ve-histogram ref="histogram" :init-options="initRendererSvg" @ready="onBarReady($event, name)" height="300px" :mark-point="barChartMarkPoint" :after-config="barChartConfig" :data="barChartData" :settings="chartSettings" :extend="chartOptions.barChart"></ve-histogram>
-                                    </div>
-                                    <div class="bar-tip">注:标书编制周期是指招标文件发放之日至投标截止时间(开标)之间的时间间隔,标书编制周期越长,准备时间越充分。</div>
-                                </div>
-                                <!-- 类似项目预算分布 -->
-                                <div class="a-item" v-show="isShow.showHotMap">
-                                    <p class="a-title">类似项目预算分布</p>
-                                    <div class="hot-map">
-                                        <div id="myChart" ref="hotChart" :style="{height: heatMapHeight}"></div>
-                                    </div>
-                                    <div class="bar-tip">注:少数缺失的项目预算,用中标金额补充;平均折扣率=(全部项目预算-全部中标金额)/全部项目预算,仅统计预算和中标金额同时存在的项目。</div>
-                                </div>
-                                <!-- 类似项目区域分布 -->
-                                <div class="a-item" v-show="isShow.showMap">
-                                    <p class="a-title">类似项目区域分布</p>
-                                    <div class="map">
-                                        <ve-map
-                                            ref="mapRef"
-                                            :init-options="initRendererSvg"
-                                            :width="mapWidth"
-                                            height="400px"
-                                            :after-config="mapConfig"
-                                            :data="mapChartData"
-                                            :settings="mapSettings.chartSettings"
-                                            :extend="mapSettings.chartExtend">
-                                        </ve-map>
-                                    </div>
-                                </div>
-                                <!-- 类似项目采购单位类型分布 -->
-                                <div class="a-item" v-show="isShow.showPie">
-                                    <p class="a-title">类似项目采购单位类型分布</p>
-                                    <div class="pieChart">
-                                        <div ref="pieChart" style="height: 360px;"></div>
-                                    </div>
-                                    <div class="bar-tip">注:各采购单位类型占比以采购规模来计算,最多展示占比排名前十的采购单位类型。</div>
-                                </div>
-                                <!-- 类似项目评标专家 -->
-                                <div class="a-item ranking" v-show="isShow.showExperts">
-                                    <p class="a-title">类似项目评标专家</p>
-                                    <p style="padding:0 .32rem;font-size: .18rem;color:#9B9CA3;text-align: right;line-height: .28rem;">参评项目数量(个)</p>
-                                    <div class="progress-bar-container">
-                                        <div class="progress-bar-item" v-for="(item,index) in expertWinArr" :key="index">
-                                            <div class="item-label">
-                                                <span class="item-name">${item.key}</span>
-                                                <span class="item-count">${item.doc_count}个</span>
-                                            </div>
-                                            <div class="item-progress">
-                                                <span class="item-progress-count blue-progress" :style="{width: item.parent}"></span>
-                                            </div>
-                                        </div>
-                                    </div>
+                    <div :style="setHeightActive" :class="{'setTop': isHaveTop}" v-if="isHaveTop">
+                      <van-tabs v-if="listCount.pCount !== 0" v-model="active" background="#fff" title-active-color="#2ABED1" line-width="24" @click="onTabClick">
+                          <van-tab title="采购单位">
+                          </van-tab>
+                          <van-tab :title="filterData.area">
+                          </van-tab>
+                          <van-tab title="全国">
+                          </van-tab>
+                      </van-tabs>
+                    </div>
+                    <div id="analysis-tabs" ref="analysisTab">
+                      <van-tabs v-if="listCount.pCount !== 0" v-model="active" background="#fff" title-active-color="#2ABED1" line-width="24" @click="onTabClick">
+                          <van-tab title="采购单位">
+                          </van-tab>
+                          <van-tab :title="filterData.area">
+                          </van-tab>
+                          <van-tab title="全国">
+                          </van-tab>
+                      </van-tabs>
+                    </div>
+                    <div class="tab-item" v-if="listCount.pCount !== 0">
+                      <div class="summary" v-if="isShow.showSummary">
+                          <div class="filter-title">
+                              <span>同类项目分析</span>
+                          </div>
+                          <div class="summary-container">
+                              <div class="summary-item">
+                                  <span>项目数量</span>
+                                  <span v-if="cacheImgData.all_counts">${cacheImgData.all_counts}个</span>
+                                  <span v-else>--</span>
+                              </div>
+                              <div class="summary-item">
+                                  <span>项目金额</span>
+                                  <span v-if="cacheImgData.all_money">${formatterMoney(cacheImgData.all_money)}</span>
+                                  <span v-else>--</span>
+                              </div>
+                              <div class="summary-item">
+                                  <span>涉及中标企业</span>
+                                  <span v-if="cacheImgData.all_winners">${cacheImgData.all_winners}个</span>
+                                  <span v-else>--</span>
+                              </div>
+                              <div class="summary-item">
+                                  <span>涉及评标专家</span>
+                                  <span v-if="cacheImgData.all_review_experts">${cacheImgData.all_review_experts}人</span>
+                                  <span v-else>--</span>
+                              </div>
+                          </div>
+                          <div class="summary-tip">
+                              <p class="van-hairline--top">数据统计范围:${year}至今</p>
+                          </div>
+                      </div>
+                      <div class="projects" v-if="isShow.showProjectList">
+                        <div class="filter-title">
+                            <span>同类项目明细</span>
+                        </div>
+                        <div v-for="item in setShowListBtn" :key="item._id" class="project-list">
+                            <div class="pl-title" @click="goProjectDetail(item.infoid)">${item.projectname}</div>
+                            <div class="pl-tags">
+                              <span v-if="item.area">${item.area}</span>
+                              <span v-if="item.subtype">${item.subtype}</span>
+                              <span v-if="item.buyerclass">${item.buyerclass}</span>
+                              <span v-if="item.bidamount || item.budget">${item.bidamount || item.budget}万元</span>
+                            </div>
+                            <div class="pl-info can-click" @click="goUnitImage(item.buyer)">
+                                <span>采购单位:</span>
+                                <span>${item.buyer || '--'}</span>
+                            </div>
+                            <div class="pl-info">
+                                <span>预算金额:</span>
+                                <span>${item.budget || '--'}${item.budget ? '万元' : ''}</span>
+                            </div>
+                            <div class="pl-info can-click">
+                                <span>中标单位:</span>
+                                <div class="winner-list">
+                                  <span  @click="goEntImg(winner.id)" v-for="winner in item.s_winner" :key="winner.id">${winner.name}</span> 
                                 </div>
                             </div>
-                        </van-tab>
-                        <van-tab title="类似项目明细">
-                            <div class="detail-filter" ref="detailFilter">
-                              <van-collapse v-model="activeNames">
-                                <van-collapse-item title="筛选条件" name="1">
-                                  <van-field class="filter-input" v-model="winnerVal" label="中标企业" placeholder="输入中标企业名称" maxlength="50"></van-field>
-                                  <van-field class="filter-input" v-model="buyerVal" label="采购单位" placeholder="输入采购单位名称" maxlength="50"></van-field>
-                                  <div class="d-f-search">
-                                    <span @click="onSearch">搜索</span>
+                            <div class="pl-info">
+                                <span>中标金额:</span>
+                                <span>${item.bidamount || '--'}${item.bidamount ? '万元' : ''}</span>
+                            </div>
+                            <div class="pl-info">
+                                <span>评标专家:</span>
+                                <span>${item.review_experts || '--'}</span>
+                            </div>
+                            <div class="pl-info">
+                                <span>成交时间:</span>
+                                <span>${item.jgtime || '--'}</span>
+                            </div>
+                        </div>
+                        <div class="more" v-if="showListBtn" @click="setViewMore()">
+                          <span>查看更多</span>
+                        </div>
+                      </div>
+                      <!-- <div class="a-item purchase-history" v-show="isShow.showHistory">
+                          <div class="filter-title">
+                            <span>${baseInfo.buyer}同类项目采购历史</span>
+                          </div>
+                          <div class="history-content">
+                              <div class="d_list" v-for="(item,index) in showHistoryList" @click="goBuyerDetail(item.infoid)">
+                                  <p class="i_title">${item.projectname}</p>
+                                  <div class="i_info">
+                                      <p class="area_type">
+                                          <span v-if="item.area" class="i_area">${item.area}</span>
+                                          <span v-if="item.bidstatus" class="i_type">${item.bidstatus}</span>
+                                          <span v-if="item.bidamount" class="i_type">${formatterMoney(item.bidamount)}</span>
+                                      </p>
+                                      <p class="i_time">${item.firsttime}</p>
+                                  </div>
+                              </div>
+                              <div v-if="historyList.length > 3 && !showAll">
+                                  <div class="more">
+                                      <span @click="showAll = true">查看更多</span>
                                   </div>
-                                </van-collapse-item>
-                              </van-collapse>
+                              </div>
+                          </div>
+                      </div> -->
+                      <div class="a-item hot-win" v-if="isShow.showWinner">
+                          <div class="filter-title">
+                            <span>同类项目热点中标企业TOP10</span>
+                            <div class="switchTab">
+                              <span class="switch_label">排序:</span>
+                              <div :class="{'textColor': hotWinnerEnt.hotTabActive==0}" class="switch-tab" @click="onTabWinnerClick(0)">
+                                <span>中标金额</span>
+                                <div v-if="hotWinnerEnt.hotTabActive==0" class="line"></div>
+                              </div>
+                              <div :class="{'textColor': hotWinnerEnt.hotTabActive==1}" class="switch-tab" @click="onTabWinnerClick(1)">
+                                <span>中标数量</span>
+                                <div v-if="hotWinnerEnt.hotTabActive==1" class="line"></div>
+                              </div>
+                              <!-- <van-tabs class="switch_tab_list" :class="'winner_' + hotWinnerEnt.hotTabActive" v-model:active="hotWinnerEnt.hotTabActive" @click="onTabWinnerClick">
+                                <van-tab title="中标金额"></van-tab>
+                                <van-tab title="中标数量"></van-tab>
+                              </van-tabs> -->
                             </div>
-                            <div class="tab-item">
-                                <div class="projects" v-if="projectListDetail.length && projectListDetail.length > 0">
-                                    <div v-for="item in projectListDetail" :key="item._id" class="project-list" @click="goProjectDetail(item.infoid)">
-                                        <div class="pl-title">${item.projectname}</div>
-                                        <div class="pl-info">
-                                            <span>采购方式:</span>
-                                            <span>${item.bidtype || '--'}</span>
-                                        </div>
-                                        <div class="pl-info">
-                                            <span>中标企业:</span>
-                                            <span>${item.s_winner || '--'}</span>
-                                        </div>
-                                        <div class="pl-info">
-                                            <span>评审专家:</span>
-                                            <span>${item.review_experts || '--'}</span>
-                                        </div>
-                                        <div class="pl-info">
-                                            <span>项目时间:</span>
-                                            <span>${item.firsttime || '--'}</span>
-                                        </div>
-                                        <div class="pl-price">
-                                            <div class="price-item">
-                                                <span>预算 (万元)</span>
-                                                <span>${item.budget || '--'}</span>
-                                            </div>
-                                            <div class="price-item">
-                                                <span>中标价 (万元)</span>
-                                                <span>${item.bidamount || '--'}</span>
-                                            </div>
-                                            <div class="price-item">
-                                                <span>折扣率</span>
-                                                <span>${item.project_rate || '--'}</span>
-                                            </div>
-                                        </div>
-                                        <div class="bid-company" v-if="item.winnerorder">
-                                            <p>中标候选人:</p>
-                                            <p v-for="sItem in item.winnerorder">
-                                                ${sItem || '--'}
-                                            </p>
-                                        </div>
+                        </div>
+                          <div class="win-content">
+                              <div class="van-hairline--bottom win-list" v-for="(hs,i) in isShowWinBtn" :key="i">
+                                  <div class="win-name" @click="goEntImg(hs.entId)">
+                                      <span v-if="i === 0" class="index first-index">${i + 1}</span>
+                                      <span v-else-if="i === 1" class="index second-index">${i + 1}</span>
+                                      <span v-else-if="i === 2" class="index third-index">${i + 1}</span>
+                                      <span v-else class="index">${i + 1}</span>
+                                      <span class="title">${hs.key}</span>
+                                  </div>
+                                  <div class="win-capital" @click="goProDetail(hs)">
+                                    <span>中标金额:<span v-html="setMoenyColor(formatterMoney(hs.total_project))"></span></span>
+                                    <span>中标数量:<span style="color: #2ABED1;">${hs.doc_count}</span>个</span>
+                                  </div>
+                                  <div class="win-info">
+                                    <div class="w-title">
+                                      <div class="w-title-head">最近合作项目:</div>
+                                      <span @click="goProjectDetail(hs.latest_project._id)" class="w-title-label">${hs.latest_project.projectname}</span>
+                                      <!-- <van-icon class="win-arrow" name="arrow"></van-icon> -->
+                                    </div>
+                                    <div class="company-info">
+                                      <span>中标金额:${hs.latest_project.bidamount ? formatterMoney(hs.latest_project.bidamount) : '--'}</span>
+                                      <!-- <span>注册资本:${formatterMoney(hs.capital)}</span> -->
+                                      <span>成交时间:${formatterTime(hs.latest_project.jgtime)}</span>
                                     </div>
+                                  </div>
+                              </div>
+                              <div v-if="showWinBtn" @click="showWinBtn = false" class="more">
+                                <span>查看更多</span>
+                              </div>
+                          </div>
+                      </div>
+                      <div class="bid_forcast_com" v-if="isHaveTrue && is15">
+                        <span>大数据预测企业中标概率、企业排名,帮助分析潜在投标<br/>企业、辅助投标决策。请点击  </span>
+                        <span @click="goBidForcast" style="color: #2ABED1;">中标企业预测>></span>
+                      </div>
+                      <!-- 同类项目标书编制周期分布 -->
+                      <div class="a-item" v-if="isShow.bidCycle">
+                          <div class="filter-title">
+                            <span>同类项目标书编制周期分布</span>
+                          </div>
+                          <div class="much-bar">
+                              <div style="padding: 0 12px;font-size: 10px;color: #9B9CA3;line-height: 14px;">同类项目数量(个)</div>
+                              <ve-histogram ref="histogram" :init-options="initRendererSvg" @ready="onBarReady($event, name)" height="300px" :mark-point="barChartMarkPoint" :after-config="barChartConfig" :data="barChartData" :settings="chartSettings" :extend="chartOptions.barChart"></ve-histogram>
+                          </div>
+                          <div class="bar-tip">注:标书编制周期是指招标文件发放之日至投标截止时间(开标)之间的时间间隔,标书编制周期越长,准备时间越充分。</div>
+                      </div>
+                      <!-- 同类项目预算分布 -->
+                      <div class="a-item" v-if="isShow.showHotMap">
+                          <div class="filter-title">
+                            <span>同类项目预算分布</span>
+                          </div>
+                          <div class="hot-map">
+                              <div id="myChart" ref="hotChart" :style="{height: heatMapHeight}"></div>
+                          </div>
+                          <div class="bar-tip">注:少数缺失的项目预算,用中标金额补充;平均折扣率=(全部项目预算-全部中标金额)/全部项目预算,仅统计预算和中标金额同时存在的项目。</div>
+                      </div>
+                      <!-- 同类项目区域分布 -->
+                      <div class="a-item" v-if="isShow.showMap">
+                          <div class="filter-title">
+                            <span>同类项目区域分布</span>
+                          </div>
+                          <div class="map">
+                              <ve-map
+                                  ref="mapRef"
+                                  :init-options="initRendererSvg"
+                                  :width="mapWidth"
+                                  height="400px"
+                                  :after-config="mapConfig"
+                                  :data="mapChartData"
+                                  :settings="mapSettings.chartSettings"
+                                  :extend="mapSettings.chartExtend">
+                              </ve-map>
+                          </div>
+                      </div>
+                      <!-- 同类项目采购单位类型分布 -->
+                      <div class="a-item" v-if="isShow.showPie">
+                          <div class="filter-title">
+                            <span>同类项目采购单位类型分布</span>
+                          </div>
+                          <div class="pieChart">
+                              <div ref="pieChart" style="height: 360px;"></div>
+                          </div>
+                          <div class="bar-tip">注:各采购单位类型占比以采购规模来计算,最多展示占比排名前十的采购单位类型。</div>
+                      </div>
+                      <!-- 历史合作评标专家 -->
+                      <div class="a-item ranking" v-if="(historyExpert.historyTabActive == 0 && isShow.showExperts) || historyExpert.historyTabActive == 1">
+                          <div class="filter-title">
+                              <span>历史合作评标专家</span>
+                              <div class="switchTab">
+                                <div :class="{'textColor': historyExpert.historyTabActive==0}" class="switch-tab" @click="onTabHistoryClick(0)">
+                                  <span>全部项目</span>
+                                  <div v-if="historyExpert.historyTabActive==0" class="line"></div>
                                 </div>
-                                <div class="jy-empty" v-else>
-                                    <div class="jy-empty-img"></div>
-                                    <p class="jy-empty-text" style="padding-bottom: 0.32rem;">暂无明细</p>
+                                <div :class="{'textColor': historyExpert.historyTabActive==1}" class="switch-tab" @click="onTabHistoryClick(1)">
+                                  <span>同类项目</span>
+                                  <div v-if="historyExpert.historyTabActive==1" class="line"></div>
                                 </div>
-                            </div>
-                        </van-tab>
-                    </van-tabs>
+                                <!-- <div class="switch-main">
+                                  <van-tabs class="switch_tab_list" :class="'history_'+ historyExpert.historyTabActive" v-model:active="historyExpert.historyTabActive" @click="onTabHistoryClick">
+                                    <van-tab title="全部项目"></van-tab>
+                                    <van-tab title="同类项目"></van-tab>
+                                  </van-tabs>
+                                </div> -->
+                              </div>
+                          </div>
+                          <p v-if="isShow.showExperts" style="display: flex;justify-content: space-between;align-items: center;padding:0 .32rem;font-size: .24rem;color:#9B9CA3;height: .48rem;">
+                            <span style="width: 1.04rem;"></span>
+                            <span style="margin-left: 1.1rem">最近合作日期</span>
+                            <span>参评项目数量(个)</span>
+                          </p>
+                          <div class="progress-bar-container" v-if="isShow.showExperts">
+                              <div class="progress-bar-item" @click="setViewMore(item)" v-for="(item,index) in expertWinArr" :key="index">
+                                  <div class="item-label">
+                                      <span class="item-name">${item.key}</span>
+                                      <span class="item-time">${formatterLineTime(item.jgtime)}</span>
+                                      <span class="item-count">${item.doc_count}个</span>
+                                  </div>
+                                  <div class="item-progress">
+                                      <span class="item-progress-count blue-progress" :style="{width: item.parent}"></span>
+                                  </div>
+                              </div>
+                          </div>
+                          <div class="jy-empty" v-else>
+                            <div class="jy-empty-img"></div>
+                            <p class="jy-empty-text" style="padding-bottom: 0.32rem;">
+                              暂无数据
+                            </p>
+                          </div>
+                      </div>
+                      <div class="a-item navBar" v-if="isHaveTrue">
+                        <span>继续查看</span>
+                        <div class="link-btn" @click="onTabClick(0)" v-if="active !== 0 && listCount.BuyerCount > 0">采购单位同类项目分析</div>
+                        <div class="link-btn" @click="onTabClick(1)" v-if="active !== 1 && listCount.AreaCount > 0">${filterData.area}同类项目分析</div>
+                        <div class="link-btn" @click="onTabClick(2)" v-if="active !== 2">全国同类项目分析</div>
+                      </div>
+                      <div class="jy-empty jy-main-empty" v-if="!isHaveTrue && loadingEmpty">
+                        <div class="jy-empty-img"></div>
+                        <div class="jy-empty-text" style="padding-bottom: 0.32rem;">
+                          <span style="color: #171826;" v-if="active === 0">${filterData.pname}</span><br/>
+                          <span style="color: #9B9CA3;" v-if="active === 0">暂未采购过同类项目,您可前往查看:</span> 
+                          <span style="color: #9B9CA3;" v-if="active === 1">${filterData.area}地区暂无同类项目,您可前往查看:</span> 
+                          <div class="a-item navBar">
+                            <div class="link-btn" @click="onTabClick(0)" v-if="active !== 0 && listCount.BuyerCount > 0">采购单位同类项目分析</div>
+                            <div class="link-btn" @click="onTabClick(1)" v-if="active !== 1 && listCount.AreaCount > 0">${filterData.area}同类项目分析</div>
+                            <div class="link-btn" @click="onTabClick(2)" v-if="active !== 2">全国同类项目分析</div>
+                          </div>
+                        </div>
+                      </div>
+                    </div>
+                    <div class="jy-empty" v-if="listCount.pCount === 0 && isShow.isShowAll">
+                      <div class="jy-empty-img"></div>
+                      <p class="jy-empty-text" style="padding-bottom: 0.32rem;">
+                        对不起,没有匹配到同类项目<br/>
+                        请修改您的分析条件
+                      </p>
+                    </div>
                 </div>
             </div>
         </div>
@@ -319,6 +393,8 @@
 {{include "/big-member/commonjs.html"}}
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/big-member/js/echarts_option.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/big-member/js/chart_options.js?v={{Msg "seo" "version"}}'></script>
+<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/public/js/china-province-data.js?v={{Msg "seo" "version"}}'></script>
+<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/analysis-filter/js/analysis-filter.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/big-member/js/analysis_result.js?v={{Msg "seo" "version"}}'></script>
 <!--小于100行同css,减少请求数-->
 

+ 103 - 0
src/jfw/modules/app/src/web/templates/big-member/page_bid_analysis_pro_list.html

@@ -0,0 +1,103 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+<head>
+    <!--引入公共资源头部-->
+    {{include "/big-member/meta.html"}}
+    <title>投标决策分析项目明细</title>
+    <!--S-当前页必定需要预加载的资源-->
+    <link rel="preload" as="style" href=//cdn-common.jianyu360.com/cdn/lib/reset-css/5.0.1/reset.min.css />
+    <link rel="preload" as="style" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/index.css />
+    <link rel="preload" as="style" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/icon/local.css />
+    <!--E-当前页必定需要预加载的资源-->
+
+    <!--S-当前页面的css资源-->
+    <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/reset-css/5.0.1/reset.min.css />
+    <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/index.css />
+    <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/icon/local.css />
+    <link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/big-member/css/analysis_result.css?v={{Msg "seo" "version"}}' />
+    <!--E-当前页面的css资源-->
+    <!--head内避免script加载-->
+</head>
+<body>
+<div class="j-container">
+    {{include "/big-member/header.html"}}
+    <div class="j-main" id="analysis-result" v-cloak>
+      <div class="j-container">
+        <div class="j-main" ref="wrapper">
+          <div class="projects" v-if="projectListDetail.length && projectListDetail.length > 0">
+            <div class="filter-title">
+                <span>共 <span style="color: #2abed1;">${projectData.count}</span> 个项目</span>
+            </div>
+            <van-list
+              v-model:loading="listParams.loading"
+              :finished="listParams.finished"
+              finished-text="没有更多了"
+              @load="onLoad"
+            >
+            <div v-for="item in projectListDetail" :key="item._id" class="project-list">
+                <div class="pl-title" @click="goProjectDetail(item.infoid)">${item.projectname}</div>
+                <div class="pl-tags">
+                  <span v-if="item.area">${item.area}</span>
+                  <span v-if="item.subtype">${item.subtype}</span>
+                  <span v-if="item.buyerclass">${item.buyerclass}</span>
+                  <span v-if="item.bidamount || item.budget">${item.bidamount || item.budget}万元</span>
+                </div>
+                <div class="pl-info can-click" @click="goUnitImage(item.buyer)">
+                    <span>采购单位:</span>
+                    <span>${item.buyer || '--'}</span>
+                </div>
+                <div class="pl-info">
+                    <span>预算金额:</span>
+                    <span>${item.budget || '--'}${item.budget ? '万元' : ''}</span>
+                </div>
+                <div class="pl-info can-click">
+                    <span>中标单位:</span>
+                    <div class="winner-list">
+                      <span  @click="goEntImg(winner.id)" v-for="winner in item.s_winner" :key="winner.id">${winner.name}</span> 
+                    </div>
+                </div>
+                <div class="pl-info">
+                    <span>中标金额:</span>
+                    <span>${item.bidamount || '--'}${item.bidamount ? '万元' : ''}</span>
+                </div>
+                <div class="pl-info">
+                    <span>评标专家:</span>
+                    <span>${item.review_experts || '--'}</span>
+                </div>
+                <div class="pl-info">
+                    <span>成交时间:</span>
+                    <span>${item.jgtime || '--'}</span>
+                </div>
+            </div>
+            </van-list>
+          </div>
+          <div class="jy-empty" style="margin-top: 2rem;" v-else>
+            <div class="jy-empty-img"></div>
+            <p class="jy-empty-text" style="padding-bottom: 0.32rem;">
+              暂无明细
+            </p>
+          </div>
+        </div>
+        <div class="j-footer" v-if="projectData.count > 5000">
+          <div class="bottom-tip">为您展示前5000条,可细化筛选条件查看更多信息</div>
+        </div>
+      </div>
+    </div>
+</div>
+
+<!--S-必定需要预加载的资源-->
+<link rel="preload" as="script" href=//cdn-common.jianyu360.com/cdn/lib/vue/2.6.11/vue.min.js />
+<link rel="preload" as="script" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/vant.min.js />
+<link rel="preload" as="script" href=//cdn-common.jianyu360.com/cdn/lib/zepto/1.2.0/zepto.min.js />
+<!--E-必定需要预加载的资源-->
+
+<!--S-当前页面的资源-->
+<script src=//cdn-common.jianyu360.com/cdn/lib/vue/2.6.11/vue.min.js></script>
+<script src=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/vant.min.js></script>
+<script src=//cdn-common.jianyu360.com/cdn/lib/zepto/1.2.0/zepto.min.js></script>
+<!--E-当前页面的资源-->
+{{include "/big-member/commonjs.html"}}
+<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/big-member/js/analysis_pro_list.js?v={{Msg "seo" "version"}}'></script>
+
+</body>
+</html>

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
src/jfw/modules/app/src/web/templates/big-member/page_contrast.html


+ 1 - 1
src/jfw/modules/app/src/web/templates/big-member/page_landingPage.html

@@ -94,7 +94,7 @@
       <div class="insight" id="fx">
         <div class="action_out" style="font-size: 0;">
           <div>
-            <img src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/big-member/image/landpage_new/itemA_05.jpg'>
+            <img src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/big-member/image/landpage_new/itemA_05.jpg?v={{Msg "seo" "mod_version"}}'>
           </div>
           <div>
             <img src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/big-member/image/landpage_new/itemA_06.jpg'>

+ 1 - 1
src/jfw/modules/app/src/web/templates/big-member/page_landingPage_old.html

@@ -69,7 +69,7 @@
                 <div class="land_head">
                     <img src="/jyapp/big-member/image/landpage/title03.png" alt="" class="head_big">
                 </div>
-                <div class="land_intro">通过对类项目进行多维度分析,帮助企业决策是否投标或合作投标、以及投标报价金额等。</div>
+                <div class="land_intro">通过对类项目进行多维度分析,帮助企业决策是否投标或合作投标、以及投标报价金额等。</div>
                 <div class="land_main">
                     <ul class="landul">
                         <van-swipe :autoplay="3000">

+ 6 - 6
src/jfw/modules/app/src/web/templates/big-member/page_landingPage_old_1.html

@@ -79,7 +79,7 @@
                                 </div>
                                 <div class="forecast">
                                     <span class="cast_left">为你提供</span>
-                                    <span class="cast_right">类项目联系人 &nbsp; 联系方式</span>
+                                    <span class="cast_right">类项目联系人 &nbsp; 联系方式</span>
                                 </div>
                                 <div class="manysquare">
                                     <img src="/jyapp/big-member/image/landpage_new/square.png" alt="" class="manysquare_img">
@@ -422,11 +422,11 @@
                 '透视潜在投标企业的全景画像'
             ],
             offer:[
-                '类项目评标专家频次排名',
-                '类项目中标金额',
-                '类项目预算',
-                '类项目折扣率',
-                '类项目区域热度'
+                '类项目评标专家频次排名',
+                '类项目中标金额',
+                '类项目预算',
+                '类项目折扣率',
+                '类项目区域热度'
             ],
             pushcom:[
                 '企业中标动态',

+ 1 - 1
src/jfw/modules/app/src/web/templates/big-member/page_ontrial_landingPage.html

@@ -56,7 +56,7 @@
                 <div class="land_head">
                     <img src="/jyapp/big-member/image/landpage/title03.png" alt="" class="head_big">
                 </div>
-                <div class="land_intro">通过对类项目进行多维度分析,帮助企业决策是否投标或合作投标、以及投标报价金额等。</div>
+                <div class="land_intro">通过对类项目进行多维度分析,帮助企业决策是否投标或合作投标、以及投标报价金额等。</div>
                 <div class="land_main">
                     <ul class="landul">
                         <van-swipe :autoplay="3000">

+ 2 - 2
src/jfw/modules/app/src/web/templates/big-member/page_pro_follow_detail.html

@@ -1046,9 +1046,9 @@
             goAnalysis: function () {
                 sessionStorage.removeItem('big-analysis_filter')
                 if (this.power.indexOf(6) > -1) {
-                    location.href = './analysis_filter?sId=' + this.sid
+                    location.href = './analysis_result?id=' + this.sid
                 } else {
-                    location.href = './analysis_filter?source=app_analysis_follow_project&sId=' + this.sid
+                    location.href = '/jyapp/frontPage/bigmember/free/perfect_info?source=app_analysis_follow_project'
                 }
             },
             callPhone() {

+ 8 - 5
src/jfw/modules/app/src/web/templates/big-member/page_unit_portrayal.html

@@ -2,7 +2,7 @@
 <html lang="zh-CN" style="font-size: 50px;">
 
 <head>
-  <title>采购单位画像 </title>
+  <title>采购单位画像</title>
 
   <!--引入公共资源头部-->
   {{include "/big-member/meta.html"}}
@@ -224,6 +224,9 @@
     .client .q-name {
       font-weight: 500;
     }
+    .vip_openDialog{
+        margin-top:.3rem;
+    }
 
   </style>
 </head>
@@ -250,7 +253,7 @@
           </div>
           <p class="region">所在地:${statistics.province || '--'} ${statistics.city}</p>
           <p class="buyer-type">采购单位类型:${statistics.buyerClass || '--'}</p>
-          <forwardshare :params="unitParams"></forwardshare>
+          <forwardshare :params="unitParams" v-if="isLogin"></forwardshare>
         </div>
         <!-- 留完资的免费用户 已体验和未体验的展示去开通 -->
         <div v-if="getfreeBuyerOpen">
@@ -259,7 +262,7 @@
           </van-sticky>
         </div>
         <!-- 免费用户采购单位全景分析提示 -->
-        <div v-if="getfreeBuyerPort" class="free-give">
+        <div v-if="getfreeBuyerPort && isLogin" class="free-give">
           <div class="go-text"> 免费赠送1次【采购单位全景分析】权益体验机会!</div>
           <div class="go-btn" @click="goGiveAnalysis">去解锁</div>
         </div>
@@ -280,7 +283,7 @@
         <!-- 高级分析 -->
         <div class="win-analyse" ref="setRefs">
           <span class="win-bid-title">采购单位分析</span>
-          <div class="high-link" @click="goHighSet">
+          <div class="high-link" @click="goHighSet" v-if="isLogin">
             <span>高级分析设置</span>
             <van-icon name="arrow"></van-icon>
           </div>
@@ -746,6 +749,7 @@
     src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/history-project.js?v={{Msg "seo" "version"}}'>
   </script>
   <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/forward-share/js/forward.js?v={{Msg "seo" "version"}}'></script>
+  <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/public/js/setTdk.js?v={{Msg "seo" "version"}}'></script>
   <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/js/common.js?v={{Msg "seo" "version"}}'></script>
   <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/visited.js?v={{Msg "seo" "version"}}'>
   </script>
@@ -776,7 +780,6 @@
         }
       }
     })
-
   </script>
 </body>
 

+ 178 - 1
src/jfw/modules/app/src/web/templates/dataSmt/index.html

@@ -1 +1,178 @@
-pc 落地页
+<!doctype html>
+<html lang="en">
+<head>
+    <title>数据超市</title>
+    <!--引入公共资源头部-->
+    {{include "/big-member/meta.html"}}
+    <!--S-当前页面的css资源-->
+    <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/reset-css/5.0.1/reset.min.css />
+    <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/index.css />
+    <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/icon/local.css />
+    <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/assets/iconfont/mobile/22.7.2/iconfont.css />
+    <link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/dataSmt/css/index.css?v={{Msg "seo" "version"}}' />
+    <!--E-当前页面的css资源-->
+    <style>
+        .j-container.app > .j-main {
+            margin-top: -21.34vw;
+        }
+        .j-header.transparent-header .header-left, .j-header.transparent-header .header-title{
+            color: #171826 !important;
+            font-size: 18px !important;
+        }
+        .jy-app-header.transparent-header .icon-back{
+            display: block;
+        }
+        .j-header .header-left .j-icon{
+            width: .48rem;
+            height: .48rem;
+        }
+    </style>
+<body>
+    <div class="j-container app">
+        {{include "/big-member/header.html"}}
+        <div class="j-main data-sam-main">
+            <div class="header-banner">
+               <img class="header-banner-img" src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/dataSmt/images/header-banner.png' alt="头部背景">
+                <section class="header-box">
+                    <p><img class="supermarket-img" src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/dataSmt/images/data-market-text.png' alt="数据超市"></p>
+                    <p class="sub-description">提供海量热门行业数据,专业安全合规成品数据一键下载</p>
+                    <ul class="example-list">
+                        <li>
+                            <img src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/dataSmt/images/icon-1.png' alt="海量数据支持">
+                            <span>海量数据支持</span>
+                        </li>
+                        <li>
+                            <img src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/dataSmt/images/icon-1.png' alt="海量数据支持">
+                            <span>专业数据团队</span>
+                        </li>
+                        <li>
+                            <img src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/dataSmt/images/icon-1.png' alt="海量数据支持">
+                            <span>数据成本低</span>
+                        </li>
+                        <li>
+                            <img src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/dataSmt/images/icon-1.png' alt="海量数据支持">
+                            <span>多种数据获取方式</span>
+                        </li>
+                    </ul>
+                </section>
+            </div>
+            <div class="content-container">
+                <section class="section-search-com">
+                   <div class="search-component">
+                       <i class="j-icon base-icon icon-search"></i>
+                       <input class="search-input" type="text" onfocus="searchFocus()" placeholder="请输入业务范围,如物业管理">
+                   </div>
+                </section>
+                <section class="select-component" id="select-component">
+                    <div class="cell-left"  @click="showTypeHandle">
+                        <span>数据类型:</span>
+                        <span class="data-type">${typeText}</span>
+                        <i class="iconfont icon-youbian"></i>
+                    </div>
+                    <div class="cell-right" @click="showExplain = true">
+                        <span>包含字段</span>
+                        <i class="iconfont icon-help1"></i>
+                    </div>
+                    <van-popup
+                            v-model:show="showDataType"
+                            closeable
+                            round
+                            close-icon="clear"
+                            position="bottom"
+                            :style="{ height: '480px' }"
+                            class="custom-pop data-type-pop"
+                    >
+                        <div class="pop-container">
+                            <div class="pop-title">选择数据类型</div>
+                            <div class="pop-content">
+                                <van-cell v-for="item in typeList" :title="item.label" @click="changeDataType(item)">
+                                    <template #right-icon v-if="item.value === selectType">
+                                        <i class="iconfont icon-duihao"></i>
+                                    </template>
+                                </van-cell>
+                            </div>
+                            <div class="pop-bottom bottom-handle-box">
+                                <div class="confirm-btn" @click="typeConfirmHandle">确定</div>
+                            </div>
+                        </div>
+                    </van-popup>
+                    <van-popup
+                            v-model:show="showExplain"
+                            closeable
+                            round
+                            close-icon="clear"
+                            position="bottom"
+                            :style="{ height: '480px' }"
+                            class="custom-pop explain-pop"
+                    >
+                        <div class="pop-container">
+                            <div class="pop-title">字段包含说明</div>
+                            <div class="pop-content">
+                                <van-cell v-for="item in explainList" :title="item.title" :label="item.label" />
+                            </div>
+                            <div class="pop-bottom bottom-handle-box">
+                                <div class="confirm-btn" @click="showExplain = false">我知道了</div>
+                            </div>
+                        </div>
+                    </van-popup>
+                </section>
+                <section class="j-container list-component">
+                    <div class="j-main">
+                        <div class="list-row">
+                            <span class="corner-mark corner-color-1">采购意见</span>
+                            <p class="label-info">“新媒体运营”项目,近6个月全国采购意向数据批量下载</p>
+                            <div class="row-tags">
+                                <span class="tag-item tag-color-1">人工清洗</span>
+                                <span class="tag-item tag-color-1">格式:Excel、CSV</span>
+                            </div>
+                        </div>
+                        <div class="list-row">
+                            <span class="corner-mark corner-color-2">拟建项目</span>
+                            <p class="label-info">“新媒体运营”项目,近6个月全国采购意向数据批量下载</p>
+                            <div class="row-tags">
+                                <span class="tag-item tag-color-1">人工清洗</span>
+                                <span class="tag-item tag-color-1">格式:Excel、CSV</span>
+                            </div>
+                        </div>
+                        <div class="list-row">
+                            <span class="corner-mark corner-color-3">招标数据</span>
+                            <p class="label-info">“新媒体运营”项目,近6个月全国采购意向数据批量下载</p>
+                            <div class="row-tags">
+                                <span class="tag-item tag-color-1">人工清洗</span>
+                                <span class="tag-item tag-color-1">格式:Excel、CSV</span>
+                            </div>
+                        </div>
+                        <div class="list-row">
+                                <span class="corner-mark corner-color-4">中标数据</span>
+                                <p class="label-info">“新媒体运营”项目,近6个月全国采购意向数据批量下载</p>
+                                <div class="row-tags">
+                                    <span class="tag-item tag-color-1">人工清洗</span>
+                                    <span class="tag-item tag-color-1">格式:Excel、CSV</span>
+                                </div>
+                            </div>
+                    </div>
+                </section>
+            </div>
+        </div>
+        <div class="bottom-handle-box fixed">
+            <div class="confirm-btn">申请数据定制</div>
+        </div>
+    </div>
+    <!--S-当前页面的资源-->
+    <script src=//cdn-common.jianyu360.com/cdn/lib/vue/2.6.11/vue.min.js></script>
+    <script src=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/vant.min.js></script>
+    <script src=//cdn-common.jianyu360.com/cdn/lib/jquery/3.6.0/jquery.min.js></script>
+    <!--E-当前页面的资源-->
+    {{include "/big-member/commonjs.html"}}
+    <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/dataSmt/js/index.js?v={{Msg "seo" "version"}}'></script>
+    <script>
+      $(function () {
+        var header = $('.j-header.jy-app-header')
+        header.addClass('transparent-header')
+      })
+    </script>
+    <script>
+
+    </script>
+</body>
+</html>

+ 22 - 2
src/jfw/modules/app/src/web/templates/dataSmt/list.html

@@ -1,2 +1,22 @@
-pc 列表页
-{{.T.dataType}}
+<!doctype html>
+<html lang="en">
+<head>
+    <title>数据超市</title>
+    <!--引入公共资源头部-->
+    {{include "/big-member/meta.html"}}
+    <!--S-当前页面的css资源-->
+    <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/reset-css/5.0.1/reset.min.css />
+    <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/index.css />
+    <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/icon/local.css />
+    <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/assets/iconfont/mobile/22.7.2/iconfont.css />
+    <link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/dataSmt/css/index.css?v={{Msg "seo" "version"}}' />
+</head>
+<body>
+<div class="j-container app">
+    {{include "/big-member/header.html"}}
+    <div class="app-layout-header">
+        555555
+    </div>
+</div>
+</body>
+</html>

+ 3 - 4
src/jfw/modules/app/src/web/templates/vipsubscribe/vip_introduce.html

@@ -83,8 +83,7 @@
                 <img src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/vipsubscribe/image/info/cut_01.jpg?v={{Msg "seo" "version"}}">
                 <img src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/vipsubscribe/image/info/cut_02.jpg?v={{Msg "seo" "version"}}">
                 <img src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/vipsubscribe/image/info/cut_03.jpg?v={{Msg "seo" "version"}}">
-                <img src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/vipsubscribe/image/info/cut_04.jpg?v={{Msg "seo" "version"}}">
-                <img src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/vipsubscribe/image/info/cut_05.jpg?v={{Msg "seo" "version"}}">
+                <img src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/vipsubscribe/image/info/vip_vs.png?v={{Msg "seo" "version"}}">
                 <img src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/vipsubscribe/image/info/cut_06.jpg?v={{Msg "seo" "version"}}">
                 <img src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/vipsubscribe/image/info/cut_07.jpg?v={{Msg "seo" "version"}}">
         </div>
@@ -165,7 +164,7 @@
             }
         }
     })
-    
+
     var loginFlag = {{if .T.loginFlag}}{{.T.loginFlag}}{{else}}false{{end}}
     $("*[data-need-bind-phone]").on('click', function () {
       if (loginFlag){
@@ -173,7 +172,7 @@
       }else{
         window.location.replace("/jyapp/free/login?url="+$(this).attr('data-url'))
       }
-        
+
     })
     $(function () {
         try{

+ 11 - 19
src/jfw/modules/app/src/web/templates/weixin/wxinfocontent.html

@@ -2,7 +2,7 @@
 <head>
     {{include "/common/meta.html"}}
     <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
-    <meta name="keywords" content="">
+    <meta name="keywords" content="{{.T.obj.keywords}}">
     <meta name="description" content="{{.T.obj.description}}">
     <title>公告信息</title>
     <link href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/css/alertPopShow.css?v={{Msg "seo" "version"}}" rel="stylesheet">
@@ -817,18 +817,9 @@
             <div id="third-party-verify-attention" class="third-party-verify-attention" style="display:none;">
               <span class="t-p-v-a-text">*温馨提示:系统识别到正文中对投标方有资质要求~</span>
             </div>
-            <div class="noLoginShow" style="display: none;">
+            <div class="noLoginShow option-login" style="display: none;">
               <div class="serve-list">
-                <img src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/images/register_serve.png" alt="" />
-              </div>
-              <div class="serve-option">
-                <div class="option-title">登录后可查看全文</div>
-                <div class="option-login option-common">立即登录</div>
-                <div class="option-register option-common">还不是会员?立即免费注册</div>
-                <div class="option-hotline">
-                  <img src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/images/telphone.png" alt="" />
-                  <span>咨询热线:400-108-6670</span>
-                </div>
+                <img src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/images/no-login-content.png" alt="详情页-未登录-引导" />
               </div>
             </div>
             <!--S 登录引导置底 S-->
@@ -1414,7 +1405,11 @@
             }
         }
     }
-
+    function appAutoLogin(){
+      // 去登录
+        const url = `/jyapp/article/content/${id}.html`
+        autoLogin(url)
+    }
     // 去登录
     $('.option-login').on('click', function() {
       const url = `/jyapp/article/content/${id}.html`
@@ -2461,10 +2456,8 @@
         $("#baseInfo ul").html(outhtml);
       }
       if(!userId) {
-        $('.unitbtn').hide()
         $('.border-tel_').hide()
       } else {
-        $('.unitbtn').show()
         $('.border-tel_').show()
       }
       //中标信息
@@ -2559,7 +2552,6 @@
       })
       // 采购单位跳转
       $('.caigouunit').on('click',function(){
-        if(!userId) return
         if(rerbuyer != ''&&rerbuyer!=null){
             var landinfo = {
                 anchor: '采购单位全景分析',
@@ -2752,10 +2744,10 @@
         // 判断有没有投标决策分析权限
         if (hasServiceArr.indexOf(6) > -1) {
           // 有权限 带标讯id 跳转到开始分析页面
-          location.href = '/jyapp/big/page/analysis_filter?sId=' + id
+          location.href = '/jyapp/big/page/analysis_result?id=' + id
         } else {
-          // 没有投标决策分析权限 跳转到搜索页 走留资流程
-          location.href = '/jyapp/big/page/analysis_filter?source=app_analysis_bid_detail&sId=' + id
+          // 没有投标决策分析权限 走留资流程
+          location.href = '/jyapp/frontPage/bigmember/free/perfect_info?source=app_analysis_bid_detail'
         }
       })
       // 中标预测

+ 264 - 77
src/jfw/modules/bigmember/src/entity/analysis.go

@@ -1,19 +1,19 @@
 package entity
 
 import (
+	qutil "app.yhyue.com/moapp/jybase/common"
 	"fmt"
 	"jy/src/jfw/modules/bigmember/src/util"
+	"log"
 	"regexp"
 	"strconv"
 	"strings"
 	"sync"
 	"time"
-
-	qutil "app.yhyue.com/moapp/jybase/common"
 )
 
 var (
-	query      = `{"query":{"bool":{"should":[%s],"must":[%s]}},"_source":[%s],"sort":[%s],"from":0,"size":%d,"aggs":{%s}}`
+	query      = `{"track_total_hits": true,"query":{"bool":{"must":[%s]}},"_source":[%s],"sort":[%s],"from":%d,"size":%d,"aggs":{%s}}`
 	query_bool = `{"bool":{"should":[%s],"minimum_should_match":%d}}`
 	//关键词匹配
 	multi_match_public = `{"multi_match":{"query":%s,"type":"phrase","fields":[%s]}}`
@@ -26,25 +26,24 @@ var (
 )
 
 const (
-	PSearch_DecField    = `"projectname","_id","buyer","firsttime","area","city","s_winner","review_experts","budget","bidamount","project_rate","bidtype","ids","winnerorder","bidtype","bidcycle"`
+	PSearch_DecField    = `"projectname","_id","buyer","firsttime","area","city","s_winner","review_experts","budget","bidamount","project_rate","bidtype","ids","winnerorder","entidlist","bidtype","bidcycle","buyerclass","jgtime","list"`
 	PSearch_DecMust     = `"bidstatus": ["中标","成交","合同"]`
-	PSearch_DecSimCount = 100                    //决策分析类似项目明细数据量
-	PSearch_DecSort     = `{"firsttime":"desc"}` //决策分析类似项目明细排序
+	PSearch_DecSimCount = 100                 //决策分析类似项目明细数据量
+	PSearch_DecSort     = `{"jgtime":"desc"}` //决策分析类似项目明细排序
 )
 
 var RegExperts = regexp.MustCompile("^[\\p{Han}]{2,4}$")
 
-//查询此中标企业 和 此采购单位 所有合作的项目
+// 查询此中标企业 和 此采购单位 所有合作的项目
 func (this *AnalysisDec) GetAllBWQueryByBW() string {
 	return fmt.Sprintf(query_allmsg_buyer_winner, this.Buyer, this.Winner, PSearch_DecField, PSearch_DecSimCount)
 }
 
-////投标决策分析查询语句-中标企业和采购单位 类似项目明细
+// //投标决策分析查询语句-中标企业和采购单位 类似项目明细
 func (this *AnalysisDec) DecQueryNewSimilarMsgByBW() (qstr string) {
 	//基础查询
 	bools := []string{}
 	musts := []string{}
-	shoulds := []string{}
 	var BWExists = 0
 	//中标单位 类似项目合作历史||采购单位类似项目
 	if this.Winner != "" {
@@ -60,62 +59,57 @@ func (this *AnalysisDec) DecQueryNewSimilarMsgByBW() (qstr string) {
 		musts = append(musts, winnerterms)
 	}
 	//中标单位 类似项目合作历史||采购单位类似项目
-	if this.Buyer != "" {
+	if this.Buyer != "" && this.SearchItem == 1 {
+		buyerterms := fmt.Sprintf(`{"query_string": {"default_field": "buyer","query": "*%s*"}}`, this.Buyer)
 		BWExists += 1
-		buyerterms := `{"terms":{"buyer":[`
-		for k, v := range strings.Split(this.Buyer, ",") {
-			if k > 0 {
-				buyerterms += `,`
-			}
-			buyerterms += `"` + v + `"`
-		}
-		buyerterms += `]}}`
 		musts = append(musts, buyerterms)
 	}
 	//searchType ==1; buyer & winner 不能为空
 	if BWExists < 2 && this.SearchType == 1 {
 		this.SearchType = 0
 	}
-	//省份
-	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 += `,`
+	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 += `"` + k + `"`
-				i += 1
-			} else {
-				citys = append(citys, qutil.ObjArrToStringArr(v.([]interface{}))...)
+			}
+			areaquery += `]}}`
+			if i > 0 {
+				areaCity = append(areaCity, areaquery)
 			}
 		}
-		areaquery += `]}}`
-		if i > 0 {
+		//城市
+		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(citys) > 0 {
-		//城市对应前三十个
-		if len(citys) > 30 {
-			citys = citys[:30]
-		}
-		areaquery := `{"terms":{"city":[`
-		for k, v := range citys {
-			if k > 0 {
-				areaquery += `,`
-			}
-			areaquery += `"` + v + `"`
+		if len(areaCity) > 0 {
+			musts = append(musts, strings.Join(areaCity, ","))
 		}
-		areaquery += `]}}`
-		areaCity = append(areaCity, areaquery)
-	}
-	if len(areaCity) > 0 {
-		shoulds = append(shoulds, strings.Join(areaCity, ","))
 	}
 
 	//金额区间
@@ -133,16 +127,29 @@ func (this *AnalysisDec) DecQueryNewSimilarMsgByBW() (qstr string) {
 		pricequery += `}}}`
 		musts = append(musts, pricequery)
 	}
+
+	//检索日期
+	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(P_Starttime)
+	}
+	if this.LimitTime != "" {
+		gte = time.Date(gteTime.Year(), 1, 1, 0, 0, 0, 0, time.Local).Unix()
+	}
 	//检索日期
-	if P_Starttime != "" {
-		now := time.Now()
-		endtime := now.Unix()
-		timequery := `{"range":{"firsttime":{`
-		timequery += `"gte":` + P_Starttime
-		timequery += `,`
-		timequery += `"lt":` + strconv.FormatInt(endtime, 10)
-		timequery += `}}}`
-		musts = append(musts, timequery)
+	if gte > 0 {
+		musts = append(musts, fmt.Sprintf(`{"range":{"jgtime":{"gte":%d,"lt":%d}}}`, gte, sTime.Unix()))
 	}
 	//中标项目
 	if PSearch_DecMust != "" {
@@ -210,11 +217,17 @@ func (this *AnalysisDec) DecQueryNewSimilarMsgByBW() (qstr string) {
 	if len(bools) > 0 {
 		musts = append(musts, fmt.Sprintf(query_bool, strings.Join(bools, ","), boolsNum))
 	}
-	qstr = fmt.Sprintf(query, strings.Join(shoulds, ","), strings.Join(musts, ","), PSearch_DecField, PSearch_DecSort, PSearch_DecSimCount, "")
+	if this.Page == 0 {
+		this.Page = 1
+	}
+	if this.PageSize == 0 {
+		this.PageSize = 10
+	}
+	qstr = fmt.Sprintf(query, strings.Join(musts, ","), PSearch_DecField, PSearch_DecSort, (this.Page-1)*this.PageSize, this.PageSize, "")
+	log.Println("投标决策分析查询语句-中标企业和采购单位 类似项目明细", qstr)
 	return qstr
 }
 
-//
 func ThisLock(userId string) *sync.Mutex {
 	UIL.Lock()
 	if UIL.DecLock[userId] == nil {
@@ -224,8 +237,7 @@ func ThisLock(userId string) *sync.Mutex {
 	return UIL.DecLock[userId]
 }
 
-//
-//采购内容 精准or模糊匹配处理
+// 采购内容 精准or模糊匹配处理
 func BuyerContentStruct(BC []ViewKeyWord) (arr []ViewKeyWord) {
 	if len(BC) > 0 {
 		for _, kw := range BC {
@@ -250,7 +262,7 @@ func BuyerContentStruct(BC []ViewKeyWord) (arr []ViewKeyWord) {
 	return arr
 }
 
-//决策分析 根据字段权重排序 中标企业和中标价格
+// 决策分析 根据字段权重排序 中标企业和中标价格
 var (
 	bidtype_score        = 1 //采购方式
 	review_experts_score = 1 //评审专家
@@ -261,6 +273,59 @@ var (
 	winnerorder_score    = 1 //中标候选人
 )
 
+// NewSequence 成交时间
+func NewSequence(seqData []map[string]interface{}) []map[string]interface{} {
+	var data []map[string]interface{}
+	for _, v := range seqData {
+		var score = 0
+		if v["s_winner"] != nil && qutil.InterfaceToStr(v["s_winner"]) != "" {
+			var s_winner = qutil.ObjToString(v["s_winner"])
+			entidlist, _ := v["entidlist"].([]interface{})
+			//中标单位id
+			winnerList := strings.Split(s_winner, ",")
+			if len(entidlist) == len(winnerList) {
+				var entidlists []string
+				for _, v2 := range entidlist {
+					entidlists = append(entidlists, util.EncodeId(qutil.InterfaceToStr(v2)))
+				}
+				v["entidlist"] = entidlists
+			} else {
+				delete(v, "entidlist") //中标单位id有误 删除id处理
+			}
+		}
+		//评审专家
+		review_experts := []string{}
+		if v["review_experts"] != nil {
+			for _, v1 := range qutil.ObjArrToStringArr(v["review_experts"].([]interface{})) {
+				if RegExperts.MatchString(v1) {
+					review_experts = append(review_experts, v1)
+				}
+			}
+			v["review_experts"] = review_experts
+		}
+		if len(review_experts) > 0 {
+			score += review_experts_score
+		}
+		list, _ := v["list"].([]interface{})
+		if len(list) > 0 {
+			listMap, _ := list[len(list)-1].(map[string]interface{})
+			v["subtype"] = listMap["subtype"]
+			delete(v, "list")
+		}
+
+		if v["ids"] != nil {
+			ids := qutil.ObjArrToStringArr(v["ids"].([]interface{}))
+			if len(ids) > 0 {
+				v["infoid"] = util.EncodeId(ids[0])
+				delete(v, "ids")
+			}
+		}
+		v["_id"] = util.EncodeId(v["_id"].(string))
+		data = append(data, v)
+	}
+	return data
+}
+
 func Sequence(seqData []map[string]interface{}) []map[string]interface{} {
 	var sequenceArr3 = []map[string]interface{}{}
 	var sequenceArr4 = []map[string]interface{}{}
@@ -271,24 +336,36 @@ func Sequence(seqData []map[string]interface{}) []map[string]interface{} {
 	var sequenceArr9 = []map[string]interface{}{}
 	for k, v := range seqData {
 		var score = 0
-		if v["s_winner"] == nil {
+		if v["s_winner"] != nil && qutil.InterfaceToStr(v["s_winner"]) != "" {
 			var s_winner = qutil.ObjToString(v["s_winner"])
-			var s_length = 0
-			for _, v := range strings.Split(s_winner, ",") {
-				if RegWinner.MatchString(v) {
-					s_length += 1
+			entidlist, _ := v["entidlist"].([]interface{})
+			//中标单位id
+			winnerList := strings.Split(s_winner, ",")
+			if len(entidlist) == len(winnerList) {
+				var entidlists []string
+				for _, v2 := range entidlist {
+					entidlists = append(entidlists, util.EncodeId(qutil.InterfaceToStr(v2)))
 				}
+				v["entidlist"] = entidlists
+			} else {
+				delete(v, "entidlist") //中标单位id有误 删除id处理
 			}
-			if s_length == 0 {
-				continue
-			}
+			//var s_length = 0
+			//for _, v1 := range winnerList {
+			//	if RegWinner.MatchString(v1) {
+			//		s_length += 1
+			//	}
+			//}
+			//if s_length == 0 {
+			//	continue
+			//}
 		}
 		//评审专家
 		review_experts := []string{}
 		if v["review_experts"] != nil {
-			for _, v := range qutil.ObjArrToStringArr(v["review_experts"].([]interface{})) {
-				if RegExperts.MatchString(v) {
-					review_experts = append(review_experts, v)
+			for _, v1 := range qutil.ObjArrToStringArr(v["review_experts"].([]interface{})) {
+				if RegExperts.MatchString(v1) {
+					review_experts = append(review_experts, v1)
 				}
 			}
 			v["review_experts"] = review_experts
@@ -296,6 +373,12 @@ func Sequence(seqData []map[string]interface{}) []map[string]interface{} {
 		if len(review_experts) > 0 {
 			score += review_experts_score
 		}
+		list, _ := v["list"].([]interface{})
+		if len(list) > 0 {
+			listMap, _ := list[len(list)-1].(map[string]interface{})
+			v["subtype"] = listMap["subtype"]
+			delete(v, "list")
+		}
 		//采购方式
 		if v["bidtype"] != nil && qutil.ObjToString(v["bidtype"].(string)) != "" {
 			score += bidtype_score
@@ -351,3 +434,107 @@ func Sequence(seqData []map[string]interface{}) []map[string]interface{} {
 	}
 	return append(append(append(append(append(append(sequenceArr9, sequenceArr8...), sequenceArr7...), sequenceArr6...), sequenceArr5...), sequenceArr4...), sequenceArr3...)
 }
+
+func GetReviewExpertsProjects(expertName string, area map[string]interface{}, business_scope []ViewKeyWord, buyer, limitTime string, searchItem, projectScope, page, pageSize int) string {
+	var query = `{"track_total_hits": true,"query":{"bool":{"must":[{"bool":{"should":[%s],"must":[%s]}},{"bool":{"should":[%s],"minimum_should_match":%d}},{"term":{"review_experts":"%s"}}]}},"_source":[%s],"sort":[%s],"from":%d,"size":%d}`
+
+	//基础查询
+	bools := []string{}
+	musts := []string{}
+	shoulds := []string{}
+
+	if searchItem == 1 { //采购单位同类型检索
+		//项目采购单位 模糊匹配
+		buyerSql := fmt.Sprintf(`{"query_string": {"default_field": "buyer","query": "*%s*"}}`, buyer)
+		musts = append(musts, buyerSql)
+	}
+
+	if searchItem == 2 { //地区同类型检索
+		//省份
+		areaCity := []string{}
+		//citys := []string{}
+		if len(area) > 0 {
+			areaquery := `{"terms":{"area":[`
+			var i = 0
+			for k, v := range area {
+				if len(qutil.ObjArrToStringArr(v.([]interface{}))) == 0 {
+					if i > 0 {
+						areaquery += `,`
+					}
+					areaquery += `"` + strings.ReplaceAll(strings.ReplaceAll(k, "省", ""), "市", "") + `"`
+					i += 1
+				}
+			}
+			areaquery += `]}}`
+			if i > 0 {
+				areaCity = append(areaCity, areaquery)
+			}
+		}
+
+		if len(areaCity) > 0 {
+			musts = append(musts, strings.Join(areaCity, ","))
+		}
+	}
+
+	//检索日期
+	if limitTime != "" {
+		var (
+			gteTime time.Time
+			gte     int64
+		)
+		sTime := time.Now()
+		switch limitTime {
+		case "oneYear":
+			gteTime = sTime.AddDate(-1, 0, 0)
+		case "threeYear":
+			gteTime = sTime.AddDate(-3, 0, 0)
+		default: // 默认近五年
+			gteTime = sTime.AddDate(-5, 0, 0)
+		}
+		gte = time.Date(gteTime.Year(), 1, 1, 0, 0, 0, 0, time.Local).Unix()
+		musts = append(musts, fmt.Sprintf(`{"range":{"jgtime":{"gte":%d,"lt":%d}}}`, gte, sTime.Unix()))
+	}
+	//中标项目
+	if PSearch_DecMust != "" {
+		musts = append(musts, fmt.Sprintf(query_bool_must, PSearch_DecMust))
+	}
+	boolsNum := 0
+	//should
+	if len(business_scope) > 0 && projectScope != 1 {
+		boolsNum = 1
+		findfields := `"projectname.pname","purchasing"`
+		multi_match := fmt.Sprintf(multi_match_public, "%s", findfields)
+		for _, kv := range business_scope {
+			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))
+			}
+		}
+	}
+	start := (page - 1) * pageSize
+	qstr := fmt.Sprintf(query, strings.Join(shoulds, ","), strings.Join(musts, ","), strings.Join(bools, ","), boolsNum, expertName, PSearch_DecField, `{"jgtime":"desc"}`, start, pageSize)
+	log.Println("str:", qstr)
+	return qstr
+}

+ 261 - 204
src/jfw/modules/bigmember/src/entity/analysisEntName.go

@@ -2,38 +2,56 @@
 package entity
 
 import (
-	"fmt"
-	"jy/src/jfw/modules/bigmember/src/db"
-	"jy/src/jfw/modules/bigmember/src/util"
-	"regexp"
-	"strings"
-	"sync"
-
-	qutil "app.yhyue.com/moapp/jybase/common"
-	elastic "app.yhyue.com/moapp/jybase/es"
-	"app.yhyue.com/moapp/jybase/go-xweb/httpsession"
+    qutil "app.yhyue.com/moapp/jybase/common"
+    elastic "app.yhyue.com/moapp/jybase/es"
+    "app.yhyue.com/moapp/jybase/go-xweb/httpsession"
+    "fmt"
+    "jy/src/jfw/modules/bigmember/src/db"
+    "jy/src/jfw/modules/bigmember/src/util"
+    "log"
+    "regexp"
+    "strings"
+    "sync"
+    "time"
 )
 
-/**即时获取项目名称列表
+/*
+*即时获取项目名称列表
 name  名称
 limit 取几条
 */
-var pnquery = `{"query": {"bool": {"must": [{"match": {"projectname.pname": "%s"}}]}},"_source": ["projectname","_id","buyer","firsttime","area","city","sourceinfoid"],"from": 0,"size": %d}`
+var pnquery = `{"query": {"bool": {"must": [{"match": {"%s": "%s"}}]}},"_source": ["projectname","_id","buyer","firsttime","area","city","sourceinfoid"],"from": 0,"size": %d}`
+
+func GetProNameImmediate(sType, name string, limit int) []map[string]interface{} {
+    var queryName string
+    if sType == "1" {
+        var list []map[string]interface{}
+        r := elastic.Get("buyer", "buyer", fmt.Sprintf(`{"query": {"match_phrase": {"name": "%s"}},"_source": ["name"],"size": %d}`, name, limit))
+        if r != nil {
+            for _, v := range *r {
+                list = append(list, map[string]interface{}{"buyer": qutil.InterfaceToStr(v["name"])})
+            }
+        }
+        return list
+    } else {
+        queryName = fmt.Sprintf(pnquery, "projectname.pname", name, limit)
+    }
 
-func GetProNameImmediate(name string, limit int) []map[string]interface{} {
-	query := fmt.Sprintf(pnquery, name, limit)
-	list := *elastic.Get("projectset", "projectset", query)
-	return list
+    list := elastic.Get("projectset", "projectset", queryName)
+    if list == nil {
+        return nil
+    }
+    return *list
 }
 
-//根据项目名称查询项目信息
+// 根据项目名称查询项目信息
 func GetProInfoById(ids, sourceinfoids []string) []map[string]interface{} {
-	var res []map[string]interface{}
-	if len(ids) > 0 {
-		res = *elastic.GetById("projectset", "projectset", ids[0])
-	}
-	if (res == nil || len(res) == 0) && len(sourceinfoids) > 0 {
-		query := `{"query": {
+    var res []map[string]interface{}
+    if len(ids) > 0 {
+        res = *elastic.GetById("projectset", "projectset", ids[0])
+    }
+    if (res == nil || len(res) == 0) && len(sourceinfoids) > 0 {
+        query := `{"query": {
 					"bool": {
 						"must": [{
 							"term": {
@@ -53,231 +71,270 @@ func GetProInfoById(ids, sourceinfoids []string) []map[string]interface{} {
 			 	"from": 0,
 				"size": 1
 			}`
-		res = *elastic.Get("projectset", "projectset", query)
-	}
-	return res
+        res = *elastic.Get("projectset", "projectset", query)
+    }
+    return res
 }
 
-//
 var pcquery = `{"query": {"bool": {"must": [{"terms": {"%s": [%s]}}],"must_not": [],"should": []}},"from": 0,"size": 20,"sort": []}`
+var qurySql = `{"query": {"bool": {"must": [],"must_not": [],"should": [%s]}},"from": 0,"size": 10,"sort": []}`
+
+// 采购单位模糊
+func GetEntBlur(entName []string) []map[string]interface{} {
+    var data []string
+    for _, v := range entName {
+        data = append(data, fmt.Sprintf(`{"query_string": {"default_field": "buyer_name","query": "*%s*"}}`, v))
+    }
+    query := fmt.Sprintf(qurySql, strings.Join(data, ","))
+    list := elastic.Get("buyer", "buyer", query)
+    if list == nil {
+        return nil
+    }
+    return *list
+}
 
-//潜在客户 获取省份和城市
 func GetEntPC(entName []string) []map[string]interface{} {
-	query := fmt.Sprintf(pcquery, "buyer_name", `"`+strings.Join(entName, `","`)+`"`)
-	list := *elastic.Get("buyer", "buyer", query)
-	return list
+    query := fmt.Sprintf(pcquery, "buyer_name", `"`+strings.Join(entName, `","`)+`"`)
+    list := elastic.Get("buyer", "buyer", query)
+    if list == nil {
+        return nil
+    }
+    return *list
 }
 
 type EnterQYXYInfo struct {
-	Name string
-	Id   string
-	Area string
-	City string
+    Name string
+    Id   string
+    Area string
+    City string
 }
 
-//企业库是否有此企业信息
+// 企业库是否有此企业信息
 func GetEntInfo(entName []string, p string) (entName_r []*EnterQYXYInfo) {
-	if len(entName) > 0 {
-		query := map[string]interface{}{}
-		if p == "C" {
-			query["company_name"] = map[string]interface{}{
-				"$in": entName,
-			}
-		} else {
-			query["_id"] = map[string]interface{}{
-				"$in": entName,
-			}
-		}
-		sess := db.Mgo_Ent.GetMgoConn()
-		defer db.Mgo_Ent.DestoryMongoConn(sess)
-		it := sess.DB(db.Mgo_Ent.DbName).C("qyxy_std").Find(query).Select(map[string]interface{}{"company_name": 1, "_id": 1, "company_area": 1, "company_city": 1}).Iter()
-		for m := make(map[string]interface{}); it.Next(&m); {
-			if m["company_name"] != nil && m["company_name"].(string) != "" {
-				entName_r = append(entName_r, &EnterQYXYInfo{
-					Id:   m["_id"].(string),
-					Name: qutil.ObjToString(m["company_name"]),
-					Area: qutil.ObjToString(m["company_area"]),
-					City: qutil.ObjToString(m["company_city"]),
-				})
-			}
-		}
-	}
-	return entName_r
+    if len(entName) > 0 {
+        query := map[string]interface{}{}
+        if p == "C" {
+            query["company_name"] = map[string]interface{}{
+                "$in": entName,
+            }
+        } else {
+            query["_id"] = map[string]interface{}{
+                "$in": entName,
+            }
+        }
+        sess := db.Mgo_Ent.GetMgoConn()
+        defer db.Mgo_Ent.DestoryMongoConn(sess)
+        it := sess.DB(db.Mgo_Ent.DbName).C("qyxy_std").Find(query).Select(map[string]interface{}{"company_name": 1, "_id": 1, "company_area": 1, "company_city": 1}).Iter()
+        for m := make(map[string]interface{}); it.Next(&m); {
+            if m["company_name"] != nil && m["company_name"].(string) != "" {
+                entName_r = append(entName_r, &EnterQYXYInfo{
+                    Id:   m["_id"].(string),
+                    Name: qutil.ObjToString(m["company_name"]),
+                    Area: qutil.ObjToString(m["company_area"]),
+                    City: qutil.ObjToString(m["company_city"]),
+                })
+            }
+        }
+    }
+    return entName_r
 }
 
-//企业库是否有此企业信息
+// 企业库是否有此企业信息
 func GetEntInfoByQYXY(entName []string, p string) []*EnterQYXYInfo {
-	entName_r := []*EnterQYXYInfo{}
-	if len(entName) > 0 {
-		query := map[string]interface{}{}
-		if p == "C" {
-			query["company_name"] = map[string]interface{}{
-				"$in": entName,
-			}
-		} else {
-			query["_id"] = map[string]interface{}{
-				"$in": entName,
-			}
-		}
-		sess := db.Mgo_Ent.GetMgoConn()
-		defer db.Mgo_Ent.DestoryMongoConn(sess)
-		it := sess.DB(db.Mgo_Ent.DbName).C("qyxy_std").Find(query).Select(map[string]interface{}{"company_name": 1, "_id": 1, "company_area": 1, "company_city": 1}).Iter()
-		for m := make(map[string]interface{}); it.Next(&m); {
-			if m["company_name"] != nil && m["company_name"].(string) != "" {
-				entName_r = append(entName_r, &EnterQYXYInfo{
-					Id:   m["_id"].(string),
-					Name: qutil.ObjToString(m["company_name"]),
-					Area: qutil.ObjToString(m["company_area"]),
-					City: qutil.ObjToString(m["company_city"]),
-				})
-			}
-		}
-	}
-	return entName_r
+    entName_r := []*EnterQYXYInfo{}
+    if len(entName) > 0 {
+        query := map[string]interface{}{}
+        if p == "C" {
+            query["company_name"] = map[string]interface{}{
+                "$in": entName,
+            }
+        } else {
+            query["_id"] = map[string]interface{}{
+                "$in": entName,
+            }
+        }
+        sess := db.Mgo_Ent.GetMgoConn()
+        defer db.Mgo_Ent.DestoryMongoConn(sess)
+        it := sess.DB(db.Mgo_Ent.DbName).C("qyxy_std").Find(query).Select(map[string]interface{}{"company_name": 1, "_id": 1, "company_area": 1, "company_city": 1}).Iter()
+        for m := make(map[string]interface{}); it.Next(&m); {
+            if m["company_name"] != nil && m["company_name"].(string) != "" {
+                entName_r = append(entName_r, &EnterQYXYInfo{
+                    Id:   m["_id"].(string),
+                    Name: qutil.ObjToString(m["company_name"]),
+                    Area: qutil.ObjToString(m["company_area"]),
+                    City: qutil.ObjToString(m["company_city"]),
+                })
+            }
+        }
+    }
+    return entName_r
 }
 
-//企业库是否有此企业信息 并返回加密后id
+// 企业库是否有此企业信息 并返回加密后id
 func GetEntIdByQYXY(entName string) string {
-	var entId = ""
-	if entName != "" {
-		query := map[string]interface{}{
-			"company_name": entName,
-		}
-		sess := db.Mgo_Ent.GetMgoConn()
-		defer db.Mgo_Ent.DestoryMongoConn(sess)
-		it := sess.DB(db.Mgo_Ent.DbName).C("qyxy_std").Find(query).Select(map[string]interface{}{"company_name": 1, "_id": 1}).Iter()
-		for m := make(map[string]interface{}); it.Next(&m); {
-			if m["company_name"] != nil && m["company_name"].(string) != "" {
-				entId = m["_id"].(string)
-			}
-		}
-	}
-	return entId
+    var entId = ""
+    if entName != "" {
+        query := map[string]interface{}{
+            "company_name": entName,
+        }
+        sess := db.Mgo_Ent.GetMgoConn()
+        defer db.Mgo_Ent.DestoryMongoConn(sess)
+        it := sess.DB(db.Mgo_Ent.DbName).C("qyxy_std").Find(query).Select(map[string]interface{}{"company_name": 1, "_id": 1}).Iter()
+        for m := make(map[string]interface{}); it.Next(&m); {
+            if m["company_name"] != nil && m["company_name"].(string) != "" {
+                entId = m["_id"].(string)
+            }
+        }
+    }
+    return entId
 }
 
-//中标企业库是否有此企业注册金额
+// 中标企业库是否有此企业注册金额
 func GetWinnerCapitals(entName []string) map[string]int64 {
-	entName_capitals := map[string]int64{}
-	if len(entName) > 0 {
-		query := map[string]interface{}{
-			"company_name": map[string]interface{}{
-				"$in": entName,
-			},
-		}
-		sess := db.Mgo_Ent.GetMgoConn()
-		defer db.Mgo_Ent.DestoryMongoConn(sess)
-		it := sess.DB(db.Mgo_Ent.DbName).C("winner_enterprise").Find(query).Select(map[string]interface{}{"company_name": 1, "capital": 1}).Iter()
-		for m := make(map[string]interface{}); it.Next(&m); {
-			if m["company_name"] != nil && m["company_name"].(string) != "" && m["capital"] != nil {
-				entName_capitals[m["company_name"].(string)] = qutil.Int64All(m["capital"])
-			}
-		}
-	}
-	return entName_capitals
+    esSql := `{"query": {"bool": {"must": [{"terms": {"id": [%s]}}],"must_not": [],"should": []}},"_source":["id","capital"],"from": 0,"size": %d,"sort": [],"aggs": {}}`
+    querySql := fmt.Sprintf(esSql, strings.Join(entName, ","), len(entName))
+    r := elastic.Get("qyxy", "qyxy", querySql)
+    if r == nil || len(*r) == 0 {
+        return nil
+    }
+    entName_capitals := map[string]int64{}
+    for _, v := range *r {
+        id := util.EncodeId(qutil.InterfaceToStr(v["id"]))
+        entName_capitals[id] = qutil.Int64All(v["capital"])
+    }
+    return entName_capitals
 }
 
 var P_Starttime = "1514736000" //2018.01.01
 
-var RegWinner = regexp.MustCompile(".+[司院厂所心处普]$")
+var RegWinner = regexp.MustCompile(".+[司院厂所心处普学]$")
 
 type UserInfoLock struct {
-	sync.Mutex
-	DecLock  map[string]*sync.Mutex
-	ForWLock map[string]*sync.Mutex
+    sync.Mutex
+    DecLock  map[string]*sync.Mutex
+    ForWLock map[string]*sync.Mutex
 }
 
 var UIL *UserInfoLock
 
 func NewUserInfoLock() *UserInfoLock {
-	return &UserInfoLock{
-		DecLock:  make(map[string]*sync.Mutex),
-		ForWLock: make(map[string]*sync.Mutex),
-	}
+    return &UserInfoLock{
+        DecLock:  make(map[string]*sync.Mutex),
+        ForWLock: make(map[string]*sync.Mutex),
+    }
 }
 
-//决策分析-中标企业和采购单位 其他项目明细
+// 决策分析-中标企业和采购单位 其他项目明细
 type AnalysisDec struct {
-	Area             map[string]interface{} //地区
-	BuyerContent     []ViewKeyWord          //采购内容
-	BuyerClass       []string               //采购单位类型
-	Sid              string                 //项目招标信息id
-	Pname            string                 //项目名称
-	Industry         string                 //招标行业
-	MinPrice         int                    //最小价格
-	MaxPrice         int                    //最大价格
-	Buyer            string                 //采购单位
-	ServiceId        int                    //大会员服务id
-	MobileModel      string                 //手机型号
-	AppVersion       string                 //app版本号
-	Winner           string                 //中标企业
-	SearchType       int                    //默认0:中标企业||采购单位||(中标企业&&采购单位)-类似项目明细;1:中标企业和采购单位其他项目明细
-	UserId           string                 //用户id
-	IsPower          bool                   //是否有权限
-	UserLock         sync.Mutex             //用户锁
-	Buyer_BuyerClass string                 //当前采购单位的采购单位类型
+    Area             map[string]interface{} //地区
+    BuyerContent     []ViewKeyWord          //采购内容
+    BuyerClass       []string               //采购单位类型
+    Sid              string                 //项目招标信息id
+    Pname            string                 //项目名称
+    Industry         string                 //招标行业
+    MinPrice         int                    //最小价格
+    MaxPrice         int                    //最大价格
+    Buyer            string                 //采购单位
+    ServiceId        int                    //大会员服务id
+    MobileModel      string                 //手机型号
+    AppVersion       string                 //app版本号
+    Winner           string                 //中标企业
+    SearchType       int                    //默认0:中标企业||采购单位||(中标企业&&采购单位)-类似项目明细;1:中标企业和采购单位其他项目明细 2:分析项目明细 3:专家项目明细
+    UserId           string                 //用户id
+    IsPower          bool                   //是否有权限
+    UserLock         sync.Mutex             //用户锁
+    Buyer_BuyerClass string                 //当前采购单位的采购单位类型
+    ExpertName       string                 //专家名字
+    ProjectScope     int                    //0 同类项目(默认搜索) 1 全部项目
+    LimitTime        string
+    SearchItem       int
+    Page             int //页码
+    PageSize         int //数量
 }
 
 /*已选条件--关键词*/
 type ViewKeyWord struct {
-	Keyword  []string `json:"key"`       //关键词
-	Appended []string `json:"appendkey"` //附加词
-	Exclude  []string `json:"notkey"`    //排除词
-	MatchWay int      `json:"matchway"`  //匹配模式
+    Keyword  []string `json:"key"`       //关键词
+    Appended []string `json:"appendkey"` //附加词
+    Exclude  []string `json:"notkey"`    //排除词
+    MatchWay int      `json:"matchway"`  //匹配模式
 }
 
 func CheckPower(session *httpsession.Session) (string, bool) {
-	main_userId, _, member_status := util.MainUserId(session)
-	return main_userId, member_status > 0
+    main_userId, _, member_status := util.MainUserId(session)
+    return main_userId, member_status > 0
+}
+
+func (this *AnalysisDec) GetProjectInfoByBW() (count int64, res []map[string]interface{}) {
+    //this.UserLock.Lock()
+    //defer this.UserLock.Unlock()
+    //采购单位的采购类型
+    //if this.Buyer != "" {
+    //	buyerData := GetEntPC(strings.Split(this.Buyer, ","))
+    //	if buyerData != nil && len(buyerData) > 0 {
+    //		buyer_one := *qutil.ObjToMap(buyerData[0])
+    //		if buyer_one["buyerclass"] != nil {
+    //			this.Buyer_BuyerClass = buyer_one["buyerclass"].(string)
+    //		}
+    //	}
+    //}
+    this.ParameterCheck()
+    //this.BuyerContent = BuyerContentStruct(this.BuyerContent)
+    //中标企业和采购单位类似项目明细
+    decQuery := this.DecQueryNewSimilarMsgByBW()
+    tm := time.Now()
+    //其他项目明细
+    switch this.SearchType {
+    case 0: //分析项目明细||中标单位项目明细
+        _, count, res = elastic.GetAggs("projectset", "projectset", decQuery)
+    case 1:
+        _, _idMap := this.GetAllMsgByBW(decQuery)
+        //中标企业和采购单位 所有项目明细
+        allQuery := this.GetAllBWQueryByBW()
+        allMsg, _ := this.GetAllMsgByBW(allQuery)
+        if len(allMsg) > 0 {
+            for _, v := range allMsg {
+                id := qutil.ObjToString(v["_id"])
+                if _idMap[id] {
+                    continue
+                }
+                res = append(res, v)
+            }
+        }
+    case 2: //中标单位top10项目明细
+        _, count, res = elastic.GetAggs("projectset", "projectset", decQuery)
+    case 3: // 专家明细
+        decQuery := GetReviewExpertsProjects(this.ExpertName, this.Area, this.BuyerContent, this.Buyer, this.LimitTime, this.SearchItem, this.ProjectScope, this.Page, this.PageSize)
+        _, count, res = elastic.GetAggs("projectset", "projectset", decQuery)
+        log.Println("各类项目明细耗时:", time.Since(tm))
+
+    }
+    log.Println("各类项目明细耗时:", time.Since(tm))
+    return count, NewSequence(res)
 }
 
-//
-func (this *AnalysisDec) GetProjectInfoByBW() (res []map[string]interface{}) {
-	this.UserLock.Lock()
-	defer this.UserLock.Unlock()
-	//采购单位的采购类型
-	if this.Buyer != "" {
-		buyerData := GetEntPC(strings.Split(this.Buyer, ","))
-		if buyerData != nil && len(buyerData) > 0 {
-			buyer_one := *qutil.ObjToMap(buyerData[0])
-			if buyer_one["buyerclass"] != nil {
-				this.Buyer_BuyerClass = buyer_one["buyerclass"].(string)
-			}
-		}
-	}
-	this.BuyerContent = BuyerContentStruct(this.BuyerContent)
-	//中标企业和采购单位类似项目明细
-	decQuery := this.DecQueryNewSimilarMsgByBW()
-	similarMsg, _idMap := this.GetAllMsgByBW(decQuery)
-	//其他项目明细
-	switch this.SearchType {
-	case 0:
-		res = similarMsg
-	case 1:
-		//中标企业和采购单位 所有项目明细
-		allQuery := this.GetAllBWQueryByBW()
-		allMsg, _ := this.GetAllMsgByBW(allQuery)
-		if len(allMsg) > 0 {
-			for _, v := range allMsg {
-				id := qutil.ObjToString(v["_id"])
-				if _idMap[id] {
-					continue
-				}
-				res = append(res, v)
-			}
-		}
-	}
-	return Sequence(res)
+func (this *AnalysisDec) ParameterCheck() {
+    this.BuyerContent = BuyerContentStruct(this.BuyerContent)
+    switch this.SearchType {
+    case 0: //类似项目 过滤无用字段
+        this.Winner = ""
+        this.ExpertName = ""
+    case 2: //中标top10项目明细 过滤无用字段
+        this.ExpertName = ""
+    case 3: //专家项目明细 过滤无用字段
+        this.Winner = ""
+    }
 }
 
-//获取数据
+// 获取数据
 func (this *AnalysisDec) GetAllMsgByBW(decQuery string) (res []map[string]interface{}, idMap map[string]bool) {
-	newRes := elastic.Get("projectset", "projectset", decQuery)
-	if newRes != nil {
-		idMap = map[string]bool{}
-		res = *newRes
-		for _, v := range *newRes {
-			idMap[qutil.ObjToString(v["_id"])] = true
-		}
-	}
-	return res, idMap
+    newRes := elastic.Get("projectset", "projectset", decQuery)
+    if newRes != nil {
+        idMap = map[string]bool{}
+        res = *newRes
+        for _, v := range *newRes {
+            idMap[qutil.ObjToString(v["_id"])] = true
+        }
+    }
+    return res, idMap
 }

+ 41 - 7
src/jfw/modules/bigmember/src/entity/portrait.go

@@ -28,7 +28,7 @@ const (
 // CreatePortraitManager 大会员
 func CreatePortraitManager(session *httpsession.Session, pageFlag string) (*Portrait, bool, error, bool) {
 	userid := fmt.Sprint(qutil.Int64All(session.Get("base_user_id")))
-	if userid == "" {
+	if userid == "" || userid == "0" {
 		return nil, false, errors.New("未登录"), true
 	}
 	bigMsg := jy.GetBigVipUserBaseMsg(session, *config.Middleground)
@@ -64,7 +64,7 @@ func CreatePortraitManager(session *httpsession.Session, pageFlag string) (*Port
 // CreatePortraitManagerForContacts 画像通讯里权限验证
 func CreatePortraitManagerForContacts(session *httpsession.Session, entType int64, entName string) (*Portrait, error) {
 	userid := fmt.Sprint(qutil.Int64All(session.Get("base_user_id")))
-	if userid == "" {
+	if userid == "" || userid == "0" {
 		return nil, errors.New("未登录")
 	}
 	if entName == "" {
@@ -147,6 +147,39 @@ func CreateSubVipPortraitManager(userid string, pageFlag, searchValue string, is
 	return &Portrait{userid, session}, 1, nil, true
 }
 
+// CreateSubVipPortraitManagerForOpen 超级订阅权限校验-部分开放接口 int -1无权限 1免费权限 2超级订阅次数&采购单位流量包 3使用体验
+func CreateSubVipPortraitManagerForOpen(userid string, pageFlag, searchValue string, isWinner bool, session *httpsession.Session) (*Portrait, int, error, bool) {
+	if pageFlag == "" {
+		return nil, -1, errors.New("未知请求"), true
+	}
+	if pageFlag != "entDetail" { //需要权限校验的接口
+		if userid == "" {
+			// 未登录用户
+			return &Portrait{userid, session}, 1, nil, true
+		}
+		bigMsg := jy.GetBigVipUserBaseMsg(session, *config.Middleground)
+		//免费用户判断
+		free := false
+		if bigMsg.VipStatus <= 0 && bigMsg.Status <= 0 && bigMsg.EntnicheStatus <= 0 {
+			free = true
+		}
+		if bigMsg.VipStatus <= 0 || bigMsg.Vip_BuySet.Upgrade != 1 { //免费用户留资体验
+			if searchValue != "" && jy.Portraitexperience(userid, searchValue, isWinner) {
+				return &Portrait{userid, session}, 3, nil, free
+			}
+			return &Portrait{userid, session}, -1, nil, free
+		} else { //超级订阅升级版-校验超级订阅画像浏览次数
+			err := bigMsg.NewSubVipPortrait(db.Mysql, searchValue, isWinner).SubVipPortraitTimesCheck()
+			if err == nil {
+				return &Portrait{userid, session}, 2, nil, free
+			} else {
+				log.Printf("用户%s 超级订阅使用画像%s次数异常 %v\n", userid, searchValue, err)
+			}
+		}
+	}
+	return &Portrait{userid, session}, 1, nil, true
+}
+
 // GetEntInfo 获取企业基本信息
 func (this *Portrait) GetEntInfo(entId string) (map[string]interface{}, error) {
 	if entId == "" {
@@ -308,7 +341,7 @@ func (this *Portrait) WinnerPortraitData(screen *PortraitScreen) (map[string]int
 	}
 	resMap := map[string]interface{}{}
 	if !screen.HasPower || screen.IsEmptySearch() { //空查询读缓存
-		resMap = TryFunc(GetPortraitCache, screen.Ent, "winner", 2)
+		resMap = TryFunc(GetPortraitCache, screen.Ent, "winner", 2, 1)
 	} else {
 		Screen_Thread <- true
 		winnerPortraitData, err := GetWinnerPortraitSearch(screen)
@@ -334,7 +367,7 @@ func (this *Portrait) WinnerMiniPortraitData(entId string) (map[string]interface
 	if entId == "" {
 		return nil, errors.New("企业名称异常")
 	}
-	winnerPortraitData := TryFunc(GetPortraitCache, entId, "winner", 2)
+	winnerPortraitData := TryFunc(GetPortraitCache, entId, "winner", 2, 1)
 	miniReturnMap := map[string]interface{}{}
 	for _, key := range []string{"bidamount_count", "project_count"} {
 		miniReturnMap[key] = winnerPortraitData[key]
@@ -368,9 +401,10 @@ func (this *Portrait) BuyerPortraitData(screen *PortraitScreen, flag string) (ma
 		return nil, errors.New("企业名称异常")
 	}
 	buyerPortraitData := map[string]interface{}{}
+
 	if screen.IsEmptySearch() { //空查询读缓存
-		buyerPortraitData = TryFunc(GetPortraitCache, screen.Ent, "buyer", 5)
-	} else {
+		buyerPortraitData = TryFunc(GetPortraitCache, screen.Ent, "buyer", qutil.If(screen.UserLevel == 3, 2, 5).(int), screen.UserLevel)
+	} else if screen.UserLevel != 3 { //3:未登录用户不能使用条件查询,只能进行空搜索
 		Screen_Thread <- true
 		res, err := GetBuyerPortraitData(screen)
 		<-Screen_Thread
@@ -407,7 +441,7 @@ func (this *Portrait) BuyerMiniPortraitData(buyer string) (map[string]interface{
 		return nil, errors.New("企业名称异常")
 	}
 	miniReturnMap := map[string]interface{}{}
-	buyerPortraitData := TryFunc(GetPortraitCache, buyer, "buyer", 2)
+	buyerPortraitData := TryFunc(GetPortraitCache, buyer, "buyer", 2, 1)
 	if buyerPortraitData != nil {
 		for _, key := range []string{"province", "city", "buyerclass", "bidamount_count", "project_count"} {
 			miniReturnMap[key] = buyerPortraitData[key]

+ 4 - 4
src/jfw/modules/bigmember/src/entity/portrait_manager.go

@@ -145,9 +145,9 @@ func upDataQxhxRedis(redisKey string, data interface{}) {
 }
 
 // TryFunc 画像查询,读存缓存
-func TryFunc(f func(string, string) map[string]interface{}, ent, do string, times int) map[string]interface{} {
+func TryFunc(f func(string, string, int) map[string]interface{}, ent, do string, times, userLevel int) map[string]interface{} {
 	for i := times; i > 0; i-- {
-		if r := f(ent, do); r != nil {
+		if r := f(ent, do, userLevel); r != nil {
 			return r
 		}
 		time.Sleep(time.Second * tryAgaintSleep)
@@ -156,7 +156,7 @@ func TryFunc(f func(string, string) map[string]interface{}, ent, do string, time
 }
 
 // GetPortraitCache 空筛选读缓存数据
-func GetPortraitCache(winner, doType string) map[string]interface{} {
+func GetPortraitCache(winner, doType string, userLevel int) map[string]interface{} {
 	hxObj := getInitPortraitSearch(winner, doType)
 	if rBytes, err := redis.GetBytes("other", hxObj.RedisKey); err == nil && len(*rBytes) != 0 {
 		data := map[string]interface{}{}
@@ -166,6 +166,6 @@ func GetPortraitCache(winner, doType string) map[string]interface{} {
 		}
 		log.Printf("Get%sPortraitCache %s Unmarshal [e] %v \n", doType, winner, err)
 	}
-	go Qyhx_search_prior(hxObj, 1)
+	go Qyhx_search_prior(hxObj, userLevel)
 	return nil
 }

+ 1 - 0
src/jfw/modules/bigmember/src/entity/portrait_screen.go

@@ -46,6 +46,7 @@ type PortraitScreen struct {
 	PareStartTime, PareEndTime int64 //筛选时间戳
 	ShowMatch                  string
 	KeyWordArr                 []string
+	UserLevel                  int //用户身份 3:未登录;2:免费;1:付费
 }
 
 // PortraitProjectScreen 动态翻页

+ 50 - 44
src/jfw/modules/bigmember/src/go.mod

@@ -3,9 +3,9 @@ module jy/src/jfw/modules/bigmember/src
 go 1.20
 
 require (
-	app.yhyue.com/moapp/jybase v0.0.0-20230523020646-528a068dac39
+	app.yhyue.com/moapp/jybase v0.0.0-20230614085041-f8f20842d5cb
 	app.yhyue.com/moapp/jylog v0.0.0-20230522075550-05d7230ca545
-	app.yhyue.com/moapp/jypkg v0.0.0-20230531014856-12e9a04b5c44
+	app.yhyue.com/moapp/jypkg v0.0.0-20230627060822-53aa53e4d064
 	bp.jydev.jianyu360.cn/BaseService/userCenter v1.2.13
 	github.com/donnie4w/go-logger v0.0.0-20230316073421-36a48f87a69a
 	github.com/gogf/gf/v2 v2.4.2
@@ -25,58 +25,60 @@ require (
 	github.com/cenkalti/backoff/v4 v4.2.1 // indirect
 	github.com/cespare/xxhash/v2 v2.2.0 // indirect
 	github.com/clbanning/mxj/v2 v2.5.5 // indirect
-	github.com/coreos/go-semver v0.3.0 // indirect
-	github.com/coreos/go-systemd/v22 v22.3.2 // indirect
+	github.com/coreos/go-semver v0.3.1 // indirect
+	github.com/coreos/go-systemd/v22 v22.5.0 // indirect
 	github.com/davecgh/go-spew v1.1.1 // indirect
-	github.com/dchest/captcha v0.0.0-20200903113550-03f5f0333e1f // indirect
 	github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
-	github.com/fatih/color v1.13.0 // indirect
-	github.com/felixge/fgprof v0.9.3 // indirect
+	github.com/emicklei/go-restful/v3 v3.9.0 // indirect
+	github.com/fatih/color v1.15.0 // indirect
 	github.com/fsnotify/fsnotify v1.6.0 // indirect
 	github.com/garyburd/redigo v1.6.2 // indirect
 	github.com/go-logr/logr v1.2.4 // indirect
 	github.com/go-logr/stdr v1.2.2 // indirect
+	github.com/go-openapi/jsonpointer v0.19.6 // indirect
+	github.com/go-openapi/jsonreference v0.20.1 // indirect
+	github.com/go-openapi/swag v0.22.3 // indirect
 	github.com/go-redis/redis/v8 v8.11.5 // indirect
-	github.com/go-sql-driver/mysql v1.7.0 // indirect
+	github.com/go-sql-driver/mysql v1.7.1 // indirect
 	github.com/gogo/protobuf v1.3.2 // indirect
 	github.com/golang/mock v1.6.0 // indirect
-	github.com/golang/protobuf v1.5.2 // indirect
+	github.com/golang/protobuf v1.5.3 // indirect
 	github.com/golang/snappy v0.0.4 // indirect
 	github.com/gomodule/redigo v2.0.0+incompatible // indirect
+	github.com/google/gnostic v0.5.7-v3refs // indirect
 	github.com/google/go-cmp v0.5.9 // indirect
 	github.com/google/gofuzz v1.2.0 // indirect
-	github.com/google/pprof v0.0.0-20211214055906-6f57359322fd // indirect
-	github.com/googleapis/gnostic v0.5.5 // indirect
 	github.com/gorilla/websocket v1.5.0 // indirect
 	github.com/grokify/html-strip-tags-go v0.0.1 // indirect
-	github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 // indirect
+	github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.0 // indirect
 	github.com/hashicorp/hcl v1.0.0 // indirect
 	github.com/howeyc/fsnotify v0.9.0 // indirect
 	github.com/jinzhu/inflection v1.0.0 // indirect
 	github.com/jinzhu/now v1.1.1 // indirect
 	github.com/josharian/intern v1.0.0 // indirect
 	github.com/json-iterator/go v1.1.12 // indirect
-	github.com/klauspost/compress v1.15.11 // indirect
+	github.com/klauspost/compress v1.15.15 // indirect
 	github.com/magiconair/properties v1.8.7 // indirect
 	github.com/mailru/easyjson v0.7.7 // indirect
-	github.com/mattn/go-colorable v0.1.12 // indirect
-	github.com/mattn/go-isatty v0.0.14 // indirect
+	github.com/mattn/go-colorable v0.1.13 // indirect
+	github.com/mattn/go-isatty v0.0.17 // indirect
 	github.com/mattn/go-runewidth v0.0.13 // indirect
-	github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect
+	github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
 	github.com/mitchellh/mapstructure v1.5.0 // indirect
 	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
 	github.com/modern-go/reflect2 v1.0.2 // indirect
 	github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect
+	github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
 	github.com/nsqio/go-nsq v1.1.0 // indirect
 	github.com/olekukonko/tablewriter v0.0.5 // indirect
 	github.com/olivere/elastic v6.2.37+incompatible // indirect
 	github.com/openzipkin/zipkin-go v0.4.1 // indirect
-	github.com/pelletier/go-toml/v2 v2.0.6 // indirect
+	github.com/pelletier/go-toml/v2 v2.0.8 // indirect
 	github.com/pkg/errors v0.9.1 // indirect
-	github.com/prometheus/client_golang v1.13.0 // indirect
-	github.com/prometheus/client_model v0.2.0 // indirect
-	github.com/prometheus/common v0.37.0 // indirect
-	github.com/prometheus/procfs v0.8.0 // indirect
+	github.com/prometheus/client_golang v1.15.1 // indirect
+	github.com/prometheus/client_model v0.3.0 // indirect
+	github.com/prometheus/common v0.42.0 // indirect
+	github.com/prometheus/procfs v0.9.0 // indirect
 	github.com/rivo/uniseg v0.2.0 // indirect
 	github.com/sirupsen/logrus v1.8.3 // indirect
 	github.com/spaolacci/murmur3 v1.1.0 // indirect
@@ -92,36 +94,37 @@ require (
 	github.com/xdg-go/scram v1.1.1 // indirect
 	github.com/xdg-go/stringprep v1.0.3 // indirect
 	github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect
-	github.com/zeromicro/go-zero v1.4.4 // indirect
+	github.com/zeromicro/go-zero v1.5.3 // indirect
 	github.com/ziutek/blas v0.0.0-20190227122918-da4ca23e90bb // indirect
-	go.etcd.io/etcd/api/v3 v3.5.6 // indirect
-	go.etcd.io/etcd/client/pkg/v3 v3.5.6 // indirect
-	go.etcd.io/etcd/client/v3 v3.5.6 // indirect
+	go.etcd.io/etcd/api/v3 v3.5.9 // indirect
+	go.etcd.io/etcd/client/pkg/v3 v3.5.9 // indirect
+	go.etcd.io/etcd/client/v3 v3.5.9 // indirect
 	go.opentelemetry.io/otel v1.15.1 // indirect
 	go.opentelemetry.io/otel/exporters/jaeger v1.15.1 // indirect
 	go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.15.1 // indirect
 	go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.15.1 // indirect
 	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.15.1 // indirect
 	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.15.1 // indirect
+	go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.14.0 // indirect
 	go.opentelemetry.io/otel/exporters/zipkin v1.15.1 // indirect
 	go.opentelemetry.io/otel/sdk v1.15.1 // indirect
 	go.opentelemetry.io/otel/trace v1.15.1 // indirect
 	go.opentelemetry.io/proto/otlp v0.19.0 // indirect
-	go.uber.org/atomic v1.9.0 // indirect
-	go.uber.org/automaxprocs v1.5.1 // indirect
-	go.uber.org/multierr v1.8.0 // indirect
-	go.uber.org/zap v1.21.0 // indirect
-	golang.org/x/crypto v0.0.0-20221010152910-d6f0a8c073c2 // indirect
-	golang.org/x/net v0.8.0 // indirect
-	golang.org/x/oauth2 v0.4.0 // indirect
+	go.uber.org/atomic v1.10.0 // indirect
+	go.uber.org/automaxprocs v1.5.2 // indirect
+	go.uber.org/multierr v1.9.0 // indirect
+	go.uber.org/zap v1.24.0 // indirect
+	golang.org/x/crypto v0.6.0 // indirect
+	golang.org/x/net v0.10.0 // indirect
+	golang.org/x/oauth2 v0.7.0 // indirect
 	golang.org/x/sync v0.1.0 // indirect
-	golang.org/x/sys v0.7.0 // indirect
-	golang.org/x/term v0.6.0 // indirect
-	golang.org/x/text v0.8.0 // indirect
+	golang.org/x/sys v0.8.0 // indirect
+	golang.org/x/term v0.8.0 // indirect
+	golang.org/x/text v0.9.0 // indirect
 	golang.org/x/time v0.3.0 // indirect
 	google.golang.org/appengine v1.6.7 // indirect
-	google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f // indirect
-	google.golang.org/grpc v1.54.0 // indirect
+	google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect
+	google.golang.org/grpc v1.56.1 // indirect
 	google.golang.org/protobuf v1.30.0 // indirect
 	gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
 	gopkg.in/inf.v0 v0.9.1 // indirect
@@ -131,11 +134,14 @@ require (
 	gopkg.in/yaml.v3 v3.0.1 // indirect
 	gorm.io/driver/mysql v1.0.5 // indirect
 	gorm.io/gorm v1.21.3 // indirect
-	k8s.io/api v0.22.9 // indirect
-	k8s.io/apimachinery v0.22.9 // indirect
-	k8s.io/client-go v0.22.9 // indirect
-	k8s.io/klog/v2 v2.80.1 // indirect
-	k8s.io/utils v0.0.0-20221108210102-8e77b1f39fe2 // indirect
-	sigs.k8s.io/structured-merge-diff/v4 v4.2.1 // indirect
-	sigs.k8s.io/yaml v1.2.0 // indirect
+	jygit.jydev.jianyu360.cn/ApplicationCenter/publicService v0.0.0-20230626055559-2b719f6c6602 // indirect
+	k8s.io/api v0.26.3 // indirect
+	k8s.io/apimachinery v0.27.0-alpha.3 // indirect
+	k8s.io/client-go v0.26.3 // indirect
+	k8s.io/klog/v2 v2.90.1 // indirect
+	k8s.io/kube-openapi v0.0.0-20230307230338-69ee2d25a840 // indirect
+	k8s.io/utils v0.0.0-20230209194617-a36077c30491 // indirect
+	sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
+	sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect
+	sigs.k8s.io/yaml v1.3.0 // indirect
 )

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 79 - 472
src/jfw/modules/bigmember/src/go.sum


+ 77 - 41
src/jfw/modules/bigmember/src/service/analysis/analysis.go

@@ -19,23 +19,25 @@ import (
 
 type Analysis struct {
 	*xweb.Action
-	pName           xweb.Mapper `xweb:"/analysis/projectName"`     //根据项目名称关键词连带项目名称
-	pInfo           xweb.Mapper `xweb:"/analysis/projectInfo"`     //根据项目名称获取项目信息
-	csORRsList      xweb.Mapper `xweb:"/potential/corList"`        //潜在客户customers or 潜在竞争对手rivals
-	rMyRivals       xweb.Mapper `xweb:"/potential/rMyRivals"`      //移除我的潜在竞争对手rivals
-	decInfo         xweb.Mapper `xweb:"/decision/decInfo"`         //投标决策分析
-	trialInfo       xweb.Mapper `xweb:"/decision/trialInfo"`       //投标决策分析-使用用户 剩余次数
-	forPList        xweb.Mapper `xweb:"/forecast/forPList"`        //新项目预测结果list
-	forPContent     xweb.Mapper `xweb:"/forecast/forPContent"`     //新项目预测结果详情
-	fWData          xweb.Mapper `xweb:"/forecast/forWData"`        //中标预测分析
-	fWStatus        xweb.Mapper `xweb:"/forecast/forWStatus"`      //查看中标预测状态
-	fWResult        xweb.Mapper `xweb:"/forecast/forWResult"`      //中标预测结果
-	fWOvertime      xweb.Mapper `xweb:"/forecast/forWOvertime"`    //中标预测超时处理
-	bdInfoStatus    xweb.Mapper `xweb:"/forecast/bdInfoStatus"`    //中标预测-项目是否已完成招标
-	freeDecInfo     xweb.Mapper `xweb:"/decision/freeDecInfo"`     //投标决策分析-免费用户
-	potIndex        xweb.Mapper `xweb:"/potential/index"`          //潜在客户customers or 潜在竞争对手rivals 首页接口
-	projectInfoByBW xweb.Mapper `xweb:"/decision/projectInfoByBW"` //投标决策分析-采购单位和中标企业 其他项目明细/类似项目明细
-
+	pName            xweb.Mapper `xweb:"/analysis/projectName"`      //根据项目名称关键词连带项目名称
+	pInfo            xweb.Mapper `xweb:"/analysis/projectInfo"`      //根据项目名称获取项目信息
+	csORRsList       xweb.Mapper `xweb:"/potential/corList"`         //潜在客户customers or 潜在竞争对手rivals
+	rMyRivals        xweb.Mapper `xweb:"/potential/rMyRivals"`       //移除我的潜在竞争对手rivals
+	decInfo          xweb.Mapper `xweb:"/decision/decInfo"`          //投标决策分析
+	trialInfo        xweb.Mapper `xweb:"/decision/trialInfo"`        //投标决策分析-使用用户 剩余次数
+	forPList         xweb.Mapper `xweb:"/forecast/forPList"`         //新项目预测结果list
+	forPContent      xweb.Mapper `xweb:"/forecast/forPContent"`      //新项目预测结果详情
+	fWData           xweb.Mapper `xweb:"/forecast/forWData"`         //中标预测分析
+	fWStatus         xweb.Mapper `xweb:"/forecast/forWStatus"`       //查看中标预测状态
+	fWResult         xweb.Mapper `xweb:"/forecast/forWResult"`       //中标预测结果
+	fWOvertime       xweb.Mapper `xweb:"/forecast/forWOvertime"`     //中标预测超时处理
+	bdInfoStatus     xweb.Mapper `xweb:"/forecast/bdInfoStatus"`     //中标预测-项目是否已完成招标
+	freeDecInfo      xweb.Mapper `xweb:"/decision/freeDecInfo"`      //投标决策分析-免费用户
+	potIndex         xweb.Mapper `xweb:"/potential/index"`           //潜在客户customers or 潜在竞争对手rivals 首页接口
+	projectInfoByBW  xweb.Mapper `xweb:"/decision/projectInfoByBW"`  //投标决策分析-采购单位和中标企业 其他项目明细/类似项目明细
+	decReviewExperts xweb.Mapper `xweb:"/decision/decReviewExperts"` //投标决策分析-评标专家
+	getREProjects    xweb.Mapper `xweb:"/decision/getREProjects"`    //投标决策分析-评标专家de项目
+	hotWinnerTop     xweb.Mapper `xweb:"/decision/hotWinnerTop"`     //投标决策分析-同类热点中标企业top10
 }
 
 const (
@@ -104,16 +106,17 @@ func (this *Analysis) PInfo() {
 				buyerperson := qutil.ObjToString(ptdata["buyerperson"])         //采购联系人
 				buyertel := qutil.ObjToString(ptdata["buyertel"])               //采购联系方式
 				if this.GetString("D") == "" {
-					var keyArr = []map[string]interface{}{}
-					var a_key = []map[string]interface{}{}
+					var keyArr []map[string]interface{}
+					var a_key []map[string]interface{}
+
 					//查库获得大会员用户的信息
-					o_mb, ok := &map[string]interface{}{}, false
+					o_mb := &map[string]interface{}{}
 					o_mb = Compatible.Select(userId, `{"o_member_jy":1,"s_member_mainid":1,"i_member_sub_status":1}`)
 					if o_mb != nil && (*o_mb) != nil && (*o_mb)["s_member_mainid"] != nil && qutil.IntAllDef((*o_mb)["i_member_sub_status"], 0) == 1 { //如果是子账号 查询主账号信息
 						mainId := qutil.ObjToString((*o_mb)["s_member_mainid"])
 						o_mb = Compatible.Select(mainId, `{"o_member_jy":1}`)
 					}
-					if ok && o_mb != nil && (*o_mb) != nil && (*o_mb)["o_member_jy"] != nil {
+					if o_mb != nil && (*o_mb)["o_member_jy"] != nil {
 						o_member_jy := qutil.ObjToMap((*o_mb)["o_member_jy"])
 						if (*o_member_jy)["a_items"] != nil {
 							a_items := qutil.ObjArrToMapArr((*o_member_jy)["a_items"].([]interface{}))
@@ -136,12 +139,10 @@ func (this *Analysis) PInfo() {
 					}
 					if len(keyArr) == 0 {
 						if purchasing != "" {
-							if len(strings.Split(purchasing, ",")) > 0 {
-								for _, v := range strings.Split(purchasing, ",") {
-									keyArr = append(keyArr, map[string]interface{}{
-										"key": []string{v},
-									})
-								}
+							for _, v := range strings.Split(purchasing, ",") {
+								keyArr = append(keyArr, map[string]interface{}{
+									"key": []string{v},
+								})
 							}
 						}
 					}
@@ -173,6 +174,23 @@ func (this *Analysis) PInfo() {
 						}
 					}
 				} else {
+					var keyArr []ViewKeyWord
+					if purchasing != "" {
+						key := strings.Split(purchasing, ",")
+						if len(key) > 0 {
+							//最多取10个
+							if len(key) > 10 {
+								key = key[:10]
+							}
+							for _, v := range key {
+								keyArr = append(keyArr, ViewKeyWord{
+									Keyword:  []string{v},
+									MatchWay: 1,
+								})
+							}
+						}
+					}
+					ArrPS["buyerContent"] = keyArr
 					if s_subscopeclass != "" {
 						ArrPS["s_subscopeclass"] = s_subscopeclass
 					} else {
@@ -236,6 +254,7 @@ func (this *Analysis) PName() {
 	}
 	if this.Method() == METHOD {
 		var pName = this.GetString("pName")
+		var sType = this.GetString("sType")
 		limit := Config.RdProLimit //匹配项目数量
 		if limit == 0 {
 			limit = 10
@@ -243,25 +262,42 @@ func (this *Analysis) PName() {
 		if pName != "" {
 			if len([]rune(pName)) > 2 {
 				pName = strings.ReplaceAll(pName, "\"", "")
-				data := entity.GetProNameImmediate(pName, limit)
+				data := entity.GetProNameImmediate(sType, pName, limit)
 				ArrPS := []map[string]interface{}{}
 				if data != nil && len(data) > 0 {
 					var pjtMap = map[string]bool{}
-					for _, v := range data {
-						r_data := qutil.ObjToMap(v)
-						//过滤重复名称的项目
-						if pjtMap[(*r_data)["projectname"].(string)] {
-							continue
+					var buyerMap = map[string]bool{}
+					for _, r_data := range data {
+						//过滤重复名称
+						buyer := qutil.InterfaceToStr(r_data["buyer"])
+						projectname, _ := r_data["projectname"].(string)
+						if sType == "1" {
+							if buyer == "" || buyerMap[buyer] {
+								continue
+							}
+						} else {
+							if projectname == "" || pjtMap[projectname] {
+								continue
+							}
 						}
-						if (*r_data)["firsttime"] != nil {
-							firsttime := (*r_data)["firsttime"]
-							(*r_data)["firsttime"] = FormatDateWithObj(&firsttime, Date_Short_Layout)
+
+						if r_data["firsttime"] != nil {
+							firsttime := r_data["firsttime"]
+							r_data["firsttime"] = FormatDateWithObj(&firsttime, Date_Short_Layout)
+						}
+						if r_data["_id"] != nil {
+							r_data["s_id"] = util.EncodeId(r_data["_id"].(string))
+							delete(r_data, "_id")
+						}
+						if r_data["sourceinfoid"] != nil {
+							r_data["sourceinfoid"] = util.EncodeId(r_data["sourceinfoid"].(string))
+						}
+						if sType == "1" {
+							buyerMap[buyer] = true
+						} else {
+							pjtMap[projectname] = true
 						}
-						(*r_data)["s_id"] = util.EncodeId((*r_data)["_id"].(string))
-						(*r_data)["sourceinfoid"] = util.EncodeId((*r_data)["sourceinfoid"].(string))
-						delete(v, "_id")
-						pjtMap[(*r_data)["projectname"].(string)] = true
-						ArrPS = append(ArrPS, v)
+						ArrPS = append(ArrPS, r_data)
 					}
 				}
 				regMap.Data = ArrPS

+ 967 - 793
src/jfw/modules/bigmember/src/service/analysis/decision.go

@@ -2,45 +2,60 @@
 package analysis
 
 import (
-	"encoding/json"
-	"fmt"
-	"jy/src/jfw/modules/bigmember/src/config"
-	"jy/src/jfw/modules/bigmember/src/entity"
-	"jy/src/jfw/modules/bigmember/src/util"
-	"log"
-	"sort"
-	"strconv"
-	"strings"
-	"sync"
-	"time"
+    elastic "app.yhyue.com/moapp/jybase/es"
+    "encoding/json"
+    "fmt"
+    "jy/src/jfw/modules/bigmember/src/config"
+    "jy/src/jfw/modules/bigmember/src/entity"
+    "jy/src/jfw/modules/bigmember/src/util"
+    "log"
+    "strconv"
+    "sync"
+    "time"
 
-	. "app.yhyue.com/moapp/jybase/api"
-	qutil "app.yhyue.com/moapp/jybase/common"
-	. "app.yhyue.com/moapp/jybase/date"
-	"app.yhyue.com/moapp/jypkg/common/src/qfw/util/jy"
+    . "app.yhyue.com/moapp/jybase/api"
+    qutil "app.yhyue.com/moapp/jybase/common"
+    "app.yhyue.com/moapp/jypkg/common/src/qfw/util/jy"
 )
 
 type DecParam struct {
-	Area         map[string]interface{} //地区
-	BuyerContent []ViewKeyWord          //采购内容
-	BuyerClass   []string               //采购单位行业
-	Sid          string                 //项目招标信息id
-	Pname        string                 //项目名称
-	Industry     string                 //招标行业
-	MinPrice     int                    //最小价格
-	MaxPrice     int                    //最大价格
-	Buyer        string                 //采购单位
-	ServiceId    int                    //大会员服务id
-	MobileModel  string                 //手机型号
-	AppVersion   string                 //app版本号
+    SearchItem    int
+    Area          map[string]interface{} //地区
+    BuyerContent  []ViewKeyWord          //采购内容
+    BuyerClass    []string               //采购单位行业
+    Sid           string                 //项目招标信息id
+    Pname         string                 //项目名称
+    Industry      string                 //招标行业
+    MinPrice      int                    //最小价格
+    MaxPrice      int                    //最大价格
+    Buyer         string                 //采购单位
+    ServiceId     int                    //大会员服务id
+    MobileModel   string                 //手机型号
+    AppVersion    string                 //app版本号
+    LimitTime     string                 //检索日期
+    ProjectScope  int                    //0 同类项目(默认搜索) 1 全部项目
+    HotWinnerType int                    // 热门中标企业top10 排序 0 默认金额排序 1:数量
 }
 
 /*已选条件--关键词*/
 type ViewKeyWord struct {
-	Keyword  []string `json:"key"`       //关键词
-	Appended []string `json:"appendkey"` //附加词
-	Exclude  []string `json:"notkey"`    //排除词
-	MatchWay int      `json:"matchway"`  //匹配模式
+    Keyword  []string `json:"key"`       //关键词
+    Appended []string `json:"appendkey"` //附加词
+    Exclude  []string `json:"notkey"`    //排除词
+    MatchWay int      `json:"matchway"`  //匹配模式
+}
+
+type GetProParam struct {
+    ExpertName   string //专家名字
+    LimitTime    string //检索日期
+    ProjectScope int    //0 同类项目(默认搜索) 1 全部项目
+    SearchItem   int
+    Area         map[string]interface{} //地区
+    Buyer        string                 //采购单位
+    ServiceId    int                    //大会员服务id
+    BuyerContent []ViewKeyWord          //采购内容
+    Page         int
+    PageSize     int
 }
 
 // 投标决策分析id
@@ -48,787 +63,946 @@ var ServiceId = 6
 
 // 采购单位和中标企业 其他项目明细/类似项目明细
 func (this *Analysis) ProjectInfoByBW() {
-	defer qutil.Catch()
-	r := func() Result {
-		if this.Method() != "POST" {
-			return Result{Data: nil, Error_msg: Error_msg_1005}
-		}
-		if string(this.Body()) == "" {
-			return Result{Data: nil, Error_msg: Error_msg_1003}
-		}
-		EAD := entity.AnalysisDec{}
-		//接收参数
-		json.Unmarshal(this.Body(), &EAD)
-		if EAD.Sid == "" || EAD.Pname == "" || len(EAD.BuyerContent) == 0 {
-			return Result{Data: nil, Error_msg: Error_msg_1003}
-		}
-		//是否是大会员用户
-		if EAD.UserId, EAD.IsPower = entity.CheckPower(this.Session()); !EAD.IsPower {
-			return Result{Data: nil, Error_msg: Error_msg_1004}
-		}
-		EAD.ServiceId = ServiceId
-		EAD.UserLock = *entity.ThisLock(EAD.UserId)
-		return Result{Data: EAD.GetProjectInfoByBW()}
-	}()
-	this.ServeJson(r)
+    defer qutil.Catch()
+    r := func() Result {
+        if this.Method() != "POST" {
+            return Result{Data: nil, Error_msg: Error_msg_1005}
+        }
+        if string(this.Body()) == "" {
+            return Result{Data: nil, Error_msg: Error_msg_1003}
+        }
+        EAD := entity.AnalysisDec{}
+        //接收参数
+        json.Unmarshal(this.Body(), &EAD)
+        if len(EAD.BuyerContent) == 0 {
+            return Result{Data: nil, Error_msg: Error_msg_1003}
+        }
+        //是否是大会员用户
+        if EAD.UserId, EAD.IsPower = entity.CheckPower(this.Session()); !EAD.IsPower {
+            return Result{Data: nil, Error_msg: Error_msg_1004}
+        }
+        EAD.ServiceId = ServiceId
+        //EAD.UserLock = *entity.ThisLock(EAD.UserId)
+
+        count, res := EAD.GetProjectInfoByBW()
+        return Result{Data: map[string]interface{}{"count": count, "res": res}}
+    }()
+    this.ServeJson(r)
 }
 
 // 试用用户分析
 func (this *Analysis) TrialInfo() {
-	defer qutil.Catch()
-	userId, _ := this.GetSession("userId").(string)
-	rData, errMsg := func() (interface{}, error) {
-		baseMsg := jy.GetBigVipUserBaseMsg(this.Session(), *config.Middleground)
-		if baseMsg == nil {
-			return -2, nil
-		}
-		//试用用户
-		var isTrialBool = false
-		if baseMsg.Status == 4 {
-			isTrialBool = true
-		}
-		//非试用用户 不做统计
-		if !isTrialBool {
-			return 1, nil
-		}
-		//是否是已预测过得项目
-		pname := this.GetString("pname")
-		sid := this.GetString("sid")
-		serviceId, _ := this.GetInteger("serviceid")
-		if pname == "" || sid == "" {
-			return -2, nil
-		}
-		if serviceId == 0 {
-			serviceId = 6
-		}
-		ai, _, decision_count := AnalysisPower("P", userId, pname, sid, serviceId)
-		if ai == 1 {
-			return 1, nil
-		}
-		if decision_count >= 0 {
-			return decision_count, nil
-		}
-		return 0, nil
-	}()
-	if errMsg != nil {
-		log.Printf("%s 获取此用户试用信息出错-%s", userId, errMsg)
-	}
-	this.ServeJson(NewResult(rData, errMsg))
+    defer qutil.Catch()
+    userId, _ := this.GetSession("userId").(string)
+    rData, errMsg := func() (interface{}, error) {
+        baseMsg := jy.GetBigVipUserBaseMsg(this.Session(), *config.Middleground)
+        if baseMsg == nil {
+            return -2, nil
+        }
+        //试用用户
+        var isTrialBool = false
+        if baseMsg.Status == 4 {
+            isTrialBool = true
+        }
+        //非试用用户 不做统计
+        if !isTrialBool {
+            return 1, nil
+        }
+        //是否是已预测过得项目
+        pname := this.GetString("pname")
+        sid := this.GetString("sid")
+        serviceId, _ := this.GetInteger("serviceid")
+        if pname == "" || sid == "" {
+            return -2, nil
+        }
+        if serviceId == 0 {
+            serviceId = 6
+        }
+        ai, _, decision_count := AnalysisPower("P", userId, pname, sid, serviceId)
+        if ai == 1 {
+            return 1, nil
+        }
+        if decision_count >= 0 {
+            return decision_count, nil
+        }
+        return 0, nil
+    }()
+    if errMsg != nil {
+        log.Printf("%s 获取此用户试用信息出错-%s", userId, errMsg)
+    }
+    this.ServeJson(NewResult(rData, errMsg))
 }
 
 // 决策分析内容-普通用户
 func (this *Analysis) FreeDecInfo() {
-	defer qutil.Catch()
-	var regMap = Result{
-		Data:       []map[string]interface{}{},
-		Error_code: Error_code,
-		Error_msg:  "",
-	}
-	if this.Method() == METHOD {
-		//接受前端参数
-		getRes := new(DecParam)
-		if string(this.Body()) != "" {
-			//接收参数
-			json.Unmarshal(this.Body(), &getRes)
-		}
-		if getRes.Sid != "" && getRes.Pname != "" && len(getRes.BuyerContent) > 0 {
-			userId, _ := this.GetSession("userId").(string)
-			bigMsg := jy.GetBigVipUserBaseMsg(this.Session(), *config.Middleground)
-			mainUserid, phone := qutil.If(bigMsg.Data.Member.Pid != "", bigMsg.Data.Member.Pid, userId).(string), bigMsg.Data.Free.Phone
-			entity.UIL.Lock()
-			if entity.UIL.DecLock[mainUserid] == nil {
-				entity.UIL.DecLock[mainUserid] = &sync.Mutex{}
-			}
-			entity.UIL.Unlock()
-			entity.UIL.DecLock[mainUserid].Lock()
-			defer entity.UIL.DecLock[mainUserid].Unlock()
-			if getRes.ServiceId == 0 {
-				getRes.ServiceId = 6
-			}
-			//采购单位的采购类型
-			buyer_buyerClass := ""
-			if getRes.Buyer != "" {
-				buyerData := entity.GetEntPC(strings.Split(getRes.Buyer, ","))
-				if buyerData != nil && len(buyerData) > 0 {
-					buyer_one := *qutil.ObjToMap(buyerData[0])
-					if buyer_one["buyerclass"] != nil {
-						buyer_buyerClass = buyer_one["buyerclass"].(string)
-					}
-				}
-			}
-			getRes.BuyerContent = BuyerContentStruct(getRes.BuyerContent)
-			decQuery := DecQueryFree(getRes.Area, getRes.BuyerClass, getRes.BuyerContent, getRes.Industry, getRes.Buyer, buyer_buyerClass, getRes.MinPrice, getRes.MaxPrice)
-			regMap.Data = getDecInfoFree(decQuery, buyer_buyerClass, getRes)
-			//投标决策分析历史记录
-			go SaveDecHistortList(getRes, userId, mainUserid, phone, "", 0, this.Request, "free")
-		} else {
-			regMap.Error_code = Error_code_1002
-			regMap.Error_msg = Error_msg_1002
-		}
-	} else {
-		regMap.Error_code = Error_code_1005
-		regMap.Error_msg = Error_msg_1005
-	}
-	this.ServeJson(regMap)
+    defer qutil.Catch()
+    var regMap = Result{
+        Data:       []map[string]interface{}{},
+        Error_code: Error_code,
+        Error_msg:  "",
+    }
+    if this.Method() == METHOD {
+        //接受前端参数
+        getRes := new(DecParam)
+        if string(this.Body()) != "" {
+            //接收参数
+            json.Unmarshal(this.Body(), &getRes)
+        }
+
+        if getRes.Area != nil && getRes.Buyer != "" && len(getRes.BuyerContent) > 0 {
+            userId, _ := this.GetSession("userId").(string)
+            bigMsg := jy.GetBigVipUserBaseMsg(this.Session(), *config.Middleground)
+            mainUserid, phone := qutil.If(bigMsg.Data.Member.Pid != "", bigMsg.Data.Member.Pid, userId).(string), bigMsg.Data.Free.Phone
+            entity.UIL.Lock()
+            if entity.UIL.DecLock[mainUserid] == nil {
+                entity.UIL.DecLock[mainUserid] = &sync.Mutex{}
+            }
+            entity.UIL.Unlock()
+            entity.UIL.DecLock[mainUserid].Lock()
+            defer entity.UIL.DecLock[mainUserid].Unlock()
+            if getRes.ServiceId == 0 {
+                getRes.ServiceId = 6
+            }
+            //采购单位的采购类型
+            buyer_buyerClass := ""
+            getRes.BuyerContent = BuyerContentStruct(getRes.BuyerContent)
+            decQuery := DecQueryFree(getRes.Area, getRes.BuyerContent, getRes.LimitTime, getRes.Buyer, getRes.SearchItem)
+            regMap.Data = getDecInfoFree(decQuery, buyer_buyerClass, getRes)
+            //投标决策分析历史记录
+            go SaveDecHistortList(getRes, userId, mainUserid, phone, "", 0, this.Request, "free")
+        } else {
+            regMap.Error_code = Error_code_1002
+            regMap.Error_msg = Error_msg_1002
+        }
+    } else {
+        regMap.Error_code = Error_code_1005
+        regMap.Error_msg = Error_msg_1005
+    }
+    this.ServeJson(regMap)
 }
 
 // 决策分析内容
 func (this *Analysis) DecInfo() {
-	defer qutil.Catch()
-	var regMap = Result{
-		Data:       []map[string]interface{}{},
-		Error_code: Error_code,
-		Error_msg:  "",
-	}
-	if this.Method() == METHOD {
-		//接受前端参数
-		getRes := new(DecParam)
-		if string(this.Body()) != "" {
-			//接收参数
-			json.Unmarshal(this.Body(), &getRes)
-		}
-		if getRes.Sid != "" && getRes.Pname != "" && len(getRes.BuyerContent) > 0 {
-			var decCount = 0   //功能剩余次数
-			var base64Key = "" //加密串
-			userId, _ := this.GetSession("userId").(string)
-			//是否是子账号
-			//main_userId, phone, member_status := util.MainUserId(this.Session())
-			bigMsg := jy.GetBigVipUserBaseMsg(this.Session(), *config.Middleground)
-			mainUserid, phone := qutil.If(bigMsg.Data.Member.Pid != "", bigMsg.Data.Member.Pid, userId).(string), bigMsg.Data.Free.Phone
-			isAble := false
-			if len(bigMsg.Data.Member.MemberPowerList) > 0 {
-				for _, v := range bigMsg.Data.Member.MemberPowerList {
-					if v == 6 {
-						isAble = true
-					}
-				}
-			}
-			if !isAble {
-				regMap.Error_code = Error_code_1004
-				regMap.Error_msg = Error_msg_1004
-			} else {
-				entity.UIL.Lock()
-				if entity.UIL.DecLock[mainUserid] == nil {
-					entity.UIL.DecLock[mainUserid] = &sync.Mutex{}
-				}
-				entity.UIL.Unlock()
-				entity.UIL.DecLock[mainUserid].Lock()
-				defer entity.UIL.DecLock[mainUserid].Unlock()
-				if getRes.ServiceId == 0 {
-					getRes.ServiceId = 6
-				}
-				// getRes.Buyer = "北京市交通委员会密云公路分局"
-				//采购单位的采购类型
-				buyer_buyerClass := ""
-				if getRes.Buyer != "" {
-					buyerData := entity.GetEntPC(strings.Split(getRes.Buyer, ","))
-					if buyerData != nil && len(buyerData) > 0 {
-						buyer_one := *qutil.ObjToMap(buyerData[0])
-						if buyer_one["buyerclass"] != nil {
-							buyer_buyerClass = buyer_one["buyerclass"].(string)
-						}
-					}
-				}
-				getRes.BuyerContent = BuyerContentStruct(getRes.BuyerContent)
-				decQuery := DecQuery(getRes.Area, getRes.BuyerClass, getRes.BuyerContent, getRes.Industry, getRes.Buyer, buyer_buyerClass, getRes.MinPrice, getRes.MaxPrice)
-				regMap.Data = getDecInfo(decQuery, buyer_buyerClass, getRes)
-				//投标决策分析历史记录
-				go SaveDecHistortList(getRes, userId, mainUserid, phone, base64Key, decCount, this.Request, "pay")
-			}
-		} else {
-			regMap.Error_code = Error_code_1002
-			regMap.Error_msg = Error_msg_1002
-		}
-	} else {
-		regMap.Error_code = Error_code_1005
-		regMap.Error_msg = Error_msg_1005
-	}
-	this.ServeJson(regMap)
+    defer qutil.Catch()
+    var regMap = Result{
+        Data:       []map[string]interface{}{},
+        Error_code: Error_code,
+        Error_msg:  "",
+    }
+    if this.Method() == METHOD {
+        //接受前端参数
+        getRes := new(DecParam)
+        if string(this.Body()) != "" {
+            //接收参数
+            json.Unmarshal(this.Body(), &getRes)
+        }
+
+        if getRes.Area != nil && getRes.Buyer != "" && len(getRes.BuyerContent) > 0 {
+            var decCount = 0   //功能剩余次数
+            var base64Key = "" //加密串
+            userId, _ := this.GetSession("userId").(string)
+            //是否是子账号
+            //main_userId, phone, member_status := util.MainUserId(this.Session())
+            bigMsg := jy.GetBigVipUserBaseMsg(this.Session(), *config.Middleground)
+            mainUserid, phone := qutil.If(bigMsg.Data.Member.Pid != "", bigMsg.Data.Member.Pid, userId).(string), bigMsg.Data.Free.Phone
+            isAble := false
+            if len(bigMsg.Data.Member.MemberPowerList) > 0 {
+                for _, v := range bigMsg.Data.Member.MemberPowerList {
+                    if v == 6 {
+                        isAble = true
+                    }
+                }
+            }
+            if !isAble {
+                regMap.Error_code = Error_code_1004
+                regMap.Error_msg = Error_msg_1004
+            } else {
+                entity.UIL.Lock()
+                if entity.UIL.DecLock[mainUserid] == nil {
+                    entity.UIL.DecLock[mainUserid] = &sync.Mutex{}
+                }
+                entity.UIL.Unlock()
+                entity.UIL.DecLock[mainUserid].Lock()
+                defer entity.UIL.DecLock[mainUserid].Unlock()
+                if getRes.ServiceId == 0 {
+                    getRes.ServiceId = 6
+                }
+                var buyer_buyerClass string
+                //采购单位的采购类型
+                /*
+                   if getRes.Buyer != "" {
+                   	buyerData := entity.GetEntBlur(strings.Split(getRes.Buyer, ","))
+                   	if buyerData != nil && len(buyerData) > 0 {
+                   		buyer_one := *qutil.ObjToMap(buyerData[0])
+                   		if buyer_one["buyerclass"] != nil {
+                   			buyer_buyerClass = buyer_one["buyerclass"].(string)
+                   		}
+                   	}
+                   }*/
+                getRes.BuyerContent = BuyerContentStruct(getRes.BuyerContent)
+                //各维度项目数量
+                all_count, area_count, buyer_count := AnalyzeNumber(getRes.Area, getRes.BuyerContent, getRes.Buyer, getRes.LimitTime)
+                var isAnalyze bool
+                if all_count == 0 || (getRes.SearchItem == 1 && buyer_count == 0) ||
+                    (getRes.SearchItem == 2 && area_count == 0) {
+                    isAnalyze = true
+                }
+                if isAnalyze {
+                    regMap.Data = map[string]interface{}{
+                        "PAnalysis":  nil,
+                        "PCount":     all_count,
+                        "AreaCount":  area_count,
+                        "BuyerCount": buyer_count,
+                    }
+                    this.ServeJson(regMap)
+                    return
+                }
+
+                var rMap = sync.Map{}
+                sy := sync.WaitGroup{}
+                for _, v := range []int{1, 2, 3} {
+                    sy.Add(1)
+                    go func(stype int) {
+                        defer sy.Done()
+                        decQuery := DecQuery(getRes.Area, getRes.BuyerContent, getRes.Buyer, getRes.LimitTime, getRes.SearchItem, stype)
+                        aggsArr := getDecInfo(decQuery, buyer_buyerClass, getRes, stype)
+                        for k, v1 := range aggsArr {
+                            rMap.Store(k, v1)
+                        }
+                    }(v)
+                }
+                sy.Wait()
+                rMaps := make(map[string]interface{})
+                rMap.Range(func(key, value interface{}) bool {
+                    rMaps[qutil.InterfaceToStr(key)] = value
+                    return true
+                })
+                regMap.Data = map[string]interface{}{
+                    "PAnalysis":  rMaps,
+                    "PCount":     all_count,
+                    "AreaCount":  area_count,
+                    "BuyerCount": buyer_count,
+                }
+                //投标决策分析历史记录
+                go SaveDecHistortList(getRes, userId, mainUserid, phone, base64Key, decCount, this.Request, "pay")
+            }
+        } else {
+            regMap.Error_code = Error_code_1002
+            regMap.Error_msg = Error_msg_1002
+        }
+    } else {
+        regMap.Error_code = Error_code_1005
+        regMap.Error_msg = Error_msg_1005
+    }
+    this.ServeJson(regMap)
+}
+
+func (this *Analysis) HotWinnerTop() {
+    defer qutil.Catch()
+    var regMap = Result{
+        Data:       []map[string]interface{}{},
+        Error_code: Error_code,
+        Error_msg:  "",
+    }
+    if this.Method() == METHOD {
+        //接受前端参数
+        getRes := new(DecParam)
+        if string(this.Body()) != "" {
+            //接收参数
+            json.Unmarshal(this.Body(), &getRes)
+        }
+
+        if getRes.Area != nil && getRes.Buyer != "" && len(getRes.BuyerContent) > 0 {
+            //是否是子账号
+            //main_userId, phone, member_status := util.MainUserId(this.Session())
+            bigMsg := jy.GetBigVipUserBaseMsg(this.Session(), *config.Middleground)
+            isAble := false
+            if len(bigMsg.Data.Member.MemberPowerList) > 0 {
+                for _, v := range bigMsg.Data.Member.MemberPowerList {
+                    if v == 6 {
+                        isAble = true
+                    }
+                }
+            }
+            if !isAble {
+                regMap.Error_code = Error_code_1004
+                regMap.Error_msg = Error_msg_1004
+            } else {
+                if getRes.ServiceId == 0 {
+                    getRes.ServiceId = 6
+                }
+                //采购单位的采购类型
+                buyer_buyerClass := ""
+                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()
+                    for _, v := range winnerAmount {
+                        if v1, ok := rMap.Load(v.Key); ok {
+                            v.Doc_count = qutil.Float64All(v1)
+                        }
+                    }
+                    sortkey := "doc_count" //默认金额
+                    if getRes.HotWinnerType == 0 {
+                        sortkey = "total_project"
+                    }
+                    util.SortData(&winnerAmount, sortkey, true) //排序
+                    aggsArr["winnerAmount"] = winnerAmount
+                }
+
+                regMap.Data = map[string]interface{}{
+                    "PAnalysis": aggsArr,
+                }
+            }
+        } else {
+            regMap.Error_code = Error_code_1002
+            regMap.Error_msg = Error_msg_1002
+        }
+    } else {
+        regMap.Error_code = Error_code_1005
+        regMap.Error_msg = Error_msg_1005
+    }
+    this.ServeJson(regMap)
+}
+
+// 决策分析内容-评标专家top十
+func (this *Analysis) DecReviewExperts() {
+    defer qutil.Catch()
+    var regMap = Result{
+        Data:       []map[string]interface{}{},
+        Error_code: Error_code,
+        Error_msg:  "",
+    }
+    if this.Method() == METHOD {
+        //接受前端参数
+        getRes := new(DecParam)
+        if string(this.Body()) != "" {
+            //接收参数
+            json.Unmarshal(this.Body(), &getRes)
+        }
+
+        if getRes.Area != nil && getRes.Buyer != "" && len(getRes.BuyerContent) > 0 {
+            //是否是子账号
+            //main_userId, phone, member_status := util.MainUserId(this.Session())
+            bigMsg := jy.GetBigVipUserBaseMsg(this.Session(), *config.Middleground)
+            isAble := false
+            if len(bigMsg.Data.Member.MemberPowerList) > 0 {
+                for _, v := range bigMsg.Data.Member.MemberPowerList {
+                    if v == 6 {
+                        isAble = true
+                    }
+                }
+            }
+            if !isAble {
+                regMap.Error_code = Error_code_1004
+                regMap.Error_msg = Error_msg_1004
+            } else {
+                if getRes.ServiceId == 0 {
+                    getRes.ServiceId = 6
+                }
+                //各维度项目数量
+                all_count, area_count, buyer_count := AnalyzeNumber(getRes.Area, getRes.BuyerContent, getRes.Buyer, getRes.LimitTime)
+                var isAnalyze bool
+                if all_count == 0 || (getRes.SearchItem == 1 && buyer_count == 0) ||
+                    (getRes.SearchItem == 2 && area_count == 0) {
+                    isAnalyze = true
+                }
+                if isAnalyze {
+                    regMap.Data = map[string]interface{}{
+                        "PAnalysis": nil,
+                    }
+                    this.ServeJson(regMap)
+                    return
+                }
+                // getRes.Buyer = "北京市交通委员会密云公路分局"
+                //采购单位的采购类型
+                buyer_buyerClass := ""
+                getRes.BuyerContent = BuyerContentStruct(getRes.BuyerContent)
+                decQuery := DecReviewExpertsQuery(getRes.Area, getRes.BuyerContent, getRes.Buyer, buyer_buyerClass, getRes.LimitTime, getRes.SearchItem, getRes.ProjectScope)
+                aggsArr := getDecInfo(decQuery, buyer_buyerClass, getRes, 0)
+                //log.Println("专家top10", aggsArr["reviewExperts"])
+                var expertlist []map[string]interface{}
+                if reviewExperts, ok := aggsArr["reviewExperts"].([]map[string]interface{}); ok {
+                    for k, v := range reviewExperts {
+                        if k < 10 {
+                            expertName := qutil.ObjToString(v["key"])
+                            decQuery := ExpertsCooperationProjectCount(expertName, getRes.Area, getRes.BuyerContent, getRes.Buyer, getRes.LimitTime, getRes.SearchItem, getRes.ProjectScope)
+                            _, count, _ := elastic.GetAggs("projectset", "projectset", decQuery)
+                            v["doc_count"] = count
+                            expertlist = append(expertlist, v)
+                        } else {
+                            break
+                        }
+                    }
+                    util.SortData(&expertlist, "doc_count", true)
+                    aggsArr["reviewExperts"] = expertlist
+                }
+
+                regMap.Data = map[string]interface{}{
+                    "PAnalysis": aggsArr,
+                }
+                //投标决策分析历史记录
+                //go SaveDecHistortList(getRes, userId, mainUserid, phone, base64Key, decCount, this.Request, "pay")
+            }
+        } else {
+            regMap.Error_code = Error_code_1002
+            regMap.Error_msg = Error_msg_1002
+        }
+    } else {
+        regMap.Error_code = Error_code_1005
+        regMap.Error_msg = Error_msg_1005
+    }
+    this.ServeJson(regMap)
+}
+
+type TRecentProject struct {
+    //RecentProject struct {
+    Hits struct {
+        Total struct {
+            Value    int    `json:"value"`
+            Relation string `json:"relation"`
+        } `json:"total"`
+        MaxScore interface{} `json:"max_score"`
+        Hits     []struct {
+            Index  string      `json:"_index"`
+            Type   string      `json:"_type"`
+            Id     string      `json:"_id"`
+            Score  interface{} `json:"_score"`
+            Source struct {
+                Bidamount   float64 `json:"bidamount"`
+                Projectname string  `json:"projectname"`
+                Jgtime      int     `json:"jgtime"`
+                Id          string  `json:"id"`
+            } `json:"_source"`
+            Sort []int `json:"sort"`
+        } `json:"hits"`
+    } `json:"hits"`
+    //} `json:"recent_project"`
 }
 
 // 投标决策分析
 func getDecInfoFree(decQuery, buyer_buyerClass string, dec *DecParam) map[string]interface{} {
-	t1 := time.Now()
-	//
-	var aggsArr = map[string]interface{}{}
-	//聚合
-	aggs, _ := GetAggs(P_INDEX, P_TYPE, decQuery)
-	if aggs != nil {
-		//项目数量
-		if all_counts, ok := aggs.Children("all_counts"); ok {
-			all_counts_val, _ := all_counts.Aggregations["value"].MarshalJSON()
-			aggsArr["all_counts"] = string(all_counts_val)
-		}
-		//项目涉及中标企业
-		if all_winners, ok := aggs.Children("all_winners"); ok {
-			all_winners_val, _ := all_winners.Aggregations["value"].MarshalJSON()
-			aggsArr["all_winners"] = string(all_winners_val)
-		}
-		//项目金额
-		if all_money, ok := aggs.Children("all_money"); ok {
-			all_money_val, _ := all_money.Aggregations["value"].MarshalJSON()
-			all_money_float, _ := strconv.ParseFloat(string(all_money_val), 64)
-			aggsArr["all_money"] = all_money_float
-		}
-		//项目专家
-		if all_review_experts, ok := aggs.Children("all_review_experts"); ok {
-			all_review_experts_val, _ := all_review_experts.Aggregations["value"].MarshalJSON()
-			aggsArr["all_review_experts"] = string(all_review_experts_val)
-		}
-		//标书编制周期
-		if bidcycle_ranges, ok := aggs.Children("bidcycle_ranges"); ok {
-			var aggsMap []map[string]interface{}
-			bs, _ := bidcycle_ranges.Aggregations["buckets"].MarshalJSON()
-			if len(bs) > 0 {
-				json.Unmarshal(bs, &aggsMap)
-				if len(aggsMap) > 0 {
-					var buckets = []map[string]interface{}{}
-					for _, v := range aggsMap {
-						buckets = append(buckets, map[string]interface{}{
-							"key":       v["key"],
-							"doc_count": v["doc_count"],
-						})
-					}
-					aggsArr["bidcycle_ranges"] = buckets
-				}
-			}
-		}
-	}
-	log.Println("运行时间:", time.Since(t1))
-	return aggsArr
+    t1 := time.Now()
+    //
+    var aggsArr = map[string]interface{}{}
+    //聚合
+    aggs, _ := GetAggs(P_INDEX, P_TYPE, decQuery)
+    if aggs != nil {
+        //项目数量
+        if all_counts, ok := aggs.Children("all_counts"); ok {
+            all_counts_val, _ := all_counts.Aggregations["value"].MarshalJSON()
+            aggsArr["all_counts"] = string(all_counts_val)
+        }
+        //项目涉及中标企业
+        if all_winners, ok := aggs.Children("all_winners"); ok {
+            all_winners_val, _ := all_winners.Aggregations["value"].MarshalJSON()
+            aggsArr["all_winners"] = string(all_winners_val)
+        }
+        //项目金额
+        if all_money, ok := aggs.Children("all_money"); ok {
+            all_money_val, _ := all_money.Aggregations["value"].MarshalJSON()
+            all_money_float, _ := strconv.ParseFloat(string(all_money_val), 64)
+            aggsArr["all_money"] = all_money_float
+        }
+        //项目专家
+        if all_review_experts, ok := aggs.Children("all_review_experts"); ok {
+            all_review_experts_val, _ := all_review_experts.Aggregations["value"].MarshalJSON()
+            aggsArr["all_review_experts"] = string(all_review_experts_val)
+        }
+        //标书编制周期
+        if bidcycle_ranges, ok := aggs.Children("bidcycle_ranges"); ok {
+            var aggsMap []map[string]interface{}
+            bs, _ := bidcycle_ranges.Aggregations["buckets"].MarshalJSON()
+            if len(bs) > 0 {
+                json.Unmarshal(bs, &aggsMap)
+                if len(aggsMap) > 0 {
+                    var buckets = []map[string]interface{}{}
+                    for _, v := range aggsMap {
+                        buckets = append(buckets, map[string]interface{}{
+                            "key":       v["key"],
+                            "doc_count": v["doc_count"],
+                        })
+                    }
+                    aggsArr["bidcycle_ranges"] = buckets
+                }
+            }
+        }
+    }
+    log.Println("运行时间:", time.Since(t1))
+    return aggsArr
 }
 
 // 投标决策分析
-func getDecInfo(decQuery, buyer_buyerClass string, dec *DecParam) map[string]interface{} {
-	t1 := time.Now()
-	//
-	var aggsArr = map[string]interface{}{}
-	//类似项目采购单位采购历史
-	var buyerHistroyList = []map[string]interface{}{}
-	if dec.Buyer != "" {
-		list := GetListByBuyer(dec)
-		if list != nil && len(list) > 0 {
-			for _, v := range list {
-				var firsttime = v["firsttime"]
-				infoid := ""
-				if v["ids"] != nil {
-					ids := qutil.ObjArrToStringArr(v["ids"].([]interface{}))
-					if len(ids) > 0 {
-						infoid = util.EncodeId(ids[0])
-					}
-				}
-				var projectMap = map[string]interface{}{
-					"projectname": v["projectname"],
-					"_id":         util.EncodeId(v["_id"].(string)),
-					"area":        v["area"],
-					"bidstatus":   v["bidstatus"],
-					"firsttime":   FormatDateWithObj(&firsttime, Date_Short_Layout),
-					"infoid":      infoid,
-				}
-				buyerHistroyList = append(buyerHistroyList, projectMap)
-			}
-		}
-	}
-	// log.Println("buyerHistroyList.length:", len(buyerHistroyList))
-	aggsArr["buyerHistroyList"] = buyerHistroyList
-	//聚合
-	aggs, res := GetAggs(P_INDEX, P_TYPE, decQuery)
-	log.Println("请求数据时间:", time.Since(t1))
-	if res != nil && len(res) > 0 {
-		res = Sequence(res)
-	}
-	log.Println("-请求数据时间-:", time.Since(t1))
-	if aggs != nil {
-		//标书编制周期
-		if bidcycle_ranges, ok := aggs.Children("bidcycle_ranges"); ok {
-			var aggsMap []map[string]interface{}
-			bs, _ := bidcycle_ranges.Aggregations["buckets"].MarshalJSON()
-			if len(bs) > 0 {
-				json.Unmarshal(bs, &aggsMap)
-				if len(aggsMap) > 0 {
-					var buckets = []map[string]interface{}{}
-					for _, v := range aggsMap {
-						buckets = append(buckets, map[string]interface{}{
-							"key":       v["key"],
-							"doc_count": v["doc_count"],
-						})
-					}
-					aggsArr["bidcycle_ranges"] = buckets
-				}
-			}
-		}
-		//类似项目预算统计分析
-		if aggs_budget, ok := aggs.Children("budget_ranges"); ok {
-			var aggsMap []map[string]interface{}
-			bs, _ := aggs_budget.Aggregations["buckets"].MarshalJSON()
-			if len(bs) > 0 {
-				json.Unmarshal(bs, &aggsMap)
-				if len(aggsMap) > 0 {
-					var buckets = []map[string]interface{}{}
-					for _, v := range aggsMap {
-						var avg_rate_map = *qutil.ObjToMap(v["avg_rate"].(map[string]interface{}))
-						var avg_rate = avg_rate_map["avg_rate"].(map[string]interface{})
-						var avg interface{} = nil
-						if avg_rate["value"] != nil {
-							// avg = avg_rate["value"].(interface{})
-						}
-						var sum_budget_map = avg_rate_map["sum_budget"].(map[string]interface{})
-						var sum_bidamount_map = avg_rate_map["sum_bidamount"].(map[string]interface{})
-						if sum_budget_map["value"] != nil && sum_bidamount_map["value"] != nil {
-							var sum_budget float64 = qutil.RetainDecimal(qutil.Float64All(sum_budget_map["value"].(interface{})), 4)       //预算总额
-							var sum_bidamount float64 = qutil.RetainDecimal(qutil.Float64All(sum_bidamount_map["value"].(interface{})), 4) //中标总额
-							if sum_bidamount > 0 && sum_budget > 0 && sum_bidamount <= sum_budget {
-								avg = (sum_budget - sum_bidamount) / sum_budget
-							}
-						}
-						buckets = append(buckets, map[string]interface{}{
-							"key":       v["key"],
-							"doc_count": v["doc_count"],
-							"avg":       avg,
-						})
-					}
-					aggsArr["budgetAnalysis"] = buckets
-				}
-			}
-		}
-		//类似项目地区分布分析
-		if aggs_area, ok := aggs.Children("group_area"); ok {
-			var aggsMap []map[string]interface{}
-			bs, _ := aggs_area.Aggregations["buckets"].MarshalJSON()
-			if len(bs) > 0 {
-				json.Unmarshal(bs, &aggsMap)
-				if len(aggsMap) > 0 {
-					var buckets = []map[string]interface{}{}
-					for _, v := range aggsMap {
-						//类似项目数量
-						var group_counts_map = *qutil.ObjToMap(v["group_counts"].(map[string]interface{}))
-						var doc_count = 0
-						if group_counts_map["value"] != nil {
-							doc_count = qutil.IntAll(group_counts_map["value"])
-						}
-						//类似项目规模
-						var sum_bidamount_map = *qutil.ObjToMap(v["sum_bidamount"].(map[string]interface{}))
-						var bidamount_sum_map = sum_bidamount_map["bidamount_sum"].(map[string]interface{})
-						var bidamount_sum float64 = 0
-						if bidamount_sum_map["value"] != nil {
-							bidamount_sum = qutil.RetainDecimal(qutil.Float64All(bidamount_sum_map["value"].(interface{})), 2)
-						}
-						buckets = append(buckets, map[string]interface{}{
-							"key":           v["key"],
-							"doc_count":     doc_count,
-							"bidamount_sum": bidamount_sum,
-						})
-					}
-					aggsArr["group_area"] = buckets
-				}
-			}
-		}
-		var buyer_buyerClass_bool = false
-		//类似项目采购单位类型分析
-		if group_buyerclass, ok := aggs.Children("group_buyerclass"); ok {
-			if group_buyerclass_c, ok := group_buyerclass.Children("group_buyerclass_c"); ok {
-				var aggsMap []map[string]interface{}
-				bs, _ := group_buyerclass_c.Aggregations["buckets"].MarshalJSON()
-				if len(bs) > 0 {
-					json.Unmarshal(bs, &aggsMap)
-					if len(aggsMap) > 0 {
-						// log.Println(aggsMap)
-						var buckets = []map[string]interface{}{}
-						for _, v := range aggsMap {
-							if v["key"].(string) == "" {
-								continue
-							}
-							var this_bool = false
-							if buyer_buyerClass == v["key"].(string) {
-								buyer_buyerClass_bool = true
-								this_bool = true
-							}
-							//类似项目数量
-							var group_counts_map = *qutil.ObjToMap(v["group_counts"].(map[string]interface{}))
-							var doc_count = 0
-							if group_counts_map["value"] != nil {
-								doc_count = qutil.IntAll(group_counts_map["value"])
-							}
-							//类似项目规模
-							var group_money_map = *qutil.ObjToMap(v["group_money"].(map[string]interface{}))
-							var group_money float64 = 0
-							if group_money_map["value"] != nil {
-								group_money = qutil.RetainDecimal(qutil.Float64All(group_money_map["value"].(interface{})), 4)
-							}
-							//平均折扣率
-							var avg_rate_map = *qutil.ObjToMap(v["avg_rate"].(map[string]interface{}))
-							var avg_rate = avg_rate_map["avg_rate"].(map[string]interface{})
-							var avg interface{} = nil
-							if avg_rate["value"] != nil {
-								// avg = avg_rate["value"].(interface{})
-							}
-							var sum_budget_map = avg_rate_map["sum_budget"].(map[string]interface{})
-							var sum_bidamount_map = avg_rate_map["sum_bidamount"].(map[string]interface{})
-							if sum_budget_map["value"] != nil && sum_bidamount_map["value"] != nil {
-								var sum_budget float64 = qutil.RetainDecimal(qutil.Float64All(sum_budget_map["value"].(interface{})), 4)       //预算总额
-								var sum_bidamount float64 = qutil.RetainDecimal(qutil.Float64All(sum_bidamount_map["value"].(interface{})), 4) //中标总额
-								if sum_bidamount > 0 && sum_budget > 0 && sum_bidamount <= sum_budget {
-									avg = (sum_budget - sum_bidamount) / sum_budget
-								}
-							}
-							buckets = append(buckets, map[string]interface{}{
-								"key":       v["key"],    //采购单位类型名称
-								"doc_count": doc_count,   //类似项目总数
-								"doc_money": group_money, //类似项目规模
-								"avg":       avg,         //平均折扣率
-								"main":      this_bool,   //当前采购单位得采购单位类型
-							})
-						}
-						aggsArr["group_buyerclass"] = buckets
-					}
-				}
-			}
-		}
-		//此采购单位得采购类型 buyer_buyerclass
-		if group_buyer_buyerclass, ok := aggs.Children("group_buyer_buyerclass"); ok && !buyer_buyerClass_bool {
-			var buyer_buyerclass_map map[string]interface{}
-			if group_buyerclass_c, ok := group_buyer_buyerclass.Children("group_buyerclass_c"); ok {
-				var aggsMap []map[string]interface{}
-				bs, _ := group_buyerclass_c.Aggregations["buckets"].MarshalJSON()
-				if len(bs) > 0 {
-					json.Unmarshal(bs, &aggsMap)
-					if len(aggsMap) > 0 {
-						for _, v := range aggsMap {
-							//类似项目数量
-							var group_counts_map = *qutil.ObjToMap(v["group_counts"].(map[string]interface{}))
-							var doc_count = 0
-							if group_counts_map["value"] != nil {
-								doc_count = qutil.IntAll(group_counts_map["value"])
-							}
-							//类似项目规模
-							var group_money_map = *qutil.ObjToMap(v["group_money"].(map[string]interface{}))
-							var group_money float64 = 0
-							if group_money_map["value"] != nil {
-								group_money = qutil.RetainDecimal(qutil.Float64All(group_money_map["value"].(interface{})), 4)
-							}
-							//平均折扣率
-							var avg_rate_map = *qutil.ObjToMap(v["avg_rate"].(map[string]interface{}))
-							var avg_rate = avg_rate_map["avg_rate"].(map[string]interface{})
-							var avg interface{} = nil
-							if avg_rate["value"] != nil {
-								// avg = avg_rate["value"].(interface{})
-							}
-							var sum_budget_map = avg_rate_map["sum_budget"].(map[string]interface{})
-							var sum_bidamount_map = avg_rate_map["sum_bidamount"].(map[string]interface{})
-							if sum_budget_map["value"] != nil && sum_bidamount_map["value"] != nil {
-								var sum_budget float64 = qutil.RetainDecimal(qutil.Float64All(sum_budget_map["value"].(interface{})), 4)       //预算总额
-								var sum_bidamount float64 = qutil.RetainDecimal(qutil.Float64All(sum_bidamount_map["value"].(interface{})), 4) //中标总额
-								if sum_bidamount > 0 && sum_budget > 0 && sum_bidamount <= sum_budget {
-									avg = (sum_budget - sum_bidamount) / sum_budget
-								}
-							}
-							buyer_buyerclass_map = map[string]interface{}{
-								"key":       v["key"],    //采购单位类型名称
-								"doc_count": doc_count,   //类似项目总数
-								"doc_money": group_money, //类似项目规模
-								"avg":       avg,         //平均折扣率
-								"main":      true,        //当前采购单位得采购单位类型
-							}
-						}
-					}
-				}
-			}
-			if aggsArr["group_buyerclass"] != nil && buyer_buyerclass_map != nil {
-				group_buyerclass_buyers := aggsArr["group_buyerclass"].([]map[string]interface{})
-				buyers_len := len(group_buyerclass_buyers)
-				if buyers_len < 10 {
-					group_buyerclass_buyers = append(group_buyerclass_buyers, buyer_buyerclass_map)
-				} else {
-					group_buyerclass_buyers = append(group_buyerclass_buyers[:buyers_len-1], buyer_buyerclass_map)
-				}
-				aggsArr["group_buyerclass"] = group_buyerclass_buyers
-			}
-		}
-		//专家评审
-		if aggs_review_experts, ok := aggs.Children("group_review_experts"); ok {
-			var aggsMap []map[string]interface{}
-			bs, _ := aggs_review_experts.Aggregations["buckets"].MarshalJSON()
-			if len(bs) > 0 {
-				json.Unmarshal(bs, &aggsMap)
-				if len(aggsMap) > 0 {
-					// log.Println(aggsMap)
-					var _aggsMap = []map[string]interface{}{}
-					for k, v := range aggsMap {
-						if !entity.RegExperts.MatchString(qutil.ObjToString(v["key"])) {
-							continue
-						}
-						_aggsMap = append(_aggsMap, aggsMap[k])
-					}
-					aggsArr["reviewExperts"] = _aggsMap
-				}
-			}
-		}
-		//项目数量
-		if all_counts, ok := aggs.Children("all_counts"); ok {
-			all_counts_val, _ := all_counts.Aggregations["value"].MarshalJSON()
-			aggsArr["all_counts"] = string(all_counts_val)
-		}
-		//项目金额
-		if all_money, ok := aggs.Children("all_money"); ok {
-			all_money_val, _ := all_money.Aggregations["value"].MarshalJSON()
-			all_money_float, _ := strconv.ParseFloat(string(all_money_val), 64)
-			aggsArr["all_money"] = all_money_float
-		}
-		//项目涉及中标企业
-		if all_winners, ok := aggs.Children("all_winners"); ok {
-			all_winners_val, _ := all_winners.Aggregations["value"].MarshalJSON()
-			aggsArr["all_winners"] = string(all_winners_val)
-		}
-		//项目专家
-		if all_review_experts, ok := aggs.Children("all_review_experts"); ok {
-			all_review_experts_val, _ := all_review_experts.Aggregations["value"].MarshalJSON()
-			aggsArr["all_review_experts"] = string(all_review_experts_val)
-		}
-		//中标企业
-		if aggs_winner, ok := aggs.Children("group_winner"); ok {
-			var aggsMap []map[string]interface{}
-			bs, _ := aggs_winner.Aggregations["buckets"].MarshalJSON()
-			if len(bs) > 0 {
-				var winners = []string{}
-				json.Unmarshal(bs, &aggsMap)
-				if len(aggsMap) > 0 {
-					var buckets = []*DecWinnerInfo{}
-					for _, v := range aggsMap {
-						if !entity.RegWinner.MatchString(qutil.ObjToString(v["key"])) {
-							continue
-						}
-						//类似项目金额
-						var total_map = *qutil.ObjToMap(v["total"].(map[string]interface{}))
-						var total_project = 0
-						if total_map["value"] != nil {
-							total_project = qutil.IntAll(total_map["value"])
-						}
-						//
-						var max_jytime_map = *qutil.ObjToMap(v["max_jytime"].(map[string]interface{}))
-						var max_jytime int64 = 0
-						if max_jytime_map["value"] != nil {
-							max_jytime = qutil.Int64All(max_jytime_map["value"])
-						}
-						//中标企业id
-						var group_entidlist = *qutil.ObjToMap(v["group_entidlist"].(map[string]interface{}))
-						var entId = ""
-						if group_entidlist != nil && group_entidlist["buckets"] != nil {
-							buckets := qutil.ObjArrToMapArr(group_entidlist["buckets"].([]interface{}))
-							if buckets == nil || len(buckets) == 0 || (buckets[0]["key"] != nil && len(qutil.ObjToString(buckets[0]["key"])) < 10) {
-								continue
-							}
-							entId = util.EncodeId(qutil.ObjToString(buckets[0]["key"]))
-						}
-						//此中标企业与采购单位类似项目采购历史
-						var buyer_similar_list = BuyerSOOL{}
-						//此中标企业与采购单位其它项目采购历史
-						var buyer_other_list = BuyerSOOL{}
-						if dec.Buyer != "" {
-							var buyer_map = *qutil.ObjToMap(v["this_buyer"].(map[string]interface{}))
-							var buyer_map_count = buyer_map["doc_count"] //类似项目数量
-							var buyer_map_tatil_map = *qutil.ObjToMap(buyer_map["total"].(map[string]interface{}))
-							var buyer_map_tatil = qutil.RetainDecimal(qutil.Float64All(buyer_map_tatil_map["value"].(interface{})), 4)
-							var my_top_hits_map = *qutil.ObjToMap(buyer_map["my_top_hits"].(map[string]interface{}))
-							var buyer_hits_map = *qutil.ObjToMap(my_top_hits_map["hits"].(map[string]interface{}))
-							var hits_map = qutil.ObjArrToMapArr(buyer_hits_map["hits"].([]interface{}))
-							var bid_winner_time = ""
-							var buyer_winner_map = map[string]interface{}{} //类似项目 采购单位 和 中标企业
-							if hits_map != nil && len(hits_map) > 0 {
-								for _, v := range hits_map {
-									if v["_source"] != nil {
-										var hits_source_map = *qutil.ObjToMap(v["_source"].(map[string]interface{}))
-										jgtime := hits_source_map["jgtime"]
-										if jgtime != nil && bid_winner_time == "" {
-											bid_winner_time = FormatDateWithObj(&jgtime, "2006/01/02")
-										}
-										buyer_winner_map[hits_source_map["_id"].(string)] = hits_source_map["jgtime"]
-									}
-								}
-							}
-							//查询此中标企业 和 此采购单位 所有合作的项目
-							buyer_winner_all_query := GetAllBWQuery(v["key"].(string), dec.Buyer)
-							buyer_winner_all_aggs, buyer_winner_all_res := GetAggs("projectset", "projectset", buyer_winner_all_query)
-							var bid_winner_other_time = ""
-							if buyer_winner_all_res != nil && len(buyer_winner_all_res) > 0 {
-								for _, v := range buyer_winner_all_res {
-									if buyer_winner_map[v["_id"].(string)] == nil && bid_winner_other_time == "" {
-										jgtime := v["jgtime"]
-										bid_winner_other_time = FormatDateWithObj(&jgtime, "2006/01/02")
-										break
-									}
-								}
-								//此中标企业 和 此采购单位 合作项目总金额
-								var sum_project_val_float float64 = 0
-								if buyer_winner_all_aggs != nil {
-									if sum_project, ok := buyer_winner_all_aggs.Children("sum_project"); ok {
-										sum_project_val, _ := sum_project.Aggregations["value"].MarshalJSON()
-										sum_project_val_float, _ = strconv.ParseFloat(string(sum_project_val), 64)
-									}
-								}
-								if sum_project_val_float > 0 {
-									buyer_other_list = BuyerSOOL{
-										dec.Buyer,
-										len(buyer_winner_all_res) - qutil.IntAll(buyer_map_count),
-										sum_project_val_float - buyer_map_tatil,
-										bid_winner_other_time,
-									}
-								}
-							}
-							if buyer_map_count != nil {
-								buyer_similar_list = BuyerSOOL{
-									dec.Buyer,
-									qutil.IntAll(buyer_map_count),
-									buyer_map_tatil,
-									bid_winner_time,
-								}
-							}
-						}
-						//中标企业名称
-						winners = append(winners, v["key"].(string))
-						buckets = append(buckets, &DecWinnerInfo{
-							v["key"].(string),        //中标企业名称
-							v["doc_count"].(float64), //类似项目总数
-							total_project,            //项目金额
-							buyer_similar_list,       //中标企业与采购单位类似项目合作历史
-							buyer_other_list,         //中标企业和采购单位其它项目合作历史
-							0,                        //中标企业注册资本
-							entId,                    //中标企业加密id
-							max_jytime,               //类似项目中标时间
-						})
-					}
-					//获取中标企业注资金信息
-					capitals := entity.GetWinnerCapitals(winners)
-					var isSortBool = false
-					var bvdoc_count float64 = -1
-					var bvtotal_project = -1
-					for k, v := range buckets {
-						//类似项目或者其它项目
-						if k > 0 && (v.Buyer_other_list.Doc_count > 0 || v.Buyer_similar_list.Doc_count > 0) {
-							isSortBool = true
-						}
-						//项目数相同 且 此中标企业金额大于前一个中标企业金额 允许再次排序
-						if bvdoc_count == v.Doc_count && bvtotal_project < v.Total_project {
-							isSortBool = true
-						}
-						bvdoc_count = v.Doc_count
-						bvtotal_project = v.Total_project
-						v.Capital = capitals[v.Key]
-					}
-					//根据金额二次排序
-					fmt.Println("isSortBool:", isSortBool)
-					if isSortBool {
-						sort.Sort(DWIArray(buckets))
-					}
-					aggsArr["winnerAmount"] = buckets
-				}
-			}
-		}
-	}
-	log.Println("运行时间:", time.Since(t1))
-	return map[string]interface{}{
-		"PDeatils":  res,
-		"PAnalysis": aggsArr,
-	}
-}
+func getDecInfo(decQuery, buyer_buyerClass string, dec *DecParam, buyerSty int) map[string]interface{} {
+    t1 := time.Now()
+    //
+    var aggsArr = map[string]interface{}{}
+    /*
+    	//类似项目采购单位采购历史
+    	var buyerHistroyList = []map[string]interface{}{}
+    	  if dec.Buyer != "" && buyerSty == 1 {
+    	  	list := GetListByBuyer(dec)
+    	  	if list != nil && len(list) > 0 {
+    	  		for _, v := range list {
+    	  			var firsttime = v["firsttime"]
+    	  			infoid := ""
+    	  			if v["ids"] != nil {
+    	  				ids := qutil.ObjArrToStringArr(v["ids"].([]interface{}))
+    	  				if len(ids) > 0 {
+    	  					infoid = util.EncodeId(ids[0])
+    	  				}
+    	  			}
+    	  			var projectMap = map[string]interface{}{
+    	  				"projectname": v["projectname"],
+    	  				"_id":         util.EncodeId(v["_id"].(string)),
+    	  				"area":        v["area"],
+    	  				"bidstatus":   v["bidstatus"],
+    	  				"firsttime":   FormatDateWithObj(&firsttime, Date_Short_Layout),
+    	  				"infoid":      infoid,
+    	  			}
+    	  			buyerHistroyList = append(buyerHistroyList, projectMap)
+    	  		}
+    	  	}
+    	  	aggsArr["buyerHistroyList"] = buyerHistroyList
+    	  }*/
+    //聚合
+    aggs, _ := GetAggs(P_INDEX, P_TYPE, decQuery)
 
-// 决策分析 根据字段权重排序 中标企业和中标价格
-var (
-	bidtype_score        = 1 //采购方式
-	review_experts_score = 1 //评审专家
-	zbtime_score         = 1 //招标时间
-	bidamount_score      = 2 //中标价格
-	budget_score         = 2 //预算
-	project_rate_score   = 1 //折扣率
-	winnerorder_score    = 1 //中标候选人
-)
+    log.Println("-请求数据时间-:", time.Since(t1))
+    if aggs != nil {
+        //标书编制周期
+        if bidcycle_ranges, ok := aggs.Children("bidcycle_ranges"); ok {
+            var aggsMap []map[string]interface{}
+            bs, _ := bidcycle_ranges.Aggregations["buckets"].MarshalJSON()
+            if len(bs) > 0 {
+                json.Unmarshal(bs, &aggsMap)
+                if len(aggsMap) > 0 {
+                    var buckets = []map[string]interface{}{}
+                    for _, v := range aggsMap {
+                        buckets = append(buckets, map[string]interface{}{
+                            "key":       v["key"],
+                            "doc_count": v["doc_count"],
+                        })
+                    }
+                    aggsArr["bidcycle_ranges"] = buckets
+                }
+            }
+        }
+        //类似项目预算统计分析
+        if aggs_budget, ok := aggs.Children("budget_ranges"); ok {
+            var aggsMap []map[string]interface{}
+            bs, _ := aggs_budget.Aggregations["buckets"].MarshalJSON()
+            if len(bs) > 0 {
+                json.Unmarshal(bs, &aggsMap)
+                if len(aggsMap) > 0 {
+                    var buckets = []map[string]interface{}{}
+                    for _, v := range aggsMap {
+                        var avg_rate_map = *qutil.ObjToMap(v["avg_rate"].(map[string]interface{}))
+                        var avg_rate = avg_rate_map["avg_rate"].(map[string]interface{})
+                        var avg interface{} = nil
+                        if avg_rate["value"] != nil {
+                            // avg = avg_rate["value"].(interface{})
+                        }
+                        var sum_budget_map = avg_rate_map["sum_budget"].(map[string]interface{})
+                        var sum_bidamount_map = avg_rate_map["sum_bidamount"].(map[string]interface{})
+                        if sum_budget_map["value"] != nil && sum_bidamount_map["value"] != nil {
+                            var sum_budget float64 = qutil.RetainDecimal(qutil.Float64All(sum_budget_map["value"].(interface{})), 4)       //预算总额
+                            var sum_bidamount float64 = qutil.RetainDecimal(qutil.Float64All(sum_bidamount_map["value"].(interface{})), 4) //中标总额
+                            if sum_bidamount > 0 && sum_budget > 0 && sum_bidamount <= sum_budget {
+                                avg = (sum_budget - sum_bidamount) / sum_budget
+                            }
+                        }
+                        buckets = append(buckets, map[string]interface{}{
+                            "key":       v["key"],
+                            "doc_count": v["doc_count"],
+                            "avg":       avg,
+                        })
+                    }
+                    aggsArr["budgetAnalysis"] = buckets
+                }
+            }
+        }
+        //类似项目地区分布分析
+        if aggs_area, ok := aggs.Children("group_area"); ok {
+            var aggsMap []map[string]interface{}
+            bs, _ := aggs_area.Aggregations["buckets"].MarshalJSON()
+            if len(bs) > 0 {
+                json.Unmarshal(bs, &aggsMap)
+                if len(aggsMap) > 0 {
+                    var buckets = []map[string]interface{}{}
+                    for _, v := range aggsMap {
+                        //类似项目数量
+                        var group_counts_map = *qutil.ObjToMap(v["group_counts"].(map[string]interface{}))
+                        var doc_count = 0
+                        if group_counts_map["value"] != nil {
+                            doc_count = qutil.IntAll(group_counts_map["value"])
+                        }
+                        //类似项目规模
+                        var sum_bidamount_map = *qutil.ObjToMap(v["sum_bidamount"].(map[string]interface{}))
+                        var bidamount_sum_map = sum_bidamount_map["bidamount_sum"].(map[string]interface{})
+                        var bidamount_sum float64 = 0
+                        if bidamount_sum_map["value"] != nil {
+                            bidamount_sum = qutil.RetainDecimal(qutil.Float64All(bidamount_sum_map["value"].(interface{})), 2)
+                        }
+                        buckets = append(buckets, map[string]interface{}{
+                            "key":           v["key"],
+                            "doc_count":     doc_count,
+                            "bidamount_sum": bidamount_sum,
+                        })
+                    }
+                    aggsArr["group_area"] = buckets
+                }
+            }
+        }
+        var buyer_buyerClass_bool = false
+        //类似项目采购单位类型分析
+        if group_buyerclass, ok := aggs.Children("group_buyerclass"); ok {
+            if group_buyerclass_c, ok := group_buyerclass.Children("group_buyerclass_c"); ok {
+                var aggsMap []map[string]interface{}
+                bs, _ := group_buyerclass_c.Aggregations["buckets"].MarshalJSON()
+                if len(bs) > 0 {
+                    json.Unmarshal(bs, &aggsMap)
+                    if len(aggsMap) > 0 {
+                        // log.Println(aggsMap)
+                        var buckets = []map[string]interface{}{}
+                        for _, v := range aggsMap {
+                            if v["key"].(string) == "" {
+                                continue
+                            }
+                            var this_bool = false
+                            if buyer_buyerClass != "" && buyer_buyerClass == v["key"].(string) {
+                                buyer_buyerClass_bool = true
+                                this_bool = true
+                            }
+                            //类似项目数量
+                            var group_counts_map = *qutil.ObjToMap(v["group_counts"].(map[string]interface{}))
+                            var doc_count = 0
+                            if group_counts_map["value"] != nil {
+                                doc_count = qutil.IntAll(group_counts_map["value"])
+                            }
+                            //类似项目规模
+                            var group_money_map = *qutil.ObjToMap(v["group_money"].(map[string]interface{}))
+                            var group_money float64 = 0
+                            if group_money_map["value"] != nil {
+                                group_money = qutil.RetainDecimal(qutil.Float64All(group_money_map["value"].(interface{})), 4)
+                            }
+                            //平均折扣率
+                            var avg_rate_map = *qutil.ObjToMap(v["avg_rate"].(map[string]interface{}))
+                            var avg_rate = avg_rate_map["avg_rate"].(map[string]interface{})
+                            var avg interface{} = nil
+                            if avg_rate["value"] != nil {
+                                // avg = avg_rate["value"].(interface{})
+                            }
+                            var sum_budget_map = avg_rate_map["sum_budget"].(map[string]interface{})
+                            var sum_bidamount_map = avg_rate_map["sum_bidamount"].(map[string]interface{})
+                            if sum_budget_map["value"] != nil && sum_bidamount_map["value"] != nil {
+                                var sum_budget float64 = qutil.RetainDecimal(qutil.Float64All(sum_budget_map["value"].(interface{})), 4)       //预算总额
+                                var sum_bidamount float64 = qutil.RetainDecimal(qutil.Float64All(sum_bidamount_map["value"].(interface{})), 4) //中标总额
+                                if sum_bidamount > 0 && sum_budget > 0 && sum_bidamount <= sum_budget {
+                                    avg = (sum_budget - sum_bidamount) / sum_budget
+                                }
+                            }
+                            buckets = append(buckets, map[string]interface{}{
+                                "key":       v["key"],    //采购单位类型名称
+                                "doc_count": doc_count,   //类似项目总数
+                                "doc_money": group_money, //类似项目规模
+                                "avg":       avg,         //平均折扣率
+                                "main":      this_bool,   //当前采购单位得采购单位类型
+                            })
+                        }
+                        aggsArr["group_buyerclass"] = buckets
+                    }
+                }
+            }
+        }
+        //此采购单位得采购类型 buyer_buyerclass
+        if group_buyer_buyerclass, ok := aggs.Children("group_buyer_buyerclass"); ok && !buyer_buyerClass_bool {
+            var buyer_buyerclass_map map[string]interface{}
+            if group_buyerclass_c, ok := group_buyer_buyerclass.Children("group_buyerclass_c"); ok {
+                var aggsMap []map[string]interface{}
+                bs, _ := group_buyerclass_c.Aggregations["buckets"].MarshalJSON()
+                if len(bs) > 0 {
+                    json.Unmarshal(bs, &aggsMap)
+                    if len(aggsMap) > 0 {
+                        for _, v := range aggsMap {
+                            //类似项目数量
+                            var group_counts_map = *qutil.ObjToMap(v["group_counts"].(map[string]interface{}))
+                            var doc_count = 0
+                            if group_counts_map["value"] != nil {
+                                doc_count = qutil.IntAll(group_counts_map["value"])
+                            }
+                            //类似项目规模
+                            var group_money_map = *qutil.ObjToMap(v["group_money"].(map[string]interface{}))
+                            var group_money float64 = 0
+                            if group_money_map["value"] != nil {
+                                group_money = qutil.RetainDecimal(qutil.Float64All(group_money_map["value"].(interface{})), 4)
+                            }
+                            //平均折扣率
+                            var avg_rate_map = *qutil.ObjToMap(v["avg_rate"].(map[string]interface{}))
+                            var avg_rate = avg_rate_map["avg_rate"].(map[string]interface{})
+                            var avg interface{} = nil
+                            if avg_rate["value"] != nil {
+                                // avg = avg_rate["value"].(interface{})
+                            }
+                            var sum_budget_map = avg_rate_map["sum_budget"].(map[string]interface{})
+                            var sum_bidamount_map = avg_rate_map["sum_bidamount"].(map[string]interface{})
+                            if sum_budget_map["value"] != nil && sum_bidamount_map["value"] != nil {
+                                var sum_budget float64 = qutil.RetainDecimal(qutil.Float64All(sum_budget_map["value"].(interface{})), 4)       //预算总额
+                                var sum_bidamount float64 = qutil.RetainDecimal(qutil.Float64All(sum_bidamount_map["value"].(interface{})), 4) //中标总额
+                                if sum_bidamount > 0 && sum_budget > 0 && sum_bidamount <= sum_budget {
+                                    avg = (sum_budget - sum_bidamount) / sum_budget
+                                }
+                            }
+                            buyer_buyerclass_map = map[string]interface{}{
+                                "key":       v["key"],    //采购单位类型名称
+                                "doc_count": doc_count,   //类似项目总数
+                                "doc_money": group_money, //类似项目规模
+                                "avg":       avg,         //平均折扣率
+                                "main":      true,        //当前采购单位得采购单位类型
+                            }
+                        }
+                    }
+                }
+            }
+            if aggsArr["group_buyerclass"] != nil && buyer_buyerclass_map != nil {
+                group_buyerclass_buyers := aggsArr["group_buyerclass"].([]map[string]interface{})
+                buyers_len := len(group_buyerclass_buyers)
+                if buyers_len < 10 {
+                    group_buyerclass_buyers = append(group_buyerclass_buyers, buyer_buyerclass_map)
+                } else {
+                    group_buyerclass_buyers = append(group_buyerclass_buyers[:buyers_len-1], buyer_buyerclass_map)
+                }
+                aggsArr["group_buyerclass"] = group_buyerclass_buyers
+            }
+        }
+        //专家评审
+        if aggs_review_experts, ok := aggs.Children("group_review_experts"); ok {
+            var aggsMap []map[string]interface{}
+            bs, _ := aggs_review_experts.Aggregations["buckets"].MarshalJSON()
+            if len(bs) > 0 {
+                json.Unmarshal(bs, &aggsMap)
+                if len(aggsMap) > 0 {
+                    if len(aggsMap) > 10 {
+                        aggsMap = aggsMap[:10]
+                    }
+                    var _aggsMap = []map[string]interface{}{}
+                    for k, v := range aggsMap {
+                        if !entity.RegExperts.MatchString(qutil.ObjToString(v["key"])) {
+                            continue
+                        }
+                        var recentProject TRecentProject
+                        rp, err := json.Marshal(v["recent_project"])
+                        if err == nil {
+                            err = json.Unmarshal(rp, &recentProject)
+                            if err == nil && len(recentProject.Hits.Hits) > 0 {
+                                data := recentProject.Hits.Hits[0]
+                                v["jgtime"] = data.Source.Jgtime //成交时间
+                            }
+                        }
+                        delete(aggsMap[k], "recent_project")
+                        _aggsMap = append(_aggsMap, aggsMap[k])
+                    }
+                    aggsArr["reviewExperts"] = _aggsMap
+                }
+            }
+        }
+        //项目数量
+        if all_counts, ok := aggs.Children("all_counts"); ok {
+            all_counts_val, _ := all_counts.Aggregations["value"].MarshalJSON()
+            aggsArr["all_counts"] = string(all_counts_val)
+        }
+        //项目金额
+        if all_money, ok := aggs.Children("all_money"); ok {
+            all_money_val, _ := all_money.Aggregations["value"].MarshalJSON()
+            all_money_float, _ := strconv.ParseFloat(string(all_money_val), 64)
+            aggsArr["all_money"] = all_money_float
+        }
+        //项目涉及中标企业
+        if all_winners, ok := aggs.Children("all_winners"); ok {
+            all_winners_val, _ := all_winners.Aggregations["value"].MarshalJSON()
+            aggsArr["all_winners"] = string(all_winners_val)
+        }
+        //项目专家
+        if all_review_experts, ok := aggs.Children("all_review_experts"); ok {
+            all_review_experts_val, _ := all_review_experts.Aggregations["value"].MarshalJSON()
+            aggsArr["all_review_experts"] = string(all_review_experts_val)
+        }
+        //中标企业
+        if aggs_winner, ok := aggs.Children("group_winner"); ok {
+            var aggsMap []map[string]interface{}
+            bs, _ := aggs_winner.Aggregations["buckets"].MarshalJSON()
+            if len(bs) > 0 {
+                var winners = []string{}
+                json.Unmarshal(bs, &aggsMap)
+                if len(aggsMap) > 0 {
+                    if len(aggsMap) > 10 {
+                        aggsMap = aggsMap[:10]
+                    }
+                    var buckets = []*DecWinnerInfo{}
+                    for _, v := range aggsMap {
+                        //if !entity.RegWinner.MatchString(qutil.ObjToString(v["key"])) {
+                        //	continue
+                        //}
+                        //类似项目金额
+                        var total_map = *qutil.ObjToMap(v["total"].(map[string]interface{}))
+                        var total_project = 0
+                        if total_map["value"] != nil {
+                            total_project = qutil.IntAll(total_map["value"])
+                        }
+
+                        //中标企业最近合作项目
+                        var recentProject TRecentProject
+                        latestProject := make(map[string]interface{})
+                        rp, err := json.Marshal(v["recent_project"])
+                        if err == nil {
+                            err = json.Unmarshal(rp, &recentProject)
+                            if err == nil && len(recentProject.Hits.Hits) > 0 {
+                                latestProject["_id"] = recentProject.Hits.Hits[0].Id
+                                data := recentProject.Hits.Hits[0]
+                                latestProject["_id"] = util.EncodeId(data.Id)
+                                latestProject["bidamount"] = data.Source.Bidamount     //金额
+                                latestProject["projectname"] = data.Source.Projectname //项目名称
+                                latestProject["jgtime"] = data.Source.Jgtime           //成交时间
+                            }
+                        }
 
-func Sequence(seqData []map[string]interface{}) []map[string]interface{} {
-	var sequenceArr3 = []map[string]interface{}{}
-	var sequenceArr4 = []map[string]interface{}{}
-	var sequenceArr5 = []map[string]interface{}{}
-	var sequenceArr6 = []map[string]interface{}{}
-	var sequenceArr7 = []map[string]interface{}{}
-	var sequenceArr8 = []map[string]interface{}{}
-	var sequenceArr9 = []map[string]interface{}{}
-	for k, v := range seqData {
-		var score = 0
-		if v["s_winner"] == nil {
-			var s_winner = qutil.ObjToString(v["s_winner"])
-			var s_length = 0
-			for _, v := range strings.Split(s_winner, ",") {
-				if entity.RegWinner.MatchString(v) {
-					s_length += 1
-				}
-			}
-			if s_length == 0 {
-				continue
-			}
-		}
-		//评审专家
-		review_experts := []string{}
-		if v["review_experts"] != nil {
-			for _, v := range qutil.ObjArrToStringArr(v["review_experts"].([]interface{})) {
-				if entity.RegExperts.MatchString(v) {
-					review_experts = append(review_experts, v)
-				}
-			}
-			v["review_experts"] = review_experts
-		}
-		if len(review_experts) > 0 {
-			score += review_experts_score
-		}
-		//采购方式
-		if v["bidtype"] != nil && qutil.ObjToString(v["bidtype"].(string)) != "" {
-			score += bidtype_score
-		}
-		//招标时间
-		if v["firsttime"] != nil && qutil.Float64All(v["firsttime"].(float64)) > 0 {
-			score += zbtime_score
-		}
-		//预算
-		if v["budget"] != nil && qutil.Float64All(v["budget"].(float64)) > 0 {
-			score += budget_score
-		}
-		//中标价格
-		if v["bidamount"] != nil && qutil.Float64All(v["bidamount"].(float64)) > 0 {
-			score += bidamount_score
-		}
-		//折扣率
-		if v["project_rate"] != nil && qutil.Float64All(v["project_rate"].(float64)) > 0 {
-			score += project_rate_score
-		}
-		//中标候选人
-		if v["winnerorder"] != nil && len(qutil.ObjArrToStringArr(v["winnerorder"].([]interface{}))) > 0 {
-			score += winnerorder_score
-		}
-		//低于三分排除
-		if score < 4 {
-			// continue
-		}
-		if v["ids"] != nil {
-			ids := qutil.ObjArrToStringArr(v["ids"].([]interface{}))
-			if len(ids) > 0 {
-				v["infoid"] = util.EncodeId(ids[0])
-				delete(v, "ids")
-			}
-		}
-		v["_id"] = util.EncodeId(v["_id"].(string))
-		switch score {
-		case 4:
-			sequenceArr4 = append(sequenceArr4, seqData[k])
-		case 5:
-			sequenceArr5 = append(sequenceArr5, seqData[k])
-		case 6:
-			sequenceArr6 = append(sequenceArr6, seqData[k])
-		case 7:
-			sequenceArr7 = append(sequenceArr7, seqData[k])
-		case 8:
-			sequenceArr8 = append(sequenceArr8, seqData[k])
-		case 9:
-			sequenceArr9 = append(sequenceArr9, seqData[k])
-		default:
-			sequenceArr3 = append(sequenceArr3, seqData[k])
-		}
-	}
-	return append(append(append(append(append(append(sequenceArr9, sequenceArr8...), sequenceArr7...), sequenceArr6...), sequenceArr5...), sequenceArr4...), sequenceArr3...)
+                        var max_jytime_map = *qutil.ObjToMap(v["max_jytime"].(map[string]interface{}))
+                        var max_jytime int64 = 0
+                        if max_jytime_map["value"] != nil {
+                            max_jytime = qutil.Int64All(max_jytime_map["value"])
+                        }
+                        //中标企业id
+                        var group_entidlist = *qutil.ObjToMap(v["group_entidlist"].(map[string]interface{}))
+                        var entId = ""
+                        if group_entidlist != nil && group_entidlist["buckets"] != nil {
+                            buckets := qutil.ObjArrToMapArr(group_entidlist["buckets"].([]interface{}))
+                            if buckets == nil || len(buckets) == 0 || (buckets[0]["key"] != nil && len(qutil.ObjToString(buckets[0]["key"])) < 10) {
+                                continue
+                            }
+                            ent_id := qutil.ObjToString(buckets[0]["key"])
+                            winners = append(winners, fmt.Sprintf(`"%s"`, ent_id))
+                            entId = util.EncodeId(ent_id)
+                        }
+                        //此中标企业与采购单位类似项目采购历史
+                        var buyer_similar_list = BuyerSOOL{}
+                        //此中标企业与采购单位其它项目采购历史
+                        var buyer_other_list = BuyerSOOL{}
+                        /*if dec.Buyer != "" {
+                        	var buyer_map = *qutil.ObjToMap(v["this_buyer"].(map[string]interface{}))
+                        	var buyer_map_count = buyer_map["doc_count"] //类似项目数量
+                        	var buyer_map_tatil_map = *qutil.ObjToMap(buyer_map["total"].(map[string]interface{}))
+                        	var buyer_map_tatil = qutil.RetainDecimal(qutil.Float64All(buyer_map_tatil_map["value"].(interface{})), 4)
+                        	var my_top_hits_map = *qutil.ObjToMap(buyer_map["my_top_hits"].(map[string]interface{}))
+                        	var buyer_hits_map = *qutil.ObjToMap(my_top_hits_map["hits"].(map[string]interface{}))
+                        	var hits_map = qutil.ObjArrToMapArr(buyer_hits_map["hits"].([]interface{}))
+                        	var bid_winner_time = ""
+                        	var buyer_winner_map = map[string]interface{}{} //类似项目 采购单位 和 中标企业
+                        	if hits_map != nil && len(hits_map) > 0 {
+                        		for _, v := range hits_map {
+                        			if v["_source"] != nil {
+                        				var hits_source_map = *qutil.ObjToMap(v["_source"].(map[string]interface{}))
+                        				jgtime := hits_source_map["jgtime"]
+                        				if jgtime != nil && bid_winner_time == "" {
+                        					bid_winner_time = FormatDateWithObj(&jgtime, "2006/01/02")
+                        				}
+                        				buyer_winner_map[qutil.InterfaceToStr(hits_source_map["id"])] = hits_source_map["jgtime"]
+                        			}
+                        		}
+                        	}
+                        	//查询此中标企业 和 此采购单位 所有合作的项目
+                        	buyer_winner_all_query := GetAllBWQuery(v["key"].(string), dec.Buyer)
+                        	buyer_winner_all_aggs, buyer_winner_all_res := GetAggs("projectset", "projectset", buyer_winner_all_query)
+                        	var bid_winner_other_time = ""
+                        	if buyer_winner_all_res != nil && len(buyer_winner_all_res) > 0 {
+                        		for _, v := range buyer_winner_all_res {
+                        			if buyer_winner_map[v["_id"].(string)] == nil && bid_winner_other_time == "" {
+                        				jgtime := v["jgtime"]
+                        				bid_winner_other_time = FormatDateWithObj(&jgtime, "2006/01/02")
+                        				break
+                        			}
+                        		}
+                        		//此中标企业 和 此采购单位 合作项目总金额
+                        		var sum_project_val_float float64 = 0
+                        		if buyer_winner_all_aggs != nil {
+                        			if sum_project, ok := buyer_winner_all_aggs.Children("sum_project"); ok {
+                        				sum_project_val, _ := sum_project.Aggregations["value"].MarshalJSON()
+                        				sum_project_val_float, _ = strconv.ParseFloat(string(sum_project_val), 64)
+                        			}
+                        		}
+                        		if sum_project_val_float > 0 {
+                        			buyer_other_list = BuyerSOOL{
+                        				dec.Buyer,
+                        				len(buyer_winner_all_res) - qutil.IntAll(buyer_map_count),
+                        				sum_project_val_float - buyer_map_tatil,
+                        				bid_winner_other_time,
+                        			}
+                        		}
+                        	}
+                        	if buyer_map_count != nil {
+                        		buyer_similar_list = BuyerSOOL{
+                        			dec.Buyer,
+                        			qutil.IntAll(buyer_map_count),
+                        			buyer_map_tatil,
+                        			bid_winner_time,
+                        		}
+                        	}
+                        }*/
+                        //中标企业名称
+                        buckets = append(buckets, &DecWinnerInfo{
+                            v["key"].(string),        //中标企业名称
+                            v["doc_count"].(float64), //类似项目总数
+                            total_project,            //项目金额
+                            buyer_similar_list,       //中标企业与采购单位类似项目合作历史
+                            buyer_other_list,         //中标企业和采购单位其它项目合作历史
+                            0,                        //中标企业注册资本
+                            entId,                    //中标企业加密id
+                            max_jytime,               //类似项目中标时间
+                            latestProject,            //中标企业最近合作项目
+                        })
+                    }
+                    //获取中标企业注资金信息
+                    /*capitals := entity.GetWinnerCapitals(winners)
+                      log.Println("查询获取中标企业注资金信息消耗时间", time.Since(t1))
+                      var isSortBool = false
+                      var bvdoc_count float64 = -1
+                      var bvtotal_project = -1
+                      for _, v := range buckets {
+                      	//类似项目或者其它项目
+                      	if k > 0 && (v.Buyer_other_list.Doc_count > 0 || v.Buyer_similar_list.Doc_count > 0) {
+                      	   isSortBool = true
+                      	}
+                      	//项目数相同 且 此中标企业金额大于前一个中标企业金额 允许再次排序
+                      	if bvdoc_count == v.Doc_count && bvtotal_project < v.Total_project {
+                      	   isSortBool = true
+                      	}
+                      	bvdoc_count = v.Doc_count
+                      	bvtotal_project = v.Total_project
+                      	v.Capital = capitals[v.EntId]
+                      }
+                      //根据金额二次排序
+                      fmt.Println("isSortBool:", isSortBool)
+                      if isSortBool {
+                         sort.Sort(DWIArray(buckets))
+                      }*/
+                    aggsArr["winnerAmount"] = buckets
+                }
+            }
+        }
+    }
+    log.Println("运行时间:", time.Since(t1))
+    return aggsArr
 }

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 691 - 179
src/jfw/modules/bigmember/src/service/analysis/esquery.go


+ 2 - 0
src/jfw/modules/bigmember/src/service/analysis/power.go

@@ -125,6 +125,8 @@ func SaveDecHistortList(res *DecParam, userId, main_userId, phone, base64Key str
 		"maxPrice":     res.MaxPrice,
 		"minPrice":     res.MinPrice,
 		"pname":        res.Pname,
+		"limitTime":    res.LimitTime,
+		"searchItem":   res.SearchItem,
 		"sid":          res.Sid,
 	}
 	//dev3.4.1版本前试用用户 有使用次数限制

+ 9 - 11
src/jfw/modules/bigmember/src/service/analysis/util.go

@@ -74,7 +74,6 @@ func (this *SelectC) Base64Keys() (baseKey string) {
 	return
 }
 
-//
 func GetBase64KeyForPotential(userId, area, buyerClass, business_scope, entName, industry string) (signedStr string) {
 	var param = [][]string{
 		[]string{"userId", userId},
@@ -100,7 +99,6 @@ func GetBase64KeyForPotential(userId, area, buyerClass, business_scope, entName,
 	return
 }
 
-//
 func GetBase64Key(userId, pname, sid string) (signedStr string) {
 	var param = [][]string{
 		[]string{"userId", userId},
@@ -123,7 +121,6 @@ func GetBase64Key(userId, pname, sid string) (signedStr string) {
 	return
 }
 
-//
 func GetRedisBase64Key(pname, area, city, buyer string, buyerContent []string) (signedStr string) {
 	if len(buyerContent) > 0 {
 		sort.Slice(buyerContent, func(i, j int) bool {
@@ -192,14 +189,15 @@ func (this *SignStr) Swap(i, j int) {
 //投标决策分析-类似项目热点中标企业排序
 
 type DecWinnerInfo struct {
-	Key                string    `json:"key"`                //中标企业名称
-	Doc_count          float64   `json:"doc_count"`          //项目数量
-	Total_project      int       `json:"total_project"`      //项目金额
-	Buyer_similar_list BuyerSOOL `json:"buyer_similar_list"` //与采购单位类似项目合作历史
-	Buyer_other_list   BuyerSOOL `json:"buyer_other_list"`   //与采购单位其他项目合作历史
-	Capital            int64     `json:"capital"`            //中标企业注册资本
-	EntId              string    `json:"entId"`              //中标企业加密id
-	Max_jytime         int64     `json:"max_jytime"`         //类似项目中标时间
+	Key                string                 `json:"key"`                //中标企业名称
+	Doc_count          float64                `json:"doc_count"`          //项目数量
+	Total_project      int                    `json:"total_project"`      //项目金额
+	Buyer_similar_list BuyerSOOL              `json:"buyer_similar_list"` //与采购单位类似项目合作历史
+	Buyer_other_list   BuyerSOOL              `json:"buyer_other_list"`   //与采购单位其他项目合作历史
+	Capital            int64                  `json:"capital"`            //中标企业注册资本
+	EntId              string                 `json:"entId"`              //中标企业加密id
+	Max_jytime         int64                  `json:"max_jytime"`         //类似项目中标时间
+	LatestProject      map[string]interface{} `json:"latest_project"`     // 中标企业最近合作项目
 }
 
 type BuyerSOOL struct {

+ 1 - 0
src/jfw/modules/bigmember/src/service/chatShare/obtainDetails.go

@@ -136,6 +136,7 @@ func (this *ChatShareProject) BuyerPortrait() ([]ForwardData, error) {
 			ScopeClass: this.GetString("scopeClass"),
 			TimeRange:  this.GetString("timeRange"),
 			HasPower:   power > 1,
+			UserLevel:  1,
 		}, "")
 		if err != nil {
 			return nil, err

+ 15 - 14
src/jfw/modules/bigmember/src/service/portrait/memberPortraitAction.go

@@ -14,7 +14,7 @@ import (
 	"app.yhyue.com/moapp/jybase/go-xweb/xweb"
 )
 
-//EntPortrait 大会员画像接口
+// EntPortrait 大会员画像接口
 type EntPortrait struct {
 	*xweb.Action
 	//中标企业画像
@@ -36,7 +36,7 @@ type EntPortrait struct {
 
 }
 
-//EntDetail 企业基本信息
+// EntDetail 企业基本信息
 func (this *EntPortrait) EntDetail() {
 	userId := qutil.ObjToString(this.GetSession("userId"))
 	rData, errMsg := func() (interface{}, error) {
@@ -57,7 +57,7 @@ func (this *EntPortrait) EntDetail() {
 	this.ServeJson(NewResult(rData, errMsg))
 }
 
-//WinnerContacts 中标企业历史联系人
+// WinnerContacts 中标企业历史联系人
 func (this *EntPortrait) WinnerContacts() {
 	userId := qutil.ObjToString(this.GetSession("userId"))
 	rData, errMsg := func() (interface{}, error) {
@@ -107,7 +107,7 @@ func (this *EntPortrait) WinnerSelects() {
 	this.ServeJson(NewResult(rData, errMsg))
 }
 
-//WinnerNewMsg 企业画像-最新项目动态
+// WinnerNewMsg 企业画像-最新项目动态
 func (this *EntPortrait) WinnerNewMsg() {
 	userId := qutil.ObjToString(this.GetSession("userId"))
 	rData, errMsg := func() (interface{}, error) {
@@ -153,7 +153,7 @@ func (this *EntPortrait) WinnerNewMsg() {
 	this.ServeJson(NewResult(rData, errMsg))
 }
 
-//WinnerNewMsgExport 企业画像-最新项目动态
+// WinnerNewMsgExport 企业画像-最新项目动态
 func (this *EntPortrait) WinnerNewMsgExport() {
 	userId := qutil.ObjToString(this.GetSession("userId"))
 	rData, errMsg := func() (interface{}, error) {
@@ -204,7 +204,7 @@ func (this *EntPortrait) WinnerNewMsgExport() {
 	this.ServeJson(NewResult(rData, errMsg))
 }
 
-//WinnerPortrait 企业画像-画像数据查询
+// WinnerPortrait 企业画像-画像数据查询
 func (this *EntPortrait) WinnerPortrait() {
 	userId := qutil.ObjToString(this.GetSession("userId"))
 	rData, errMsg := func() (interface{}, error) {
@@ -234,7 +234,7 @@ func (this *EntPortrait) WinnerPortrait() {
 	this.ServeJson(NewResult(rData, errMsg))
 }
 
-//WinnerMiniPortrait 三级页中标单位引流数据展示(免费)
+// WinnerMiniPortrait 三级页中标单位引流数据展示(免费)
 func (this *EntPortrait) WinnerMiniPortrait() {
 	userId := qutil.ObjToString(this.GetSession("userId"))
 	rData, errMsg := func() (interface{}, error) {
@@ -267,8 +267,8 @@ func (this *EntPortrait) WinnerMiniPortrait() {
 	this.ServeJson(NewResult(rData, errMsg))
 }
 
-//BuyerSelects 采购单位画像可供筛选的条件
-//dev.6.2.1免费用户可筛选画像
+// BuyerSelects 采购单位画像可供筛选的条件
+// dev.6.2.1免费用户可筛选画像
 func (this *EntPortrait) BuyerSelects() {
 	userId := qutil.ObjToString(this.GetSession("userId"))
 	rData, errMsg := func() (interface{}, error) {
@@ -289,7 +289,7 @@ func (this *EntPortrait) BuyerSelects() {
 	this.ServeJson(NewResult(rData, errMsg))
 }
 
-//BuyerNewMsg 采购单位画像-最新招标动态(免费用户仅可查看3条记录,付费50条)
+// BuyerNewMsg 采购单位画像-最新招标动态(免费用户仅可查看3条记录,付费50条)
 func (this *EntPortrait) BuyerNewMsg() {
 	userId := qutil.ObjToString(this.GetSession("userId"))
 	rData, errMsg := func() (interface{}, error) {
@@ -375,7 +375,7 @@ func (this *EntPortrait) BuyerNewMsgExport() {
 	this.ServeJson(NewResult(rData, errMsg))
 }
 
-//BuyerContacts 采购单位联系人(必须开通会员)
+// BuyerContacts 采购单位联系人(必须开通会员)
 func (this *EntPortrait) BuyerContacts() {
 	userId := qutil.ObjToString(this.GetSession("userId"))
 	rData, errMsg := func() (interface{}, error) {
@@ -401,7 +401,7 @@ func (this *EntPortrait) BuyerContacts() {
 	this.ServeJson(NewResult(rData, errMsg))
 }
 
-//BuyerPortrait 采购单位画像-数据(免费用户可查看基本信息、项目统计、合作企业资本、年龄及地区分布)
+// BuyerPortrait 采购单位画像-数据(免费用户可查看基本信息、项目统计、合作企业资本、年龄及地区分布)
 func (this *EntPortrait) BuyerPortrait() {
 	userId := qutil.ObjToString(this.GetSession("userId"))
 	rData, errMsg := func() (interface{}, error) {
@@ -421,6 +421,7 @@ func (this *EntPortrait) BuyerPortrait() {
 			ScopeClass: this.GetString("scopeClass"),
 			TimeRange:  this.GetString("timeRange"),
 			HasPower:   hasPower,
+			UserLevel:  1,
 		}, flag)
 		if err != nil {
 			return nil, err
@@ -433,7 +434,7 @@ func (this *EntPortrait) BuyerPortrait() {
 	this.ServeJson(NewResult(rData, errMsg))
 }
 
-//BuyerMiniPortrait 三级页采购单位引流数据展示(免费)
+// BuyerMiniPortrait 三级页采购单位引流数据展示(免费)
 func (this *EntPortrait) BuyerMiniPortrait() {
 	userId := qutil.ObjToString(this.GetSession("userId"))
 	rData, errMsg := func() (interface{}, error) {
@@ -500,7 +501,7 @@ func (this *EntPortrait) PortraitContacts() {
 	this.ServeJson(NewResult(rData, errMsg))
 }
 
-//formatContact 格式化混淆联系人电话
+// formatContact 格式化混淆联系人电话
 func formatContact(contactList []map[string]interface{}) (confusing []map[string]interface{}, total int) {
 	total = len(contactList)
 	deConfusingMap := make(map[string]bool) //去重

+ 7 - 2
src/jfw/modules/bigmember/src/service/portrait/subvipPortraitAction.go

@@ -334,7 +334,7 @@ func (this *SubVipPortrait) BuyerNewMsg() {
 		}
 		pageNum, _ := this.GetInteger("pageNum")
 		pageSize, _ := this.GetInteger("pageSize")
-		cepm, power, err, _ := entity.CreateSubVipPortraitManager(userId, "buyerPortrait", buyer, false, this.Session())
+		cepm, power, err, _ := entity.CreateSubVipPortraitManagerForOpen(userId, "buyerPortrait", buyer, false, this.Session())
 		if err != nil {
 			return nil, err
 		}
@@ -451,12 +451,16 @@ func (this *SubVipPortrait) BuyerPortrait() {
 		if buyerName == "" {
 			return nil, fmt.Errorf("参数异常")
 		}
-		cepm, power, err, _ := entity.CreateSubVipPortraitManager(userId, "buyerPortrait", buyerName, false, this.Session())
+		cepm, power, err, isFree := entity.CreateSubVipPortraitManagerForOpen(userId, "buyerPortrait", buyerName, false, this.Session())
 		cepm.Session = this.Session()
 		if err != nil {
 			return nil, err
 		}
 		flag := this.GetString("flag") //分段请求标识
+		userLevel := 3
+		if userId != "" {
+			userLevel = qutil.If(isFree, 2, 1).(int)
+		}
 		rData, err := cepm.BuyerPortraitData(&entity.PortraitScreen{
 			Ent:        buyerName,
 			Match:      this.GetString("match"),
@@ -466,6 +470,7 @@ func (this *SubVipPortrait) BuyerPortrait() {
 			ScopeClass: this.GetString("scopeClass"),
 			TimeRange:  this.GetString("timeRange"),
 			HasPower:   power > 1,
+			UserLevel:  userLevel,
 		}, flag)
 		if err != nil {
 			return nil, err

+ 2 - 2
src/jfw/modules/bigmember/src/service/report/marketAnalysis.go

@@ -98,8 +98,8 @@ func (this *MarketAnalysis) ProjectInfo() {
 
 // checkPower 权限校验
 func checkPower(session *httpsession.Session) (string, error) {
-	userId := fmt.Sprint(qutil.Int64All(session.Get("base_user_id")))
-	if userId == "" {
+	userid := fmt.Sprint(qutil.Int64All(session.Get("base_user_id")))
+	if userid == "" || userid == "0" {
 		return "", fmt.Errorf("未登录")
 	}
 	//仅购买《周报/月报/定制化市场分析报告》的大会员有权限

+ 6 - 0
src/jfw/modules/bigmember/src/service/report/report.go

@@ -195,6 +195,12 @@ func (r *Report) Detail() {
 
 // ProjectInfo 项目明细
 func (r *Report) ProjectInfo() {
+	// 判断登录
+	userId := qutil.ObjToString(r.GetSession("userId"))
+	if userId == "" {
+		r.ServeJson(Result{Error_code: Error_code_1001, Error_msg: Error_msg_1001})
+		return
+	}
 	//参数接收
 	body := xweb.FilterXSS(string(r.Body()))
 	param := entity.ReportProjectInfoParam{}

+ 2 - 1
src/jfw/modules/bigmember/src/service/search/search.go

@@ -67,7 +67,8 @@ func (s *Search) BuyerAssociation() {
 	result := func() Result {
 		name := s.GetString("name")
 		list := []string{}
-		r := elastic.Get("buyer", "buyer", fmt.Sprintf(`{"query": {"match_phrase": {"name": "%s"}},"_source": ["name"],"size": %d}`, name, 10))
+		size, _ := s.GetInteger("size")
+		r := elastic.Get("buyer", "buyer", fmt.Sprintf(`{"query": {"match_phrase": {"name": "%s"}},"_source": ["name"],"size": %d}`, name, qutil.If(size > 0, size, 10).(int)))
 		if r != nil {
 			for _, v := range *r {
 				list = append(list, qutil.ObjToString(v["name"]))

+ 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
+}

+ 51 - 45
src/jfw/modules/publicapply/src/go.mod

@@ -3,14 +3,14 @@ module jy/src/jfw/modules/publicapply/src
 go 1.18
 
 require (
-	app.yhyue.com/moapp/jybase v0.0.0-20230517064222-e0bdfc8ee0e8
+	app.yhyue.com/moapp/jybase v0.0.0-20230614085041-f8f20842d5cb
 	app.yhyue.com/moapp/jylog v0.0.0-20230522075550-05d7230ca545
-	app.yhyue.com/moapp/jypkg v0.0.0-20230517064346-54ec66481628
+	app.yhyue.com/moapp/jypkg v0.0.0-20230627060822-53aa53e4d064
 	bp.jydev.jianyu360.cn/BaseService/userCenter v1.2.13
 	github.com/SKatiyar/qr v0.0.0-20151201054752-25b6bdf44e67
 	github.com/gogf/gf/v2 v2.0.6
-	github.com/zeromicro/go-zero v1.4.4
-	go.mongodb.org/mongo-driver v1.11.1
+	github.com/zeromicro/go-zero v1.5.3
+	go.mongodb.org/mongo-driver v1.11.6
 )
 
 require (
@@ -25,60 +25,62 @@ require (
 	github.com/cenkalti/backoff/v4 v4.2.1 // indirect
 	github.com/cespare/xxhash/v2 v2.2.0 // indirect
 	github.com/clbanning/mxj/v2 v2.5.5 // indirect
-	github.com/coreos/go-semver v0.3.0 // indirect
-	github.com/coreos/go-systemd/v22 v22.3.2 // indirect
+	github.com/coreos/go-semver v0.3.1 // indirect
+	github.com/coreos/go-systemd/v22 v22.5.0 // indirect
 	github.com/davecgh/go-spew v1.1.1 // indirect
-	github.com/dchest/captcha v0.0.0-20200903113550-03f5f0333e1f // indirect
 	github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
-	github.com/fatih/color v1.13.0 // indirect
-	github.com/felixge/fgprof v0.9.3 // indirect
+	github.com/emicklei/go-restful/v3 v3.9.0 // indirect
+	github.com/fatih/color v1.15.0 // indirect
 	github.com/fsnotify/fsnotify v1.6.0 // indirect
 	github.com/garyburd/redigo v1.6.2 // indirect
 	github.com/go-logr/logr v1.2.4 // indirect
 	github.com/go-logr/stdr v1.2.2 // indirect
+	github.com/go-openapi/jsonpointer v0.19.6 // indirect
+	github.com/go-openapi/jsonreference v0.20.1 // indirect
+	github.com/go-openapi/swag v0.22.3 // indirect
 	github.com/go-redis/redis/v8 v8.11.5 // indirect
-	github.com/go-sql-driver/mysql v1.7.0 // indirect
+	github.com/go-sql-driver/mysql v1.7.1 // indirect
 	github.com/gogo/protobuf v1.3.2 // indirect
 	github.com/golang/mock v1.6.0 // indirect
-	github.com/golang/protobuf v1.5.2 // indirect
+	github.com/golang/protobuf v1.5.3 // indirect
 	github.com/golang/snappy v0.0.4 // indirect
 	github.com/gomodule/redigo v2.0.0+incompatible // indirect
+	github.com/google/gnostic v0.5.7-v3refs // indirect
 	github.com/google/go-cmp v0.5.9 // indirect
 	github.com/google/gofuzz v1.2.0 // indirect
-	github.com/google/pprof v0.0.0-20211214055906-6f57359322fd // indirect
-	github.com/googleapis/gnostic v0.5.5 // indirect
 	github.com/gorilla/websocket v1.5.0 // indirect
 	github.com/grokify/html-strip-tags-go v0.0.1 // indirect
-	github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 // indirect
+	github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.0 // indirect
 	github.com/hashicorp/hcl v1.0.0 // indirect
 	github.com/howeyc/fsnotify v0.9.0 // indirect
 	github.com/jinzhu/inflection v1.0.0 // indirect
 	github.com/jinzhu/now v1.1.1 // indirect
 	github.com/josharian/intern v1.0.0 // indirect
 	github.com/json-iterator/go v1.1.12 // indirect
-	github.com/klauspost/compress v1.15.11 // indirect
+	github.com/klauspost/compress v1.15.15 // indirect
 	github.com/longbridgeapp/sqlparser v0.3.1 // indirect
 	github.com/magiconair/properties v1.8.7 // indirect
 	github.com/mailru/easyjson v0.7.7 // indirect
-	github.com/mattn/go-colorable v0.1.12 // indirect
-	github.com/mattn/go-isatty v0.0.14 // indirect
+	github.com/mattn/go-colorable v0.1.13 // indirect
+	github.com/mattn/go-isatty v0.0.17 // indirect
 	github.com/mattn/go-runewidth v0.0.13 // indirect
-	github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect
+	github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
 	github.com/mitchellh/mapstructure v1.5.0 // indirect
 	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
 	github.com/modern-go/reflect2 v1.0.2 // indirect
 	github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect
+	github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
 	github.com/nsqio/go-nsq v1.1.0 // indirect
 	github.com/olekukonko/tablewriter v0.0.5 // indirect
 	github.com/olivere/elastic v6.2.37+incompatible // indirect
 	github.com/olivere/elastic/v7 v7.0.22 // indirect
 	github.com/openzipkin/zipkin-go v0.4.1 // indirect
-	github.com/pelletier/go-toml/v2 v2.0.6 // indirect
+	github.com/pelletier/go-toml/v2 v2.0.8 // indirect
 	github.com/pkg/errors v0.9.1 // indirect
-	github.com/prometheus/client_golang v1.13.0 // indirect
-	github.com/prometheus/client_model v0.2.0 // indirect
-	github.com/prometheus/common v0.37.0 // indirect
-	github.com/prometheus/procfs v0.8.0 // indirect
+	github.com/prometheus/client_golang v1.15.1 // indirect
+	github.com/prometheus/client_model v0.3.0 // indirect
+	github.com/prometheus/common v0.42.0 // indirect
+	github.com/prometheus/procfs v0.9.0 // indirect
 	github.com/rivo/uniseg v0.2.0 // indirect
 	github.com/sirupsen/logrus v1.8.3 // indirect
 	github.com/spaolacci/murmur3 v1.1.0 // indirect
@@ -95,34 +97,35 @@ require (
 	github.com/xdg-go/stringprep v1.0.3 // indirect
 	github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect
 	github.com/ziutek/blas v0.0.0-20190227122918-da4ca23e90bb // indirect
-	go.etcd.io/etcd/api/v3 v3.5.6 // indirect
-	go.etcd.io/etcd/client/pkg/v3 v3.5.6 // indirect
-	go.etcd.io/etcd/client/v3 v3.5.6 // indirect
+	go.etcd.io/etcd/api/v3 v3.5.9 // indirect
+	go.etcd.io/etcd/client/pkg/v3 v3.5.9 // indirect
+	go.etcd.io/etcd/client/v3 v3.5.9 // indirect
 	go.opentelemetry.io/otel v1.15.1 // indirect
 	go.opentelemetry.io/otel/exporters/jaeger v1.15.1 // indirect
 	go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.15.1 // indirect
 	go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.15.1 // indirect
 	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.15.1 // indirect
 	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.15.1 // indirect
+	go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.14.0 // indirect
 	go.opentelemetry.io/otel/exporters/zipkin v1.15.1 // indirect
 	go.opentelemetry.io/otel/sdk v1.15.1 // indirect
 	go.opentelemetry.io/otel/trace v1.15.1 // indirect
 	go.opentelemetry.io/proto/otlp v0.19.0 // indirect
-	go.uber.org/atomic v1.9.0 // indirect
-	go.uber.org/automaxprocs v1.5.1 // indirect
-	go.uber.org/multierr v1.8.0 // indirect
-	go.uber.org/zap v1.21.0 // indirect
-	golang.org/x/crypto v0.0.0-20221010152910-d6f0a8c073c2 // indirect
-	golang.org/x/net v0.8.0 // indirect
-	golang.org/x/oauth2 v0.4.0 // indirect
+	go.uber.org/atomic v1.10.0 // indirect
+	go.uber.org/automaxprocs v1.5.2 // indirect
+	go.uber.org/multierr v1.9.0 // indirect
+	go.uber.org/zap v1.24.0 // indirect
+	golang.org/x/crypto v0.6.0 // indirect
+	golang.org/x/net v0.10.0 // indirect
+	golang.org/x/oauth2 v0.7.0 // indirect
 	golang.org/x/sync v0.1.0 // indirect
-	golang.org/x/sys v0.7.0 // indirect
-	golang.org/x/term v0.6.0 // indirect
-	golang.org/x/text v0.8.0 // indirect
+	golang.org/x/sys v0.8.0 // indirect
+	golang.org/x/term v0.8.0 // indirect
+	golang.org/x/text v0.9.0 // indirect
 	golang.org/x/time v0.3.0 // indirect
 	google.golang.org/appengine v1.6.7 // indirect
-	google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f // indirect
-	google.golang.org/grpc v1.54.0 // indirect
+	google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect
+	google.golang.org/grpc v1.56.1 // indirect
 	google.golang.org/protobuf v1.30.0 // indirect
 	gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
 	gopkg.in/inf.v0 v0.9.1 // indirect
@@ -132,11 +135,14 @@ require (
 	gopkg.in/yaml.v3 v3.0.1 // indirect
 	gorm.io/driver/mysql v1.0.5 // indirect
 	gorm.io/gorm v1.21.3 // indirect
-	k8s.io/api v0.22.9 // indirect
-	k8s.io/apimachinery v0.22.9 // indirect
-	k8s.io/client-go v0.22.9 // indirect
-	k8s.io/klog/v2 v2.80.1 // indirect
-	k8s.io/utils v0.0.0-20221108210102-8e77b1f39fe2 // indirect
-	sigs.k8s.io/structured-merge-diff/v4 v4.2.1 // indirect
-	sigs.k8s.io/yaml v1.2.0 // indirect
+	jygit.jydev.jianyu360.cn/ApplicationCenter/publicService v0.0.0-20230626055559-2b719f6c6602 // indirect
+	k8s.io/api v0.26.3 // indirect
+	k8s.io/apimachinery v0.27.0-alpha.3 // indirect
+	k8s.io/client-go v0.26.3 // indirect
+	k8s.io/klog/v2 v2.90.1 // indirect
+	k8s.io/kube-openapi v0.0.0-20230307230338-69ee2d25a840 // indirect
+	k8s.io/utils v0.0.0-20230209194617-a36077c30491 // indirect
+	sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
+	sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect
+	sigs.k8s.io/yaml v1.3.0 // indirect
 )

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 81 - 473
src/jfw/modules/publicapply/src/go.sum


+ 1 - 1
src/jfw/modules/publicapply/src/npsValue/service/action.go

@@ -147,7 +147,7 @@ func CloudWord(w, p string, attr int) []string {
 		npswords = append(npswords, w)
 	} else if len(w) >= 10 {
 		words := jy.HttpEs(w, "ik_smart", db.DbConf.Elasticsearch.Main.Address)
-		npswords = strings.Split(words, "+")
+		npswords = strings.Split(jy.KeywordsProcessing(words, "+"), "+")
 		for idx, val := range hotwords {
 			exit := strings.Contains(w, val)
 			if exit {

+ 51 - 44
src/jfw/modules/subscribepay/src/go.mod

@@ -5,14 +5,14 @@ go 1.18
 require (
 	app.yhyue.com/moapp/jybase v0.0.0-20230614085041-f8f20842d5cb
 	app.yhyue.com/moapp/jylog v0.0.0-20230522075550-05d7230ca545
-	app.yhyue.com/moapp/jypkg v0.0.0-20230517064346-54ec66481628
+	app.yhyue.com/moapp/jypkg v0.0.0-20230627060822-53aa53e4d064
 	bp.jydev.jianyu360.cn/BaseService/pushpkg v0.0.0-20230225061813-384daf716c9d
 	bp.jydev.jianyu360.cn/BaseService/userCenter v1.2.13
 	github.com/SKatiyar/qr v0.0.0-20151201054752-25b6bdf44e67
 	github.com/gogf/gf/v2 v2.3.3
 	github.com/shopspring/decimal v1.3.1
 	github.com/tealeg/xlsx v1.0.5
-	go.mongodb.org/mongo-driver v1.11.2
+	go.mongodb.org/mongo-driver v1.11.6
 	gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22
 )
 
@@ -28,60 +28,63 @@ require (
 	github.com/cenkalti/backoff/v4 v4.2.1 // indirect
 	github.com/cespare/xxhash/v2 v2.2.0 // indirect
 	github.com/clbanning/mxj/v2 v2.5.5 // indirect
-	github.com/coreos/go-semver v0.3.0 // indirect
-	github.com/coreos/go-systemd/v22 v22.3.2 // indirect
+	github.com/coreos/go-semver v0.3.1 // indirect
+	github.com/coreos/go-systemd/v22 v22.5.0 // indirect
 	github.com/davecgh/go-spew v1.1.1 // indirect
 	github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
 	github.com/donnie4w/go-logger v0.0.0-20170827050443-4740c51383f4 // indirect
-	github.com/fatih/color v1.13.0 // indirect
-	github.com/felixge/fgprof v0.9.3 // indirect
+	github.com/emicklei/go-restful/v3 v3.9.0 // indirect
+	github.com/fatih/color v1.15.0 // indirect
 	github.com/fsnotify/fsnotify v1.6.0 // indirect
 	github.com/garyburd/redigo v1.6.2 // indirect
 	github.com/go-logr/logr v1.2.4 // indirect
 	github.com/go-logr/stdr v1.2.2 // indirect
+	github.com/go-openapi/jsonpointer v0.19.6 // indirect
+	github.com/go-openapi/jsonreference v0.20.1 // indirect
+	github.com/go-openapi/swag v0.22.3 // indirect
 	github.com/go-redis/redis/v8 v8.11.5 // indirect
-	github.com/go-sql-driver/mysql v1.7.0 // indirect
+	github.com/go-sql-driver/mysql v1.7.1 // indirect
 	github.com/gogo/protobuf v1.3.2 // indirect
-	github.com/golang-jwt/jwt/v4 v4.4.3 // indirect
+	github.com/golang-jwt/jwt/v4 v4.5.0 // indirect
 	github.com/golang/mock v1.6.0 // indirect
-	github.com/golang/protobuf v1.5.2 // indirect
+	github.com/golang/protobuf v1.5.3 // indirect
 	github.com/golang/snappy v0.0.4 // indirect
 	github.com/gomodule/redigo v2.0.0+incompatible // indirect
+	github.com/google/gnostic v0.5.7-v3refs // indirect
 	github.com/google/go-cmp v0.5.9 // indirect
 	github.com/google/gofuzz v1.2.0 // indirect
-	github.com/google/pprof v0.0.0-20211214055906-6f57359322fd // indirect
-	github.com/googleapis/gnostic v0.5.5 // indirect
 	github.com/gorilla/websocket v1.5.0 // indirect
 	github.com/grokify/html-strip-tags-go v0.0.1 // indirect
-	github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 // indirect
+	github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.0 // indirect
 	github.com/hashicorp/hcl v1.0.0 // indirect
 	github.com/howeyc/fsnotify v0.9.0 // indirect
 	github.com/jinzhu/inflection v1.0.0 // indirect
 	github.com/jinzhu/now v1.1.1 // indirect
 	github.com/josharian/intern v1.0.0 // indirect
 	github.com/json-iterator/go v1.1.12 // indirect
-	github.com/klauspost/compress v1.15.11 // indirect
+	github.com/klauspost/compress v1.15.15 // indirect
 	github.com/magiconair/properties v1.8.7 // indirect
 	github.com/mailru/easyjson v0.7.7 // indirect
-	github.com/mattn/go-colorable v0.1.12 // indirect
-	github.com/mattn/go-isatty v0.0.14 // indirect
+	github.com/mattn/go-colorable v0.1.13 // indirect
+	github.com/mattn/go-isatty v0.0.17 // indirect
 	github.com/mattn/go-runewidth v0.0.13 // indirect
-	github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect
+	github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
 	github.com/mitchellh/mapstructure v1.5.0 // indirect
 	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
 	github.com/modern-go/reflect2 v1.0.2 // indirect
 	github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect
+	github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
 	github.com/nsqio/go-nsq v1.1.0 // indirect
 	github.com/olekukonko/tablewriter v0.0.5 // indirect
 	github.com/olivere/elastic v6.2.37+incompatible // indirect
 	github.com/olivere/elastic/v7 v7.0.22 // indirect
 	github.com/openzipkin/zipkin-go v0.4.1 // indirect
-	github.com/pelletier/go-toml/v2 v2.0.6 // indirect
+	github.com/pelletier/go-toml/v2 v2.0.8 // indirect
 	github.com/pkg/errors v0.9.1 // indirect
-	github.com/prometheus/client_golang v1.13.0 // indirect
-	github.com/prometheus/client_model v0.2.0 // indirect
-	github.com/prometheus/common v0.37.0 // indirect
-	github.com/prometheus/procfs v0.8.0 // indirect
+	github.com/prometheus/client_golang v1.15.1 // indirect
+	github.com/prometheus/client_model v0.3.0 // indirect
+	github.com/prometheus/common v0.42.0 // indirect
+	github.com/prometheus/procfs v0.9.0 // indirect
 	github.com/rivo/uniseg v0.2.0 // indirect
 	github.com/sirupsen/logrus v1.8.3 // indirect
 	github.com/spaolacci/murmur3 v1.1.0 // indirect
@@ -95,35 +98,36 @@ require (
 	github.com/xdg-go/scram v1.1.1 // indirect
 	github.com/xdg-go/stringprep v1.0.3 // indirect
 	github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect
-	github.com/zeromicro/go-zero v1.4.4 // indirect
-	go.etcd.io/etcd/api/v3 v3.5.6 // indirect
-	go.etcd.io/etcd/client/pkg/v3 v3.5.6 // indirect
-	go.etcd.io/etcd/client/v3 v3.5.6 // indirect
+	github.com/zeromicro/go-zero v1.5.3 // indirect
+	go.etcd.io/etcd/api/v3 v3.5.9 // indirect
+	go.etcd.io/etcd/client/pkg/v3 v3.5.9 // indirect
+	go.etcd.io/etcd/client/v3 v3.5.9 // indirect
 	go.opentelemetry.io/otel v1.15.1 // indirect
 	go.opentelemetry.io/otel/exporters/jaeger v1.15.1 // indirect
 	go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.15.1 // indirect
 	go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.15.1 // indirect
 	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.15.1 // indirect
 	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.15.1 // indirect
+	go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.14.0 // indirect
 	go.opentelemetry.io/otel/exporters/zipkin v1.15.1 // indirect
 	go.opentelemetry.io/otel/sdk v1.15.1 // indirect
 	go.opentelemetry.io/otel/trace v1.15.1 // indirect
 	go.opentelemetry.io/proto/otlp v0.19.0 // indirect
-	go.uber.org/atomic v1.9.0 // indirect
-	go.uber.org/automaxprocs v1.5.1 // indirect
-	go.uber.org/multierr v1.8.0 // indirect
-	go.uber.org/zap v1.21.0 // indirect
-	golang.org/x/crypto v0.0.0-20221010152910-d6f0a8c073c2 // indirect
-	golang.org/x/net v0.8.0 // indirect
-	golang.org/x/oauth2 v0.4.0 // indirect
+	go.uber.org/atomic v1.10.0 // indirect
+	go.uber.org/automaxprocs v1.5.2 // indirect
+	go.uber.org/multierr v1.9.0 // indirect
+	go.uber.org/zap v1.24.0 // indirect
+	golang.org/x/crypto v0.6.0 // indirect
+	golang.org/x/net v0.10.0 // indirect
+	golang.org/x/oauth2 v0.7.0 // indirect
 	golang.org/x/sync v0.1.0 // indirect
-	golang.org/x/sys v0.7.0 // indirect
-	golang.org/x/term v0.6.0 // indirect
-	golang.org/x/text v0.8.0 // indirect
+	golang.org/x/sys v0.8.0 // indirect
+	golang.org/x/term v0.8.0 // indirect
+	golang.org/x/text v0.9.0 // indirect
 	golang.org/x/time v0.3.0 // indirect
 	google.golang.org/appengine v1.6.7 // indirect
-	google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f // indirect
-	google.golang.org/grpc v1.54.0 // indirect
+	google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect
+	google.golang.org/grpc v1.56.1 // indirect
 	google.golang.org/protobuf v1.30.0 // indirect
 	gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
 	gopkg.in/inf.v0 v0.9.1 // indirect
@@ -133,11 +137,14 @@ require (
 	gopkg.in/yaml.v3 v3.0.1 // indirect
 	gorm.io/driver/mysql v1.0.5 // indirect
 	gorm.io/gorm v1.21.3 // indirect
-	k8s.io/api v0.22.9 // indirect
-	k8s.io/apimachinery v0.22.9 // indirect
-	k8s.io/client-go v0.22.9 // indirect
-	k8s.io/klog/v2 v2.80.1 // indirect
-	k8s.io/utils v0.0.0-20221108210102-8e77b1f39fe2 // indirect
-	sigs.k8s.io/structured-merge-diff/v4 v4.2.1 // indirect
-	sigs.k8s.io/yaml v1.2.0 // indirect
+	jygit.jydev.jianyu360.cn/ApplicationCenter/publicService v0.0.0-20230626055559-2b719f6c6602 // indirect
+	k8s.io/api v0.26.3 // indirect
+	k8s.io/apimachinery v0.27.0-alpha.3 // indirect
+	k8s.io/client-go v0.26.3 // indirect
+	k8s.io/klog/v2 v2.90.1 // indirect
+	k8s.io/kube-openapi v0.0.0-20230307230338-69ee2d25a840 // indirect
+	k8s.io/utils v0.0.0-20230209194617-a36077c30491 // indirect
+	sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
+	sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect
+	sigs.k8s.io/yaml v1.3.0 // indirect
 )

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 86 - 498
src/jfw/modules/subscribepay/src/go.sum


+ 5 - 5
src/jfw/modules/subscribepay/src/service/dataExportPay.go

@@ -54,7 +54,7 @@ func dataExportPhoneAndMailCheck(sess *httpsession.Session) (phone, mail string,
 	return
 }
 
-//移动端创建订单
+// 移动端创建订单
 func (p *DataExportPay) CreateOrder() {
 	defer qutil.Catch()
 	openId, _ := p.GetSession("s_m_openid").(string)
@@ -246,7 +246,7 @@ func (p *DataExportPay) CreateOrder() {
 	p.ServeJson(result)
 }
 
-//获取价格
+// 获取价格
 func (p *DataExportPay) GetPrice() {
 	//获取数量
 	p.ServeJson(map[string]interface{}{
@@ -258,7 +258,7 @@ func (p *DataExportPay) GetPrice() {
 	})
 }
 
-//根据id获取导出条件
+// 根据id获取导出条件
 func (p *DataExportPay) HistoryById() {
 	id := p.GetString("id")
 	id = encrypt.SE.Decode4Hex(id)
@@ -310,12 +310,12 @@ func (k *KeywordExport) KeywordsFormat(wordsMode, searchMode int) (res []map[str
 	if searchMode == 1 && esAddrS != "" {
 		esAddr := strings.Split(esAddrS, ",")[0]
 		if ikWords := jy.HttpEs(k.Keyword, "ik_smart", esAddr); ikWords != "" {
-			k.Keyword = strings.ReplaceAll(ikWords, "+", " ")
+			k.Keyword = jy.KeywordsProcessing(strings.ReplaceAll(ikWords, "+", " "), " ")
 		}
 		if len(k.Appended) > 0 {
 			for kai, kav := range k.Appended {
 				if ikWords := jy.HttpEs(kav, "ik_smart", esAddr); ikWords != "" {
-					k.Appended[kai] = strings.ReplaceAll(ikWords, "+", " ")
+					k.Appended[kai] = jy.KeywordsProcessing(strings.ReplaceAll(ikWords, "+", " "), " ")
 				}
 			}
 		}

BIN
src/web/staticres/big-member/image/landpage_new/itemA_05.jpg


BIN
src/web/staticres/big-member/image/landpage_new/toubiaoImg/itemB1.png


BIN
src/web/staticres/big-member/image/landpage_new/toubiaoImg/itemB2.png


BIN
src/web/staticres/big-member/image/landpage_new/toubiaoImg/itemB3.png


BIN
src/web/staticres/big-member/image/landpage_new/toubiaoImg/itemB4.png


BIN
src/web/staticres/big-member/image/landpage_new/toubiaoImg/itemB5.png


BIN
src/web/staticres/big-member/image/landpage_new/toubiaoImg/itemB6.png


BIN
src/web/staticres/big-member/image/new_info/item-tb1.png


BIN
src/web/staticres/big-member/image/new_info/item-tb2-1.png


BIN
src/web/staticres/big-member/image/new_info/item-tb2-2.png


BIN
src/web/staticres/big-member/image/new_info/item-tb2-3.png


BIN
src/web/staticres/big-member/image/new_info/item-tb2-4.png


BIN
src/web/staticres/big-member/image/new_info/item-tb2-5.png


+ 5 - 5
src/web/staticres/big-member/js/chart_options.js

@@ -120,7 +120,7 @@ var chartOptions = {
                     top: 'middle',
                     style: {
                         fill: '#333',
-                        text: '类项目数量(个)',
+                        text: '类项目数量(个)',
                         font: '10px Microsoft YaHei'
                     }
                 }]
@@ -243,7 +243,7 @@ var chartOptions = {
             itemGap: 30,
         },
         series: [{
-            name: '类项目数量',
+            name: '类项目数量',
             type: 'heatmap',
             label: {
                 show: false
@@ -363,7 +363,7 @@ var chartOptions = {
         series: [
             {
                 type:'bar',
-                name:'类项目标书编制周期',
+                name:'类项目标书编制周期',
                 barWidth: 10,
                 barMaxWidth: 10,
                 itemStyle:{
@@ -425,7 +425,7 @@ var chartOptions = {
                         top: 'middle',
                         style: {
                             fill: '#333',
-                            text: '类项目标书编制周期',
+                            text: '类项目标书编制周期',
                             font: '11px Microsoft YaHei',
                             x: 8
                         }
@@ -789,7 +789,7 @@ var chartOptions = {
                 x:0,
                 y:1,
                 itemName: '行业',
-                value: "类项目规模", 
+                value: "类项目规模", 
             },
             labelLine: {
                 show:false

+ 13 - 13
src/web/staticres/big-member/js/contrast_trial.js

@@ -55,7 +55,7 @@ var CustomData = {
             sm: '利用招标大数据,结合项目知识工程,预测潜在新项目',
             merge: true,
             '预测采购项目': ['利用招标大数据,预测潜在项目的采购内容。', '2个'],
-            '类项目联系方式': ['提供类项目的联系人、联系方式等。', '2个'],
+            '类项目联系方式': ['提供类项目的联系人、联系方式等。', '2个'],
         },
         '中标企业预测': {
             sm: '通过大数据和AI技术,预测项目中标企业',
@@ -65,18 +65,18 @@ var CustomData = {
             '企业联系方式': ['提供企业的联系方式,一键可拨打联系人。', '2个'],
         },
         '投标决策分析': {
-            sm: '分析类项目,帮助企业决策是否投标或合作投标、以及投标报价金额等。',
-            '类项目动态': ['提供类项目的招标日期、招标截至日期、采购单位、代理机构、项目行业、金额等', '✅'],
-            '类项目筛选': ['通过项目行业、地区、采购内容、金额区间、采购单位类型筛选符合条件项目信息。', '✅'],
-            '类项目分析': ['通过大数据统计分析,提供近2-3年类项目数量、项目金额、涉及中标企业数量、涉及评标专家数量。', '✅'],
-            '类项目明细': ['提供类项目明细,包含项目的名称、采购方式、中标企业、评标专家、项目时间、预算、中标价、折扣率、中标候选人等。', '✅'],
-            '类项目采购历史': ['提供类项目的历史采购动态,项目名称、采购方式、时间等。', '✅'],
-            '类项目热点中标企业': ['根据类项目的历史中标数量、中标金额等综合评定企业竞争力,提供排名前十的企业。', '✅'],
-            '类项目标书编制周期发布': ['提供类项目的历史招标文件发放至投标截止时间(开标)时间间隔、项目数量,为投标人编制标书提供参考。', '✅'],
-            '类项目采购单位类型分布': ['提供采购规模排名前十的采购单位类型及规模占比、类项目规模、类项目数量、平均折扣率。', '✅'],
-            '类项目评标专家': ['通过大数据分析统计,提供类项目评标专家的频次排名。', '✅'],
-            '类项目区域分布': ['提供类项目的采购区域热度分布。', '✅'],
-            '类项目预算分布': ['提供类采购项目的预算金额分布。', '✅'],
+            sm: '分析类项目,帮助企业决策是否投标或合作投标、以及投标报价金额等。',
+            '类项目动态': ['提供类项目的招标日期、招标截至日期、采购单位、代理机构、项目行业、金额等', '✅'],
+            '类项目筛选': ['通过项目行业、地区、采购内容、金额区间、采购单位类型筛选符合条件项目信息。', '✅'],
+            '类项目分析': ['通过大数据统计分析,提供近2-3年类项目数量、项目金额、涉及中标企业数量、涉及评标专家数量。', '✅'],
+            '类项目明细': ['提供类项目明细,包含项目的名称、采购方式、中标企业、评标专家、项目时间、预算、中标价、折扣率、中标候选人等。', '✅'],
+            '类项目采购历史': ['提供类项目的历史采购动态,项目名称、采购方式、时间等。', '✅'],
+            '类项目热点中标企业': ['根据类项目的历史中标数量、中标金额等综合评定企业竞争力,提供排名前十的企业。', '✅'],
+            '类项目标书编制周期发布': ['提供类项目的历史招标文件发放至投标截止时间(开标)时间间隔、项目数量,为投标人编制标书提供参考。', '✅'],
+            '类项目采购单位类型分布': ['提供采购规模排名前十的采购单位类型及规模占比、类项目规模、类项目数量、平均折扣率。', '✅'],
+            '类项目评标专家': ['通过大数据分析统计,提供类项目评标专家的频次排名。', '✅'],
+            '类项目区域分布': ['提供类项目的采购区域热度分布。', '✅'],
+            '类项目预算分布': ['提供类采购项目的预算金额分布。', '✅'],
         }
     },
     '招标大数据服务': {

+ 13 - 13
src/web/staticres/big-member/js/meauContact.js

@@ -309,44 +309,44 @@ var TBJC = [
   {
     '投标决策分析':[
       {
-        two: '类项目明细',
+        two: '类项目明细',
         three: '采购单位历史项目信息明细',
         four: 'icon-close',
         five: 'icon-tick'
       },
       {
-        two: '类项目评标专家分析',
-        three: '通过大数据分析统计,提供类项目评标专家的频次排名。',
+        two: '类项目评标专家分析',
+        three: '通过大数据分析统计,提供类项目评标专家的频次排名。',
         four: 'icon-close',
         five: 'icon-tick'
       },
       {
-        two: '类项目热点中标企业',
-        three: '根据类项目的历史中标数量、中标金额等综合评定企业竞争力,提供排名前十的企业。',
+        two: '类项目热点中标企业',
+        three: '根据类项目的历史中标数量、中标金额等综合评定企业竞争力,提供排名前十的企业。',
         four: 'icon-close',
         five: 'icon-tick'
       },
       {
-        two: '类项目区域分布',
-        three: '提供类项目的采购区域热度分布情况统计图表。',
+        two: '类项目区域分布',
+        three: '提供类项目的采购区域热度分布情况统计图表。',
         four: 'icon-close',
         five: 'icon-tick'
       },
       {
-        two: '类项目预算分布',
-        three: '提供类采购项目的预算金额价格区间分布情况统计图表。',
+        two: '类项目预算分布',
+        three: '提供类采购项目的预算金额价格区间分布情况统计图表。',
         four: 'icon-close',
         five: 'icon-tick'
       },
       {
-        two: '类项目采购单位类型分布',
-        three: '提供类采购项目的预算金额价格区间分布情况统计图表。',
+        two: '类项目采购单位类型分布',
+        three: '提供类采购项目的预算金额价格区间分布情况统计图表。',
         four: 'icon-close',
         five: 'icon-tick'
       },
       {
-        two: '类项目标书编制周期',
-        three: '提供类项目采购单位的各行业分类占比情况统计图表。',
+        two: '类项目标书编制周期',
+        three: '提供类项目采购单位的各行业分类占比情况统计图表。',
         four: 'icon-close',
         five: 'icon-tick'
       }

+ 26 - 26
src/web/staticres/big-member/js/previewTable.js

@@ -59,7 +59,7 @@ var AllData = {
         '潜在项目预测推送': {
             sm: '利用招标大数据,预测潜在项目的采购内容',
             '预测采购项目': ['利用招标大数据,预测潜在项目的采购内容。','-','✅','✅'],
-            '类项目联系方式': ['提供类项目的联系人、联系方式等。','-','✅','✅'],
+            '类项目联系方式': ['提供类项目的联系人、联系方式等。','-','✅','✅'],
         },
         '中标企业预测': {
             sm: '通过大数据、AI技术预测项目中标企业。',
@@ -69,18 +69,18 @@ var AllData = {
             '企业联系方式': ['提供企业的联系方式,一键可拨打联系人。','-','200个','200个'],
         },
         '投标决策分析': {
-            sm: '分析类项目,帮助企业决策是否投标或合作投标、以及投标报价金额等。',
-            '类项目动态': ['提供类项目的招标日期、招标截至日期、采购单位、代理机构、项目行业、金额等','-','✅','✅'],
-            '类项目筛选': ['通过项目行业、地区、采购内容、金额区间、采购单位类型筛选符合条件项目信息。','-','✅','✅'],
-            '类项目分析': ['通过大数据统计分析,提供近2-3年类项目数量、项目金额、涉及中标企业数量、涉及评标专家数量。','-','✅','✅'],
-            '类项目明细': ['提供类项目明细,包含项目的名称、采购方式、中标企业、评标专家、项目时间、预算、中标价、折扣率、中标候选人等。','-','✅','✅'],
-            '类项目采购历史': ['提供类项目的历史采购动态,项目名称、采购方式、时间等。','-','✅','✅'],
-            '类项目热点中标企业': ['根据类项目的历史中标数量、中标金额等综合评定企业竞争力,提供排名前十的企业。','-','✅','✅'],
-            '类项目标书编制周期发布': ['提供类项目的历史招标文件发放至投标截止时间(开标)时间间隔、项目数量,为投标人编制标书提供参考。','-','✅','✅'],
-            '类项目采购单位类型分布': ['提供采购规模排名前十的采购单位类型及规模占比、类项目规模、类项目数量、平均折扣率。','-','✅','✅'],
-            '类项目评标专家': ['通过大数据分析统计,提供类项目评标专家的频次排名。','-','✅','✅'],
-            '类项目区域分布': ['提供类项目的采购区域热度分布。','-','✅','✅'],
-            '类项目预算分布': ['提供类采购项目的预算金额分布。','-','✅','✅'],
+            sm: '分析类项目,帮助企业决策是否投标或合作投标、以及投标报价金额等。',
+            '类项目动态': ['提供类项目的招标日期、招标截至日期、采购单位、代理机构、项目行业、金额等','-','✅','✅'],
+            '类项目筛选': ['通过项目行业、地区、采购内容、金额区间、采购单位类型筛选符合条件项目信息。','-','✅','✅'],
+            '类项目分析': ['通过大数据统计分析,提供近2-3年类项目数量、项目金额、涉及中标企业数量、涉及评标专家数量。','-','✅','✅'],
+            '类项目明细': ['提供类项目明细,包含项目的名称、采购方式、中标企业、评标专家、项目时间、预算、中标价、折扣率、中标候选人等。','-','✅','✅'],
+            '类项目采购历史': ['提供类项目的历史采购动态,项目名称、采购方式、时间等。','-','✅','✅'],
+            '类项目热点中标企业': ['根据类项目的历史中标数量、中标金额等综合评定企业竞争力,提供排名前十的企业。','-','✅','✅'],
+            '类项目标书编制周期发布': ['提供类项目的历史招标文件发放至投标截止时间(开标)时间间隔、项目数量,为投标人编制标书提供参考。','-','✅','✅'],
+            '类项目采购单位类型分布': ['提供采购规模排名前十的采购单位类型及规模占比、类项目规模、类项目数量、平均折扣率。','-','✅','✅'],
+            '类项目评标专家': ['通过大数据分析统计,提供类项目评标专家的频次排名。','-','✅','✅'],
+            '类项目区域分布': ['提供类项目的采购区域热度分布。','-','✅','✅'],
+            '类项目预算分布': ['提供类采购项目的预算金额分布。','-','✅','✅'],
         }
     },
     '招标大数据服务': {
@@ -243,7 +243,7 @@ var CustomData = {
       sm: '利用招标大数据,预测潜在项目的采购内容',
       merge: true,
       '预测采购项目': ['利用招标大数据,预测潜在项目的采购内容。','2个'],
-      '类项目联系方式': ['提供类项目的联系人、联系方式等。','2个'],
+      '类项目联系方式': ['提供类项目的联系人、联系方式等。','2个'],
     },
     '中标企业预测': {
       sm: '通过大数据、AI技术预测项目中标企业。',
@@ -253,18 +253,18 @@ var CustomData = {
       '企业联系方式': ['提供企业的联系方式,一键可拨打联系人。','2个'],
     },
     '投标决策分析': {
-      sm: '分析类项目,帮助企业决策是否投标或合作投标、以及投标报价金额等。',
-      '类项目动态': ['提供类项目的招标日期、招标截至日期、采购单位、代理机构、项目行业、金额等','✅'],
-      '类项目筛选': ['通过项目行业、地区、采购内容、金额区间、采购单位类型筛选符合条件项目信息。','✅'],
-      '类项目分析': ['通过大数据统计分析,提供近2-3年类项目数量、项目金额、涉及中标企业数量、涉及评标专家数量。','✅'],
-      '类项目明细': ['提供类项目明细,包含项目的名称、采购方式、中标企业、评标专家、项目时间、预算、中标价、折扣率、中标候选人等。','✅'],
-      '类项目采购历史': ['提供类项目的历史采购动态,项目名称、采购方式、时间等。','✅'],
-      '类项目热点中标企业': ['根据类项目的历史中标数量、中标金额等综合评定企业竞争力,提供排名前十的企业。','✅'],
-      '类项目标书编制周期发布': ['提供类项目的历史招标文件发放至投标截止时间(开标)时间间隔、项目数量,为投标人编制标书提供参考。','✅'],
-      '类项目采购单位类型分布': ['提供采购规模排名前十的采购单位类型及规模占比、类项目规模、类项目数量、平均折扣率。','✅'],
-      '类项目评标专家': ['通过大数据分析统计,提供类项目评标专家的频次排名。','✅'],
-      '类项目区域分布': ['提供类项目的采购区域热度分布。','✅'],
-      '类项目预算分布': ['提供类采购项目的预算金额分布。','✅'],
+      sm: '分析类项目,帮助企业决策是否投标或合作投标、以及投标报价金额等。',
+      '类项目动态': ['提供类项目的招标日期、招标截至日期、采购单位、代理机构、项目行业、金额等','✅'],
+      '类项目筛选': ['通过项目行业、地区、采购内容、金额区间、采购单位类型筛选符合条件项目信息。','✅'],
+      '类项目分析': ['通过大数据统计分析,提供近2-3年类项目数量、项目金额、涉及中标企业数量、涉及评标专家数量。','✅'],
+      '类项目明细': ['提供类项目明细,包含项目的名称、采购方式、中标企业、评标专家、项目时间、预算、中标价、折扣率、中标候选人等。','✅'],
+      '类项目采购历史': ['提供类项目的历史采购动态,项目名称、采购方式、时间等。','✅'],
+      '类项目热点中标企业': ['根据类项目的历史中标数量、中标金额等综合评定企业竞争力,提供排名前十的企业。','✅'],
+      '类项目标书编制周期发布': ['提供类项目的历史招标文件发放至投标截止时间(开标)时间间隔、项目数量,为投标人编制标书提供参考。','✅'],
+      '类项目采购单位类型分布': ['提供采购规模排名前十的采购单位类型及规模占比、类项目规模、类项目数量、平均折扣率。','✅'],
+      '类项目评标专家': ['通过大数据分析统计,提供类项目评标专家的频次排名。','✅'],
+      '类项目区域分布': ['提供类项目的采购区域热度分布。','✅'],
+      '类项目预算分布': ['提供类采购项目的预算金额分布。','✅'],
     }
   },
   '招标大数据服务': {

+ 2 - 1
src/web/staticres/big-member/js/unit_portrayal.js

@@ -125,7 +125,8 @@ var vNode = {
               isFree: false,
               vipStatus: false,
               viper: false,
-              entniche: false
+              entniche: false,
+              isLogin: true // 用户是否登录
             },
             usageInfo: {
               total: 0,

+ 209 - 0
src/web/staticres/common-module/analysis-filter/css/analysis-filter.css

@@ -0,0 +1,209 @@
+.analysis-filter .van-cell::after{
+  border: 0.5px solid rgba(0, 0, 0, 0.05);
+  left: .32rem;
+  right: .32rem;
+}
+/* .analysis-filter .time-cell.van-cell::after {
+  content: '';
+  border: 0.5px solid rgba(0, 0, 0, 0.05);
+  left: .32rem;
+  right: .32rem;
+} */
+
+.analysis-filter .van-cell{
+  padding: .24rem .32rem;
+  flex-direction: column;
+}
+.analysis-filter .van-popover__wrapper .van-cell::after{
+  content: '';
+  display: inline;
+}
+.analysis-filter .van-cell.van-cell--required::before {
+  left: .36rem;
+  font-size: .28rem;
+}
+.analysis-filter .van-cell .van-cell--required::before {
+  left: .36rem;
+  font-size: .28rem;
+}
+.analysis-filter .buyer-label{
+  padding-left: .18rem;
+}
+.analysis-filter .van-cell.van-cell--required .van-cell__title{
+  padding-left: .18rem;
+}
+.analysis-filter .van-icon.van-icon-arrow {
+  position: absolute;
+  right: .32rem;
+  top: .8rem;
+}
+.analysis-filter .van-cell__title.van-field__label {
+  font-size: .28rem;
+  color: #5F5E64;
+  line-height: .4rem;
+  width: 100%;
+}
+.analysis-filter .van-cell__value {
+  margin-top: .16rem;
+}
+.analysis-filter .van-cell__value ::-webkit-input-placeholder {
+  color: #C0C4CC;
+  font-size: .32rem;
+  line-height: .48rem;
+}
+.analysis-filter .van-field__error-message{
+  color: #FB483D;
+  font-size: .24rem;
+  line-height: .36rem;
+  margin-top: .08rem;
+}
+.analysis-filter .van-field__control{
+  font-size: .32rem;
+  white-space: pre-wrap;
+  word-wrap: break-word;
+}
+
+.analysis-filter .van-field__control::-webkit-scrollbar {
+  display: none;
+}
+
+.analysis-filter .van-cell.buyer-conetent .van-field__control{
+  padding: .12rem .9rem .12rem .24rem;
+  background: #FFFFFF;
+/* Line/#000000_10% */
+  border: 0.5px solid rgba(0, 0, 0, 0.1);
+  border-radius: 4px;
+  color: #171826;
+}
+
+.analysis-filter .van-cell.buyer-conetent .van-field__word-limit{
+  position: absolute;
+  right: 1.4rem;
+  top: .12rem;
+  color: #9B9CA3;
+  font-size: .22rem;
+  line-height: .4rem;
+}
+.analysis-filter .van-cell.buyer-conetent .addkeys{
+  padding: .12rem .24rem;
+  background: #2ABED1;
+  border-radius: 4px;
+  border: none;
+  color: #FFFFFF;
+  font-size: .26rem;
+}
+
+.select_time .van-cell{
+  padding: 0 .32rem;
+  height: 1.08rem;
+}
+.select_time .van-cell::after{
+  border-bottom: 0.5px solid rgba(0, 0, 0, 0.05);
+}
+.select_time .van-cell.van-dropdown-item__option{
+  font-size: .28rem;
+  color: #5F5E64;
+}
+.select_time .van-cell.activeColor{
+  color: #2ABED1;
+}
+.select_time .van-cell .select_active{
+  width: .48rem;
+  height: .48rem;
+}
+.select_time .van-icon::before {
+  font-size: .4rem;
+}
+
+.select_time .van-picker-column__item--selected {
+  background: rgba(42, 190, 209, 0.05);
+  color: #2ABED1;
+  height: .8rem;
+}
+
+.project-analysis-main{
+  min-height: .64rem;
+  max-height: 8rem;
+  overflow: scroll;
+}
+.project-analysis-main .list{
+  font-size: .32rem;
+}
+.analysis-filter .van-popover__wrapper{
+  width: 100%;
+}
+
+.analysis-filter .key-list {
+  display: flex;
+  align-items: center;
+  flex-wrap: wrap;
+  word-break: break-all;
+  margin-top: .16rem;
+}
+.analysis-filter .key-list .key-item{
+  width: fit-content;
+  display: flex;
+  align-items: center;
+  padding: .12rem .2rem;
+  background: #F5F6F7;
+  border-radius: 4px;
+}
+.analysis-filter .key-list .icon_close{
+  margin-left: .08rem;
+  width: .32rem;
+  height: .32rem;
+  background: url('../image/icon_close.png') no-repeat;
+  background-size: contain;
+}
+
+.analysis-filter .j-button-group{
+  padding: .26rem .32rem;
+}
+
+
+.icon-search{
+  width: .4rem;
+  height: .4rem;
+  margin-right: .16rem;
+}
+.r-list > li > a{
+  display: block;
+  padding: .24rem .32rem;
+}
+.l-title{
+  display: flex;
+  font-size: .28rem;
+  color: #171826;
+  line-height: .4rem;
+}
+.l-title > span{
+  flex: 1;
+}
+.l-info{
+  padding-top: .16rem;
+  padding-left: .56rem;
+}
+.l-info p{
+  color: #9B9CA3;
+  font-size: .24rem;
+  line-height: .36rem;
+}
+
+.van-popup.van-popover {
+  width: 92%;
+  left: 0.5rem;
+}
+
+.van-popover__arrow {
+  display: none;
+}
+.van-hairline--top-bottom::after, .van-hairline-unset--top-bottom::after {
+  border-width: 0px 0px 1px;
+}
+.select_time.select_area .van-hairline--top-bottom::after, .van-hairline-unset--top-bottom::after {
+  border-width: 0px;
+}
+
+.select-year-time{
+  padding-bottom: .48rem;
+}

BIN
src/web/staticres/common-module/analysis-filter/image/icon_close.png


BIN
src/web/staticres/common-module/analysis-filter/image/right.png


Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно