Pārlūkot izejas kodu

Merge branch 'master' into feature/v4.8.33

lianbingjie 2 gadi atpakaļ
vecāks
revīzija
2b929a53fe
66 mainītis faili ar 4806 papildinājumiem un 1934 dzēšanām
  1. 207 33
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/css/analysis_result.css
  2. BIN
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/image/bid_bg.png
  3. BIN
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/image/landpage_new/itemA_05.jpg
  4. BIN
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/image/landpage_new/toubiaoImg/itemB1.png
  5. BIN
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/image/landpage_new/toubiaoImg/itemB2.png
  6. BIN
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/image/landpage_new/toubiaoImg/itemB3.png
  7. BIN
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/image/landpage_new/toubiaoImg/itemB4.png
  8. BIN
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/image/landpage_new/toubiaoImg/itemB5.png
  9. BIN
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/image/landpage_new/toubiaoImg/itemB6.png
  10. 258 0
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/analysis_pro_list.js
  11. 609 240
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/analysis_result.js
  12. 6 6
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/chart_options.js
  13. 13 13
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/contrast_trial.js
  14. 1 1
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/main_root_data.js
  15. 1 1
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/mock.js
  16. 35 2
      src/jfw/modules/app/src/web/templates/big-member/page_ai_add.html
  17. 1 1
      src/jfw/modules/app/src/web/templates/big-member/page_analysis_filter.html
  18. 299 223
      src/jfw/modules/app/src/web/templates/big-member/page_analysis_result.html
  19. 103 0
      src/jfw/modules/app/src/web/templates/big-member/page_bid_analysis_pro_list.html
  20. 0 0
      src/jfw/modules/app/src/web/templates/big-member/page_contrast.html
  21. 1 1
      src/jfw/modules/app/src/web/templates/big-member/page_landingPage.html
  22. 1 1
      src/jfw/modules/app/src/web/templates/big-member/page_landingPage_old.html
  23. 6 6
      src/jfw/modules/app/src/web/templates/big-member/page_landingPage_old_1.html
  24. 1 1
      src/jfw/modules/app/src/web/templates/big-member/page_ontrial_landingPage.html
  25. 2 2
      src/jfw/modules/app/src/web/templates/big-member/page_pro_follow_detail.html
  26. 3 3
      src/jfw/modules/app/src/web/templates/weixin/wxinfocontent.html
  27. 264 77
      src/jfw/modules/bigmember/src/entity/analysis.go
  28. 261 204
      src/jfw/modules/bigmember/src/entity/analysisEntName.go
  29. 77 41
      src/jfw/modules/bigmember/src/service/analysis/analysis.go
  30. 967 793
      src/jfw/modules/bigmember/src/service/analysis/decision.go
  31. 691 179
      src/jfw/modules/bigmember/src/service/analysis/esquery.go
  32. 2 0
      src/jfw/modules/bigmember/src/service/analysis/power.go
  33. 9 11
      src/jfw/modules/bigmember/src/service/analysis/util.go
  34. 91 0
      src/jfw/modules/bigmember/src/util/util.go
  35. BIN
      src/web/staticres/big-member/image/landpage_new/itemA_05.jpg
  36. BIN
      src/web/staticres/big-member/image/landpage_new/toubiaoImg/itemB1.png
  37. BIN
      src/web/staticres/big-member/image/landpage_new/toubiaoImg/itemB2.png
  38. BIN
      src/web/staticres/big-member/image/landpage_new/toubiaoImg/itemB3.png
  39. BIN
      src/web/staticres/big-member/image/landpage_new/toubiaoImg/itemB4.png
  40. BIN
      src/web/staticres/big-member/image/landpage_new/toubiaoImg/itemB5.png
  41. BIN
      src/web/staticres/big-member/image/landpage_new/toubiaoImg/itemB6.png
  42. 5 5
      src/web/staticres/big-member/js/chart_options.js
  43. 13 13
      src/web/staticres/big-member/js/contrast_trial.js
  44. 13 13
      src/web/staticres/big-member/js/meauContact.js
  45. 26 26
      src/web/staticres/big-member/js/previewTable.js
  46. 209 0
      src/web/staticres/common-module/analysis-filter/css/analysis-filter.css
  47. BIN
      src/web/staticres/common-module/analysis-filter/image/icon_close.png
  48. BIN
      src/web/staticres/common-module/analysis-filter/image/right.png
  49. 482 0
      src/web/staticres/common-module/analysis-filter/js/analysis-filter.js
  50. 5 5
      src/web/staticres/common-module/collection/js/chart_options.js
  51. 109 0
      src/web/staticres/common-module/public/js/china-province-data.js
  52. 4 4
      src/web/staticres/demo-member/js/demo_action_data.js
  53. 3 1
      src/web/staticres/public-pc/js/article-content.js
  54. 0 0
      src/web/templates/big-member/pc/page_custom.html
  55. 2 2
      src/web/templates/big-member/pc/page_index.html
  56. 6 6
      src/web/templates/big-member/pc/page_index_old.html
  57. 1 1
      src/web/templates/big-member/pc/page_qz.html
  58. 3 3
      src/web/templates/big-member/pc/page_tb.html
  59. 1 1
      src/web/templates/big-member/pc/page_zb.html
  60. 1 1
      src/web/templates/big-member/wx/page_analysis_filter.html
  61. 0 0
      src/web/templates/big-member/wx/page_index.html
  62. 1 1
      src/web/templates/big-member/wx/page_landingPage.html
  63. 6 6
      src/web/templates/big-member/wx/page_landingPage2.html
  64. 1 1
      src/web/templates/big-member/wx/page_landingPage_old.html
  65. 3 3
      src/web/templates/frontRouter/pc/serviceSystem/free/index.html
  66. 3 3
      src/web/templates/pc/biddetail_rec.html

+ 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",

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

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 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() {

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

@@ -2752,10 +2752,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
 }

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

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 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 {

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

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


+ 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年类项目数量、项目金额、涉及中标企业数量、涉及评标专家数量。','✅'],
+      '类项目明细': ['提供类项目明细,包含项目的名称、采购方式、中标企业、评标专家、项目时间、预算、中标价、折扣率、中标候选人等。','✅'],
+      '类项目采购历史': ['提供类项目的历史采购动态,项目名称、采购方式、时间等。','✅'],
+      '类项目热点中标企业': ['根据类项目的历史中标数量、中标金额等综合评定企业竞争力,提供排名前十的企业。','✅'],
+      '类项目标书编制周期发布': ['提供类项目的历史招标文件发放至投标截止时间(开标)时间间隔、项目数量,为投标人编制标书提供参考。','✅'],
+      '类项目采购单位类型分布': ['提供采购规模排名前十的采购单位类型及规模占比、类项目规模、类项目数量、平均折扣率。','✅'],
+      '类项目评标专家': ['通过大数据分析统计,提供类项目评标专家的频次排名。','✅'],
+      '类项目区域分布': ['提供类项目的采购区域热度分布。','✅'],
+      '类项目预算分布': ['提供类采购项目的预算金额分布。','✅'],
     }
   },
   '招标大数据服务': {

+ 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


+ 482 - 0
src/web/staticres/common-module/analysis-filter/js/analysis-filter.js

@@ -0,0 +1,482 @@
+var analysisTemp = `
+<div class="analysis-filter">
+  <van-form @submit="onSubmit" class="j-container">
+    <van-cell-group inset>
+      <van-popover :show-arrow="false" :close-on-click-action="true" :close-on-click-outside="true" v-model="showPopover">
+        <template #reference>
+          <van-field
+            :value="filters.pname"
+            @input="setProName"
+            name="projectName"
+            label="项目名称"
+            rows="1"
+            autosize
+            type="textarea"
+            placeholder="请输入项目名称"
+            :rules="[{ required: false, message: '请输入项目名称' }]"
+          ></van-field>
+        </template>
+        <div class="project-analysis-main">
+          <ul class="r-list">
+              <li class="list" v-for="item in projectArr" :key="item.s_id">
+                  <a href="javascript:;" @click.prevent="onSelect(item, 'project')">
+                      <div class="l-title">
+                          <i class="j-icon base-icon icon-search"></i>
+                          <span>{{item.projectname}}</span>
+                      </div>
+                      <div class="l-info">
+                          <p class="van-ellipsis">采购单位:{{item.buyer}}</p>
+                          <p>采购时间:{{item.firsttime}}</p>
+                      </div>
+                  </a>
+              </li>
+          </ul>
+        </div>
+      </van-popover>
+      <van-popover :show-arrow="false" :close-on-click-action="true" :close-on-click-outside="true" v-model="showBuyerPopover">
+        <template #reference>
+          <van-field
+            required
+            @input="setBuyerName"
+            v-model="filters.buyer"
+            name="buyer"
+            label="采购单位"
+            rows="1"
+            autosize
+            type="textarea"
+            placeholder="请输入采购单位名称"
+            :rules="[{ required: true, message: '采购单位名称为必填项' }]"
+          ></van-field>
+        </template>
+        <div class="project-analysis-main">
+          <ul class="r-list">
+            <li class="list" v-for="item in buyerArr" :key="item.s_id">
+              <a href="javascript:;" @click.prevent="onSelect(item, 'buyer')">
+                  <div class="l-title">
+                    <span>{{ item.buyer }}</span>
+                  </div>
+              </a>
+            </li>
+          </ul>
+        </div>
+      </van-popover>
+      <van-field
+        autosize
+        label-class="van-cell--required"
+        @start-validate="startValidate"
+        class="buyer-conetent"
+        v-model="filters.keys"
+        name="buyerContent"
+        maxlength="15"
+        show-word-limit
+        placeholder="请输入采购内容"
+        :rules="buyerRules"
+      >
+        <template #label>
+          <div class="buyer-content">
+            <div class="buyer-label">采购内容</div>
+            <div class="key-list">
+              <div style="margin: .16rem .16rem 0 0" v-for="(item, index) in buyerContent" :key="index">
+                <div class="key-item" v-for="(key, i) in item.key" :key="i">
+                  <span v-html="key"></span>
+                  <div @click="deleteKey(key)" class="icon_close"></div>
+                </div>
+              </div>
+            </div>
+          </div>
+        </template>
+        <template #button>
+          <button type="button" :disabled="filters.keys==''" class='addkeys' @click="addKeys" size="small">添加</button>
+        </template>
+      </van-field>
+      <van-field
+        required
+        @click="setOpenPopup('area')"
+        is-link
+        readonly
+        v-model="filters.area"
+        name="winner"
+        label="项目地区"
+        placeholder="请选择地区"
+        :rules="[{ required: true, message: '地区为必填项' }]"
+      ></van-field>
+      <van-field
+        is-link
+        class='time-cell'
+        readonly
+        @click="setOpenPopup('time')"
+        v-model="filters.limitTime"
+        name="winner"
+        label="同类项目成交时间"
+        placeholder="请选择时间"
+        :rules="[{ required: false, message: '请选择时间' }]"
+      ></van-field>
+    </van-cell-group>
+    <div class="j-footer">
+      <div class="j-button-group">
+        <button class="j-button-confirm" round block type="primary" native-type="submit">
+          开始分析
+        </button>
+      </div>
+    </div>
+  </van-form>
+  <van-popup
+    v-model="filtersPopup.area"
+    closeable
+    round
+    position="bottom"
+    close-icon="clear"
+    :lazy-render="false"
+    class="j-popup collection select_time select_area"
+    overlay-class="j-overlay"
+    :style="{ height: '46%' }"
+    get-container="body">
+    <div class="j-container report-popup">
+        <div class="popup-header header-title">请选择地区</div>
+        <div class="j-main">
+          <van-picker
+            ref="picker"
+            :show-toolbar="false"
+            :columns="columns"
+          ></van-picker>
+        </div>
+        <div class="j-footer">
+          <div class="j-button-group">
+            <button class="j-button-confirm van-picker__confirm" @click="onAreaConfirm">确认</button>
+          </div>
+        </div>
+    </div>
+  </van-popup>
+  <van-popup
+    v-model="filtersPopup.time"
+    closeable
+    round
+    position="bottom"
+    close-icon="clear"
+    class="j-popup collection select_time select-year-time"
+    :lazy-render="false"
+    overlay-class="j-overlay"
+    get-container="body">
+    <div class="j-container report-popup">
+        <div class="popup-header header-title">请选择时间</div>
+        <div class="j-main">
+          <van-cell center :class="{'activeColor': item.active}" @click="setSortRules(item)" :title="item.text" v-for="(item, index) in sortOption" :key="index">
+            <template #right-icon>
+              <img v-if="item.active" class="select_active" src="/common-module/analysis-filter/image/right.png" alt="">
+            </template>
+          </van-cell>
+        </div>
+    </div>
+  </van-popup>
+</div>
+`
+var analysisComponent = {
+  name: 'filter-content',
+  template: analysisTemp,
+  props: {
+    id: {
+      type: String,
+      default: ''
+    }
+  },
+  data () {
+    return {
+      filters: {
+        pname: '',
+        buyer: '',
+        keys: '',
+        area: '',
+        limitTime: '近五年'
+      },
+      ajaxFilters: {
+        pname: '',
+        buyer: '',
+        keys: [],
+        area: '',
+        limitTime: 'fiveYear'
+      },
+      buyerContent: [],
+      filtersPopup: {
+        area: false,
+        time: false
+      },
+      buyerRules: [{ required: true, message: '采购内容为必填项' }],
+      columns: ChinaProvinceJson,
+      showPopover: false, // 项目联想弹窗
+      showBuyerPopover: false, // 采购单位联想弹窗
+      entering: '',
+      buyerArr: [],
+      projectArr: [],
+      sortOption: [
+        { text: '近五年', value: 'fiveYear', active: true },
+        { text: '近三年', value: 'threeYear', active: false },
+        { text: '近一年', value: 'oneYear', active: false }
+      ]
+    }
+  },
+  computed: {
+    setKeyRequired () {
+      return this.buyerContent.length > 0
+    }
+  },
+  watch: {
+    id: {
+      handler (newval) {
+        if(newval) {
+          this.entering = 'project'
+          const data = {
+            sourceinfoid: newval
+          }
+          this.getFiltersData(data)
+        }
+      },
+      immediate: true
+    },
+    buyerContent: {
+      handler (newval) {
+        const buyerInput = document.querySelector('.buyer-conetent')
+        if(buyerInput) {
+          const buyerInputValue = buyerInput.querySelector('.van-cell__value')
+          if(newval.length > 0) {
+            this.buyerRules = [{ required: false, validator: this.getKeysStatus,  message: '采购内容为必填项' }]
+          } else {
+            this.buyerRules = [{ required: true, validator: this.getKeysStatus, message: '采购内容为必填项' }]
+          }
+          if(newval.length >= 10) {
+            buyerInputValue.style.display = 'none'
+          } else {
+            buyerInputValue.style.display = 'block'
+          }
+        }
+      },
+      immediate: true
+    }
+  },
+  mounted () {
+    let analysisFilterData = sessionStorage.getItem('analysis-filter-data')
+    if(analysisFilterData) {
+      analysisFilterData = JSON.parse(analysisFilterData)
+      const { filters, buyerContent } = analysisFilterData
+      this.filters = filters,
+      this.setFilterParams(filters)
+      this.buyerContent = buyerContent
+      this.$nextTick(() => {
+        this.filters.pname = filters.pname
+      })
+    }
+  },
+  methods: {
+    getKeysStatus () {
+      if(this.buyerContent.length !== 0) {
+        return true
+      } else {
+        if(this.filters.keys !== '') {
+          return true
+        } else {
+          return false
+        }
+      }
+    },
+    startValidate (data) {
+      console.log(data)
+    },
+    onSubmit: function () {
+      this.addKeys()
+      this.$nextTick(() => {
+        const {pname, buyer, area} = this.filters
+        this.ajaxFilters.pname = pname
+        this.ajaxFilters.buyer = buyer
+        this.ajaxFilters.area = area
+        this.ajaxFilters.keys = this.buyerContent
+        const params = {
+          filters: this.filters,
+          buyerContent: this.buyerContent
+        }
+        sessionStorage.setItem('analysis-filter-data', JSON.stringify(params))
+        this.$emit('click', this.ajaxFilters)
+      })
+    },
+    setProName (data) {
+      this.filters.pname = data
+      this.entering = 'project'
+      this.getProjectList(data)
+    },
+    setBuyerName (data) {
+      this.entering = 'buyer'
+      this.getProjectList(data)
+    },
+    // 选择项目
+    onSelect (data, type) {
+      // 查询筛选条件
+      if(type === 'project') {
+        this.showPopover = false
+        this.getFiltersData(data)
+      } else if(type === 'buyer') {
+        this.showBuyerPopover = false
+        this.filters.buyer = data.buyer
+      }
+      this.entering = type
+    },
+    // 项目名称联想
+    getProjectList: utils.debounce(function(){
+      var that = this;
+      let params = {
+        pName: ''
+      }
+      if(this.entering === 'project') {
+        params.pName = this.filters.pname
+      } else if (this.entering === 'buyer') {
+        params.pName = this.filters.buyer
+        params.sType = '1'
+      }
+      if (params.pName !== '' && params.pName.length > 2) {
+        $.ajax({
+          type:'POST',
+          url:'/bigmember/analysis/projectName',
+          data: params,
+          success:function(res) {
+            console.log(res)
+            if(res.error_code == 0 && res.data && res.data.length > 0) {
+              if(params.sType) {
+                that.showBuyerPopover = true
+                that.buyerArr = res.data
+              } else {
+                that.showPopover = true
+                that.projectArr = res.data
+              }
+            }else{
+              if(params.sType) {
+                that.showBuyerPopover = false
+                that.buyerArr = []
+              } else {
+                that.showPopover = false
+                that.projectArr = []
+              }
+            }
+          },
+          error:function(err) {
+            console.log(err)
+          }
+        })
+      } else {
+          this.projectArr = []
+      }
+    }, 500),
+    // 获取筛选条件
+    getFiltersData (data) {
+      $.ajax({
+        type:'POST',
+        url:'/bigmember/analysis/projectInfo',
+        data:{
+          ptid: data.s_id,
+          sourceinfoid: data.sourceinfoid,
+          D: 'detail'
+        },
+        success:function(res) {
+          if(res && res.error_code === 0 && res.data) {
+            this.setFilterParams(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('_'))
+              }
+            }
+            this.$emit('action', res.data)
+          }
+        }.bind(this),
+        error:function(err) {
+          console.log(err)
+        }
+      })
+    },
+    setFilterParams (data) {
+      if(data.id) {
+        this.ajaxFilters.pid = data.id
+        this.filters.pid = data.id
+      }
+      if(data.infoid) {
+        this.ajaxFilters.sid = data.infoid
+        this.filters.sid = data.infoid
+      }
+      // 项目名称
+      if(data.projectname || data.pname) {
+        this.filters.pname = data.projectname || data.pname
+      } else {
+        this.filters.pname = ''
+      }
+      // 地区
+      if(data.area && JSON.stringify(data.area) !== '{}') {
+        const picker = this.$refs.picker;
+        this.filters.area = data.area
+        ChinaProvinceJson.forEach(p => {
+          if(p.text.indexOf(data.area) !== -1) {
+            picker.setValues([p.text])
+          }
+        })
+      } else {
+        this.filters.area = ''
+      }
+      // 采购单位
+      if(data.buyer) {
+        this.filters.buyer = data.buyer
+      }
+      // 采购内容
+      if(data.buyerContent && data.buyerContent.length > 0) {
+        this.buyerContent = data.buyerContent
+      } else {
+        this.buyerContent = []
+      }
+      // 时间
+      if(data.limitTime) {
+        this.sortOption.forEach(option => {
+          option.active = false
+          if(data.limitTime === option.text) {
+            option.active = true
+          }
+        })
+      }
+    },
+    // 添加关键词
+    addKeys () {
+      if(this.filters.keys !== '') {
+        const keys = {
+          key: [this.filters.keys],
+          matchway: 1
+        }
+        this.buyerContent.push(keys)
+        this.filters.keys = ''
+      }
+    },
+    // 删除关键词
+    deleteKey (data) {
+      this.buyerContent.forEach((v, index) => {
+        v.key.forEach((m, i) => {
+          if(data === m) {
+            this.buyerContent.splice(index, 1)
+          }
+        })
+      })
+    },
+    // 选择时间
+    setSortRules: function (data) {
+      this.sortOption.forEach(option => {
+        option.active = false
+      })
+      data.active = true
+      this.filters.limitTime = data.text
+      this.ajaxFilters.limitTime = data.value
+      // 关闭菜单
+      this.filtersPopup.time = false
+    },
+    // 选择地区
+    onAreaConfirm: function () {
+      const picker = this.$refs.picker;
+      const selectedValue = picker.getValues()
+      this.filters.area = selectedValue[0].value
+      this.filtersPopup.area = false
+    },
+    // 打开弹出框
+    setOpenPopup: function(data) {
+      this.filtersPopup[data] = true
+    }
+  }
+}

+ 5 - 5
src/web/staticres/common-module/collection/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
                         }
@@ -790,7 +790,7 @@ var chartOptions = {
                 x:0,
                 y:1,
                 itemName: '行业',
-                value: "类项目规模", 
+                value: "类项目规模", 
             },
             labelLine: {
                 show:false

+ 109 - 0
src/web/staticres/common-module/public/js/china-province-data.js

@@ -0,0 +1,109 @@
+var ChinaProvinceJson = [{
+  "text": "北京市",
+  "value": "北京"
+}, {
+  "text": "天津市",
+  "value": "天津"
+}, {
+  "text": "河北省",
+  "value": "河北"
+}, {
+  "text": "山西省",
+  "value": "山西"
+}, {
+  "text": "内蒙古自治区",
+  "value": "内蒙古自治区"
+}, {
+  "text": "辽宁省",
+  "value": "辽宁"
+}, {
+  "text": "吉林省",
+  "value": "吉林"
+}, {
+  "text": "黑龙江省",
+  "value": "黑龙江"
+}, {
+  "text": "上海市",
+  "value": "上海"
+}, {
+  "text": "江苏省",
+  "value": "江苏"
+}, {
+  "text": "浙江省",
+  "value": "浙江"
+}, {
+  "text": "安徽省",
+  "value": "安徽"
+}, {
+  "text": "福建省",
+  "value": "福建"
+}, {
+  "text": "江西省",
+  "value": "江西"
+}, {
+  "text": "山东省",
+  "value": "山东"
+}, {
+  "text": "河南省",
+  "value": "河南"
+}, {
+  "text": "湖北省",
+  "value": "湖北"
+}, {
+  "text": "湖南省",
+  "value": "湖南"
+}, {
+  "text": "广东省",
+  "value": "广东"
+}, {
+  "text": "海南省",
+  "value": "海南"
+}, {
+  "text": "广西壮族自治区",
+  "value": "广西壮族自治区"
+}, {
+  "text": "甘肃省",
+  "value": "甘肃"
+}, {
+  "text": "陕西省",
+  "value": "陕西"
+}, {
+  "text": "新疆维吾尔自治区",
+  "value": "新疆维吾尔自治区"
+}, {
+  "text": "青海省",
+  "value": "青海"
+}, {
+  "text": "宁夏回族自治区",
+  "value": "宁夏回族自治区"
+}, {
+  "text": "重庆市",
+  "value": "重庆"
+}, {
+  "text": "四川省",
+  "value": "四川"
+}, {
+  "text": "贵州省",
+  "value": "贵州"
+}, {
+  "text": "云南省",
+  "value": "云南"
+}, {
+  "text": "西藏自治区",
+  "value": "西藏自治区"
+}, {
+  "text": "台湾省",
+  "value": "台湾"
+}, {
+  "text": "澳门特别行政区",
+  "value": "澳门特别行政区"
+}, {
+  "text": "香港特别行政区",
+  "value": "香港特别行政区"
+}, {
+  "text": "钓鱼岛",
+  "value": "钓鱼岛"
+}, {
+  "text": " 海外",
+  "value": " 海外"
+}]

+ 4 - 4
src/web/staticres/demo-member/js/demo_action_data.js

@@ -300,12 +300,12 @@ var pageMap = {
                 {
                     coords: '15,539,736,984',
                     href: 'javascript:;',
-                    info: '类项目筛选条件'
+                    info: '类项目筛选条件'
                 },
                 {
                     coords: '81,1010,301,1080',
                     href: '#analysis-filter-tab1',
-                    info: '类项目分析'
+                    info: '类项目分析'
                 }
             ]
         }
@@ -337,7 +337,7 @@ var pageMap = {
                 {
                     coords: '15,539,736,984',
                     href: 'javascript:;',
-                    info: '类项目筛选条件'
+                    info: '类项目筛选条件'
                 },
                 {
                     coords: '31,1468,737,1591',
@@ -352,7 +352,7 @@ var pageMap = {
                 {
                     coords: '395,1001,741,1088',
                     href: '#analysis-filter-tab2',
-                    info: '类项目分析'
+                    info: '类项目分析'
                 }
             ]
         }

+ 3 - 1
src/web/staticres/public-pc/js/article-content.js

@@ -185,7 +185,9 @@ var bidNode = {
       if(bidPower) {
         bidPower = JSON.parse(bidPower)
         if(bidPower.indexOf(6) != -1) {
-          location.href = '/swordfish/page_big_pc/analysis_result?sid=' + goTemplateData.params.obj._id
+          // location.href = '/swordfish/page_big_pc/analysis_result?sid=' + goTemplateData.params.obj._id
+          var link = '/page_workDesktop/work-bench/app/big/analysis_result?sid=' + goTemplateData.params.obj._id
+          window.open(link)
         }
       }
     },

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
src/web/templates/big-member/pc/page_custom.html


+ 2 - 2
src/web/templates/big-member/pc/page_index.html

@@ -361,7 +361,7 @@
                     <div class="item-info-group">
                         <div class="title-info-group">大数据多维度分析</div>
                         <div class="content-info-group">
-                            <p>采用BI可视化图表,多维度交叉分析类项目的动态、中标金额、评标专家、项目折扣率,数据洞察一目了然。</p>
+                            <p>采用BI可视化图表,多维度交叉分析类项目的动态、中标金额、评标专家、项目折扣率,数据洞察一目了然。</p>
                         </div>
                     </div>
                     <div class="item-info-group">
@@ -532,7 +532,7 @@
                     <div class="icon-sprites" data-index="5"></div>
                     <h5>投标决策分析</h5>
                     <p>
-                        AI智能分析类项目,帮助企业决策是否投标、投标报价金额。
+                        AI智能分析类项目,帮助企业决策是否投标、投标报价金额。
                     </p>
                     <div class="subpage-button sm gold">了解更多</div>
                 </div>

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 6 - 6
src/web/templates/big-member/pc/page_index_old.html


+ 1 - 1
src/web/templates/big-member/pc/page_qz.html

@@ -90,7 +90,7 @@
             <div class="item-info-group">
                 <div class="title-info-group">全数据打通</div>
                 <div class="content-info-group">
-                    <p>对接项目库、企业库,提供预测类项目联系人、<br>联系方式,提前锁定商机。</p>
+                    <p>对接项目库、企业库,提供预测类项目联系人、<br>联系方式,提前锁定商机。</p>
                     <div class="subpage-button gold " data-source="全数据打通">咨询客服,了解更多细节</div>
                 </div>
             </div>

+ 3 - 3
src/web/templates/big-member/pc/page_tb.html

@@ -98,7 +98,7 @@
         <div class="w1200 top-info-group">
           <h3>投标决策分析</h3>
           <p>
-            分析类项目的行业、地区、采购内容、金额区间,辅助做<br />投标报价决策
+            分析类项目的行业、地区、采购内容、金额区间,辅助做<br />投标报价决策
           </p>
           <div class="row-button-group">
             <div
@@ -122,7 +122,7 @@
             <div class="title-info-group">可视化数据报表分析</div>
             <div class="content-info-group">
               <p>
-                打通全行业招标项目数据、企业数据等,通过结构<br />化数据分析、抽取类项目,形成可视化类项目<br />分析报表,数据洞察一目了然。
+                打通全行业招标项目数据、企业数据等,通过结构<br />化数据分析、抽取类项目,形成可视化类项目<br />分析报表,数据洞察一目了然。
               </p>
               <div
                 class="subpage-button gold"
@@ -144,7 +144,7 @@
             <div class="title-info-group"><br/>多维度展示辅助投标决策</div>
             <div class="content-info-group">
               <p>
-                提供类项目动态、项目分析、热点中标企业、采<br />购单位类型分布、类项目评标专家、项目预算等<br />多维度详尽数据,帮助企业决策是否投<br />标或合作投标、投标报价。
+                提供类项目动态、项目分析、热点中标企业、采<br />购单位类型分布、类项目评标专家、项目预算等<br />多维度详尽数据,帮助企业决策是否投<br />标或合作投标、投标报价。
               </p>
               <div
                 class="subpage-button gold"

+ 1 - 1
src/web/templates/big-member/pc/page_zb.html

@@ -78,7 +78,7 @@
             <div class="item-info-group">
                 <div class="title-info-group">大数据预测</div>
                 <div class="content-info-group">
-                    <p>基于用户历史投标数据,抽取类项目企业,智能<br>预测未来可能参与竞标企业。</p>
+                    <p>基于用户历史投标数据,抽取类项目企业,智能<br>预测未来可能参与竞标企业。</p>
                     <div class="subpage-button gold " data-source="大数据预测">咨询客服,了解更多细节</div>
                 </div>
             </div>

+ 1 - 1
src/web/templates/big-member/wx/page_analysis_filter.html

@@ -92,7 +92,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>

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
src/web/templates/big-member/wx/page_index.html


+ 1 - 1
src/web/templates/big-member/wx/page_landingPage.html

@@ -98,7 +98,7 @@
             <div class="insight" id="fx">
                 <div  >
                     <div>
-                        <img src='{{Msg "seo" "cdn"}}/big-member/image/landpage_new/itemA_05.jpg'>
+                        <img src='{{Msg "seo" "cdn"}}/big-member/image/landpage_new/itemA_05.jpg?v={{Msg "seo" "version"}}'>
                     </div>
                     <div style="margin-top: -0.01rem">
                         <img src='{{Msg "seo" "cdn"}}/big-member/image/landpage_new/itemA_06.jpg'>

+ 6 - 6
src/web/templates/big-member/wx/page_landingPage2.html

@@ -66,7 +66,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='{{Msg "seo" "cdn"}}/big-member/image/landpage_new/square.png' alt="" class="manysquare_img">
@@ -407,11 +407,11 @@
                 '透视潜在投标企业的全景画像'
             ],
             offer:[
-                '类项目评标专家频次排名',
-                '类项目中标金额',
-                '类项目预算',
-                '类项目折扣率',
-                '类项目区域热度'
+                '类项目评标专家频次排名',
+                '类项目中标金额',
+                '类项目预算',
+                '类项目折扣率',
+                '类项目区域热度'
             ],
             pushcom:[
                 '企业中标动态',

+ 1 - 1
src/web/templates/big-member/wx/page_landingPage_old.html

@@ -58,7 +58,7 @@
                 <div class="land_head">
                     <img src='{{Msg "seo" "cdn"}}/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">

+ 3 - 3
src/web/templates/frontRouter/pc/serviceSystem/free/index.html

@@ -953,7 +953,7 @@
                                             潜在项目预测
                                         </p>
                                         <p class="text">
-                                            通过大数据分析和AI技术,帮助用户预测未来可能发生的采购项目,发掘市场上潜在的销售机会,并提供类项目的联系人、联系方式等。
+                                            通过大数据分析和AI技术,帮助用户预测未来可能发生的采购项目,发掘市场上潜在的销售机会,并提供类项目的联系人、联系方式等。
                                         </p>
                                     </div>
                                     <div class="table_content_sortcell"><i class="free"></i></div>
@@ -1804,10 +1804,10 @@
                                 <div class="table_content_r_item cell_wite">
                                     <div class="table_content_longcell">
                                         <p class="tit">
-                                            分析类项目,帮助企业决策投标策略
+                                            分析类项目,帮助企业决策投标策略
                                         </p>
                                         <p class="text">
-                                            通过大数据分析统计,提供类项目评标专家的频次排名、类项目的热点中标企业、项目区域分布、采购单位类型分布、项目标书编制周期、类型项目折扣率分析等,帮助投标人员编制标书,判断是否参与投标。
+                                            通过大数据分析统计,提供类项目评标专家的频次排名、类项目的热点中标企业、项目区域分布、采购单位类型分布、项目标书编制周期分布、同类项目明细等,帮助投标人员编制标书,判断是否参与投标。
                                         </p>
                                     </div>
                                     <div class="table_content_sortcell"><i class="free"></i></div>

+ 3 - 3
src/web/templates/pc/biddetail_rec.html

@@ -683,7 +683,7 @@
                     <div class="baseInfo bid_base">
                         <span>基本信息</span>
                         <div class="bid_dev" style="position: relative;">
-                            <span class="bid_dev_title">项目投标怎么报价?为你提供类项目预算分析!</span>
+                            <span class="bid_dev_title">项目投标怎么报价?为你提供类项目预算分析!</span>
                             <el-popover
                                     popper-class="bidtrggirPover"
                                     placement="bottom"
@@ -715,7 +715,7 @@
                                                             <span class="bid_num" v-html="bidinfo.all_counts"></span>
                                                             <span class="bid_unit">个</span>
                                                         </div>
-                                                        <div class="bidproject">类项目</div>
+                                                        <div class="bidproject">类项目</div>
                                                     </li>
                                                     <li class="bidcon_list" v-if="bidinfo.all_winners != 0">
                                                         <div class="bidcomputed">
@@ -746,7 +746,7 @@
                                                 <div class="bid_classfun">
                                                     <div class="classfun_list">
                                                         <img src="/images/blue-duihao.png" style="width: 20px;height: 20px;" alt="">
-                                                        <span class="classs_text">类项目帮多维度分析</span>
+                                                        <span class="classs_text">类项目帮多维度分析</span>
                                                     </div>
                                                     <div class="classfun_list">
                                                         <img src="/images/blue-duihao.png" style="width: 20px;height: 20px;" alt="">

Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels