Преглед на файлове

Merge branch 'dev3.0.0' of http://192.168.3.207:10080/qmx/jy into dev3.0.0

zhangyuhan преди 4 години
родител
ревизия
e837d2de90
променени са 24 файла, в които са добавени 429 реда и са изтрити 166 реда
  1. 57 0
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/echarts_option.js
  2. 101 36
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/ent_portrait.js
  3. 3 1
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/main_root.js
  4. 1 2
      src/jfw/modules/app/src/web/staticres/jyapp/css/wxinfocontent.css
  5. 8 8
      src/jfw/modules/app/src/web/templates/big-member/page_ai_result.html
  6. 1 1
      src/jfw/modules/app/src/web/templates/big-member/page_analysis_result.html
  7. 11 3
      src/jfw/modules/app/src/web/templates/big-member/page_forecast_detail.html
  8. 5 5
      src/jfw/modules/app/src/web/templates/big-member/page_landingPage.html
  9. 2 5
      src/jfw/modules/app/src/web/templates/big-member/page_pro_follow_list.html
  10. 13 13
      src/jfw/modules/app/src/web/templates/weixin/wxinfocontent.html
  11. 2 0
      src/jfw/modules/bigmember/src/config.json
  12. 2 0
      src/jfw/modules/bigmember/src/config/config.go
  13. 5 20
      src/jfw/modules/bigmember/src/entity/entPortraitBuyer.go
  14. 3 2
      src/jfw/modules/bigmember/src/entity/entPortraitSearchManager.go
  15. 25 10
      src/jfw/modules/bigmember/src/entity/entPortraitWinner.go
  16. 18 0
      src/jfw/modules/bigmember/src/entity/followProject.go
  17. 95 24
      src/jfw/modules/bigmember/src/service/analysis/decision.go
  18. 1 0
      src/jfw/modules/bigmember/src/service/analysis/esquery.go
  19. 2 0
      src/jfw/modules/bigmember/src/service/analysis/forecastproject.go
  20. 25 14
      src/jfw/modules/bigmember/src/service/analysis/forecastwinner.go
  21. 4 4
      src/jfw/modules/bigmember/src/service/analysis/potential.go
  22. 25 0
      src/jfw/modules/bigmember/src/service/follow/project.go
  23. 13 13
      src/jfw/modules/bigmember/src/util/rpc.go
  24. 7 5
      src/web/templates/big-member/wx/page_buy_commit.html

+ 57 - 0
src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/echarts_option.js

@@ -340,3 +340,60 @@ var multiBarChart = {
         color:['#05A6F3','#0BD991','#FF9F40','#8E6DF2','#F1D090']
     },
 }
+
+var mBarChart = {
+    dataEmpty: true,
+    chartSettings: {},
+    chartExtend:{
+        grid:{
+            x:14,
+            y:20,
+            x2:14
+        },
+        tooltip: {
+            trigger: 'axis',
+            backgroundColor:'#fff',
+            axisPointer: {
+                type: 'shadow',
+                shadowStyle:{
+                    color:'rgba(5,166,243,0.1)'
+                }
+            },
+            textStyle:{
+                color:'#171826',
+                fontSize:12
+            },
+            padding:[8,12],
+            extraCssText:'box-shadow: 0px 4px 16px rgba(8, 31, 38, 0.08)',
+            z: 3
+        },
+        legend: {
+            orient: 'horizontal',
+            icon:'circle',
+            bottom:10,
+            // align:'left',
+            left: 'center',
+            itemWidth: 10,
+            itemHeight: 10,
+            itemGap:10,
+            textStyle:{
+                fontSize:11
+            }
+        },
+        yAxis: {
+            splitLine: {
+                show: true,
+                lineStyle: {
+                    type: 'dashed',
+                    width: 0.5,
+                    color:'rgba(0, 0, 0, 0.08)'
+                }
+            },
+        },
+        series: {
+            barWidth: 20,
+            type:'bar'
+        },
+        color:['#9C72F4','#6B78E8','#05A6F3','#2ABED1','#0BD991','#C0C4CC','#B8D4F9','#444A7A','#F1D090','#B8D4F9','#C09BFC','#104EA3','#21CED2','#FFB901','#7BBFE5','#82E9D6','#62B8FF','#7E56EE','#B3E3E7','#8591FF','#96C3D8','#3774E8','#CDCEFE','#6BBEF4','#6E55B4','#2B82FE','#FF9A01','#01C290','#BAE1A8','#EB97D8']
+    },
+}

+ 101 - 36
src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/ent_portrait.js

@@ -42,7 +42,10 @@ var vNode = {
                 list: [],
                 showAll: false,
             },
+            // 画像接口请求不到需要重新请求(最大次数)
+            getPortraitInfoMaxTimes: 3,
             // tab2中的企业画像数据
+            getPortraitInfoCount: 0,
             entPortraitInfo: {},
             stickyTop: 80,
             singleTab: false,
@@ -65,7 +68,7 @@ var vNode = {
             },
             // 项目折扣率分布数据
             rateData: {
-                columns: ["范围","项目数量","折扣率"],
+                columns: ['日期', '0~5%', '5~10%','10~30%','30~100%','平均折扣率'],
                 rows: []
             },
             // 地图数据
@@ -83,6 +86,7 @@ var vNode = {
                 legendes: [],
                 categories: []
             },
+            sunChartShow: true
         }
     },
     computed: {
@@ -145,38 +149,64 @@ var vNode = {
             }, 20)
         },
         // 获取企业画像信息
-        getEntPortrait: function () {
+        /**
+         * 
+         * @param {String|undefined} type
+         * 
+         * type=top查询topProject
+         * type=other查询hxData
+         * type=''查询topProject
+         */
+        getEntPortrait: function (type) {
             var _this = this
+            var data = {
+                entName: _this.entInfo.name
+            }
+            if (type == 'top') {
+                data.flag = type
+            } else if (type == 'other') {
+                data.flag = type
+            }
+
             $.ajax({
                 type: 'POST',
                 url: '/bigmember/portrait/ent/winner',
-                data: {
-                    entName: _this.entInfo.name
-                },
+                data: data,
                 success: function (res) {
                     if (res.error_code == 0) {
-                        if (res.data) {
+                        // 次数+1
+                        _this.getPortraitInfoCount++
+                        if (res.data && Object.keys(res.data).length !== 0) {
                             if (res.data.hxData && Object.keys(res.data.hxData).length !== 0) {
                                 for (var key in res.data.hxData) {
                                     _this.entPortraitInfo[key] = res.data.hxData[key]
                                 }
-                                // 年度项目统计
-                                _this.getAnnualData(res.data.hxData.yearData)
-                                // 折扣率
-                                _this.getRateData(res.data.hxData.rateData)
-                                // 地图
-                                _this.getMapData(res.data.hxData.areaArr)
-                                if (_this.tabActiveName == '2') {
-                                    // 旭日图初始化在tabActiveName中执行
-                                    _this.getSunData()
+
+                                // 初始化图表数据
+                                _this.initCharts(res.data)
+                            } else {
+                                // 再次调用,查询画像信息
+                                if (_this.getPortraitInfoCount < _this.getPortraitInfoMaxTimes) {
+                                    _this.getEntPortrait('other')
                                 }
                             }
+
                             if (res.data.topPro && $.isArray(res.data.topPro) && res.data.topPro.length !== 0) {
                                 // 排序
                                 _this.topProject.list = utils.bSort(res.data.topPro, 'firsttime').reverse()
+                            } else {
+                                // 再次调用,查询画像信息
+                                if (_this.getPortraitInfoCount < _this.getPortraitInfoMaxTimes) {
+                                    _this.getEntPortrait('top')
+                                }
                             }
                         } else {
-                            _this.singleTab = true
+                            if (_this.getPortraitInfoCount < _this.getPortraitInfoMaxTimes) {
+                                _this.getEntPortrait()
+                            } else {
+                                // 单个tab,无企业画像情况
+                                _this.singleTab = true
+                            }
                         }
                     } else {
                         _this.$toast(res.error_msg)
@@ -271,11 +301,34 @@ var vNode = {
                 }
             })
         },
+        initCharts: function (data) {
+            // 年度项目统计
+            this.getAnnualData(data.hxData.yearData)
+            // 折扣率
+            this.getRateData(data.hxData.rateData)
+            // 地图
+            this.getMapData(data.hxData.areaArr)
+            if (this.tabActiveName == '2') {
+                // 旭日图初始化在tabActiveName中执行
+                this.getSunData()
+            }
+        },
         getStickyTop: function () {
             this.stickyTop = $('.jy-app-header').height() - 1
         },
         goToEntHistory: function () {
-            console.log('goToEntHistory')
+            if (this.entBaseInfo.showEntChange) {
+                // 有权限
+                location.href = './ent_portrait_change?name=' + encodeURIComponent(this.entInfo.name)
+            } else {
+                // 无权限
+                var info = {
+                    landscroll: '1900',
+                    landname: this.entInfo.name
+                }
+                sessionStorage.setItem('landentinfo',JSON.stringify(info))
+                location.href = './landingPage'
+            }
         },
         // 修改年度项目统计里点击浮窗显示效果
         formatter: function (params) {
@@ -353,36 +406,45 @@ var vNode = {
         // 获取年度项目统计数据
         getAnnualData: function (list) {
             var rows = [];
-            list.forEach(function(item) {
-                rows.push({
-                    '日期':item.key,
-                    '数量':item.count,
-                    '金额': Math.round(item.bidamount / 10000)
+            if (list && $.isArray(list)) {
+                list.forEach(function(item) {
+                    rows.push({
+                        '日期':item.key,
+                        '数量':item.count,
+                        '金额': Math.round(item.bidamount / 10000)
+                    })
                 })
-            })
+            }
             this.annualData.rows = rows;
         },
-        // 获取项目折扣率数据
-        getRateData: function(list){
+        // 获取项目折扣率数据处理
+        getRateData: function (list) {
             var rows = [];
-            list.forEach(function(item) {
-                rows.push({
-                    '范围':item.key,
-                    '项目数量':item.count,
-                    '折扣率': item.ratio
+            if (list && $.isArray(list)) {
+                list.forEach(function(item) {
+                    rows.push({
+                        '日期': item.year + '年',
+                        '0~5%': item.scope[0].count, 
+                        '5~10%': item.scope[1].count,
+                        '10~30%': item.scope[2].count,
+                        '30~100%': item.scope[3].count,
+                        '平均折扣率': Math.round(item.avg*100)
+                    })
                 })
-            })
+            }
             this.rateData.rows = rows;
         },
         // 获取主要市场分布(中国地图)数据
         getMapData: function(list) {
             var mapRows = []
-            list.forEach(function (n) {
-                mapRows.push({
-                    name: n.area,
-                    value: n.count
+            if (list && $.isArray(list)) {
+                list.forEach(function (n) {
+                    mapRows.push({
+                        name: n.area,
+                        value: n.count
+                    })
                 })
-            })
+            }
             this.mapChartData.rows = mapRows;
         },
         // 获取竞争关系图谱数据
@@ -391,6 +453,9 @@ var vNode = {
             this.sunChart = echarts.init(ref)
             if (this.entPortraitInfo.competeData) {
                 sun.initSunChart(this.sunChart, this.entInfo.name, this.entPortraitInfo.competeData)
+            } else {
+                // 如果没有数据,则隐藏图表
+                this.sunChartShow = false
             }
         },
         toProjectDetail: function (item) {

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

@@ -1123,9 +1123,11 @@ var vNode = {
         },
         linkPage:function(url,title){
             if(title == '招标大数据搜索'){
-                localStorage.chooseTab=1
+                location.go(-1)
+                localStorage.chooseTab=0
             }else{
                 location.href = url
+                sessionStorage.setItem(this.sessStorageKey, JSON.stringify(this.$data))
             }
         },
         changeStatus:function(){

+ 1 - 2
src/jfw/modules/app/src/web/staticres/jyapp/css/wxinfocontent.css

@@ -688,7 +688,7 @@ pre {
     margin-top: 10px;
     display: flex;
     align-items: center;
-    justify-content: space-between;
+    justify-content: flex-start;
 }
 
 .fatNav {
@@ -850,7 +850,6 @@ ul {
     justify-content: center;
     margin-left: .32rem;
     width: .48rem;
-    height: 100%;
 }
 
 #tab1 .itemInfo>ul>li .unitbtn .iconunit {

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

@@ -195,7 +195,7 @@
     {{include "/big-member/header.html"}}
     <div class="j-main" id="ai-result" v-cloak>
         <div class="result-header">
-            <div class="project-name">${brief.Pname}</div>
+            <div class="project-name">${brief.pname}</div>
             <div class="project-other">
                 <div class="withdraw" @click="otherClick">
                     <span class="j-icon icon-withdraw"></span>
@@ -212,27 +212,27 @@
                         <div>
                             <div class="brief-item">
                                 <span class="brief-label">地区</span>
-                                <span class="brief-value">${brief._Area || '--'} ${brief._City}</span>
+                                <span class="brief-value">${brief._area || '--'} ${brief._city}</span>
                             </div>
                             <div class="brief-item">
                                 <span class="brief-label">招标代理机构</span>
-                                <span class="brief-value">${brief.Agency || '--'}</span>
+                                <span class="brief-value">${brief.agency || '--'}</span>
                             </div>
                             <div class="brief-item">
                                 <span class="brief-label">采购单位</span>
                                 <span class="brief-value brief-icon-value">
-                                    <em>${brief.Buyer || '--'}</em>
+                                    <em>${brief.buyer || '--'}</em>
                                     <i class="j-icon icon-unit-circle"></i>
                                 </span>
                             </div>
                             <div class="brief-item">
                                 <span class="brief-label">采购联系人</span>
-                                <span class="brief-value">${brief.Buyerperson || '--'}</span>
+                                <span class="brief-value">${brief.buyerperson || '--'}</span>
                             </div>
                             <div class="brief-item" v-if="brief.phone">
                                 <span class="brief-label">采购电话</span>
                                 <span class="brief-value brief-icon-value">
-                                    <em>${brief.Buyertel}</em>
+                                    <em>${brief.buyertel}</em>
                                     <i class="j-icon icon-phone-circle"></i>
                                 </span>
                                 
@@ -371,7 +371,7 @@
                             if(res.data.responseData) {
                                 res.data.responseData.forEach(function(v,i){
                                     if(v.score){
-                                        v.score = (v.score*100).fixed(2)
+                                        v.score = Math.round(v.score*100)
                                     }
                                     if(v.capital) {
                                         v.capital = v.capital.fixed(2)
@@ -401,7 +401,7 @@
             // 去决策分析
             goAnalysis: function(){
                 sessionStorage.removeItem('big-analysis_filter')
-                location.href = './analysis_filter?id=' + this.brief.Infoid
+                location.href = './analysis_filter?id=' + this.brief.id + '&sId=' + this.brief.infoid
             }
         }
     }

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

@@ -181,7 +181,7 @@
                                             <span>${item.review_experts || '--'}</span>
                                         </div>
                                         <div class="pl-info">
-                                            <span>招标时间:</span>
+                                            <span>项目时间:</span>
                                             <span>${item.firsttime || '--'}</span>
                                         </div>
                                         <div class="pl-price">

+ 11 - 3
src/jfw/modules/app/src/web/templates/big-member/page_forecast_detail.html

@@ -38,6 +38,9 @@
             margin-top: 0.08rem;
         }
         .item-big-value{
+            display: flex;
+            justify-content: space-between;
+            align-items: center;
             font-size: .36rem;
         }
         .tip{
@@ -120,9 +123,11 @@
                 <div class="van-hairline--bottom item">
                     <div class="item-key">
                         <span>采购单位</span>
-                        <span class="j-icon icon-unit-circle"></span>
                     </div>
-                    <div class="item-value item-big-value">${info.buyer}</div>
+                    <div class="item-value item-big-value">
+                        <span>${info.buyer}</span>
+                        <span @click="goUnit(info.buyer)" class="j-icon icon-unit-circle"></span>
+                    </div>
                 </div>
                 <div class="item">
                     <div class="item-key">预测时间</div>
@@ -253,7 +258,7 @@
                                 // console.log(new Date(Number(res.data.yuce_time + '000')).pattern('yyyy/MM/dd'))
                                 if(res.data.results) {
                                     res.data.results.forEach(function(v,i) {
-                                        v.p_rate = v.p_rate.replace(/%/g, '')
+                                        v.p_rate = Math.round(v.p_rate.replace(/%/g, ''))
                                     })
                                 }
                                 that.info = res.data;
@@ -267,6 +272,9 @@
                         console.log(err)
                     }
                 })
+            },
+            goUnit: function(name) {
+                location.href = './unit_portrayal?entName=' + encodeURIComponent(name)
             }
         }
     }

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

@@ -10,7 +10,7 @@
     <link rel="preload" as="style" href=//cdn.jsdelivr.net/npm/reset-css@4.0.1/reset.min.css />
     <link rel="preload" as="style" href=//cdn.jsdelivr.net/npm/vant@2.8.2/lib/index.css />
     <link rel="preload" as="style" href=//cdn.jsdelivr.net/npm/vant@2.8.2/lib/icon/local.css />
-    <link rel="preload" type="text/css" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/big-member/css/page_landingPage.css?v={{Msg "seo" "version"}}'/>
+    <link rel="preload" as="style" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/big-member/css/page_landingPage.css?v={{Msg "seo" "version"}}'/>
     <!--E-当前页必定需要预加载的资源-->
 
 
@@ -18,7 +18,7 @@
     <link rel="stylesheet" href=//cdn.jsdelivr.net/npm/reset-css@4.0.1/reset.min.css />
     <link rel="stylesheet" href=//cdn.jsdelivr.net/npm/vant@2.8.2/lib/index.css />
     <link rel="stylesheet" href=//cdn.jsdelivr.net/npm/vant@2.8.2/lib/icon/local.css />
-    <link rel="stylesheet" type="text/css" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/big-member/css/page_landingPage.css?v={{Msg "seo" "version"}}' />
+    <link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/big-member/css/page_landingPage.css?v={{Msg "seo" "version"}}' />
     <!--E-当前页面的css资源-->
 </head>
 
@@ -208,7 +208,7 @@
                 landproinfo = JSON.parse(landproinfo)
                 setTimeout(() => {
                     var x = this.$refs.my_scroller.scrollTo(0,landproinfo.landscroll,true)
-                    // sessionStorage.removeItem('land-scrolltop')
+                    sessionStorage.removeItem('landproinfo')
                 },100);
                 this.winname = landproinfo.landname
             }
@@ -216,7 +216,7 @@
                 landinfo = JSON.parse(landinfo)
                 setTimeout(() => {
                     var x = this.$refs.my_scroller.scrollTo(0,landinfo.landscroll,true)
-                    // sessionStorage.removeItem('land-scrolltop')
+                    sessionStorage.removeItem('landinfo')
                 },100);
                 this.purchasename = landinfo.landname
             }
@@ -224,7 +224,7 @@
                 landentinfo = JSON.parse(landentinfo)
                 setTimeout(() => {
                     var x = this.$refs.my_scroller.scrollTo(0,landentinfo.landscroll,true)
-                    // sessionStorage.removeItem('land-scrolltop')
+                    sessionStorage.removeItem('landentinfo')
                 },100);
                 this.entname = landentinfo.landname
             }

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

@@ -52,8 +52,8 @@
                         <p class="pro_title">${item.title}</p>
                         <div class="pro_tags">
                             <div class="tag_left">
-                                <span class="tag_text">${item.area}</span>
-                                <span class="tag_text">${item.buyerclass}</span>
+                                <span class="tag_text" v-if="item.area!==''">${item.area}</span>
+                                <span class="tag_text" v-if="item.buyerclass!==''">${item.buyerclass}</span>
                                 <span class="tag_text" v-if="item.budget!=='0'">${item.budget}</span>
                             </div>
                             <div class="pro_time">
@@ -123,9 +123,6 @@
                         }else{
                             this.isbigvip = false
                         }
-                        if(res.data.isUsed ==true){
-                            location.href = './init'
-                        }
                     }
                 })
             },

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

@@ -181,7 +181,13 @@
 					}else{
 						type = "";
 					}
-				}
+                }
+                // 中标预测显示隐藏
+                if(subtype=='询价'||subtype=="招标"){
+                    $('.forecast').css('display','flex')
+                }else{
+                    $('.forecast').hide()
+                }
 		        if(type==null||type=="undefined"){
 		          type=""
 		        }
@@ -261,6 +267,12 @@
 					}else{
 						type = "";
 					}
+                }
+                // 中标预测显示隐藏
+                if(subtype=='询价'||subtype=="招标"){
+                    $('.forecast').css('display','flex')
+                }else{
+                    $('.forecast').hide()
                 }
 				if(type==null||type=="undefined"){
 				type=""
@@ -953,8 +965,6 @@
             // bigstatus = 0
             if(bigstatus<=0){
                 location.href = '/jyapp/big/page/landingPage'
-                sessionStorage.removeItem('landproinfo')
-                sessionStorage.removeItem('landentinfo')
                 sessionStorage.setItem('landinfo',JSON.stringify(landinfo))
             }else {
                 location.href = "/jyapp/big/page/unit_portrayal?entName="+encodeURIComponent(rerbuyer)
@@ -970,8 +980,6 @@
             }
             if(bigstatus<=0){
                 location.href = '/jyapp/big/page/landingPage'
-                sessionStorage.removeItem('landproinfo')
-                sessionStorage.removeItem('landinfo')
                 sessionStorage.setItem('landentinfo',JSON.stringify(landinfo))
             }else {
                 location.href = "/jyapp/big/page/ent_portrait?name="+encodeURIComponent(rerwinner)
@@ -1523,12 +1531,6 @@
                     break;
                 }
             }
-            // 中标预测显示隐藏
-            if(type=='询价'||type=="招标"){
-                $('.forecast').css('display','flex')
-            }else{
-                $('.forecast').hide()
-            }
             var id = {{.T.obj._id}};
             $('.forecast').on('click',function(){
                 $.ajax({
@@ -1543,8 +1545,6 @@
                                 landscroll:'0',
                                 landname:''
                             }
-                            sessionStorage.removeItem('landinfo')
-                            sessionStorage.removeItem('landentinfo')
                             sessionStorage.setItem('landproinfo',JSON.stringify(landproinfo))
                         }else{
                             location.href = '/jyapp/big/page/ai_add?sid='+id

+ 2 - 0
src/jfw/modules/bigmember/src/config.json

@@ -15,6 +15,8 @@
         }
     ],
     "dataStarttime":"1451577600",
+    "portraitPool": 5,
+    "portraitCacheDay": 7,
     "rdProLimit":10,
     "followPushRpc": "127.0.0.1:8759",
     "followEnt": {

+ 2 - 0
src/jfw/modules/bigmember/src/config/config.go

@@ -14,6 +14,8 @@ type config struct {
 		User string
 	}
 	DataStarttime       string
+	PortraitPool        int
+	PortraitCacheDay    int
 	RdProLimit          int
 	FollowPushRpc       string
 	FollowEnt           followConfig

+ 5 - 20
src/jfw/modules/bigmember/src/entity/entPortraitBuyer.go

@@ -2,6 +2,7 @@ package entity
 
 //招标单位画像查询
 import (
+	"config"
 	"fmt"
 	qutil "qfw/util"
 	"qfw/util/elastic"
@@ -10,13 +11,14 @@ import (
 )
 
 var (
-	buyer_query_top = `{"query":{"filtered":{"filter":{"bool":{"must":[{"term":{"buyer":"%s"}},{"range":{"firsttime":{"gte":1451577600}}}],"must_not":[{"term":{"bidstatus":"废标"}}]}}}},"size":10,"_source":["bidamount","bidstatus","list.infoid","list.title","list.subtype","projectname","list.area","firsttime"],"sort":[{"bidamount":"desc"}]}`
+	buyer_query_top   = `{"query":{"filtered":{"filter":{"bool":{"must":[{"term":{"buyer":"%s"}},{"range":{"firsttime":{"gte":%s}}}],"must_not":[{"term":{"bidstatus":"废标"}}]}}}},"size":10,"_source":["bidamount","bidstatus","list.infoid","list.title","list.subtype","projectname","list.area","firsttime"],"sort":[{"bidamount":"desc"}]}`
+	buyer_query_other = `{"query":{"bool":{"must":[{"term":{"buyer":"%s"}},{"range":{"firsttime":{"from":"%s"}}}]}},"from":0,"size":10000,"sort":[],"_source":["area","city","topscopeclass","s_subscopeclass","projectname","buyer","s_winner","bidamount","budget","firsttime","package1"]}`
 )
 
 //项目动态 招标金额最大的前10个项目
 func GetBuyerTop10Project(buyer string) []map[string]interface{} {
 	defer qutil.Catch()
-	res := elastic.Get("projectset", "projectset", fmt.Sprintf(buyer_query_top, buyer))
+	res := elastic.Get("projectset", "projectset", fmt.Sprintf(buyer_query_top, buyer, config.Config.DataStarttime))
 	if res == nil || len(*res) == 0 {
 		return nil
 	}
@@ -55,24 +57,7 @@ func GetBuyerPortrait(buyer string, subscopeclassSet []string) map[string]interf
 	}
 
 	data := map[string]interface{}{}
-	query := `{
-		  "query": {
-		    "bool": {
-		      "must": [
-		        {"term": {"buyer": "` + buyer + `"}},
-		        {"range": {"firsttime": {"from": "1451577600"}}}
-		      ]
-		    }
-		  },
-		  "from": 0,"size":10000,
-		  "sort": [],
-		  "_source": [
-		    "area","city","topscopeclass","s_subscopeclass",
-			"projectname","buyer","s_winner","bidamount","budget","firsttime","package1"
-		  ]
-		}
-	`
-	list := elastic.GetNoLimit("projectset", "projectset", query)
+	list := elastic.GetNoLimit("projectset", "projectset", fmt.Sprintf(buyer_query_other, buyer, config.Config.DataStarttime))
 	ypro_num := map[int]map[string]int{}               //年度项目数据
 	ypro_money := map[int]map[string]int{}             //年度项目金额
 	tmp_winners := map[string]map[string]interface{}{} //中标企业列表

+ 3 - 2
src/jfw/modules/bigmember/src/entity/entPortraitSearchManager.go

@@ -1,6 +1,7 @@
 package entity
 
 import (
+	"config"
 	"encoding/json"
 	"fmt"
 	"log"
@@ -31,7 +32,7 @@ var (
 )
 
 func init() {
-	Hx_Thread = make(chan bool, 5) //走配置文件 同时查询限制
+	Hx_Thread = make(chan bool, config.Config.PortraitPool) //走配置文件 同时查询限制
 	go Qyhx_search_chan()
 	//go redisToChan3()
 	DoSearchCheck = NewSearchCheck()
@@ -151,7 +152,7 @@ func Qyhx_search(obj *PortraitSearch) {
 //客户画像存储
 func upDataQxhxRedis(redisKey string, data interface{}) {
 	if data != nil {
-		redis.Put("other", redisKey, data, 60*60*24*7) //走配置文件缓存时长
+		redis.Put("other", redisKey, data, 60*60*24*config.Config.PortraitCacheDay) //走配置文件缓存时长
 	}
 }
 

+ 25 - 10
src/jfw/modules/bigmember/src/entity/entPortraitWinner.go

@@ -2,24 +2,39 @@ package entity
 
 //中标单位画像查询
 import (
+	"config"
 	"encoding/json"
 	"fmt"
 	"log"
 	qutil "qfw/util"
 	"qfw/util/elastic"
 	"strings"
+	"time"
 )
 
 var (
-	winner_query_top   = `{"query":{"filtered":{"filter":{"bool":{"must":[{"term":{"s_winner":"%s"}},{"range":{"firsttime":{"gte":1451577600}}}],"must_not":[{"term":{"bidstatus":"废标"}}]}}}},"size":10,"_source":["firsttime","bidstatus","area","list.infoid","list.title","list.subtype","projectname"],"sort":[{"bidamount":"desc"}]}`
-	winner_query_other = `{"query":{"filtered":{"filter":{"bool":{"must":[{"term":{"s_winner":"%s"}},{"range":{"firsttime":{"gte":1451577600}}}]}}}},"aggs":{"area_count":{"cardinality":{"field":"area"}},"buyer_count":{"cardinality":{"field":"buyer"}},"bidamount_count":{"sum":{"field":"bidamount"}},"year_ranges":{"range":{"field":"firsttime","ranges":[{"key":"2016","from":1451577600,"to":1483200000},{"key":"2017","from":1483200000,"to":1514736000},{"key":"2018","from":1514736000,"to":1546272000},{"key":"2019","from":1546272000,"to":1577808000},{"key":"2020","from":1577808000,"to":1609430400}]},"aggs":{"count":{"sum":{"field":"bidamount"}},"avg_rate":{"filter":{"range":{"project_rate":{"gte":0}}},"aggs":{"p_avg":{"avg":{"field":"project_rate"}}}},"rate_range":{"range":{"field":"project_rate","ranges":[{"key":"5","from":0,"to":0.05},{"key":"10","from":0.05,"to":0.1},{"key":"30","from":0.1,"to":0.3},{"key":"50","from":0.3,"to":0.5},{"key":"100","from":0.5,"to":1.1}]}}}},"group_area":{"terms":{"field":"area","size":40}},"group_topscopeclass":{"terms":{"field":"topscopeclass","size":1}},"group_buyer":{"terms":{"field":"buyer","size":300,"order":{"_count":"desc"}}}},"size":0}`
-	//winner_compare     = `{"query":{"filtered":{"filter":{"bool":{"must":[{"terms":{"buyer":["%s"]}},{"term":{"topscopeclass":"%s"}},{"range":{"firsttime":{"gt":1451577600}}}]}}}},"aggs":{"group_by_buyerclass":{"terms":{"field":"buyerclass","size": 6},"aggs":{"g_winner":{"terms":{"field":"package1.winner","order":[{"count_b":"desc"}],"size":5},"aggs":{"count_b":{"sum":{"field":"package1.bidamount"}}}}}}},"size":0}`
-	winner_compare = `{"query":{"filtered":{"filter":{"bool":{"must":[{"terms":{"buyer":["%s"]}},{%s},{"range":{"firsttime":{"gt":1451577600}}}]}}}},"aggs":{"group_by_buyerclass":{"terms":{"field":"buyerclass","size": 6},"aggs":{"g_winner":{"terms":{"field":"package1.winner","order":[{"count_b":"desc"}],"size":5},"aggs":{"count_b":{"sum":{"field":"package1.bidamount"}}}}}}},"size":0}`
+	winner_query_top   = `{"query":{"filtered":{"filter":{"bool":{"must":[{"term":{"s_winner":"%s"}},{"range":{"firsttime":{"gte":%s}}}],"must_not":[{"term":{"bidstatus":"废标"}}]}}}},"size":10,"_source":["firsttime","bidstatus","area","list.infoid","list.title","list.subtype","projectname"],"sort":[{"bidamount":"desc"}]}`
+	winner_query_other = `{"query":{"filtered":{"filter":{"bool":{"must":[{"term":{"s_winner":"%s"}},{"range":{"firsttime":{"gte":%s}}}]}}}},"aggs":{"area_count":{"cardinality":{"field":"area"}},"buyer_count":{"cardinality":{"field":"buyer"}},"bidamount_count":{"sum":{"field":"bidamount"}},"year_ranges":{"range":{"field":"firsttime","ranges":[%s]},"aggs":{"count":{"sum":{"field":"bidamount"}},"avg_rate":{"filter":{"range":{"project_rate":{"gte":0}}},"aggs":{"p_avg":{"avg":{"field":"project_rate"}}}},"rate_range":{"range":{"field":"project_rate","ranges":[{"key":"5","from":0,"to":0.05},{"key":"10","from":0.05,"to":0.1},{"key":"30","from":0.1,"to":0.3},{"key":"50","from":0.3,"to":0.5},{"key":"100","from":0.5,"to":1.1}]}}}},"group_area":{"terms":{"field":"area","size":40}},"group_topscopeclass":{"terms":{"field":"topscopeclass","size":1}},"group_buyer":{"terms":{"field":"buyer","size":300,"order":{"_count":"desc"}}}},"size":0}`
+	winner_compare     = `{"query":{"filtered":{"filter":{"bool":{"must":[{"terms":{"buyer":["%s"]}},{%s},{"range":{"firsttime":{"gt":%s}}}]}}}},"aggs":{"group_by_buyerclass":{"terms":{"field":"buyerclass","size": 6},"aggs":{"g_winner":{"terms":{"field":"package1.winner","order":[{"count_b":"desc"}],"size":5},"aggs":{"count_b":{"sum":{"field":"package1.bidamount"}}}}}}},"size":0}`
+	yearRange          = `{"key":"2016","from":1451577600,"to":1483200000},{"key":"2017","from":1483200000,"to":1514736000},{"key":"2018","from":1514736000,"to":1546272000},{"key":"2019","from":1546272000,"to":1577808000},{"key":"2020","from":1577808000,"to":1609430400}`
 )
 
+func init() {
+	start := config.Config.DataStarttime
+	startStamp := qutil.Int64All(start)
+	if startStamp > 0 {
+		newYearRange := ``
+		for i := 0; i < 5; i++ {
+			thisTime := time.Unix(startStamp, 0).AddDate(i, 0, 0)
+			newYearRange += fmt.Sprintf(`{"key":"%d","from":%d,"to":%d},`, thisTime.Year(), thisTime.Unix(), thisTime.AddDate(1, 0, 0).Unix())
+		}
+		yearRange = newYearRange[:len(newYearRange)-1]
+	}
+}
+
 //项目动态 招标金额最大的前10个项目
 func GetWinnerTop10Project(entName string) []map[string]interface{} {
-	topProject := elastic.Get("projectset", "projectset", fmt.Sprintf(winner_query_top, entName))
+	topProject := elastic.Get("projectset", "projectset", fmt.Sprintf(winner_query_top, entName, config.Config.DataStarttime))
 	if topProject == nil || len(*topProject) == 0 {
 		return nil
 	}
@@ -51,14 +66,14 @@ func GetWinnerTop10Project(entName string) []map[string]interface{} {
 //项目画像图谱数据(年度项目统计、折扣率分布、主要分布市场、竞争关系图谱)
 func GetWinnerPortrait(entName string, subscopeclass []string) (hx_data map[string]interface{}) {
 	defer qutil.Catch()
-	log.Println("WinnerPortrait query", fmt.Sprintf(winner_query_other, entName))
-	res, count := GetAggs("projectset", "projectset", fmt.Sprintf(winner_query_other, entName))
+	log.Println("WinnerPortrait query", fmt.Sprintf(winner_query_other, entName, config.Config.DataStarttime, yearRange))
+	res, count := GetAggs("projectset", "projectset", fmt.Sprintf(winner_query_other, entName, config.Config.DataStarttime, yearRange))
 	if res == nil {
 		return
 	}
 	//---year_ranges 年度统计、金额、折扣率
 	hx_data = make(map[string]interface{})
-
+	hx_data["startYear"] = config.Config.DataStarttime
 	//项目数量、中标总额、地区数量、客户数量
 	for _, dataType := range []string{"bidamount_count", "area_count", "buyer_count"} {
 		if b, err := json.Marshal(res[dataType]); err == nil {
@@ -208,8 +223,8 @@ func GetWinnerPortrait(entName string, subscopeclass []string) (hx_data map[stri
 	} else { //用户设置的行业
 		classQuery = fmt.Sprintf(`"terms":{"subscopeclass":["%s"]}`, strings.Join(subscopeclass, `","`))
 	}
-	compareRes, _ := GetAggs("projectset", "projectset", fmt.Sprintf(winner_compare, strings.Join(buyers, `","`), classQuery))
-	log.Println("competeData query", fmt.Sprintf(winner_compare, strings.Join(buyers, `","`), classQuery))
+	compareRes, _ := GetAggs("projectset", "projectset", fmt.Sprintf(winner_compare, strings.Join(buyers, `","`), classQuery, config.Config.DataStarttime))
+	log.Println("competeData query", fmt.Sprintf(winner_compare, strings.Join(buyers, `","`), classQuery, config.Config.DataStarttime))
 	if g, ok := compareRes.Children("group_by_buyerclass"); ok {
 		var compareRangeData []map[string]interface{}
 		bs, _ := g.Aggregations["buckets"].MarshalJSON()

+ 18 - 0
src/jfw/modules/bigmember/src/entity/followProject.go

@@ -325,6 +325,24 @@ func (this *ProjectFollow) AddTime(fid string, bidopentime, remindtime int64) bo
 	if remindtime != 0 {
 		update["l_remindtime"] = remindtime
 	}
+	return db.Mgo.Update(this.SaveTable, map[string]interface{}{
+		"_id":      StringTOBsonId(fid),
+		"i_remind": 1,
+	}, map[string]interface{}{
+		"$set": update,
+	}, false, false)
+}
+
+//项目提醒开关
+func (this *ProjectFollow) RemindSwitch(fid string, open bool) bool {
+	update := map[string]interface{}{
+		"l_updatetime": time.Now().Unix(),
+	}
+	if open {
+		update["i_remind"] = 1
+	} else {
+		update["i_remind"] = 0
+	}
 	return db.Mgo.UpdateById(this.SaveTable, fid, map[string]interface{}{
 		"$set": update,
 	})

+ 95 - 24
src/jfw/modules/bigmember/src/service/analysis/decision.go

@@ -40,7 +40,7 @@ func (this *Analysis) DecInfo() {
 			buyerClass = getRes.BuyerClass     //客户类型(采购单位行业)
 			buyerContent = getRes.BuyerContent //采购内容(一个功能一个新名字 其实就是订阅关键词)
 		}
-		log.Println(buyerClass, area, buyerContent)
+		// log.Println(buyerClass, area, buyerContent)
 		if len(buyerContent) > 0 {
 			decQuery := DecQuery(area, buyerClass, buyerContent)
 			regMap.Data = getDecInfo(decQuery)
@@ -59,29 +59,9 @@ func (this *Analysis) DecInfo() {
 func getDecInfo(decQuery string) map[string]interface{} {
 	// devQuery := ""
 	aggs, res := GetAggs(P_INDEX, P_TYPE, decQuery)
-	var _res = []map[string]interface{}{}
+	log.Println("---:", len(res))
 	if res != nil && len(res) > 0 {
-		for k, v := range res {
-			if v["s_winner"] == nil || !regWinner.MatchString(qutil.ObjToString(v["s_winner"].(string))) {
-				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)
-					}
-				}
-				v["review_experts"] = review_experts
-			}
-			ids := qutil.ObjArrToStringArr(v["ids"].([]interface{}))
-			if len(ids) > 0 {
-				delete(v, "ids")
-				v["infoid"] = qutil.EncodeArticleId2ByCheck(ids[0])
-			}
-			v["_id"] = qutil.EncodeArticleId2ByCheck(v["_id"].(string))
-			_res = append(_res, res[k])
-		}
+		res = Sequence(res)
 	}
 	//
 	var aggsArr = map[string]interface{}{}
@@ -210,7 +190,98 @@ func getDecInfo(decQuery string) map[string]interface{} {
 		}
 	}
 	return map[string]interface{}{
-		"PDeatils":  _res,
+		"PDeatils":  res,
 		"PAnalysis": aggsArr,
 	}
 }
+
+//决策分析 根据字段权重排序 中标企业和中标价格
+var (
+	bidtype_score        = 1 //采购方式
+	review_experts_score = 1 //评审专家
+	zbtime_score         = 1 //招标时间
+	bidamount_score      = 2 //中标价格
+	budget_score         = 2 //预算
+	project_rate_score   = 1 //折扣率
+	winnerorder_score    = 1 //中标候选人
+)
+
+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 || !regWinner.MatchString(qutil.ObjToString(v["s_winner"].(string))) {
+			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)
+				}
+			}
+			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
+		}
+		ids := qutil.ObjArrToStringArr(v["ids"].([]interface{}))
+		if len(ids) > 0 {
+			delete(v, "ids")
+			v["infoid"] = qutil.EncodeArticleId2ByCheck(ids[0])
+		}
+		v["_id"] = qutil.EncodeArticleId2ByCheck(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...)
+}

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

@@ -490,6 +490,7 @@ func GetAggs(index, itype, query string) (aggs elastic1.Aggregations, res []map[
 			}
 		}()
 		searchResult, err := client.Search().Index(index).Type(itype).Source(query).Do()
+		log.Println(err, "____________:::", searchResult.TimedOut)
 		if err != nil {
 			log.Println("从ES查询出错", err.Error())
 		}

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

@@ -23,6 +23,8 @@ func (this *Analysis) ForPContent() {
 				id = qutil.DecodeArticleId2ByCheck(id)[0]
 				data, ok := db.Mgo_Ent.FindById(C_FPContent, id, nil)
 				if ok && data != nil {
+					delete(*data, "_id")
+					delete(*data, "infoid")
 					regMap.Data = data
 				}
 			}

+ 25 - 14
src/jfw/modules/bigmember/src/service/analysis/forecastwinner.go

@@ -171,11 +171,6 @@ func (this *Analysis) FWStatus() {
 				} else {
 					log.Println("redis 获取预测数据有误-", resp)
 				}
-				//log.Println("--resp--", resp)
-				var getRes map[string]interface{}
-				if redis.GetNewInterface("other", redis_forecast_status+userId, &getRes) != nil {
-					log.Println("redis 获取预测参数有误-", userId)
-				}
 				f_id := ""
 				//获取数据为空
 				if resp != nil && len(resp) > 0 {
@@ -210,7 +205,23 @@ func (this *Analysis) FWStatus() {
 					}
 				}
 				//保存请求日志
-				go forecastLog(userId, f_id, getRes, resp)
+				go func(f_id, userId string, resp []*EntInfo) {
+					//log.Println("--resp--", resp)
+					var getRes map[string]interface{}
+					if redis.GetNewInterface("other", redis_forecast_status+userId, &getRes) != nil {
+						log.Println("redis 获取预测参数有误-", userId)
+					}
+					forecastLog(userId, f_id, getRes, resp)
+				}(f_id, userId, resp)
+			} else {
+				//预测中
+				rfdExist, _ := redis.Exists("other", redis_forecast_date+userId)
+				if rfdExist {
+					regMap.Data = map[string]interface{}{
+						"id":      "",
+						"success": true,
+					}
+				}
 			}
 		} else {
 			regMap.Error_code = Error_code_1001
@@ -284,16 +295,16 @@ func (this *Analysis) FWResult() {
 					if res != nil {
 						delete((*res), "_id")
 						requestData := *qutil.ObjToMap((*res)["requestData"])
-						if requestData != nil && requestData["Id"] != nil {
-							abstract := *elastic.GetById(P_INDEX, P_TYPE, requestData["Id"].(string))
+						if requestData != nil && requestData["id"] != nil {
+							abstract := *elastic.GetById(P_INDEX, P_TYPE, requestData["id"].(string))
 							if len(abstract) > 0 {
-								requestData["Agency"] = abstract[0]["agency"]
-								requestData["_Area"] = abstract[0]["area"]
-								requestData["_City"] = abstract[0]["city"]
-								requestData["Buyerperson"] = abstract[0]["buyerperson"]
-								requestData["Buyertel"] = abstract[0]["buyertel"]
+								requestData["agency"] = abstract[0]["agency"]
+								requestData["_area"] = abstract[0]["area"]
+								requestData["_city"] = abstract[0]["city"]
+								requestData["buyerperson"] = abstract[0]["buyerperson"]
+								requestData["buyertel"] = abstract[0]["buyertel"]
 							}
-							requestData["Id"] = qutil.EncodeArticleId2ByCheck(requestData["Id"].(string))
+							requestData["id"] = qutil.EncodeArticleId2ByCheck(requestData["id"].(string))
 						}
 						delete(requestData, "RedisFKey")
 					}

+ 4 - 4
src/jfw/modules/bigmember/src/service/analysis/potential.go

@@ -89,13 +89,13 @@ func (this *Analysis) CsORRsList() {
 				o_mb, ok := db.Mgo.FindById(C_User, userId, `{"o_member_jy":1}`)
 				if ok && o_mb != nil && (*o_mb) != nil {
 					o_member_jy := qutil.ObjToMap((*o_mb)["o_member_jy"])
-					if len(area) == 0 {
+					if len(area) == 0 && (*o_member_jy)["o_area"] != nil {
 						area = *qutil.ObjToMap((*o_member_jy)["o_area"].(map[string]interface{}))
 					}
-					if len(buyerClass) == 0 {
+					if len(buyerClass) == 0 && (*o_member_jy)["a_buyerclass"] != nil {
 						buyerClass = qutil.ObjArrToStringArr((*o_member_jy)["a_buyerclass"].([]interface{}))
 					}
-					if len(business_scope) == 0 {
+					if len(business_scope) == 0 && (*o_member_jy)["a_items"] != nil {
 						a_items := qutil.ObjArrToMapArr((*o_member_jy)["a_items"].([]interface{}))
 						if len(a_items) > 0 {
 							for _, v := range a_items {
@@ -135,7 +135,7 @@ func (this *Analysis) CsORRsList() {
 			//客户
 			if pcor == "C" {
 				potComQ := PCQuery(area, industry, buyerClass, business_scope, sort_no, pcor)
-				log.Println("potComQ:", potComQ)
+				// log.Println("potComQ:", potComQ)
 				regMap.Data = map[string]interface{}{
 					"list": getPCostomers(userId, entName, potComQ),
 					"param": map[string]interface{}{

+ 25 - 0
src/jfw/modules/bigmember/src/service/follow/project.go

@@ -20,6 +20,7 @@ type FollowProject struct {
 	followRead    xweb.Mapper `xweb:"/follow/project/read"`        //项目关注已读
 	followList    xweb.Mapper `xweb:"/follow/project/list"`        //项目关注列表
 	addTime       xweb.Mapper `xweb:"/follow/project/addTime"`     //项目关注-添加提醒时间&开标时间
+	remindSwitch  xweb.Mapper `xweb:"/follow/project/remind"`      //项目关注-项目提醒开关
 	remove30Day   xweb.Mapper `xweb:"/follow/project/remove30Day"` //批量删除30天未更新的项目
 }
 
@@ -298,3 +299,27 @@ func (this *FollowProject) AddTime() {
 	}
 	this.ServeJson(NewResult(rData, errMsg))
 }
+
+//项目提醒开关
+func (this *FollowProject) RemindSwitch() {
+	userId := qutil.ObjToString(this.GetSession("userId"))
+	rData, errMsg := func() (interface{}, error) {
+		projectManager, err := entity.CreateProjectFollowManager(userId)
+		if err != nil {
+			return nil, err
+		}
+		open := this.GetString("flag") == "1"
+		fid, err := projectManager.GetMsgId(this.GetString("fid")) //获取关注id
+		if err != nil {
+			return nil, err
+		}
+		if !projectManager.RemindSwitch(fid, open) {
+			return nil, errors.New("项目提醒状态更改失败")
+		}
+		return "success", nil
+	}()
+	if errMsg != nil {
+		log.Printf("%s 项目关注添加提醒时间&开标时间出错:%s\n", userId, errMsg.Error())
+	}
+	this.ServeJson(NewResult(rData, errMsg))
+}

+ 13 - 13
src/jfw/modules/bigmember/src/util/rpc.go

@@ -65,19 +65,19 @@ func Attachment(am *JyMemberRequest) (rep *JyMemberResponse, err error) {
 //JyService.Forecast  中标预测分析rpc接口
 
 type ForecastS struct {
-	Pname        string   //`json:"pname"`        //项目名称
-	Id           string   //`json:"id"`           //项目id
-	Infoid       string   //`json:"infoid"`       //项目第一个listid
-	BuyerContent []string //`json:"buyerContent"` //采购内容
-	Buyer        string   //`json:"buyer"`        //采购单位
-	Budget       float64  //`json:"budget"`       //预算
-	Area         string   //`json:"area"`         //地区
-	City         string   //`json:"city"`         //城市
-	RedisFKey    string   //`json:"redisFKey"`    //保存数据rediskey值
-	Agency       string   //`json:"agency"`       //招标代理机构
-	Buyertel     string   //`json:"buyertel"`     //采购联系方式
-	Buyerperson  string   //`json:"buyerperson"`  //采购联系人
-	Type         string   //`json:"type"`         //是否需要传参数
+	Pname        string   `json:"pname"`        //项目名称
+	Id           string   `json:"id"`           //项目id
+	Infoid       string   `json:"infoid"`       //项目第一个listid
+	BuyerContent []string `json:"buyerContent"` //采购内容
+	Buyer        string   `json:"buyer"`        //采购单位
+	Budget       float64  `json:"budget"`       //预算
+	Area         string   `json:"area"`         //地区
+	City         string   `json:"city"`         //城市
+	RedisFKey    string   `json:"redisFKey"`    //保存数据rediskey值
+	Agency       string   `json:"agency"`       //招标代理机构
+	Buyertel     string   `json:"buyertel"`     //采购联系方式
+	Buyerperson  string   `json:"buyerperson"`  //采购联系人
+	Type         string   `json:"type"`         //是否需要传参数
 }
 
 type repBool struct {

+ 7 - 5
src/web/templates/big-member/wx/page_buy_commit.html

@@ -123,13 +123,15 @@
             // 价格参数
             columns: ['1','2','3'],
             severList:[
-                {
-                    listname:'包含【智慧版】全部服务',
+            {
+                    listname:'包含【商机版】全部服务',
                     addclass:'gold'
                 },
-                {listname:'业务拓展分析'},
-                {listname:'市场分析'},
-                {listname:'企业情报监控'}
+                {listname:'新项目预测推送'},
+                {listname:'中标企业预测'},
+                {listname:'投标决策分析'},
+                {listname:'采购单位全景分析'},
+                {listname:'企业全景分析'}
             ],
             edition: [
                 {