liumiaomiao 3 yıl önce
ebeveyn
işleme
d0eaf28f4f
71 değiştirilmiş dosya ile 2988 ekleme ve 622 silme
  1. 1 0
      README.md
  2. 2 1
      src/jfw/front/dataExport.go
  3. 14 14
      src/jfw/front/supsearch.go
  4. 1 0
      src/jfw/front/ws_dataExport.go
  5. 1 0
      src/jfw/modules/app/src/app/front/ws_dataExport.go
  6. 19 6
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/css/ent_portrait.css
  7. 24 0
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/css/public.css
  8. 3 0
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/css/set_area_industry_cate.css
  9. 29 36
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/ent_portrait.js
  10. 15 8
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/set_infotype.js
  11. 8 4
      src/jfw/modules/app/src/web/staticres/jyapp/js/searchindex.js
  12. 2 2
      src/jfw/modules/app/src/web/staticres/jyapp/js/wxSupersearch.js
  13. 1 1
      src/jfw/modules/app/src/web/templates/big-member/page_big_subscribe.html
  14. 10 3
      src/jfw/modules/app/src/web/templates/big-member/page_ent_portrait.html
  15. 144 0
      src/jfw/modules/app/src/web/templates/big-member/page_free_ent_project_news.html
  16. 1 1
      src/jfw/modules/app/src/web/templates/dataExport/dataExport_subType.html
  17. 23 8
      src/jfw/modules/app/src/web/templates/dataExport/dataExport_toOrderDetail.html
  18. 4 1
      src/jfw/modules/app/src/web/templates/vipsubscribe/messageType.html
  19. 9 2
      src/jfw/modules/app/src/web/templates/weixin/search/tabSearch.html
  20. 1 4
      src/jfw/modules/bigmember/src/entinfo/entinfo.go
  21. 6 2
      src/jfw/modules/bigmember/src/entity/followEnterprise.go
  22. 4 0
      src/jfw/modules/bigmember/src/entity/portrailUtil.go
  23. 6 11
      src/jfw/modules/bigmember/src/entity/portrait.go
  24. 0 46
      src/jfw/modules/bigmember/src/entity/portraitWinnerSearch.go
  25. 224 0
      src/jfw/modules/bigmember/src/entity/portrait_project.go
  26. 22 12
      src/jfw/modules/bigmember/src/service/analysis/decision.go
  27. 54 29
      src/jfw/modules/bigmember/src/service/analysis/esquery.go
  28. 84 32
      src/jfw/modules/bigmember/src/service/analysis/potential.go
  29. 46 31
      src/jfw/modules/bigmember/src/service/portrait/memberPortraitAction.go
  30. 40 28
      src/jfw/modules/bigmember/src/service/portrait/subvipPortraitAction.go
  31. 3 0
      src/jfw/modules/common/src/qfw/util/jy/payUser.go
  32. 67 2
      src/jfw/modules/publicapply/src/enterpriseSearch/entity/entQuery.go
  33. 1 0
      src/jfw/modules/publicapply/src/enterpriseSearch/service/search.go
  34. 1 1
      src/jfw/modules/subscribepay/src/config.json
  35. 107 31
      src/jfw/modules/subscribepay/src/entity/dataexport.go
  36. 6 1
      src/jfw/public/dataexport.go
  37. 1 1
      src/web/staticres/big-member/css/j-icons.css
  38. 24 0
      src/web/staticres/big-member/css/public.css
  39. 3 0
      src/web/staticres/big-member/css/set_area_industry_cate.css
  40. 4 0
      src/web/staticres/big-member/js/set_infotype.js
  41. 19 6
      src/web/staticres/big-member/weixin/css/ent_portrait.css
  42. 1 1
      src/web/staticres/big-member/weixin/css/j-icons.css
  43. 24 0
      src/web/staticres/big-member/weixin/css/public.css
  44. 192 0
      src/web/staticres/common-module/big-member/css/ent_project_news.css
  45. 551 0
      src/web/staticres/common-module/big-member/js/ent_project_news.js
  46. 32 0
      src/web/staticres/common-module/collection/css/index.css
  47. 103 143
      src/web/staticres/common-module/collection/js/area-mobile.js
  48. 29 34
      src/web/staticres/common-module/collection/js/ent_portrait.js
  49. 3 3
      src/web/staticres/common-module/collection/js/history-project.js
  50. 84 44
      src/web/staticres/common-module/collection/js/notice-mobile.js
  51. 196 0
      src/web/staticres/common-module/collection/js/popup-select-mobile.js
  52. 126 16
      src/web/staticres/common-module/ent-search/ent-search-template.js
  53. 6 0
      src/web/staticres/common-module/ent-search/ent-search-template.prefixer.css
  54. 4 2
      src/web/staticres/frontRouter/pc/solution/js/pc-collect-solution-info.js
  55. 208 3
      src/web/staticres/js/ent-search-index-pc.js
  56. 13 4
      src/web/staticres/js/superSearch.js
  57. 8 5
      src/web/staticres/js/wxSupersearch.js
  58. 139 0
      src/web/templates/big-member/wx/page_free_ent_project_news.html
  59. 2 2
      src/web/templates/common/pcbottom.html
  60. 4 4
      src/web/templates/frontRouter/pc/solution/free/index.html
  61. 13 6
      src/web/templates/frontRouter/wx/collection/sess/ent_portrait.html
  62. 19 5
      src/web/templates/frontRouter/wx/collection/sess/ent_portrait_change.html
  63. 1 1
      src/web/templates/pc/biddetail_rec.html
  64. 4 4
      src/web/templates/pc/dataExport_sieve.html
  65. 120 0
      src/web/templates/pc/entsearchindex.html
  66. 31 7
      src/web/templates/pc/orderDetail.html
  67. 6 3
      src/web/templates/pc/supsearch.html
  68. 1 1
      src/web/templates/weixin/dataExport/dataExport_subType.html
  69. 22 7
      src/web/templates/weixin/dataExport/dataExport_toOrderDetail.html
  70. 8 2
      src/web/templates/weixin/search/tabSearch.html
  71. 4 1
      src/web/templates/weixin/vipsubscribe/messageType.html

+ 1 - 0
README.md

@@ -3,5 +3,6 @@
 weixin sdk https://github.com/wizjin/weixin
 web用xweb框架
 
+
 v4.5.9.15
 更改程序配置文件中配的是开发域名的字段

+ 2 - 1
src/jfw/front/dataExport.go

@@ -348,8 +348,8 @@ func (d *DataExport) SuperSearchExport() error {
 		Hasbuyertel:  d.GetString("buyertel"),                     //是否有采购电话
 		Haswinnertel: d.GetString("winnertel"),                    //是否有中标电话
 		SelectIds:    strings.TrimSpace(d.GetString("selectIds")), //选择信息id
+		Notkey:       d.GetString("notkey"),                       //排除词
 	}
-
 	//数据回显
 	d.SetSession("Echo_timeslot", d.GetString("timeslot"))
 	d.SetSession("Echo_keywords", reqData.Keywords)
@@ -363,6 +363,7 @@ func (d *DataExport) SuperSearchExport() error {
 	d.SetSession("Echo_buyerclass", reqData.Buyerclass)
 	d.SetSession("Echo_hasBuyertel", reqData.Hasbuyertel)
 	d.SetSession("Echo_hasWinnertel", reqData.Haswinnertel)
+	d.SetSession("Echo_notkey", reqData.Notkey)
 
 	saveData := reqData.PassBidSearchExport()
 	saveData["selectType"] = strings.Join(jy.GetVipState(public.Mysql, public.MQFW, userId).

+ 14 - 14
src/jfw/front/supsearch.go

@@ -254,7 +254,19 @@ func (p *Pcsearch) PcSearchIndex() error {
 	if selectType == "" {
 		selectType = "title,content"
 	}
-
+	vipStatus := jy.GetVipState(public.Mysql, public.MQFW, userId)
+	isPayedUser := vipStatus.IsPayedUser()
+	queryItems := vipStatus.GetQueryItems(selectType, util.Int64All(config.Sysconfig["bidSearchOldUserLimit"]))
+	if isPayedUser {
+		buyerclass = p.GetString("buyerclass")
+		hasBuyerTel, hasWinnerTel = p.GetString("buyertel"), p.GetString("winnertel")
+		notkey = p.GetString("notkey")
+	} else {
+		//时间自定义选择默认是vip 大会员 等权限
+		if len(strings.Split(publishtime, "_")) == 2 {
+			publishtime = ""
+		}
+	}
 	//历史导出数据回显
 	if strings.Contains(p.Url(), "?goback") {
 		keywords = util.ObjToString(p.GetSession("Echo_keywords"))
@@ -269,19 +281,7 @@ func (p *Pcsearch) PcSearchIndex() error {
 		hasBuyerTel = util.ObjToString(p.GetSession("Echo_hasBuyertel"))
 		hasWinnerTel = util.ObjToString(p.GetSession("Echo_hasWinnertel"))
 		industry = util.ObjToString(p.GetSession("Echo_industry"))
-	}
-	vipStatus := jy.GetVipState(public.Mysql, public.MQFW, userId)
-	isPayedUser := vipStatus.IsPayedUser()
-	queryItems := vipStatus.GetQueryItems(selectType, util.Int64All(config.Sysconfig["bidSearchOldUserLimit"]))
-	if isPayedUser {
-		buyerclass = p.GetString("buyerclass")
-		hasBuyerTel, hasWinnerTel = p.GetString("buyertel"), p.GetString("winnertel")
-		notkey = p.GetString("notkey")
-	} else {
-		//时间自定义选择默认是vip 大会员 等权限
-		if len(strings.Split(publishtime, "_")) == 2 {
-			publishtime = ""
-		}
+		notkey = util.ObjToString(p.GetSession("Echo_notkey"))
 	}
 
 	b_word, s_word := "", ""

+ 1 - 0
src/jfw/front/ws_dataExport.go

@@ -385,6 +385,7 @@ func (wd *WsDataExport) SearchExport() error {
 		Hasbuyertel:  wd.GetString("buyertel"),                     //是否有采购电话
 		Haswinnertel: wd.GetString("winnertel"),                    //是否有中标电话
 		SelectIds:    strings.TrimSpace(wd.GetString("selectIds")), //选择信息id
+		Notkey:       wd.GetString("notkey"),                       //排除词
 	}
 	saveData := reqData.PassBidSearchExport()
 	saveData["selectType"] = strings.Join(jy.GetVipState(public.Mysql, public.MQFW, userId).

+ 1 - 0
src/jfw/modules/app/src/app/front/ws_dataExport.go

@@ -350,6 +350,7 @@ func (wd *WsDataExport) SearchExport() error {
 		Hasbuyertel:  wd.GetString("buyertel"),                     //是否有采购电话
 		Haswinnertel: wd.GetString("winnertel"),                    //是否有中标电话
 		SelectIds:    strings.TrimSpace(wd.GetString("selectIds")), //选择信息id
+		Notkey:       wd.GetString("notkey"),                       //排除词
 	}
 
 	saveData := reqData.PassBidSearchExport()

+ 19 - 6
src/jfw/modules/app/src/web/staticres/jyapp/big-member/css/ent_portrait.css

@@ -82,16 +82,11 @@
     margin-top: .08rem;
 }
 
-.tab-card:not(:first-of-type) {
-    margin-top: .16rem;
-}
-.tab-card:last-of-type {
-    margin-bottom: .44rem;
-}
 .tab-card {
     display: flex;
     align-items: center;
     flex-direction: column;
+    margin-top: .16rem;
     padding: .16rem 0;
 }
 .tab-card.charts {
@@ -370,3 +365,21 @@
 #ent-portrait-change .border-line-b:after {
     width: calc(100% + 0.32rem);
 }
+
+.project-news .tab-card-title {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+}
+.project-news .tab-card-title .t-c-t-r {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    font-weight: normal;
+    font-size: .26rem;
+}
+.project-news .tab-card-title .t-c-t-r .link {
+    color: #2abed1;
+    text-decoration: underline;
+    margin-right: .08rem;
+}

+ 24 - 0
src/jfw/modules/app/src/web/staticres/jyapp/big-member/css/public.css

@@ -497,6 +497,30 @@ button[disabled] {
     color: #9B9CA3;
 }
 
+.preferential-tag {
+    position: relative;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    padding: 2px 6px;
+    height: 18px;
+    color: #fff;
+    background: linear-gradient(102deg,#ffa674, #f01212 100%);
+    border-top-left-radius: 4px;
+    border-bottom-left-radius: 4px;
+}
+.preferential-tag::after {
+    content: '';
+    position: absolute;
+    top: 0;
+    right: -5px;
+    width: 0;
+    height: 0;
+    border-top: 9px solid #f01212;
+    border-right: 5px solid transparent;
+    border-bottom: 9px solid #f01212;
+}
+
 .shiyong_common {
     width: 5.92rem!important;
     height: 4.48rem;

+ 3 - 0
src/jfw/modules/app/src/web/staticres/jyapp/big-member/css/set_area_industry_cate.css

@@ -255,6 +255,9 @@
     font-size: 0.3rem;
     line-height: 0.44rem;
   }
+	#typeHidden{
+		display:none;
+	}
   #js_dialog .weui-dialog{
     border-radius: 8px;
     left: .72rem;

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

@@ -64,8 +64,8 @@ var vNode = {
       // tab2中的项目动态
       topProject: {
         list: [],
-        count: '',
-        pageSign: '',
+        count: 1, // 总共多少条数据
+        pageSize: 3,
         showGetNextButton: true
       },
       entPortraitInfo: {},
@@ -230,6 +230,9 @@ var vNode = {
     hideDt: function() {
       // 是新超级订阅 且不是大会员且次数已用完   或大会员没有项目动态权限
       return this.isVip && this.powerInfo.memberStatus <= 0 && this.entvisit.total <= this.entvisit.usage || this.conf.arr.indexOf(13) === -1
+    },
+    isMemberAndSvip: function () {
+      return this.powerInfo.memberStatus > 0 || this.powerInfo.vipStatus > 0
     }
   },
   methods: {
@@ -393,26 +396,14 @@ var vNode = {
         }
       });
     },
-    // 获取项目动态
-    getProjectNews: function () {
+    getProjectNewsUrl: function () {
       var _this = this
-      var data = {
-        entId: _this.entInfo.id,
-        count: _this.topProject.count,
-        pageSign: _this.topProject.pageSign
-      }
-
-      if (data.pageSign) {
-        this.loading = this.showLoading()
-      }
-
       var urls = ''
       // 判断专家版、智慧版; 商机版和自定义版时判断是不是超级订阅 
       if (_this.powerInfo.memberStatus > 0 && _this.powerInfo.memberStatus <= 2) {
         urls = '/bigmember/portrait/winner/getNewMsg'
       } else if (_this.powerInfo.memberStatus > 2) {
         if (_this.isVip) {
-          console.log(_this.entvisit.total,_this.entvisit.usage)
           if (_this.entvisit.total <= _this.entvisit.usage && !_this.entvisit.visited) {
             urls = '/bigmember/portrait/winner/getNewMsg'
           } else {
@@ -424,6 +415,21 @@ var vNode = {
       } else {
         urls = '/bigmember/portrait/subVipPortrait/winnerNewMsg'
       }
+      return urls
+    },
+    // 获取项目动态
+    getProjectNews: function () {
+      var _this = this
+      var data = {
+        entId: _this.entInfo.id,
+        pageNum: 1,
+        pageSize: _this.topProject.pageSize
+      }
+
+      this.loading = this.showLoading()
+
+      var urls = this.getProjectNewsUrl()
+      
       $.ajax({
         type: 'POST',
         url: urls,
@@ -433,27 +439,8 @@ var vNode = {
             _this.loading.clear()
             _this.topProject.count = res.data.count
             if (res.data.list && $.isArray(res.data.list)) {
-              if (!_this.topProject.pageSign) {
-                _this.singleTab = false
-              }
-
-              // 修改当前pageSign值
-              if (!_this.topProject.pageSign) {
-                _this.topProject.list = []
-                _this.topProject.pageSign = 'more'
-                if (res.data.count <= 3) {
-                  _this.topProject.showGetNextButton = false
-                }
-              } else if (_this.topProject.pageSign === 'more') {
-                _this.topProject.pageSign = 'max'
-                if (res.data.count <= 23) {
-                  _this.topProject.showGetNextButton = false
-                }
-              } else if (_this.topProject.pageSign === 'max') {
-                _this.topProject.showGetNextButton = false
-              }
-
-              _this.topProject.list = _this.topProject.list.concat(res.data.list)
+              _this.singleTab = false
+              _this.topProject.list = res.data.list
             }
           } else {
             _this.$toast(res.error_msg)
@@ -1057,6 +1044,12 @@ var vNode = {
         location.href = 'unit_portrayal?entName=' + item.name
       }
     },
+    goToFilterProjectNews: function () {
+      this.savePageState()
+      var url = this.getProjectNewsUrl()
+      var reqSign = url.indexOf('subVipPortrait') === -1 ? 'bigmember' : 'svip'
+      location.href = './free_ent_project_news?eid=' + this.entInfo.id + '&reqSign=' + reqSign
+    },
     savePageState: function () {
       this.scrollTop = $('#ent-portrait').scrollTop()
       var data = {

+ 15 - 8
src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/set_infotype.js

@@ -90,11 +90,12 @@ var vNode = {
                         value: '变更',
                         level: 2,
                     },
-                    {
-                        name: '其它',
-                        value: '其它',
-                        level: 2,
-                    },
+                    // {
+                    //     name: '其它',
+                    //     value: '其它',
+                    //     level: 2,
+                    //     hidden: "typeHidden",
+                    // },
                 ]
             },
             {
@@ -302,6 +303,9 @@ var vNode = {
                         if (inList) {
                             selectedCount ++
                             iitem.selected = true
+                        	if(iitem.value=="其它"){
+								iitem.hidden = ""
+							}
                         }
                     })
 
@@ -320,9 +324,6 @@ var vNode = {
             }
 
             this.infoTypeList.forEach(function (item) {
-                if (item.value && item.selected) {
-                    arr.push(item.value)
-                }
 
                 if (item.level !== 0) {
                     item.children.forEach(function (iitem) {
@@ -331,6 +332,12 @@ var vNode = {
                         }
                     })
                 }
+                if (item.value && item.selected) {
+                    arr.push(item.value)
+                }
+                if (item.selected && item.name === '招标公告') {
+                    arr.push('其它')
+                }
             })
             return arr
         },

+ 8 - 4
src/jfw/modules/app/src/web/staticres/jyapp/js/searchindex.js

@@ -281,11 +281,11 @@ var SuperSearch = {
         $("#supersearchPage input[name=super_searchinput]").blur();
         window.isKeyDownToEntSearch = true
         if (vEntSearchComponent) {
-          vEntSearchComponent.toggleEntShow(true)
+          // vEntSearchComponent.toggleEntShow(true)
         }
         return
       }
-      if ($(this).text().trim() !== '筛选' || $("#search-header-input").val().trim() === '') {
+      if ($(this).text().trim() !== '搜索' || $("#search-header-input").val().trim() === '') {
         return
       }
       $("#supersearchPage input[name=super_searchinput]").blur();
@@ -1476,7 +1476,11 @@ var SuperSearch = {
         if(details && details.length > 0){
           detail = details[0];
           if(detail.length>100){
-            detail = detail.substring(0,100);
+            detail = detail.substring(0,100)
+            if (detail.indexOf("}")!=-1){
+//            	.replace(/[^\{\u4e00-\u9fa5]{1,90}{[^\}\u4e00-\u9fa5]+?}/g,"");
+				detail = detail.substring(detail.indexOf("}")+1)
+            }
           }
         }
       }
@@ -1495,7 +1499,7 @@ var SuperSearch = {
             $("#supersearchPage #tempDiv").html(detail);
             detail = $("#supersearchPage #tempDiv").text().replace(/</g,"&lt;").replace(/>/g,"&gt;");
           }catch(e){
-            detail = detail.replace(/</g,"&lt;").replace(/>/g,"&gt;");
+            detail = detail.replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/[^\{\u4e00-\u9fa5]{1,90}{[^\}\u4e00-\u9fa5]+?}/g,"");
           }
           detail = keyWordHighlight(detail,wordsArray,'<font class="keyword">$1</font>');
         }

+ 2 - 2
src/jfw/modules/app/src/web/staticres/jyapp/js/wxSupersearch.js

@@ -1032,7 +1032,7 @@ var SuperSearch = {
 				if(details && details.length > 0){
 					detail = details[0];
 					if(detail.length>100){
-						detail = detail.substring(0,100);
+						detail = detail.substring(0,100).replace(/[^\{\u4e00-\u9fa5]{1,90}{[^\}\u4e00-\u9fa5]+?}/g,"");
 					}
 				}
 			}
@@ -1051,7 +1051,7 @@ var SuperSearch = {
 					   $("#supersearchPage #tempDiv").html(detail);
 					   detail = $("#supersearchPage #tempDiv").text().replace(/</g,"&lt;").replace(/>/g,"&gt;");
 					}catch(e){
-					   detail = detail.replace(/</g,"&lt;").replace(/>/g,"&gt;");
+					   detail = detail.replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/[^\{\u4e00-\u9fa5]{1,90}{[^\}\u4e00-\u9fa5]+?}/g,"");
 					}
 					detail = keyWordHighlight(detail,wordsArray,'<font class="keyword">$1</font>');
 				}

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

@@ -65,7 +65,7 @@
                         <div class="select-area-box j-container">
                             <div class="select-area-pop j-main">
                               <van-index-bar class="area-list" :index-list="indexList">
-                                <div v-for="item in indexList" :key="item">
+                                <div class="key-card-box" v-for="item in indexList" :key="item">
                                   <van-index-anchor class="area-index" v-show="item !== '#'" :index="item"></van-index-anchor>
                                   <div class="area-card-box" v-if="refresh">
                                     <div

+ 10 - 3
src/jfw/modules/app/src/web/templates/big-member/page_ent_portrait.html

@@ -254,8 +254,15 @@
               <div class="j-img img-empty empty-img"></div>
               <p class="empty-text">暂无项目动态</p>
             </div>
-            <div class="bg-white tab-card cell-list" v-show="conf._13 && topProject.list.length !== 0">
-              <div class="tab-card-title">项目动态</div>
+            <div class="bg-white tab-card cell-list project-news" v-show="conf._13 && topProject.list.length !== 0">
+              <div class="tab-card-title">
+                <span class="t-c-t-l">项目动态</span>
+                <span class="t-c-t-r" v-if="isMemberAndSvip" @click="goToFilterProjectNews">
+                  <div class="link">高级搜索</div>
+                  <div class="preferential-tag">New</div>
+                </span>
+                <span v-else></span>
+              </div>
               <div class="tab-card-content">
                 <ul class="project-info-list">
                   <li class="project-info-item border-line-b clickable" v-for="(item,index) in topProject.list"
@@ -271,7 +278,7 @@
                         : '-'}</span>
                     </div>
                   </li>
-                  <li class="show-more" v-if="topProject.showGetNextButton" @click="getProjectNews">查看更多</li>
+                  <li class="show-more clickable" v-if="topProject.showGetNextButton && isMemberAndSvip && topProject.count > 3" @click="goToFilterProjectNews">查看更多</li>
                 </ul>
               </div>
             </div>

+ 144 - 0
src/jfw/modules/app/src/web/templates/big-member/page_free_ent_project_news.html

@@ -0,0 +1,144 @@
+<!DOCTYPE html>
+<html lang="zh-CN" style="font-size: 50px;">
+<head>
+    <title>项目动态</title>
+
+    <!--引入公共资源头部-->
+    {{include "/big-member/meta.html"}}
+
+    <!--S-当前页面的css资源-->
+    <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/reset-css/5.0.1/reset.min.css />
+    <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/index.css />
+    <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/icon/local.css />
+    <link rel="stylesheet" href='{{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/big-member/css/ent_project_news.css?v={{Msg "seo" "version"}}' />
+    <!--E-当前页面的css资源-->
+    <!--临时处理区域选择仅有一个时展示问题-->
+    <style>
+        .select-area-box.j-container.hide-all .van-index-bar__sidebar + .key-card-box {
+            display: none;
+        }
+        .select-area-box.j-container.hide-all .van-index-bar__sidebar + .key-card-box + .key-card-box .area-card-item:after {
+            content: "";
+            position: absolute;
+            right: 0;
+            bottom: 0;
+            background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAHHSURBVHgB7ZS/TsJQFMa/tkpIVEIMCRodIMQEZYGBB8An8AWMuOqgbm46uqFPIImzCS9gqrMDYhxYNAwODiQi/iMEe72nUkJJbe/FwuQ33Z57en49t+d+wL98VEovp1WMSUm9sgGm6grGIIKpDEVaj7zDFb1yYMFII+2QYGA47I+NDJjSbwuMsd3BuO/AtF4Ot6EVwFjead9XoAnjk0jL33J8A3JYrAuLueX5AhSF+QKUgf0ZSFZF7sGAsOg7Q198y6pkYEMDl/XKDrmHG2x9MYLz7BKS00FbXIOkyD0UhiO3nO1YFHuJeUQCk6i3O7huvPf2pDp0sion2FY8aq6rb584e6zb9oU7JKvisP1seMqctNeO4QnLlx943pctx3NK+62KYMVMwiySL9/zoi0pGEn1hNEd6/oiAZq8yMyEZoKtgRCF8e5uFBeY44UmyCmHhTiUil7UX7A2N+sJIzGGE0UG5gS15AUjGYoRV2VhP8Vb2OT/sNktLgKDohSruUzN1qGsVS0EA1iNhFB6enaHATXeXc4GJKvSGI5lrUpAPRg9mEcqYlVDiR/jh2JkLJgZEnEP4fpAg390jU/jlaYapbtc5nIw5xuaNAINUmtJBQAAAABJRU5ErkJggg==);
+            width: 14px;
+            height: 14px;
+            background-size: 100% 100%;
+        }
+        .select-area-box.j-container.hide-all .van-index-bar__sidebar + .key-card-box + .key-card-box .area-card-item {
+            position: relative;
+            background: #E8FAFD;
+            color: #2ABED1;
+        }
+    </style>
+</head>
+<body>
+<div class="j-container">
+    {{include "/big-member/header.html"}}
+    <div id="ent-project-news" class="j-main" v-cloak>
+        <div class="j-container search-container">
+            <div class="search-header">
+                <div class="header-ent-name border-line-b clickable">
+                    <span class="j-icon icon-company"></span>
+                    <span class="ent-title">${ entInfo.name }</span>
+                    <div class="ent-follow">
+                        <span class="j-icon"
+                            :class="!!entInfo.follow ? 'icon-favorite' : 'icon-add-favorite'"
+                            @click="changeFollowState"
+                            v-if="entInfo.followSearchFinish && entInfo.entExist">
+                        </span>
+                        <van-loading v-if="!entInfo.followSearchFinish" size="24px"></van-loading>
+                    </div>
+                </div>
+                <div class="search-input">
+                    <van-search
+                        v-model.trim="searchInfo.content"
+                        @search="doSearch"
+                        maxlength="50"
+                        placeholder="输入关键词">
+                        <template #left-icon>
+                            <span class="j-icon base-icon icon-search"></span>
+                        </template>
+                    </van-search>
+                    <div class="action-text clickable" @click="doSearch">搜索</div>
+                </div>
+                <div class="search-filters">
+                    <van-dropdown-menu :close-on-click-outside="false">
+                        <van-dropdown-item get-container="body" :lazy-render="false" title="搜索范围" ref="matchTypeMenu">
+                            <popup-select-component :data-list="matchTypeList" multiple show-all-button @confirm="pConfirm($event, 'matchType')" ref="matchTypeSelector"></popup-select-component>
+                        </van-dropdown-item>
+                        <van-dropdown-item get-container="body" :lazy-render="false" title="信息类型" class="collection" ref="infoTypeMenu">
+                            <notice-component class="collection" @cancel="cancel" @confirm="confirm" :selectnoticelist="searchFilters.infoType"  ref="infoTypeSelector"></notice-component>
+                        </van-dropdown-item>
+                        <van-dropdown-item get-container="body" :lazy-render="false" title="项目地区" ref="projectAreaMenu">
+                            <area-component :class="{'hide-all': filterInitData.areaArr.length == 2}" ref="projectAreaSelector" @cancel="cancel" @confirm="confirm"></area-component>
+                        </van-dropdown-item>
+                        <van-dropdown-item get-container="body" :lazy-render="false" title="发布时间" ref="publishTimeMenu">
+                            <popup-select-component ref="publishTimeSelector" button-type="button" :data-list="publishTimeList" @confirm="pConfirm($event, 'publishTime')"></popup-select-component>
+                        </van-dropdown-item>
+                    </van-dropdown-menu>
+                </div>
+            </div>
+            <div class="j-main" ref="jList">
+                <div class="list-wrapper">
+                    <van-list
+                        v-model="listState.loading"
+                        :finished="listState.finished"
+                        :immediate-check="false"
+                        finished-text=""
+                        @load="onLoad"
+                        class="project-info-list">
+                        <div
+                            v-for="(item, index) in listState.list"
+                            class="project-info-item bg-white border-line-b clickable"
+                            :immediate-check="false"
+                            @click="goToDetail(item)"
+                            :key="item.id">
+                            <div class="project-name">${ item.title }</div>
+                            <div class="project-info">
+                                <span class="tags">
+                                    <span class="tag tag-success" v-if="item.area">${item.area}</span>
+                                    <span class="tag tag-success" v-if="item.bidstatus">${item.bidstatus}</span>
+                                    <span class="tag tag-success" v-if="item.bidamount">${utils.moneyUnit(item.bidamount)}</span>
+                                </span>
+                                <span class="project-time">
+                                    ${item.firsttime ? new Date(item.firsttime * 1000).pattern('yyyy-MM-dd') : '-'}
+                                </span>
+                            </div>
+                        </div>
+                    </van-list>
+                    <div class="empty-container" v-show="listState.list.length === 0 && listState.loaded && !listState.loading">
+                        <div class="empty-content-position">
+                            <div class="image">
+                                <img src="/jyapp/big-member/image/img-empty.png">
+                            </div>
+                            <div class="empty-main tip-text">暂无数据</div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<!--S-当前页面的资源-->
+<script src=//cdn-common.jianyu360.com/cdn/lib/vue/2.6.11/vue.min.js></script>
+<script src=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/vant.min.js></script>
+<script src=//cdn-common.jianyu360.com/cdn/lib/zepto/1.2.0/zepto.min.js></script>
+{{include "/big-member/commonjs.html"}}
+<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/js/common.js?v={{Msg "seo" "version"}}'></script>
+<script>
+    var pageInfo = {
+        version: {{Msg "seo" "version"}},
+        platform: 'app'
+    }
+</script>
+<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/popup-select-mobile.js?v={{Msg "seo" "version"}}'></script>
+<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/notice-mobile.js?v={{Msg "seo" "version"}}'></script>
+<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/area-mobile.js?v={{Msg "seo" "version"}}'></script>
+<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/big-member/js/ent_project_news.js?v={{Msg "seo" "version"}}'></script>
+</body>
+</html>

+ 1 - 1
src/jfw/modules/app/src/web/templates/dataExport/dataExport_subType.html

@@ -130,7 +130,7 @@
                     <dd>单一</dd>
                     <dd>竞价</dd>
                     <dd>变更</dd>
-                    <dd>其他</dd>
+<!--                    <dd>其他</dd>-->
                     </dl>
                     </li>
                     <li>

+ 23 - 8
src/jfw/modules/app/src/web/templates/dataExport/dataExport_toOrderDetail.html

@@ -321,7 +321,7 @@
                             onek += '</span>'
                             onek += '</p>'
                         }
-                        if (appended != null && exclude.length != 0) {
+                        if (exclude != null && exclude.length != 0) {
                             onek += '<p class="item-list l-item">'
                             onek += '<span class="label">排除词:</span>'
                             onek += '<span class="item-list-parents value exclud">'
@@ -352,16 +352,31 @@
                 }
                 $(".money").append(priceHtml);
 
-                var selectTypeHtml = "";
+                var selectTypeHtml = "<span>";
                 if (selectType) {
-                    if (selectType == "title") {
-                        selectTypeHtml += "<span>按标题匹配</span>";
-                    } else if (selectType == "all") {
-                        selectTypeHtml += "<span>按全文匹配</span>";
+                    selectTypeHtml += "按"
+                    var selectTypeArr = selectType.split(",");
+                    var snArray = [];
+                    for (var i=0;i<selectTypeArr.length;i++){
+                      if (selectTypeArr[i] == "title") {
+                          snArray.push("标题");
+                      } else if (selectTypeArr[i] == "detail") {
+                          snArray.push("正文");
+                      } else if (selectTypeArr[i] == "mwinner") {
+                          snArray.push("中标企业");
+                      } else if (selectTypeArr[i] == "mbuyer") {
+                          snArray.push("采购单位");
+                      } else if (selectTypeArr[i] == "magency") {
+                          snArray.push("招标代理机构");
+                      } else if (selectTypeArr[i] == "filetext") {
+                          snArray.push("附件");
+                      } else if (selectTypeArr[i].indexOf("purchasing")!=-1) {
+                          snArray.push("项目名称/标的物");
+                      } 
                     }
-                } else {
-                    selectTypeHtml += "<span></span>";
+                     selectTypeHtml += snArray.join("、")+"匹配";
                 }
+                selectTypeHtml += "</span>"
                 $(".selectType").append(selectTypeHtml);
 
                 var subTypeHtml = "";

+ 4 - 1
src/jfw/modules/app/src/web/templates/vipsubscribe/messageType.html

@@ -120,7 +120,7 @@
                         <dd>单一</dd>
                         <dd>竞价</dd>
                         <dd>变更</dd>
-                        <dd>其它</dd>
+<!--                        <dd style="display:none;">其它</dd>-->
                     </dl>
                 </li>
                 <li>
@@ -222,6 +222,9 @@
             for (var i = infoTypeData.length - 1; i >= 0; i--) {
                 $(".list ul li dl dd").each(function(index){
                     if($(this).text()==infoTypeData[i]){
+                        if(infoTypeData[i]=="其它"){
+                           $(this).show();
+                        }
                         $(this).addClass("active");
                         isDtSelected (this);
                         isAllSelected ();

+ 9 - 2
src/jfw/modules/app/src/web/templates/weixin/search/tabSearch.html

@@ -588,6 +588,10 @@
     #hasNoData_tiptext .tip-text-for-group .tip-text-for-search {
         color: #2ABED1;
     }
+
+    #diyDateComponent .area-card-item {
+        width: auto;
+    }
 </style>
 
 <!--S-Loading-->
@@ -684,7 +688,7 @@
                                     <area-component ref="areaComponent" @select="updateScrollTop" v-show="activeTabIndex === 2"></area-component>
                                     <money-component :radio="false" :all="true" :tags="moneyTags" ref="moneyComponent"  v-show="activeTabIndex === 3"></money-component>
                                     <div class="more-popup-content" v-show="isMoreContent">
-                                        <div class="select-more-tag-group" @click="onSelectMoreGroup(item)"  v-for="(item,i) in moreContentList" :class="{'row-group': !conditionMap[item]}">
+                                        <div class="select-more-tag-group" @click="onSelectMoreGroup(item)"  v-for="(item,i) in moreContentList" :class="{'row-group': entTabs[item].title == '中标区域'}">
                                             <div class="select-tag-title">
                                                 @@entTabs[item].title@@
                                                 <div class="disabled-tag"  v-if="entTabs[item].disabled === true">开通</div>
@@ -692,10 +696,13 @@
                                             <div class="select-tag-content" v-if="conditionMap[item]">
                                                 <div class="select-more-tag-item" @click.stop="onSelectMoreItem(item, tags, ii)" v-for="(tags,ii) in conditionMap[item]" :class="{active: tags.checked}">@@tags.title@@</div>
                                             </div>
-                                            <div class="select-area-content" v-else>
+                                            <div class="select-area-content" v-else-if="entTabs[item].title == '中标区域'">
                                                 已选:@@conditionStrMap.biddingArea || '全国'@@
                                                 <van-icon name="arrow"></van-icon>
                                             </div>
+                                            <div id="diyDateComponent" class="select-tag-content collection" v-else-if="entTabs[item].title == '成立时间'">
+                                                <date-component :diy="true" :times="times"  :selectdate="selectDate" :key="'dateForEnt' + dateComponentKey" ref="dateComponentForEnt"></date-component>
+                                            </div>
                                         </div>
                                     </div>
                                 </div>

+ 1 - 4
src/jfw/modules/bigmember/src/entinfo/entinfo.go

@@ -5,7 +5,6 @@ import (
 	"fmt"
 	"qfw/util"
 	"qfw/util/elastic"
-	"time"
 	. "util"
 
 	"github.com/go-xweb/xweb"
@@ -100,9 +99,7 @@ func entInfoInit() []EntInfoStruct {
 					entInfo.Company_area = util.ObjToString(m["company_area"])
 					entInfo.Company_city = util.ObjToString(m["company_city"])
 					//时间格式处理
-					if establishData := util.Int64All(m["establish_date"]); establishData > 0 {
-						entInfo.Establish_date = time.Unix(establishData, 0).Format(util.Date_Short_Layout)
-					}
+					entInfo.Establish_date = util.ObjToString(m["establish_date"])
 					entInfo.Company_phone = util.ObjToString(m["company_phone"])
 					entInfo.Employee_no = util.ObjToString(m["employee_no"])
 					entInfo.Capital = util.Float64All(m["capital"])

+ 6 - 2
src/jfw/modules/bigmember/src/entity/followEnterprise.go

@@ -266,8 +266,12 @@ func (this *EntFollow) AddFollowEnt(entId string, getOldData ...bool) error {
 		}
 	}
 
-	if establishdate := qutil.Int64All((*res)["establish_date"]); establishdate > 0 {
-		followData["l_establishdate"] = establishdate
+	establishdate := qutil.ObjToString((*res)["establish_date"])
+	if establishdate != "" {
+		t, err := time.Parse(qutil.Date_Short_Layout, establishdate)
+		if err == nil {
+			followData["l_establishdate"] = t.Unix()
+		}
 	}
 
 	followId := db.Mgo.Save(this.SaveTable, followData)

+ 4 - 0
src/jfw/modules/bigmember/src/entity/portrailUtil.go

@@ -90,6 +90,10 @@ func CalculationShare(one, all float64) float64 {
 	return 0.0
 }
 
+type SimpleStringKeyValue struct {
+	Key string `json:"key"`
+}
+
 //画像时间短
 func GetPortraitTimeRange() (start, end time.Time) {
 	now := time.Now()

+ 6 - 11
src/jfw/modules/bigmember/src/entity/portrait.go

@@ -147,14 +147,12 @@ func (this *Portrait) GetWinnerContactsMsg(entId string) ([]map[string]interface
 }
 
 //企业画像-查询最新项目动态
-func (this *Portrait) GetWinnerNewMsg(entId string, start, limit int) ([]map[string]interface{}, error) {
-	if entId == "" {
-		return nil, errors.New("企业名称异常")
-	}
-	//if start > PortraitNewMegsLimit || start+limit > PortraitNewMegsLimit {
-	//	return nil, errors.New("超出检索限制")
-	//}
-	return GetWinnerNewProject(entId, start, limit), nil
+//增加 match 搜索词
+//	  matchType 搜索范围
+//    area 项目地区
+//    pushTime 发布时间
+func (this *Portrait) GetWinnerNewMsg(pwp *PortraitWinnerProject) ([]map[string]interface{}, int64, error) {
+	return pwp.GetList()
 }
 
 //企业画像-查询最新项目数量(前端用于展示是否加载更多)
@@ -163,9 +161,6 @@ func (this *Portrait) GetWinnerNewCount(entId string) int64 {
 		return -1
 	}
 	count := GetWinnerNewProjectCount(entId)
-	//if count > PortraitNewMegsLimit {
-	//	count = PortraitNewMegsLimit
-	//}
 	return count
 }
 

+ 0 - 46
src/jfw/modules/bigmember/src/entity/portraitWinnerSearch.go

@@ -13,7 +13,6 @@ import (
 )
 
 const (
-	newProject_fields       = `"_id","projectname","bidamount","title","publishtime","subtype","toptype","area"`
 	winnerPortraitSearchSql = `{"query":{"filtered":{"filter":{"bool":{"must":[{"term":{"entidlist":"%s"}},{"range":{"firsttime":{"lt":%d}}}]}}}},"aggs":{"three_year_data":{"filter":{"bool":{"must":[{"range":{"firsttime":{"gte":%d}}}]}},"aggs":{"bidamount_count":{"sum":{"field":"bidamount"}},"area_count":{"cardinality":{"field":"area"}},"buyer_count":{"cardinality":{"field":"buyer"}},"group_area":{"terms":{"field":"area","size":40},"aggs":{"bidamount_count":{"sum":{"field":"bidamount"}}}},"all_buyerclass":` + YearRate + `,"top_buyerclass":{"terms":{"field":"buyerclass","size":11,"order":[{"buyerclass_count_bidamount":"desc"}]},"aggs":{"buyerclass_avg_rate":` + BaseRate + `,"buyerclass_count_bidamount":{"sum":{"field":"bidamount"}},"buyerclass_top_buyer":{"terms":{"field":"buyer","order":[{"count_top_buyer":"desc"},{"_count":"desc"},{"last_winner_time":"desc"}],"size":5},"aggs":{"count_top_buyer":{"sum":{"field":"bidamount"}},"avg_rate_top_buyer":` + BaseRate + `,"last_winner_time":{"max":{"field":"firsttime"}}}},"top_buyerclass_rate_time_avg":` + YearRate + `}}}},"five_year_data_bidamount":{"filter":{"bool":{"must":[{"range":{"firsttime":{"gte":%d}}}]}},"aggs":{"year_bidamount":{"range":{"field":"firsttime","ranges":[%s]},"aggs":{"count":{"sum":{"field":"bidamount"}}}}}}},"size":0}`
 	winnerContactsSearch    = `{"bool":{"must":[{"term":{"projectset.entidlist":"%s"}}],"must_not":[{"term":{"projectset.buyertel":""}}]}}`
 )
@@ -31,51 +30,6 @@ func GetWinnerIdByName(entName string) (entId string) {
 	return
 }
 
-//GetWinnerNewProject 中标企业最新中标动态查询【若id不存在,则用名字查询】(近五年)
-func GetWinnerNewProject(entId string, start, size int) []map[string]interface{} {
-	defer qutil.Catch()
-	if entId == "" {
-		return []map[string]interface{}{}
-	}
-	newData := elastic.GetPage("bidding", "bidding", fmt.Sprintf(`{"TERM_entidlist":"%s","$and":[{"publishtime":{"$gte":%d}}]}`, entId, time.Now().AddDate(-5, 0, 0).Unix()), `{"publishtime":-1}`, newProject_fields, start, size)
-	if newData == nil || len(*newData) == 0 {
-		return []map[string]interface{}{}
-	}
-	for k, rowData := range *newData {
-		if rowData["subtype"] != nil {
-			(*newData)[k]["bidstatus"] = rowData["subtype"]
-		} else if rowData["toptype"] != nil {
-			(*newData)[k]["bidstatus"] = rowData["toptype"]
-		}
-		delete((*newData)[k], "subtype")
-		delete((*newData)[k], "toptype")
-
-		if rowData["_id"] != nil {
-			(*newData)[k]["id"] = qutil.CommonEncodeArticle("content", rowData["_id"].(string))
-			delete((*newData)[k], "_id")
-		}
-		title := qutil.ObjToString(rowData["title"])
-		if title == "" {
-			title = qutil.ObjToString(rowData["projectname"])
-		}
-		(*newData)[k]["title"] = util.ClearHtml.ReplaceAllString(title, "")
-
-		delete((*newData)[k], "projectname")
-
-		if rowData["publishtime"] != nil {
-			(*newData)[k]["firsttime"] = rowData["publishtime"]
-			delete((*newData)[k], "publishtime")
-		}
-	}
-	return *newData
-}
-
-//GetWinnerNewProjectCount 企业中标-中标动态数量(近五年)
-func GetWinnerNewProjectCount(entId string) int64 {
-	defer qutil.Catch()
-	return elastic.Count("bidding", "bidding", fmt.Sprintf(`{"query":{"bool":{"must":[{"term": {"entidlist": "%s"}},{"range":{"publishtime":{"gte":%d}}}]}}}`, entId, time.Now().AddDate(-5, 0, 0).Unix()))
-}
-
 //项目联系方式 查询最新200条记录 筛选获取联系方式
 func GetProjectContactsMsg(buyerName, entId string) (list []map[string]interface{}) {
 	defer qutil.Catch()

+ 224 - 0
src/jfw/modules/bigmember/src/entity/portrait_project.go

@@ -0,0 +1,224 @@
+package entity
+
+import (
+	"encoding/json"
+	"fmt"
+	"log"
+	qutil "qfw/util"
+	"qfw/util/elastic"
+	"strings"
+	"time"
+	"util"
+)
+
+//PortraitWinnerProject 中标企业画像中标信息查询
+type PortraitWinnerProject struct {
+	EntId     string //企业id
+	Match     string //检索词
+	MatchType string //匹配方式
+	Area      string //省份
+	InfoType  string //信息类型
+	PushTime  string //信息发布时间
+	PageNum   int    //页码
+	PageSize  int    //每页数量
+}
+
+const (
+	matchWordLenLimit         = 50
+	elasticIndex, elasticType = "bidding", "bidding"
+	multi_match               = `{"multi_match": {"query": "%s","type": "phrase", "fields": [%s]}}`
+	NewBiddingSearch          = `{"query":{"bool":{"must":[%s]}}%s}`
+	ListSearchLimit           = `,"_source":["_id","projectname","bidamount","title","publishtime","subtype","toptype","area"],"sort":[{"publishtime":{"order":"desc"}}],"from":%d,"size":%d`
+
+	newBiddingSearchShowSql = `{"query":{"filtered":{"filter":{"bool":{"must":[{"term":{"entidlist":"%s"}},{"range":{"publishtime":{"gte":"%d"}}}]}}}},"aggs":{"group_area":{"terms":{"field":"area","size":40}},"group_subtype":{"terms":{"field":"subtype","size":20}},"group_pushtime":{"range":{"field":"publishtime","ranges":[%s]}}}}`
+)
+
+// GetProjectSelectItems 获取可筛选列
+// 地区:省份
+// 信息类型
+// 信息发布时间:7天内 最近30天 1年内 3年内 5年内
+func (pwp *PortraitWinnerProject) GetProjectSelectItems() (map[string]interface{}, error) {
+	defer qutil.Catch()
+	doSearchSql := fmt.Sprintf(newBiddingSearchShowSql, pwp.EntId, time.Now().AddDate(-5, 0, 0).Unix(), getTimeRange())
+	//log.Println("GetProjectSelectItems doSearchSql", doSearchSql)
+	res, _ := GetAggs(elasticIndex, elasticType, doSearchSql)
+	if res == nil {
+		return nil, fmt.Errorf("此企业无信息或获取信息列表检索条件出错")
+	}
+	//地区
+	var areaArr []string
+	if g, ok := res.Children("group_area"); ok {
+		var sbn []SimpleStringKeyValue
+		bs, _ := g.Aggregations["buckets"].MarshalJSON()
+		if json.Unmarshal(bs, &sbn) == nil && len(sbn) > 0 {
+			for _, bk := range sbn {
+				areaArr = append(areaArr, bk.Key)
+			}
+		}
+	}
+	//信息类型
+	var infoType []string
+	if g, ok := res.Children("group_subtype"); ok {
+		var sbn []SimpleStringKeyValue
+		bs, _ := g.Aggregations["buckets"].MarshalJSON()
+		if json.Unmarshal(bs, &sbn) == nil && len(sbn) > 0 {
+			for _, bk := range sbn {
+				infoType = append(infoType, bk.Key)
+			}
+		}
+	}
+	//时间
+	var timeRange []string
+	if g, ok := res.Children("group_pushtime"); ok {
+		var sbn []SimpleStringKeyValue
+		bs, _ := g.Aggregations["buckets"].MarshalJSON()
+		if json.Unmarshal(bs, &sbn) == nil && len(sbn) > 0 {
+			for _, bk := range sbn {
+				timeRange = append(timeRange, bk.Key)
+			}
+		}
+	}
+	return map[string]interface{}{"areaArr": areaArr, "infoType": infoType, "timeRange": timeRange}, nil
+}
+
+func getTimeRange() string {
+	now := time.Now()
+	return fmt.Sprintf(`{"key":"7day","from":%d},{"key":"30day","from":%d},{"key":"1year","from":%d},{"key":"3year","from":%d},{"key":"5year","from":%d}`,
+		now.AddDate(0, 0, -7).Unix(), now.AddDate(0, 0, -30).Unix(), now.AddDate(-1, 0, 0).Unix(), now.AddDate(-3, 0, 0).Unix(), now.AddDate(-5, 0, 0).Unix())
+}
+
+// GetList 获取中标信息列表
+// 超级订阅50条,大会员5年内
+func (pwp *PortraitWinnerProject) GetList() (list []map[string]interface{}, total int64, err error) {
+	mustQueryArr := []string{}
+	if pwp.EntId == "" {
+		err = fmt.Errorf("企业名称异常")
+		return
+	}
+	mustQueryArr = append(mustQueryArr, fmt.Sprintf(`{"term":{"entidlist":"%s"}}`, pwp.EntId))
+	//文本输入框,字数限制50个字,超过上限不再允许输入内容
+	if pwp.Match != "" {
+		if pareWord := pwp.pareMatchWord(); pareWord != "" {
+			findFields := fmt.Sprintf(`"%s"`, strings.Join(pwp.pareMatchType(), "\",\""))
+			mustQueryArr = append(mustQueryArr, fmt.Sprintf(multi_match, pareWord, findFields))
+		}
+	}
+	//超级订阅50条,大会员5年内,选项:7天内、30天内、1年内、3年内、5年内(初始值)
+	mustQueryArr = append(mustQueryArr, fmt.Sprintf(`{"range":{"publishtime":{"gte":"%d"}}}`, pwp.pareTimeSelect()))
+
+	//地区多选,选项:全部(初始值)、该企业项目动态下存在的项目地区(省、直辖市)
+	if pwp.Area != "" {
+		mustQueryArr = append(mustQueryArr, fmt.Sprintf(`{"terms":{"area":["%s"]}}`, strings.ReplaceAll(pwp.Area, ",", "\",\"")))
+	}
+
+	//信息类型多选,选项:全部(初始值)、该企业项目动态下存在的信息类型,例如该企业有招标公告招标和邀标的动态,则展示全部、招标公告(全部、招标、邀标)
+	if pwp.InfoType != "" {
+		mustQueryArr = append(mustQueryArr, fmt.Sprintf(`{"terms":{"subtype":["%s"]}}`, strings.ReplaceAll(pwp.InfoType, ",", "\",\"")))
+	}
+
+	pwp.PageNum = qutil.If(pwp.PageNum == 0, 1, pwp.PageNum).(int)     //默认第一页
+	pwp.PageSize = qutil.If(pwp.PageSize == 0, 10, pwp.PageSize).(int) //默认每页10条
+	//仅第一页查询总量
+	if pwp.PageNum == 1 {
+		total = elastic.Count(elasticIndex, elasticType, fmt.Sprintf(NewBiddingSearch, strings.Join(mustQueryArr, ","), ""))
+		if total <= 0 {
+			log.Println(fmt.Sprintf(NewBiddingSearch, strings.Join(mustQueryArr, ","), ""))
+			return
+		}
+	} else {
+		total = -1
+	}
+	start, limit := (pwp.PageNum-1)*pwp.PageSize, pwp.PageSize
+	//列表查询
+	listQuery := fmt.Sprintf(NewBiddingSearch, strings.Join(mustQueryArr, ","), fmt.Sprintf(ListSearchLimit, start, limit))
+	log.Printf("PortraitWinnerProject GetList Sql %s\n", listQuery)
+	newData := elastic.Get(elasticIndex, elasticType, listQuery)
+
+	if newData == nil || len(*newData) == 0 {
+		return
+	}
+	for k, rowData := range *newData {
+		if rowData["subtype"] != nil {
+			(*newData)[k]["bidstatus"] = rowData["subtype"]
+		} else if rowData["toptype"] != nil {
+			(*newData)[k]["bidstatus"] = rowData["toptype"]
+		}
+		delete((*newData)[k], "subtype")
+		delete((*newData)[k], "toptype")
+
+		if rowData["_id"] != nil {
+			(*newData)[k]["id"] = qutil.CommonEncodeArticle("content", rowData["_id"].(string))
+			delete((*newData)[k], "_id")
+		}
+		title := qutil.ObjToString(rowData["title"])
+		if title == "" {
+			title = qutil.ObjToString(rowData["projectname"])
+		}
+		(*newData)[k]["title"] = util.ClearHtml.ReplaceAllString(title, "")
+
+		delete((*newData)[k], "projectname")
+
+		if rowData["publishtime"] != nil {
+			(*newData)[k]["firsttime"] = rowData["publishtime"]
+			delete((*newData)[k], "publishtime")
+		}
+	}
+	list = *newData
+	return
+}
+
+//pareMatchWord 格式文本输入框,字数限制50个字,超过上限不再允许输入内容
+func (pwp *PortraitWinnerProject) pareMatchWord() string {
+	allWord := []rune(pwp.Match)
+	if len(allWord) <= matchWordLenLimit {
+		return pwp.Match
+	}
+	return string(allWord[:matchWordLenLimit])
+}
+
+//PareMatchType 格式筛选搜索,默认筛选为标题和正文
+func (pwp *PortraitWinnerProject) pareMatchType() (items []string) {
+	for _, t := range strings.Split(pwp.MatchType, ",") {
+		if t == "title" {
+			items = append(items, "title")
+		} else if t == "content" {
+			items = append(items, "detail")
+		} else if t == "buyer" {
+			items = append(items, "mbuyer")
+		} else if t == "winner" {
+			items = append(items, "mwinner")
+		} else if t == "agency" {
+			items = append(items, "magency")
+		} else if t == "file" {
+			items = append(items, "filetext")
+		} else if t == "purchasing" {
+			items = append(items, []string{"purchasing", "projectname.pname"}...)
+		}
+	}
+	if len(items) == 0 { //默认查询标题和正文
+		items = append(items, []string{"title", "detail"}...)
+	}
+	return
+}
+
+//PareMatchType 格式筛选时间,默认5年
+func (pwp *PortraitWinnerProject) pareTimeSelect() int64 {
+	switch pwp.PushTime {
+	case "7day":
+		return time.Now().AddDate(0, 0, -7).Unix()
+	case "30day":
+		return time.Now().AddDate(0, 0, -30).Unix()
+	case "1year":
+		return time.Now().AddDate(-1, 0, 0).Unix()
+	case "3year":
+		return time.Now().AddDate(-3, 0, 0).Unix()
+	default:
+		return time.Now().AddDate(-5, 0, 0).Unix()
+	}
+}
+
+//GetWinnerNewProjectCount 企业中标-中标动态数量(近五年)
+func GetWinnerNewProjectCount(entId string) int64 {
+	defer qutil.Catch()
+	return elastic.Count(elasticIndex, elasticType, fmt.Sprintf(`{"query":{"bool":{"must":[{"term": {"entidlist": "%s"}},{"range":{"publishtime":{"gte":%d}}}]}}}`, entId, time.Now().AddDate(-5, 0, 0).Unix()))
+}

+ 22 - 12
src/jfw/modules/bigmember/src/service/analysis/decision.go

@@ -20,18 +20,26 @@ import (
 )
 
 type DecParam struct {
-	Area         map[string]interface{}   //地区
-	BuyerContent []map[string]interface{} //采购内容
-	BuyerClass   []string                 //采购单位行业
-	Sid          string                   //项目招标信息id
-	Pname        string                   //项目名称
-	Industry     string                   //招标行业
-	MinPrice     int                      //最小价格
-	MaxPrice     int                      //最大价格
-	Buyer        string                   //采购单位
-	ServiceId    int                      //大会员服务id
-	MobileModel  string                   //手机型号
-	AppVersion   string                   //app版本号
+	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版本号
+}
+
+/*已选条件--关键词*/
+type ViewKeyWord struct {
+	Keyword  []string `json:"key"`       //关键词
+	Appended []string `json:"appendkey"` //附加词
+	Exclude  []string `json:"notkey"`    //排除词
+	MatchWay int      `json:"matchway"`  //匹配模式
 }
 
 var regExperts = regexp.MustCompile("^[\\p{Han}]{2,4}$")
@@ -122,6 +130,7 @@ func (this *Analysis) FreeDecInfo() {
 					}
 				}
 			}
+			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)
 			//投标决策分析历史记录
@@ -185,6 +194,7 @@ func (this *Analysis) DecInfo() {
 						}
 					}
 				}
+				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)
 				//投标决策分析历史记录

+ 54 - 29
src/jfw/modules/bigmember/src/service/analysis/esquery.go

@@ -53,7 +53,7 @@ var query_bool_must_and = `{"bool": {"must": [%s]%s}}`
 var query_aggs_review_experts_count = `"all_review_experts":{"cardinality":{"field":"review_experts"}}`
 
 //投标决策分析查询语句
-func DecQuery(area map[string]interface{}, buyerClass []string, business_scope []map[string]interface{}, industry, buyer, buyer_buyerClass string, minPrice, maxPrice int) string {
+func DecQuery(area map[string]interface{}, buyerClass []string, business_scope []ViewKeyWord, industry, buyer, buyer_buyerClass string, minPrice, maxPrice int) string {
 	//类似项目热点中标企业
 	var query_aggs_winners_aggs_buyer = `"group_projectname":{"terms":{"field":"buyer","size":3}},"this_buyer":{"filter":{"term":{"buyer":"%s"}},"aggs":{"total":{"sum":{"field":"sortprice"}},"my_top_hits":{"top_hits":{"size":20,"sort":{"jgtime":"desc"},"_source":["_id","jgtime"]}}}}`
 	var query_aggs_winners = `"group_winner":{"terms":{"field":"s_winner","size":10},"aggs":{"total":{"sum":{"field":"sortprice"}},"group_entidlist":{"terms":{"field":"entidlist","size":1}}%s}}`
@@ -192,22 +192,22 @@ func DecQuery(area map[string]interface{}, buyerClass []string, business_scope [
 		boolsNum = 1
 		findfields := `"projectname.pname","purchasing"`
 		multi_match := fmt.Sprintf(multi_match_public, "%s", findfields)
-		for _, v := range business_scope {
+		for _, kv := range business_scope {
 			shoulds := []string{}
 			must_not := []string{}
 			//关键词
-			for _, v := range qutil.ObjArrToStringArr(v["key"].([]interface{})) {
+			for _, v := range kv.Keyword {
 				shoulds = append(shoulds, fmt.Sprintf(multi_match, "\""+v+"\""))
 			}
 			//附加词
-			if v["appendkey"] != nil && len(v["appendkey"].([]interface{})) > 0 {
-				for _, vv := range qutil.ObjArrToStringArr(v["appendkey"].([]interface{})) {
+			if len(kv.Appended) > 0 {
+				for _, vv := range kv.Appended {
 					shoulds = append(shoulds, fmt.Sprintf(multi_match, "\""+vv+"\""))
 				}
 			}
-			if v["notkey"] != nil && len(v["notkey"].([]interface{})) > 0 {
+			if len(kv.Exclude) > 0 {
 				//排除词
-				for _, vv := range qutil.ObjArrToStringArr(v["notkey"].([]interface{})) {
+				for _, vv := range kv.Exclude {
 					must_not = append(must_not, fmt.Sprintf(multi_match, "\""+vv+"\""))
 				}
 			}
@@ -222,12 +222,12 @@ func DecQuery(area map[string]interface{}, buyerClass []string, business_scope [
 		}
 	}
 	qstr := fmt.Sprintf(query, strings.Join(shoulds, ","), strings.Join(musts, ","), strings.Join(bools, ","), boolsNum, PSearch_DecField, PSearch_DecSort, PSearch_DecSimCount, query_aggs)
-	// log.Println("str:", qstr)
+	log.Println("str:", qstr)
 	return qstr
 }
 
 //投标决策分析查询语句--free
-func DecQueryFree(area map[string]interface{}, buyerClass []string, business_scope []map[string]interface{}, industry, buyer, buyer_buyerClass string, minPrice, maxPrice int) string {
+func DecQueryFree(area map[string]interface{}, buyerClass []string, business_scope []ViewKeyWord, industry, buyer, buyer_buyerClass string, minPrice, maxPrice int) string {
 
 	var query = `{"query":{"filtered":{"filter":{"bool":{"should":[%s],"must":[%s]}},"query":{"bool":{"should":[%s],"minimum_should_match":%d}}}},"_source":[%s],"sort":[%s],"from":0,"size":%d,"aggs":{%s}}`
 
@@ -351,22 +351,22 @@ func DecQueryFree(area map[string]interface{}, buyerClass []string, business_sco
 		boolsNum = 1
 		findfields := `"projectname.pname","purchasing"`
 		multi_match := fmt.Sprintf(multi_match_public, "%s", findfields)
-		for _, v := range business_scope {
+		for _, kv := range business_scope {
 			shoulds := []string{}
 			must_not := []string{}
 			//关键词
-			for _, v := range qutil.ObjArrToStringArr(v["key"].([]interface{})) {
+			for _, v := range kv.Keyword {
 				shoulds = append(shoulds, fmt.Sprintf(multi_match, "\""+v+"\""))
 			}
 			//附加词
-			if v["appendkey"] != nil && len(v["appendkey"].([]interface{})) > 0 {
-				for _, vv := range qutil.ObjArrToStringArr(v["appendkey"].([]interface{})) {
+			if len(kv.Appended) > 0 {
+				for _, vv := range kv.Appended {
 					shoulds = append(shoulds, fmt.Sprintf(multi_match, "\""+vv+"\""))
 				}
 			}
-			if v["notkey"] != nil && len(v["notkey"].([]interface{})) > 0 {
+			if len(kv.Exclude) > 0 {
 				//排除词
-				for _, vv := range qutil.ObjArrToStringArr(v["notkey"].([]interface{})) {
+				for _, vv := range kv.Exclude {
 					must_not = append(must_not, fmt.Sprintf(multi_match, "\""+vv+"\""))
 				}
 			}
@@ -381,12 +381,12 @@ func DecQueryFree(area map[string]interface{}, buyerClass []string, business_sco
 		}
 	}
 	qstr := fmt.Sprintf(query, strings.Join(shoulds, ","), strings.Join(musts, ","), strings.Join(bools, ","), boolsNum, "", PSearch_DecSort, 0, query_aggs)
-	log.Println("str:", qstr)
+	// log.Println("str:", qstr)
 	return qstr
 }
 
 //潜在客户和潜在竞争对手查询条件
-func PCQuery(area map[string]interface{}, industry []string, buyerclass []string, business_scope []map[string]interface{}, sort_no int, pcor string) string {
+func PCQuery(area map[string]interface{}, industry []string, buyerclass []string, business_scope []ViewKeyWord, sort_no int, pcor string) string {
 	multi_match := `{"multi_match": {"query": %s,"type": "phrase", "fields": [%s]}}`
 	query := `{"query":{"bool":{"must":[%s],"must_not": [{"term": {"buyer": ""}}],"should":[%s],"minimum_should_match": %d}},"size": 0,%s}`
 	query_bool_should := `{"bool":{"should":[%s],"minimum_should_match": 1}}`
@@ -464,22 +464,22 @@ func PCQuery(area map[string]interface{}, industry []string, buyerclass []string
 		boolsNum = 1
 		findfields := `"projectname.pname","purchasing"`
 		multi_match = fmt.Sprintf(multi_match, "%s", findfields)
-		for _, v := range business_scope {
+		for _, kv := range business_scope {
 			shoulds := []string{}
 			must_not := []string{}
 			//关键词
-			for _, v := range qutil.ObjArrToStringArr(v["key"].([]interface{})) {
+			for _, v := range kv.Keyword {
 				shoulds = append(shoulds, fmt.Sprintf(multi_match, "\""+v+"\""))
 			}
 			//附加词
-			if v["appendkey"] != nil {
-				for _, vv := range qutil.ObjArrToStringArr(v["appendkey"].([]interface{})) {
+			if len(kv.Appended) > 0 {
+				for _, vv := range kv.Appended {
 					shoulds = append(shoulds, fmt.Sprintf(multi_match, "\""+vv+"\""))
 				}
 			}
-			if v["notkey"] != nil {
+			if len(kv.Exclude) > 0 {
 				//排除词
-				for _, vv := range qutil.ObjArrToStringArr(v["notkey"].([]interface{})) {
+				for _, vv := range kv.Exclude {
 					must_not = append(must_not, fmt.Sprintf(multi_match, "\""+vv+"\""))
 				}
 			}
@@ -705,22 +705,22 @@ func GetListByBuyer(dec *DecParam) []map[string]interface{} {
 		boolsNum = 1
 		findfields := `"projectname.pname","purchasing"`
 		multi_match := fmt.Sprintf(multi_match_public, "%s", findfields)
-		for _, v := range dec.BuyerContent {
+		for _, kv := range dec.BuyerContent {
 			shoulds := []string{}
 			must_not := []string{}
 			//关键词
-			for _, v := range qutil.ObjArrToStringArr(v["key"].([]interface{})) {
+			for _, v := range kv.Keyword {
 				shoulds = append(shoulds, fmt.Sprintf(multi_match, "\""+v+"\""))
 			}
 			//附加词
-			if v["appendkey"] != nil && len(v["appendkey"].([]interface{})) > 0 {
-				for _, vv := range qutil.ObjArrToStringArr(v["appendkey"].([]interface{})) {
+			if len(kv.Appended) > 0 {
+				for _, vv := range kv.Appended {
 					shoulds = append(shoulds, fmt.Sprintf(multi_match, "\""+vv+"\""))
 				}
 			}
-			if v["notkey"] != nil && len(v["notkey"].([]interface{})) > 0 {
+			if len(kv.Exclude) > 0 {
 				//排除词
-				for _, vv := range qutil.ObjArrToStringArr(v["notkey"].([]interface{})) {
+				for _, vv := range kv.Exclude {
 					must_not = append(must_not, fmt.Sprintf(multi_match, "\""+vv+"\""))
 				}
 			}
@@ -817,3 +817,28 @@ func GetAllBWQuery(winner, buyder string) string {
 	var query = `{"query":{"filtered":{"filter":{"bool":{"must":[{"term":{"buyer":"` + buyder + `"}},{"term":{"s_winner":"` + winner + `"}}]}}}},"_source":["_id","jgtime","sortprice"],"from":0,"size":50,"sort":[{"jgtime":"desc"}],"aggs":{"sum_project":{"sum":{"field":"sortprice"}}}}`
 	return query
 }
+
+//采购内容 精准or模糊匹配处理
+func BuyerContentStruct(BC []ViewKeyWord) (arr []ViewKeyWord) {
+	if len(BC) > 0 {
+		for _, kw := range BC {
+			if kw.MatchWay == 1 {
+				for _, kk := range kw.Keyword {
+					arr = append(arr, ViewKeyWord{
+						Keyword: []string{kk},
+						Exclude: kw.Exclude,
+					})
+				}
+				for _, kk := range kw.Appended {
+					arr = append(arr, ViewKeyWord{
+						Keyword: []string{kk},
+						Exclude: kw.Exclude,
+					})
+				}
+			} else {
+				arr = append(arr, kw)
+			}
+		}
+	}
+	return arr
+}

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

@@ -20,14 +20,14 @@ import (
 )
 
 type SelectC struct {
-	Area           map[string]interface{}   //区域
-	BuyerClass     []string                 //客户类型(采购单位行业)
-	Industry       []string                 //行业分类(信息行业)
-	Business_scope []map[string]interface{} //业务范围(关键词 附加词 排除词)
-	Sort_no        int                      //排序规则
-	PCOR           string                   //客户还是竞争对手 C:客户;R:对手
-	ServiceId      int                      //大会员服务id
-	Searchbool     int                      //是否是查询
+	Area           map[string]interface{} //区域
+	BuyerClass     []string               //客户类型(采购单位行业)
+	Industry       []string               //行业分类(信息行业)
+	Business_scope []ViewKeyWord          //业务范围(关键词 附加词 排除词)
+	Sort_no        int                    //排序规则
+	PCOR           string                 //客户还是竞争对手 C:客户;R:对手
+	ServiceId      int                    //大会员服务id
+	Searchbool     int                    //是否是查询
 }
 
 //移除我的潜在对手
@@ -87,29 +87,9 @@ func (this *Analysis) CsORRsList() {
 			// log.Println(len(getRes.Area), "----", getRes.BuyerClass, "----", getRes.Business_scope, "--", getRes.Searchbool)
 			if getRes.Searchbool == 0 && (len(getRes.Area) == 0 || len(getRes.BuyerClass) == 0 || len(getRes.Business_scope) == 0) {
 				//查库获得大会员用户的信息
-				o_mb, ok := db.Mgo.FindById(C_User, main_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(getRes.Area) == 0 && (*o_member_jy)["o_area"] != nil {
-						getRes.Area = *qutil.ObjToMap((*o_member_jy)["o_area"].(map[string]interface{}))
-					}
-					if len(getRes.BuyerClass) == 0 && (*o_member_jy)["a_buyerclass"] != nil {
-						getRes.BuyerClass = qutil.ObjArrToStringArr((*o_member_jy)["a_buyerclass"].([]interface{}))
-					}
-					if len(getRes.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 {
-								a_key := qutil.ObjArrToMapArr(v["a_key"].([]interface{}))
-								for _, vv := range a_key {
-									getRes.Business_scope = append(getRes.Business_scope, vv)
-								}
-							}
-						}
-					}
-				} else {
-					log.Println("--查询用户信息报错--", userId, main_userId)
-				}
+				getRes.Area, getRes.BuyerClass, getRes.Business_scope = GetUserInfo(main_userId)
+			} else {
+				getRes.Business_scope = BuyerContentStruct(getRes.Business_scope)
 			}
 			//查库获得大会员用户的行业信息
 			entInfo, ok := db.Mgo.FindOneByField(C_Member, `{"userid":"`+main_userId+`"}`, `{"entname":1,"industry":1}`)
@@ -211,8 +191,80 @@ func (this *Analysis) CsORRsList() {
 	this.ServeJson(regMap)
 }
 
+func GetUserInfo(main_userId string) (map[string]interface{}, []string, []ViewKeyWord) {
+	var (
+		query *map[string]interface{}
+		ok    bool
+	)
+	if query, ok = db.Mgo.FindById("user", main_userId, `{"o_member_jy":1}`); !ok && (*query)["o_member_jy"] == nil {
+		return nil, []string{}, nil
+	}
+	o_member_jy, _ := (*query)["o_member_jy"].(map[string]interface{})
+	if o_member_jy["a_items"] == nil && o_member_jy["a_buyerclass"] == nil && o_member_jy["a_infotype"] == nil && o_member_jy["o_area"] == nil {
+		return nil, []string{}, nil
+	}
+	a_items := []interface{}{}
+	if o_member_jy["a_items"] != nil {
+		a_items = o_member_jy["a_items"].([]interface{})
+	}
+	a_buyerclass := []interface{}{}
+	if o_member_jy["a_buyerclass"] != nil {
+		a_buyerclass = o_member_jy["a_buyerclass"].([]interface{})
+	}
+	if len(a_buyerclass) > 0 && qutil.IntAllDef(o_member_jy["i_matchbuyerclass_other"], 1) == 1 && len(a_items) > 0 {
+		a_buyerclass = append(a_buyerclass, "其它")
+	}
+	o_area := map[string]interface{}{}
+	if o_member_jy["o_area"] != nil {
+		o_area = o_member_jy["o_area"].(map[string]interface{})
+	}
+	return o_area, qutil.ObjArrToStringArr(a_buyerclass), getKeyWordArrFromDbResult(a_items, "", -1)
+}
+
+//关键词 附加词 排除词
+func getKeyWordArrFromDbResult(a_items []interface{}, item string, index int) (arr []ViewKeyWord) {
+	if a_items == nil {
+		return
+	}
+	for _, v := range a_items {
+		vm, _ := v.(map[string]interface{})
+		if item != "" && index >= 0 && item != qutil.ObjToString(vm["s_item"]) {
+			continue
+		}
+		kwsArr := vm["a_key"]
+		for i, k := range kwsArr.([]interface{}) {
+			if item != "" && index >= 0 && i != index {
+				continue
+			}
+			kw := ViewKeyWord{}
+			b, e := json.Marshal(k)
+			if e != nil {
+				log.Println(e.Error())
+			}
+			json.Unmarshal(b, &kw)
+			if kw.MatchWay == 1 {
+				for _, kk := range kw.Keyword {
+					arr = append(arr, ViewKeyWord{
+						Keyword: []string{kk},
+						Exclude: kw.Exclude,
+					})
+				}
+				for _, kk := range kw.Appended {
+					arr = append(arr, ViewKeyWord{
+						Keyword: []string{kk},
+						Exclude: kw.Exclude,
+					})
+				}
+			} else {
+				arr = append(arr, kw)
+			}
+		}
+	}
+	return
+}
+
 //记录查询日志
-func savePOTLogs(userId, main_userId, entName string, area map[string]interface{}, buyerClass, industry []string, business_scope []map[string]interface{}, sort_no int, pcor string, regMap Result) {
+func savePOTLogs(userId, main_userId, entName string, area map[string]interface{}, buyerClass, industry []string, business_scope []ViewKeyWord, sort_no int, pcor string, regMap Result) {
 	var saveData = map[string]interface{}{
 		"userId":         userId,
 		"main_userId":    main_userId,

+ 46 - 31
src/jfw/modules/bigmember/src/service/portrait/memberPortraitAction.go

@@ -15,11 +15,12 @@ import (
 type EntPortrait struct {
 	*xweb.Action
 	//中标企业画像
-	entDetail          xweb.Mapper `xweb:"/portrait/ent/detail"`       //企业基本信息
-	winnerNewMsg       xweb.Mapper `xweb:"/portrait/winner/getNewMsg"` //最新项目动态(需购买项目进度监控)
-	winnerContacts     xweb.Mapper `xweb:"/portrait/winner/contacts"`  //历史项目联系方式
-	winnerPortrait     xweb.Mapper `xweb:"/portrait/winner/getData"`   //最新项目动态
-	winnerMiniPortrait xweb.Mapper `xweb:"/portrait/winner/miniData"`  //三级页展示中标企业基础画像信息
+	entDetail           xweb.Mapper `xweb:"/portrait/ent/detail"`              //企业基本信息
+	winnerNewMsg        xweb.Mapper `xweb:"/portrait/winner/getNewMsg"`        //最新项目动态(需购买项目进度监控)
+	winnerNewMsgSelects xweb.Mapper `xweb:"/portrait/winner/getNewMsgSelects"` //最新招标信息可筛选项
+	winnerContacts      xweb.Mapper `xweb:"/portrait/winner/contacts"`         //历史项目联系方式
+	winnerPortrait      xweb.Mapper `xweb:"/portrait/winner/getData"`          //最新项目动态
+	winnerMiniPortrait  xweb.Mapper `xweb:"/portrait/winner/miniData"`         //三级页展示中标企业基础画像信息
 	//采购单位画像
 	buyerNewMsg       xweb.Mapper `xweb:"/portrait/buyer/getNewMsg"` //最新项目动态
 	buyerContacts     xweb.Mapper `xweb:"/portrait/buyer/contacts"`  //采购项目联系方式
@@ -74,50 +75,64 @@ func (this *EntPortrait) WinnerContacts() {
 	this.ServeJson(NewResult(rData, errMsg))
 }
 
-//WinnerNewMsg 企业画像-最新项目动态
-func (this *EntPortrait) WinnerNewMsg() {
+// WinnerNewMsgSelects 企业最新项目动态可供筛选的条件
+func (this *EntPortrait) WinnerNewMsgSelects() {
 	userId := qutil.ObjToString(this.GetSession("userId"))
 	rData, errMsg := func() (interface{}, error) {
-		cepm, hasPower, err := entity.CreatePortraitManager(userId, "entNewMsg")
+		entId := util.DecodeId(this.GetString("entId"))
+		if entId == "" {
+			return nil, fmt.Errorf("企业参数异常")
+		}
+		_, hasPower, err := entity.CreatePortraitManager(userId, "entNewMsg")
 		if err != nil {
 			return nil, err
 		}
 		if !hasPower {
 			return nil, fmt.Errorf("非法请求")
 		}
-		entId := util.DecodeId(this.GetString("entId"))
-		count, _ := this.GetInt("count")
+		pwp := &entity.PortraitWinnerProject{EntId: entId}
+		return pwp.GetProjectSelectItems()
+	}()
+	if errMsg != nil {
+		log.Printf("%s WinnerNewMsgSelects 获取企业最新中标信息筛选条件出错:%s\n", userId, errMsg.Error())
+	}
+	this.ServeJson(NewResult(rData, errMsg))
+}
 
-		pageNum, _ := this.GetInteger("pageNum")
-		limit, _ := this.GetInteger("pageSize")
-		if limit == 0 {
-			limit = 3
+//WinnerNewMsg 企业画像-最新项目动态
+func (this *EntPortrait) WinnerNewMsg() {
+	userId := qutil.ObjToString(this.GetSession("userId"))
+	rData, errMsg := func() (interface{}, error) {
+		entId := util.DecodeId(this.GetString("entId"))
+		if entId == "" {
+			return nil, fmt.Errorf("企业参数异常")
 		}
-		var start = 0
-		if pageNum > 0 {
-			start = (pageNum - 1) * limit
+		cepm, hasPower, err := entity.CreatePortraitManager(userId, "entNewMsg")
+		if err != nil {
+			return nil, err
 		}
-
-		if pageSign := this.GetString("pageSign"); pageSign != "" { //more:4-23条;max:24-50条(移动端)
-			if pageSign == "more" {
-				start = 3
-				limit = 20
-			} else if pageSign == "max" {
-				start = 20 + 3
-				limit = entity.PortraitNewMegsLimit - start
-			}
+		if !hasPower {
+			return nil, fmt.Errorf("非法请求")
 		}
+		pageNum, _ := this.GetInteger("pageNum")
+		pageSize, _ := this.GetInteger("pageSize")
 
-		rData, err := cepm.GetWinnerNewMsg(entId, start, limit)
+		rData, total, err := cepm.GetWinnerNewMsg(&entity.PortraitWinnerProject{
+			EntId:     entId,
+			Match:     this.GetString("match"),
+			MatchType: this.GetString("matchType"),
+			Area:      this.GetString("area"),
+			InfoType:  this.GetString("infoType"),
+			PushTime:  this.GetString("pushTime"),
+			PageNum:   pageNum,
+			PageSize:  pageSize,
+		})
 		if err != nil {
 			return nil, err
 		}
-		if count == 0 {
-			count = cepm.GetWinnerNewCount(entId)
-		}
 		return map[string]interface{}{
 			"list":  rData,
-			"count": count,
+			"count": total,
 		}, nil
 	}()
 	if errMsg != nil {

+ 40 - 28
src/jfw/modules/bigmember/src/service/portrait/subvipPortraitAction.go

@@ -18,11 +18,12 @@ import (
 //超级订阅升级版画像接口
 type SubVipPortrait struct {
 	*xweb.Action
-	subVipEntDetail    xweb.Mapper `xweb:"/portrait/subVipPortrait/entDetail"`    //企业基本信息
-	subVipPortrait     xweb.Mapper `xweb:"/portrait/subVipPortrait/winner"`       //超级订阅升级版查看画像
-	subVipWinnerNewMsg xweb.Mapper `xweb:"/portrait/subVipPortrait/winnerNewMsg"` //超级订阅升级版查看最新项目动态
-	portraitUsage      xweb.Mapper `xweb:"/portrait/subVipPortrait/usage"`        //超级订阅升级版画像浏览详情
-	portraitRecord     xweb.Mapper `xweb:"/portrait/subVipPortrait/record"`       //超级订阅升级版画像浏览记录
+	subVipEntDetail     xweb.Mapper `xweb:"/portrait/subVipPortrait/entDetail"`        //企业基本信息
+	subVipPortrait      xweb.Mapper `xweb:"/portrait/subVipPortrait/winner"`           //超级订阅升级版查看画像
+	subVipWinnerNewMsg  xweb.Mapper `xweb:"/portrait/subVipPortrait/winnerNewMsg"`     //超级订阅升级版查看最新项目动态
+	subVipNewMsgSelects xweb.Mapper `xweb:"/portrait/subVipPortrait/getNewMsgSelects"` //最新招标信息可筛选项
+	portraitUsage       xweb.Mapper `xweb:"/portrait/subVipPortrait/usage"`            //超级订阅升级版画像浏览详情
+	portraitRecord      xweb.Mapper `xweb:"/portrait/subVipPortrait/record"`           //超级订阅升级版画像浏览记录
 }
 
 //超级订阅升级版查询基本信息
@@ -62,36 +63,26 @@ func (this *SubVipPortrait) SubVipWinnerNewMsg() {
 		if err = bigMsg.SubVipPortraitTimesCheck(db.Mysql, entId); err != nil {
 			return nil, err
 		}
-		count, _ := this.GetInt("count")
+
 		pageNum, _ := this.GetInteger("pageNum")
-		limit, _ := this.GetInteger("pageSize")
-		if limit == 0 {
-			limit = 3
-		}
-		var start = 0
-		if pageNum > 0 {
-			start = (pageNum - 1) * limit
-		}
+		pageSize, _ := this.GetInteger("pageSize")
 
-		if pageSign := this.GetString("pageSign"); pageSign != "" { //more:4-23条;max:24-50条(移动端)
-			if pageSign == "more" {
-				start = 3
-				limit = 20
-			} else if pageSign == "max" {
-				start = 20 + 3
-				limit = entity.PortraitNewMegsLimit - start
-			}
-		}
-		rData, err := cepm.GetWinnerNewMsg(entId, start, limit)
+		rData, total, err := cepm.GetWinnerNewMsg(&entity.PortraitWinnerProject{
+			EntId:     entId,
+			Match:     this.GetString("match"),
+			MatchType: this.GetString("matchType"),
+			Area:      this.GetString("area"),
+			InfoType:  this.GetString("infoType"),
+			PushTime:  this.GetString("pushTime"),
+			PageNum:   pageNum,
+			PageSize:  pageSize,
+		})
 		if err != nil {
 			return nil, err
 		}
-		if count == 0 {
-			count = cepm.GetWinnerNewCount(entId)
-		}
 		return map[string]interface{}{
 			"list":  rData,
-			"count": count,
+			"count": total,
 		}, nil
 	}()
 	if errMsg != nil {
@@ -100,6 +91,27 @@ func (this *SubVipPortrait) SubVipWinnerNewMsg() {
 	this.ServeJson(NewResult(rData, errMsg))
 }
 
+func (this *SubVipPortrait) SubVipNewMsgSelects() {
+	userId := qutil.ObjToString(this.GetSession("userId"))
+	rData, errMsg := func() (interface{}, error) {
+		entId := util.DecodeId(this.GetString("entId"))
+		if entId == "" {
+			return nil, fmt.Errorf("企业参数异常")
+		}
+		//仅大会员、超级订阅升级版 可使用此接口
+		userMsg := jy.GetBigVipUserBaseMsg(userId, db.Mysql, db.Mgo)
+		if !(userMsg.VipStatus > 0 && userMsg.Vip_BuySet.Upgrade > 0) {
+			return nil, fmt.Errorf("非法请求")
+		}
+		pwp := &entity.PortraitWinnerProject{EntId: entId}
+		return pwp.GetProjectSelectItems()
+	}()
+	if errMsg != nil {
+		log.Printf("%s SubVipNewMsgSelects 获取企业最新中标信息筛选条件出错:%s\n", userId, errMsg.Error())
+	}
+	this.ServeJson(NewResult(rData, errMsg))
+}
+
 //超级订阅升级版查看企业画像
 func (this *SubVipPortrait) SubVipPortrait() {
 	userId := qutil.ObjToString(this.GetSession("userId"))

+ 3 - 0
src/jfw/modules/common/src/qfw/util/jy/payUser.go

@@ -56,6 +56,7 @@ func (vs *VipState) IsPayedUser() bool {
 
 //免费 标题(title)  正文(content) 老用户【中标企业(winner)】
 //付费用户 全部(all)、标题(title)  正文(content)  会员: 采购单位(buyer) 中标企业(winner) 招标代理机构(agency) 附件(file)
+//项目名称projectname和标的物purchasing(ppa)
 func (vs *VipState) GetQueryItems(selectType string, limitOldTime int64) (items []string) {
 	if vs.IsPayedUser() {
 		for _, t := range strings.Split(selectType, ",") {
@@ -71,6 +72,8 @@ func (vs *VipState) GetQueryItems(selectType string, limitOldTime int64) (items
 				items = append(items, "filetext")
 			} else if t == "title" {
 				items = append(items, "title")
+			} else if t == "ppa" {
+				items = append(items, []string{"purchasing", "projectname.pname"}...)
 			}
 		}
 		return

+ 67 - 2
src/jfw/modules/publicapply/src/enterpriseSearch/entity/entQuery.go

@@ -8,18 +8,21 @@ import (
 	qutil "qfw/util"
 	"qfw/util/elastic"
 	"qfw/util/redis"
+	"strconv"
 	"strings"
+	"time"
 )
 
 type EnterpriseSearch struct {
 	Match       string //搜索内容
-	MatchType   string //搜索范围[A:企业名称,B:法定代表人,C:股东,D:高管,E:项目or标的物(仅vip)]
+	MatchType   string //搜索范围[A:企业名称,B:法定代表人,C:股东,D:高管,E:项目or标的物(仅vip),F:经营范围]
 	EntArea     string //注册地省份[多个用逗号分割]
 	EntCity     string //注册地城市[多个用逗号分割]
 	EntCapital  string //注册资本[min-max,必有-][多个用逗号分割]
 	EntType     string //企业类型[A:有限责任公司,B:股份有限公司,C:有限合伙,D:普通合伙][多个用逗号分割]
 	EntStatus   string //企业状态[A:存续,B:吊销,C:注销、D:(停业??)、E:撤销][多个用逗号分割]
-	BiddingArea string //中标地区
+	Establish   string //成立时间[近一年 -1y 、1-3年 1y-3y、10年以上 10y-][多个用逗号分割]
+	BiddingArea string //中标地区[会员]
 	EntClass    string //单位类型[会员:1:采购单位、2:投标企业、3:代理机构、4:厂商]
 	EntContact  string //联系方式[会员:1:固定电话、2:手机号、3:邮箱、4:不存在]
 
@@ -46,6 +49,7 @@ var (
 		"C": `{"term":{"stock_name":"%s"}}`,                                                                  //股东
 		"D": `{"term":{"employee_name":"%s"}}`,                                                               //高管
 		"E": `{"multi_match":{"query":"%s","type": "phrase","fields":["bid_purchasing","bid_projectname"]}}`, //中标项目、标的物
+		"F": `{"match_phrase":{"business_scope":"%s"}}`,                                                      //经营范围
 	}
 	//EntType 企业类型
 	AllEntType = map[string]string{
@@ -76,6 +80,10 @@ func (es *EnterpriseSearch) Check() (*EnterpriseSearch, error) {
 	if es.EntCapital != "" && strings.Index(es.EntCapital, "-") < 0 {
 		return es, fmt.Errorf("金额查询参数异常")
 	}
+	//成立时间[min-max]
+	if es.Establish != "" && strings.Index(es.Establish, "-") < 0 {
+		return es, fmt.Errorf("成立时间查询参数异常")
+	}
 	//企业类型
 	if es.EntType != "" {
 		tmp := []string{}
@@ -116,6 +124,7 @@ func (es *EnterpriseSearch) isEmptySearch() bool {
 		es.EntCapital == "" &&
 		es.EntType == "" &&
 		es.EntStatus == "" &&
+		es.Establish == "" &&
 		es.BiddingArea == "" &&
 		es.EntClass == "" &&
 		es.EntContact == "" {
@@ -196,6 +205,35 @@ func (es *EnterpriseSearch) GetQuerySql() string {
 	if es.EntStatus != "" {
 		musts = append(musts, fmt.Sprintf(`{"terms":{"company_status":["%s"]}}`, strings.ReplaceAll(es.EntStatus, ",", "\",\"")))
 	}
+	//成立时间
+	if es.Establish != "" {
+		thisQuery := []string{}
+		for _, establishData := range strings.Split(es.Establish, ",") {
+			if establishData == "" || strings.Index(establishData, "-") < 0 {
+				continue
+			}
+			start, end := formatSelectTime(establishData)
+			if start == "" && end == "" {
+				continue
+			}
+			dateQuery := ""
+			if start != "" {
+				dateQuery = fmt.Sprintf(`"gte":"%s"`, start)
+			}
+			if end != "" {
+				if dateQuery != "" {
+					dateQuery += ","
+				}
+				dateQuery += fmt.Sprintf(`"lte":"%s"`, end)
+			}
+			if dateQuery != "" {
+				thisQuery = append(thisQuery, fmt.Sprintf(`{"range":{"establish_date":{%s}}}`, dateQuery)) //,"format":"yyyy-MM-dd"
+			}
+		}
+		if len(thisQuery) > 0 {
+			musts = append(musts, fmt.Sprintf(`{"bool":{"should":[%s],"minimum_should_match": 1}}`, strings.Join(thisQuery, ",")))
+		}
+	}
 	//中标区域 vip
 	if es.BiddingArea != "" && es.IsVip {
 		musts = append(musts, fmt.Sprintf(`{"term":{"bid_area":"%s"}}`, es.BiddingArea))
@@ -289,3 +327,30 @@ func GetEntIndexShow() (list *[]map[string]interface{}) {
 	}
 	return
 }
+
+//formatEstablishTime 格式化成立时间
+// Year range
+// [start]y-[end]y
+// Timestamp range
+// startTimestamp-entTimestamp
+func formatSelectTime(timerange string) (s string, e string) {
+	rangeData := strings.Split(timerange, "-")
+	if len(rangeData) != 2 {
+		return
+	}
+	if strings.Index(timerange, "y") > 0 {
+		return parseTime2Str(rangeData[1]), parseTime2Str(rangeData[0])
+	}
+	return parseTime2Str(rangeData[0]), parseTime2Str(rangeData[1])
+}
+
+func parseTime2Str(dateStr string) string {
+	if strings.HasSuffix(dateStr, "y") {
+		if yearNum := qutil.IntAll(dateStr[:len(dateStr)-1]); yearNum > 0 {
+			return strconv.FormatInt(time.Now().AddDate(-yearNum, 0, 0).Unix(), 10)
+		}
+	} else if dateStamp := qutil.Int64All(dateStr); dateStamp > 0 {
+		return strconv.FormatInt(time.Unix(dateStamp, 0).Unix(), 10)
+	}
+	return ""
+}

+ 1 - 0
src/jfw/modules/publicapply/src/enterpriseSearch/service/search.go

@@ -27,6 +27,7 @@ func (esa *EnterpriseSearchAction) DoEntSearch() {
 			EntCapital:  esa.GetString("entCapital"),
 			EntType:     esa.GetString("entType"),
 			EntStatus:   esa.GetString("entStatus"),
+			Establish:   esa.GetString("establish"),
 			BiddingArea: esa.GetString("biddingArea"),
 			EntClass:    esa.GetString("entClass"),
 			EntContact:  esa.GetString("entContact"),

+ 1 - 1
src/jfw/modules/subscribepay/src/config.json

@@ -27,7 +27,7 @@
 		"userName": "admin",
 		"password": "123456"
 	},
-    "redisaddrs": "other=192.168.3.206:6379,session=192.168.3.206:1712,push=192.168.3.206:1712,pushcache_1=192.168.3.206:5000,pushcache_2_a=192.168.3.206:5001",
+    "redisaddrs": "other=192.168.3.206:1712,session=192.168.3.206:1712,push=192.168.3.206:1712,pushcache_1=192.168.3.206:5000,pushcache_2_a=192.168.3.206:5001",
     "elasticsearch": "http://192.168.3.206:9800",
     "mongoqyfw": {
       "address": "192.168.3.206:27080",

+ 107 - 31
src/jfw/modules/subscribepay/src/entity/dataexport.go

@@ -212,17 +212,36 @@ func SendMailToBJFinance(order *map[string]interface{}, pay_time, transaction_id
 	selectType := "title"
 	if mailType == 1 { //支付完成后给北京财务发送导出数据接口信息的邮件
 		filter := qutil.ObjToString((*order)["filter"])
-		buyer, buyerclass, winner, subtype := "", "", "", ""
-		publishtime, region, industry, keys := "", "", "", ""
+		// buyer, buyerclass, winner, subtype := "", "", "", ""
+		// publishtime, region, industry, keys := "", "", "", ""
+		buyer, buyerclass, winner, subtype := "-", "全部", "-", "全部"
+		publishtime, region, industry, keys := "-", "全国", "全部", "-"
 		sc_money := ""
 		sc := new(dataexport.SieveCondition)
 		err := json.Unmarshal([]byte(filter), &sc)
 		if err == nil && sc != nil {
-			selectType = qutil.ObjToString(sc.SelectType)
-			if selectType == "title" {
-				selectType = "标题匹配"
-			} else {
-				selectType = "全文匹配"
+			var keywordsMatchItemShowArr []string
+			for _, item := range strings.Split(sc.SelectType, ",") {
+				if item == "all" {
+					keywordsMatchItemShowArr = append(keywordsMatchItemShowArr, "全部")
+				} else if item == "title" {
+					keywordsMatchItemShowArr = append(keywordsMatchItemShowArr, "标题")
+				} else if item == "detail" {
+					keywordsMatchItemShowArr = append(keywordsMatchItemShowArr, "正文")
+				} else if item == "mbuyer" {
+					keywordsMatchItemShowArr = append(keywordsMatchItemShowArr, "采购单位")
+				} else if item == "mwinner" {
+					keywordsMatchItemShowArr = append(keywordsMatchItemShowArr, "中标企业")
+				} else if item == "magency" {
+					keywordsMatchItemShowArr = append(keywordsMatchItemShowArr, "招标代理机构")
+				} else if item == "filetext" {
+					keywordsMatchItemShowArr = append(keywordsMatchItemShowArr, "附件")
+				} else if strings.Contains(item, "purchasing") {
+					keywordsMatchItemShowArr = append(keywordsMatchItemShowArr, "项目名称/标的物")
+				}
+				if keywordsMatchItemShowArr != nil {
+					selectType = strings.Join(keywordsMatchItemShowArr, " ")
+				}
 			}
 			//
 			if pay_time != "" {
@@ -248,6 +267,9 @@ func SendMailToBJFinance(order *map[string]interface{}, pay_time, transaction_id
 			} else {
 				region = strings.Join(sc.Region, " ")
 			}
+			if region == "" {
+				region = "全国"
+			}
 			var industryBuffer bytes.Buffer
 			for k, v := range sc.Industry {
 				if k > 0 {
@@ -260,16 +282,28 @@ func SendMailToBJFinance(order *map[string]interface{}, pay_time, transaction_id
 					industryBuffer.WriteString(vs[1])
 				}
 			}
-			industry = industryBuffer.String()
+			if len(sc.Industry) > 0 {
+				industry = industryBuffer.String()
+			}
 			var keysBuffer bytes.Buffer
 			for _, v := range sc.Keyword {
 				keysBuffer.WriteString(fmt.Sprintf(config.ExConf.Mail_attach_content_key, v.Keyword, strings.Join(v.Appended, " "), strings.Join(v.Exclude, " ")))
 			}
-			keys = keysBuffer.String()
-			buyer = strings.Join(sc.Buyer, " ")
-			buyerclass = strings.Join(sc.Buyerclass, " ")
-			winner = strings.Join(sc.Winner, " ")
-			subtype = strings.Replace(sc.Subtype, ",", " ", -1)
+			if keysBuffer.String() != "" {
+				keys = keysBuffer.String()
+			}
+			if len(sc.Buyer) > 0 {
+				buyer = strings.Join(sc.Buyer, " ")
+			}
+			if len(sc.Buyerclass) > 0 {
+				buyerclass = strings.Join(sc.Buyerclass, " ")
+			}
+			if len(sc.Winner) > 0 {
+				winner = strings.Join(sc.Winner, " ")
+			}
+			if sc.Subtype != "" {
+				subtype = strings.Replace(sc.Subtype, ",", " ", -1)
+			}
 		} else {
 			log.Println("用户筛选条件错误", err, sc)
 		}
@@ -565,8 +599,10 @@ func SendMailToBJFinance(order *map[string]interface{}, pay_time, transaction_id
 }
 
 func GetPackDataExportMailContent(filterId, download_url string) (content string, err error) {
-	buyer, buyerclass, winner, subtype := "", "", "", ""
-	publishtime, region, industry, keys := "", "", "", ""
+	// buyer, buyerclass, winner, subtype := "", "", "", ""
+	// publishtime, region, industry, keys := "", "", "", ""
+	buyer, buyerclass, winner, subtype := "-", "全部", "-", "全部"
+	publishtime, region, industry, keys := "-", "全国", "全部", "-"
 	sc_money := ""
 	sc := dataexport.GetSqlObjFromId(util.MQFW, filterId)
 	keywordsMatchItemShow := "标题"
@@ -587,6 +623,8 @@ func GetPackDataExportMailContent(filterId, download_url string) (content string
 				keywordsMatchItemShowArr = append(keywordsMatchItemShowArr, "招标代理机构")
 			} else if item == "filetext" {
 				keywordsMatchItemShowArr = append(keywordsMatchItemShowArr, "附件")
+			} else if strings.Contains(item, "purchasing") {
+				keywordsMatchItemShowArr = append(keywordsMatchItemShowArr, "项目名称/标的物")
 			}
 		}
 		if keywordsMatchItemShowArr != nil {
@@ -610,6 +648,9 @@ func GetPackDataExportMailContent(filterId, download_url string) (content string
 		} else {
 			region = strings.Join(sc.Region, " ")
 		}
+		if region == "" {
+			region = "全国"
+		}
 		var industryBuffer bytes.Buffer
 		for k, v := range sc.Industry {
 			if k > 0 {
@@ -622,16 +663,34 @@ func GetPackDataExportMailContent(filterId, download_url string) (content string
 				industryBuffer.WriteString(vs[1])
 			}
 		}
-		industry = industryBuffer.String()
+		// industry = industryBuffer.String()
+		if len(sc.Industry) > 0 {
+			industry = industryBuffer.String()
+		}
 		var keysBuffer bytes.Buffer
 		for _, v := range sc.Keyword {
 			keysBuffer.WriteString(fmt.Sprintf(config.ExConf.Mail_attach_content_key, v.Keyword, strings.Join(v.Appended, " "), strings.Join(v.Exclude, " ")))
 		}
-		keys = keysBuffer.String()
-		buyer = strings.Join(sc.Buyer, " ")
-		buyerclass = strings.Join(sc.Buyerclass, " ")
-		winner = strings.Join(sc.Winner, " ")
-		subtype = strings.Replace(sc.Subtype, ",", " ", -1)
+		// keys = keysBuffer.String()
+		// buyer = strings.Join(sc.Buyer, " ")
+		// buyerclass = strings.Join(sc.Buyerclass, " ")
+		// winner = strings.Join(sc.Winner, " ")
+		// subtype = strings.Replace(sc.Subtype, ",", " ", -1)
+		if keysBuffer.String() != "" {
+			keys = keysBuffer.String()
+		}
+		if len(sc.Buyer) > 0 {
+			buyer = strings.Join(sc.Buyer, " ")
+		}
+		if len(sc.Buyerclass) > 0 {
+			buyerclass = strings.Join(sc.Buyerclass, " ")
+		}
+		if len(sc.Winner) > 0 {
+			winner = strings.Join(sc.Winner, " ")
+		}
+		if sc.Subtype != "" {
+			subtype = strings.Replace(sc.Subtype, ",", " ", -1)
+		}
 	} else {
 		log.Println("用户筛选条件错误", err, sc)
 	}
@@ -663,9 +722,9 @@ func GetDataExportMailContent(orderCode string) (content string, err error) {
 		create_time = strings.Replace(create_time, "-", ".", -1)
 		create_time = regexp.MustCompile(":[^:]+$").ReplaceAllString(create_time, "")
 	}
-	buyer, buyerclass, winner, subtype := "", "", "", ""
-	publishtime, region, industry, keys := "", "", "", ""
-	sc_money := ""
+	buyer, buyerclass, winner, subtype := "-", "全部", "-", "全部"
+	publishtime, region, industry, keys := "-", "全国", "全部", "-"
+	sc_money := "-"
 	sc := new(dataexport.SieveCondition)
 	err = json.Unmarshal([]byte(filter), &sc)
 	if err != nil {
@@ -689,6 +748,8 @@ func GetDataExportMailContent(orderCode string) (content string, err error) {
 				keywordsMatchItemShowArr = append(keywordsMatchItemShowArr, "招标代理机构")
 			} else if item == "filetext" {
 				keywordsMatchItemShowArr = append(keywordsMatchItemShowArr, "附件")
+			} else if strings.Contains(item, "purchasing") {
+				keywordsMatchItemShowArr = append(keywordsMatchItemShowArr, "项目名称/标的物")
 			}
 		}
 		if keywordsMatchItemShowArr != nil {
@@ -718,6 +779,9 @@ func GetDataExportMailContent(orderCode string) (content string, err error) {
 		} else {
 			region = strings.Join(sc.Region, " ")
 		}
+		if region == "" {
+			region = "全国"
+		}
 		var industryBuffer bytes.Buffer
 		for k, v := range sc.Industry {
 			if k > 0 {
@@ -730,16 +794,28 @@ func GetDataExportMailContent(orderCode string) (content string, err error) {
 				industryBuffer.WriteString(vs[1])
 			}
 		}
-		industry = industryBuffer.String()
+		if len(sc.Industry) > 0 {
+			industry = industryBuffer.String()
+		}
 		var keysBuffer bytes.Buffer
 		for _, v := range sc.Keyword {
 			keysBuffer.WriteString(fmt.Sprintf(config.ExConf.Mail_attach_content_key, v.Keyword, strings.Join(v.Appended, " "), strings.Join(v.Exclude, " ")))
 		}
-		keys = keysBuffer.String()
-		buyer = strings.Join(sc.Buyer, " ")
-		buyerclass = strings.Join(sc.Buyerclass, " ")
-		winner = strings.Join(sc.Winner, " ")
-		subtype = strings.Replace(sc.Subtype, ",", " ", -1)
+		if keysBuffer.String() != "" {
+			keys = keysBuffer.String()
+		}
+		if len(sc.Buyer) > 0 {
+			buyer = strings.Join(sc.Buyer, " ")
+		}
+		if len(sc.Buyerclass) > 0 {
+			buyerclass = strings.Join(sc.Buyerclass, " ")
+		}
+		if len(sc.Winner) > 0 {
+			winner = strings.Join(sc.Winner, " ")
+		}
+		if sc.Subtype != "" {
+			subtype = strings.Replace(sc.Subtype, ",", " ", -1)
+		}
 	} else {
 		log.Println("用户筛选条件错误", err, sc)
 	}
@@ -751,7 +827,7 @@ func GetDataExportMailContent(orderCode string) (content string, err error) {
    获取-筛选条件-金额
 */
 func GetPriceDes_SieveCondition(minPrice, maxPrice string) string {
-	des := ""
+	des := "全部"
 	unit := "万元"
 	if minPrice != "" && maxPrice != "" {
 		des = minPrice + unit + "—" + maxPrice + unit

+ 6 - 1
src/jfw/public/dataexport.go

@@ -107,6 +107,7 @@ type BidSearchExport struct {
 	Hasbuyertel  string //是否有采购电话
 	Haswinnertel string //是否有中标电话
 	SelectIds    string //选择单条信息id
+	Notkey       string //排除词
 }
 
 func (this *BidSearchExport) PassBidSearchExport() (returnData map[string]interface{}) {
@@ -136,7 +137,11 @@ func (this *BidSearchExport) PassBidSearchExport() (returnData map[string]interf
 		}
 		_, _, keywords := jy.InterceptSearchKW(this.Keywords, isIntercept, len(this.Industry) == 0)
 		keywords = strings.Replace(keywords, "+", " ", -1)
-		KeyWordSave = append(KeyWordSave, dataexport.KeyWord{Keyword: keywords})
+		excludes := []string{}
+		if len(strings.Split(this.Notkey, " ")) > 0 {
+			excludes = strings.Split(this.Notkey, " ")
+		}
+		KeyWordSave = append(KeyWordSave, dataexport.KeyWord{Keyword: keywords, Exclude: excludes})
 	}
 
 	//时间

+ 1 - 1
src/web/staticres/big-member/css/j-icons.css

@@ -354,6 +354,6 @@
     height: 3rem;
 }
 .img-empty {
-    background: transparent url(/jyapp/big-member/image/img-empty.png) no-repeat center;
+    background: transparent url(/big-member/image/img-empty.png) no-repeat center;
     background-size: contain;
 }

+ 24 - 0
src/web/staticres/big-member/css/public.css

@@ -495,3 +495,27 @@ button[disabled] {
     line-height: .4rem;
     color: #9B9CA3;
 }
+
+.preferential-tag {
+    position: relative;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    padding: 2px 6px;
+    height: 18px;
+    color: #fff;
+    background: linear-gradient(102deg,#ffa674, #f01212 100%);
+    border-top-left-radius: 4px;
+    border-bottom-left-radius: 4px;
+}
+.preferential-tag::after {
+    content: '';
+    position: absolute;
+    top: 0;
+    right: -5px;
+    width: 0;
+    height: 0;
+    border-top: 9px solid #f01212;
+    border-right: 5px solid transparent;
+    border-bottom: 9px solid #f01212;
+}

+ 3 - 0
src/web/staticres/big-member/css/set_area_industry_cate.css

@@ -255,3 +255,6 @@
     font-size: 0.3rem;
     line-height: 0.44rem;
   }
+	#typeHidden{
+		display:none;
+	}

+ 4 - 0
src/web/staticres/big-member/js/set_infotype.js

@@ -68,6 +68,7 @@ var vNode = {
                         name: '其它',
                         value: '其它',
                         level: 2,
+                        hidden: "typeHidden",
                     },
                 ]
             },
@@ -276,6 +277,9 @@ var vNode = {
                         if (inList) {
                             selectedCount ++
                             iitem.selected = true
+                            if(iitem.value=="其它"){
+								iitem.hidden = ""
+							}
                         }
                     })
 

+ 19 - 6
src/web/staticres/big-member/weixin/css/ent_portrait.css

@@ -82,16 +82,11 @@
     margin-top: .08rem;
 }
 
-.tab-card:not(:first-of-type) {
-    margin-top: .16rem;
-}
-.tab-card:last-of-type {
-    margin-bottom: .44rem;
-}
 .tab-card {
     display: flex;
     align-items: center;
     flex-direction: column;
+    margin-top: .16rem;
     padding: .16rem 0;
 }
 .tab-card.charts {
@@ -370,3 +365,21 @@
 #ent-portrait-change .border-line-b:after {
     width: calc(100% + 0.32rem);
 }
+
+.project-news .tab-card-title {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+}
+.project-news .tab-card-title .t-c-t-r {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    font-weight: normal;
+    font-size: .26rem;
+}
+.project-news .tab-card-title .t-c-t-r .link {
+    color: #2abed1;
+    text-decoration: underline;
+    margin-right: .08rem;
+}

+ 1 - 1
src/web/staticres/big-member/weixin/css/j-icons.css

@@ -325,6 +325,6 @@
     height: 3rem;
 }
 .img-empty {
-    background: transparent url(/jyapp/big-member/image/img-empty.png) no-repeat center;
+    background: transparent url(/big-member/image/img-empty.png) no-repeat center;
     background-size: contain;
 }

+ 24 - 0
src/web/staticres/big-member/weixin/css/public.css

@@ -531,3 +531,27 @@ button[disabled] {
     line-height: .4rem;
     color: #9B9CA3;
 }
+
+.preferential-tag {
+    position: relative;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    padding: 2px 6px;
+    height: 18px;
+    color: #fff;
+    background: linear-gradient(102deg,#ffa674, #f01212 100%);
+    border-top-left-radius: 4px;
+    border-bottom-left-radius: 4px;
+}
+.preferential-tag::after {
+    content: '';
+    position: absolute;
+    top: 0;
+    right: -5px;
+    width: 0;
+    height: 0;
+    border-top: 9px solid #f01212;
+    border-right: 5px solid transparent;
+    border-bottom: 9px solid #f01212;
+}

+ 192 - 0
src/web/staticres/common-module/big-member/css/ent_project_news.css

@@ -0,0 +1,192 @@
+/* empty */
+.empty-container {
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    justify-content: center;
+    flex: 1;
+    height: 80%;
+    padding: .32rem;
+    box-sizing: border-box;
+    background-color: rgba(245, 244, 249, 1);
+}
+.empty-container {
+    min-height: 10rem;
+}
+.empty-main,
+.empty-content-position {
+    display: flex;
+    align-items: center;
+    flex-direction: column;
+    justify-content: center;
+}
+
+.empty-content-position {
+    margin-top: -1rem;
+}
+
+.empty-container .tip-text {
+    margin-top: .2rem;
+    color: #5F5E64;
+    font-size: .28rem;
+    line-height: .4rem;
+    text-align: center;
+}
+
+.empty-container .tip-sub-text {
+    color: #9B9CA3;
+    font-size: .26rem;
+    line-height: .4rem;
+    margin-top: .12rem;
+    text-align: center;
+}
+
+.empty-container .image {
+    width: 3.2rem;
+    height: 3.2rem;
+}
+.empty-container .image > img {
+    width: 100%;
+    height: 100%;
+}
+
+.header-ent-name {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    min-height: 1.08rem;
+    padding: .28rem .36rem;
+    background-color: #fff;
+}
+.ent-title {
+    flex: 1;
+    margin: 0 .2rem;
+    font-size: .28rem;
+    line-height: .4rem;
+    color: #171826;
+    word-break: break-all;
+}
+
+.search-input {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    background-color: #fff;
+}
+.search-header {
+    margin-bottom: .16rem;
+}
+.search-header .van-search{
+    width: 100%;
+    padding: .18rem  .32rem;
+}
+.search-header .van-search__content{
+    width: 100%;
+    height: 40px;
+    background: #f5f6f7;
+    border: 1px solid rgba(0,0,0,0.05);
+    border-radius: 9px;
+}
+.search-header .van-cell__value {
+    line-height: 28px;
+    font-size: 14px;
+    font-weight: 500;
+    color: #171826;
+}
+
+.search-input .action-text {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    margin-right: .32rem;
+    padding: 0 .08rem;
+    color: #2abed1;
+    font-size: .28rem;
+    height: 100%;
+    min-height: .6rem;
+    white-space: nowrap;
+}
+/* 筛选下拉选择 */
+.search-filters .van-dropdown-menu {
+    width: 100%;
+}
+.search-filters .van-dropdown-menu__bar {
+    box-shadow: none;
+    border-bottom: 1px solid #fff;
+    height: 50px;
+}
+.search-filters .van-dropdown-menu__title {
+    font-size: .28rem;
+    color: #5f5e64;
+}
+.search-filters .van-dropdown-menu__title--active {
+    color: #2abed1;
+}
+.van-dropdown-item__content {
+    height: 100%;
+    max-height: 66%;
+}
+.van-index-bar__index--active {
+    color: #2abed1;
+}
+.select-area-box .van-index-bar__sidebar {
+    top: 50%;
+}
+.collection .unitTab {
+    height: 100%;
+}
+
+.project-info-item {
+    padding: .24rem .32rem;
+}
+
+.project-info-item .project-name {
+    margin-bottom: .16rem;
+    font-size: .28rem;
+    line-height: .4rem;
+    color: #171826;
+}
+
+.project-info-item .project-info {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+}
+.tags {
+    display: flex;
+}
+.tag {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    padding: .02rem .16rem;
+    font-size: .24rem;
+    font-weight: 700;
+    line-height: .36rem;
+    border-radius: .08rem;
+}
+.tags .tag:not(:last-of-type) {
+    margin-right: .08rem;
+}
+.tag-success {
+    color: #2ABED1;
+    background-color: rgba(42, 190, 209, 0.08);
+}
+
+.project-time {
+    font-size: .2rem;
+    line-height: .36rem;
+    color: #9B9CA3;
+}
+
+.j-button-item {
+    padding: 0 .3rem;
+    font-size: .28rem;
+    color: #5f5e64;
+}
+
+.van-search .van-field__left-icon {
+    display: flex;
+    align-items: center;
+    height: 100%;
+}

+ 551 - 0
src/web/staticres/common-module/big-member/js/ent_project_news.js

@@ -0,0 +1,551 @@
+var matchTypeListForComputed = [
+    {
+        label: '标题搜索',
+        value: 'title'
+    },
+    {
+        label: '正文搜索',
+        value: 'content'
+    },
+    {
+        label: '中标项目/标的物',
+        value: 'purchasing'
+    },
+    {
+        label: '采购单位',
+        value: 'buyer'
+    },
+    {
+        label: '招标代理机构',
+        value: 'agency'
+    },
+    {
+        label: '附件',
+        value: 'file'
+    }
+]
+try {
+    if (is_weixin()) {
+        matchTypeListForComputed.pop()
+    }
+} catch (e) {}
+var vConfig = {
+    delimiters: ['${', '}'],
+    el: '#ent-project-news',
+    components: {
+        popupSelectComponent: popupSelectComponent,
+        areaComponent: areaComponent,
+        noticeComponent: noticeComponent,
+    },
+    data: {
+        platform: pageInfo.platform,
+        sessStorageKey: '$data-ent_project_news',
+        // 企业信息
+        entInfo: {
+            eid: '', // 企业id
+            name: '',
+            follow: 0,
+            followSearchFinish: false,
+            entExist: true
+        },
+        searchInfo: {
+            content: ''
+        },
+        searchFilters: {
+            matchType: ['title', 'content'],
+            area: [],
+            infoType: [],
+            pushTime: ['5year'],
+        },
+        listState: {
+            refreshing: false,
+            loaded: false,
+            loading: false,
+            finished: false,
+            pageNum: 1,
+            pageSize: 10,
+            count: 0,
+            offset: 50,
+            scrollTop: 0,
+            list: []
+        },
+        matchTypeList: matchTypeListForComputed,
+        publishTimeList: [
+            {
+                label: '最近7天',
+                value: '7day'
+            },
+            {
+                label: '最新30天',
+                value: '30day'
+            },
+            {
+                label: '1年内',
+                value: '1year'
+            },
+            {
+                label: '3年内',
+                value: '3year'
+            },
+            {
+                label: '5年内',
+                value: '5year'
+            }
+        ],
+        filterInitData: {
+            areaArr: [],
+            infoType: [],
+            timeRange: [],
+        },
+        reqSign: 'bigmember'
+    },
+    computed: {
+        projectNewUrl: function () {
+            var urlMap = {
+                bigmember: '/bigmember/portrait/winner/getNewMsg', // 大会员
+                svip: '/bigmember/portrait/subVipPortrait/winnerNewMsg' // 超级订阅
+            }
+            var url = urlMap.bigmember
+            if (urlMap[this.reqSign]) {
+                url = urlMap[this.reqSign]
+            }
+            return url
+        },
+        filterInfoUrl: function () {
+            var urlMap = {
+                bigmember: '/bigmember/portrait/winner/getNewMsgSelects', // 大会员
+                svip: '/bigmember/portrait/subVipPortrait/getNewMsgSelects' // 超级订阅
+            }
+            var url = urlMap.bigmember
+            if (urlMap[this.reqSign]) {
+                url = urlMap[this.reqSign]
+            }
+            return url
+        },
+    },
+    created: function () {
+        var eid = utils.getParam('eid')
+        var reqSign = utils.getParam('reqSign')
+        if (eid) {
+            this.entInfo.eid = decodeURIComponent(eid)
+        }
+        if (reqSign) {
+            this.reqSign = reqSign
+        }
+    },
+    mounted: function () {
+        var recover = this.recover()
+        if (!recover) {
+            this.getFilterInfo()
+            this.getEntInfo()
+            this.onLoad()
+            this.getEntFollowState()
+        } else {
+            this.initSelector(this.filterInitData)
+        }
+    },
+    methods: {
+        showToast: function (message) {
+            this.$toast({
+                duration: 1500,
+                forbidClick: true,
+                message: message,
+            })
+        },
+        showLoading: function () {
+            var loading = this.$toast.loading({
+                duration: 0,
+                forbidClick: true,
+                message: 'loading...',
+            })
+            return loading
+        },
+        getFilterInfo: function () {
+            var _this = this
+            var loading = this.showLoading()
+            $.ajax({
+                type: 'POST',
+                url: this.filterInfoUrl,
+                data: {
+                    entId: _this.entInfo.eid
+                },
+                success: function (res) {
+                    if (res.error_code == 0) {
+                        loading.clear()
+                        _this.filterInitData = res.data
+                        _this.initSelector(res.data)
+                    } else {
+                        _this.showToast(res.error_msg)
+                    }
+                },
+                error: function (error) {
+                    loading.clear()
+                    console.log(error)
+                }
+            })
+        },
+        // 查询企业是否存在和企业关注状态
+        getEntFollowState: function () {
+            var _this = this
+            _this.entInfo.followSearchFinish = false
+            $.ajax({
+                type: 'POST',
+                url: '/bigmember/follow/ent/followCheck',
+                data: {
+                    entId: _this.entInfo.eid
+                },
+                success: function (res) {
+                    if (res.error_code == 0) {
+                        if (res.data) {
+                            _this.entInfo.follow = !!res.data.followed
+                            _this.entInfo.entExist = !!res.data.isShow
+                        } else {
+                            _this.entInfo.entExist = false
+                        }
+                    } else {
+                        _this.entInfo.entExist = false
+                    }
+                },
+                complete: function () {
+                    _this.entInfo.followSearchFinish = true
+                },
+                error: function (error) {
+                    console.log(error)
+                }
+            })
+        },
+        getEntInfo: function () {
+            var _this = this
+            $.ajax({
+                type: 'POST',
+                url: '/bigmember/portrait/subVipPortrait/entDetail',
+                data: {
+                    entId: _this.entInfo.eid
+                },
+                success: function (res) {
+                    if (res.error_code == 0) {
+                        if (res.data && res.data.entName) {
+                            _this.entInfo.name = res.data.entName
+                        }
+                    } else {
+                        _this.$toast(res.error_msg)
+                    }
+                },
+                error: function (error) {
+                    console.log(error)
+                }
+            })
+        },
+        onLoad: function () {
+            var _this = this
+            var t = this.listState
+            t.loading = true
+
+            var url = this.projectNewUrl
+
+            $.ajax({
+                type: 'POST',
+                url: url,
+                data: {
+                    entId: _this.entInfo.eid,
+                    match: _this.searchInfo.content,
+                    matchType: _this.searchFilters.matchType.join(','),
+                    area: _this.searchFilters.area.join(','),
+                    infoType: _this.searchFilters.infoType.join(','),
+                    pushTime: _this.searchFilters.pushTime.join(','),
+                    pageNum: _this.listState.pageNum,
+                    pageSize: _this.listState.pageSize,
+                },
+                success: function (res) {
+                    if (res.data) {
+                        // 判断是否为刷新
+                        if (t.refreshing) {
+                            t.list = []
+                            t.refreshing = false
+                        }
+            
+                        // 列表赋值
+                        var list = res.data.list
+                        var count = res.data.count
+                        if (Array.isArray(list)) {
+                            _this.preSortList(list)
+                            if (_this.listState.pageNum === 1) {
+                                t.list = []
+                            }
+                            t.list = t.list.concat(list)
+                        } else {
+                            // list不为数组,则直接finish
+                            t.loaded = true
+                            t.loading = false
+                            t.finished = true
+                        }
+                        if (count && count != -1) {
+                            _this.listState.count = count
+                        }
+            
+                        // 加载状态结束
+                        t.loaded = true
+                        t.loading = false
+            
+                        // 翻页
+                        var hasNextPage = _this.listState.pageNum * _this.listState.pageSize < _this.listState.count
+                        if (hasNextPage) {
+                            t.pageNum++
+                        } else {
+                            t.finished = true
+                        }
+                    } else {
+                        t.loaded = true
+                        t.loading = false
+                        t.finished = true
+                        _this.$toast('请求失败')
+                    }
+                },
+                error: function (error) {
+                    console.log(error)
+                }
+            })
+        },
+        onRefresh: function () {
+            // 重置数据
+            this.listState.pageNum = 1
+            // 解除加载完成状态
+            this.listState.finished = false
+            // 重新加载数据
+            // 将 loading 设置为 true,表示处于加载状态
+            this.listState.loading = true
+            // 请求数据
+            this.onLoad()
+        },
+        resetState: function () {
+            var rState = {
+                refreshing: false,
+                loaded: false,
+                loading: false,
+                finished: false,
+                pageNum: 1,
+                pageSize: 10,
+                scrollTop: 0,
+                list: []
+            }
+            Object.assign(this.listState, rState)
+        },
+        doSearch: function () {
+            this.resetState()
+            this.onRefresh()
+            this.closeDropDownMenu(-1)
+        },
+        preSortList: function (list) {
+            return list
+        },
+        changeFollowState: function () {
+            return this.changeFollowStateRequest()
+            var _this = this
+            if (this.entInfo.follow) {
+                this.$dialog.confirm({
+                    title: '提示信息',
+                    message: '取消对“' + _this.entInfo.name + '”的关注?',
+                    confirmButtonColor: '#2cb7ca'
+                }).then(function () {
+                    _this.changeFollowStateRequest()
+                }).catch(function () {
+                    console.log('取消操作')
+                })
+            } else {
+                this.changeFollowStateRequest()
+            }
+        },
+        // 修改企业关注状态
+        changeFollowStateRequest: function () {
+            var _this = this
+            var loading = this.showLoading()
+            var urls = {
+                addFollow: '/bigmember/follow/ent/addFollow',
+                delFollow: '/bigmember/follow/ent/delFollow'
+            }
+            var url = !!this.entInfo.follow ? urls.delFollow : urls.addFollow
+            $.ajax({
+                type: 'POST',
+                url: url,
+                data: {
+                    entId: _this.entInfo.eid
+                },
+                success: function (res) {
+                    if (res.error_code == 0) {
+                        // 清除上个页面缓存
+                        sessionStorage.removeItem('$data-ent_portrait')
+                        loading.clear()
+                        if (res.data && res.data == 'success') {
+                            _this.entInfo.follow = !_this.entInfo.follow
+                        }
+                    } else {
+                        _this.showToast(res.error_msg)
+                    }
+                },
+                error: function (error) {
+                    loading.clear()
+                    console.log(error)
+                }
+            })
+        },
+        initSelector: function (data) {
+            this.initMatchTypeSelector()
+            this.initInfoTypeSelector(data.infoType)
+            this.initProjectAreaSelector(data.areaArr)
+            this.initPublishTimeSelector(data.timeRange)
+
+            this.recoverFilterState()
+        },
+        initMatchTypeSelector: function () {
+            this.$refs.matchTypeSelector.setState(this.searchFilters.matchType)
+        },
+        initInfoTypeSelector: function (infoTypeList) {
+            if (!Array.isArray(infoTypeList)) return
+
+            var list = []
+            infoTypeSelectorMap.forEach(function (item) {
+                for (var key in item) {
+                    var arr = []
+                    item[key].forEach(function (t) {
+                        if (infoTypeList.indexOf(t) !== -1) {
+                            arr.push(t)
+                        }
+                    })
+                    if (arr.length) {
+                        list.push({
+                            [key]: arr
+                        })
+                    }
+                }
+            })
+
+            this.$refs.infoTypeSelector.getIndustryData(list)
+            this.$refs.infoTypeSelector.getbBtnClick()
+            this.$refs.infoTypeSelector.setStates()
+
+            this.$refs.infoTypeSelector.checkBoxAll()
+        },
+        initProjectAreaSelector: function (areaArr) {
+            if (!Array.isArray(areaArr)) return
+
+            if (areaArr.indexOf('全国') === -1) {
+                areaArr.unshift('全国')
+            }
+
+            var areaMap = this.$refs.projectAreaSelector.provinceListMap
+            var map = {}
+            for (var key in areaMap) {
+                var arr = []
+                areaMap[key].forEach(function (item) {
+                    if (areaArr.indexOf(item) !== -1) {
+                        arr.push(item)
+                    }
+                })
+                if (arr.length) {
+                    map[key] = arr
+                }
+            }
+            this.$refs.projectAreaSelector.arrangeListMap(map)
+        },
+        initPublishTimeSelector: function (timeRange) {
+            if (!Array.isArray(timeRange)) return
+            var arr = []
+            this.publishTimeList.forEach(function (item) {
+                if (timeRange.indexOf(item.value) !== -1) {
+                    arr.push(item)
+                }
+            })
+            this.publishTimeList = JSON.parse(JSON.stringify(arr))
+            this.$refs.publishTimeSelector.setSortedList(this.publishTimeList)
+        },
+        cancel: function (data) {
+            if (data.name === 'noticeItem') {
+                this.searchFilters.infoType = []
+                this.$refs.infoTypeSelector.setState()
+            } else if (data.name === 'areaItem') {
+                this.searchFilters.area = []
+            }
+        },
+        confirm: function (data) {
+            if (data.name === 'noticeItem') {
+                this.searchFilters.infoType = data.data
+            } else if (data.name === 'areaItem') {
+                this.searchFilters.area = data.data
+            }
+            this.doSearch()
+        },
+        closeDropDownMenu: function (index) {
+            if (index === 0) {
+                this.$refs.matchTypeMenu.toggle(false)
+            } else if (index === 1) {
+                this.$refs.infoTypeMenu.toggle(false)
+            } else if (index === 2) {
+                this.$refs.projectAreaMenu.toggle(false)
+            } else if (index === 3) {
+                this.$refs.publishTimeMenu.toggle(false)
+            } else if (index === -1) {
+                this.closeDropDownMenu(0)
+                this.closeDropDownMenu(1)
+                this.closeDropDownMenu(2)
+                this.closeDropDownMenu(3)
+            }
+        },
+        pConfirm: function (e, type) {
+            if (type === 'matchType') {
+                this.searchFilters.matchType = e.data
+            } else if (type === 'publishTime') {
+                this.searchFilters.pushTime = e.data
+            }
+            this.doSearch()
+        },
+        goToDetail: function (item) {
+            this.saveState()
+            var href = ''
+            if (this.platform === 'app') {
+                href = '/jyapp/article/content/' + item.id + '.html'
+            } else {
+                href = '/article/content/' + item.id + '.html'
+            }
+            location.href = href
+        },
+        recoverFilterState: function () {
+            if (this.searchFilters.infoType.length) {
+                this.$refs.infoTypeSelector.setState(this.searchFilters.infoType)
+            }
+            if (this.searchFilters.area.length) {
+                this.$refs.projectAreaSelector.setState(this.searchFilters.area)
+            } else {
+                this.$refs.projectAreaSelector.resetAll()
+            }
+            this.$refs.publishTimeSelector.setState(this.searchFilters.pushTime)
+        },
+        saveState: function () {
+            // 保存滚动高度
+            this.listState.scrollTop = parseInt(this.$refs.jList.scrollTop)
+            var $data = JSON.stringify(this.$data)
+            sessionStorage.setItem(this.sessStorageKey, $data)
+        },
+        recover: function () {
+            var _this = this
+            var excludeKey = ['sessStorageKey', 'matchTypeList', 'publishTimeList']
+            var $data = sessionStorage.getItem(this.sessStorageKey)
+            if ($data) {
+                $data = JSON.parse($data)
+                if (this.entInfo.eid !== $data.entInfo.eid) return
+                for (var key in $data) {
+                    if (excludeKey.indexOf(key) !== -1) {
+                        continue
+                    }
+                    this.$data[key] = $data[key]
+                }
+
+                this.$nextTick(function () {
+                    _this.$refs.jList.scrollTop = _this.listState.scrollTop
+                })
+                sessionStorage.removeItem(this.sessStorageKey)
+            }
+            return !!$data
+        },
+    }
+}
+var vm = new Vue(vConfig)

+ 32 - 0
src/web/staticres/common-module/collection/css/index.css

@@ -1057,3 +1057,35 @@
 .super-vip-dialog .van-dialog__message {
     color: #5f5e64;
 }
+
+
+/* 通用多选,label+checkbox */
+.checkbox-select-component .checkbox-item:not(.active) .icon-tick-circle-fill {
+    display: none;
+}
+.checkbox-select-component .checkbox-item.active .icon-tick-circle {
+    display: none;
+}
+.checkbox-select-component .checkbox-item {
+    display: flex;
+    align-items: center;
+    font-size: .28rem;
+    min-height: .8rem;
+}
+.checkbox-select-component .checkbox-item.active {
+    color: #2abed1;
+}
+
+/* 通用多选按钮 */
+.button-select-component .button-list {
+    display: flex;
+    flex-wrap: wrap;
+    padding: .32rem;
+    color: #5f5e64;
+}
+.button-select-component .j-button-item {
+    display: flex;
+    margin-right: .16rem;
+    margin-bottom: .16rem;
+    font-size: .28rem;
+}

+ 103 - 143
src/web/staticres/common-module/collection/js/area-mobile.js

@@ -1,7 +1,7 @@
 var areaComponentTemplate = `<div class="select-area-box j-container">
 <div class="select-area-pop j-main">
   <van-index-bar class="area-list" :index-list="indexList" @select="$emit('select')">
-    <div v-for="item in indexList" :key="item">
+    <div class="key-card-box" v-for="item in indexList" :key="item">
       <van-index-anchor class="area-index" v-show="item !== '#'" :index="item"></van-index-anchor>
       <div class="area-card-box" v-if="refresh">
         <div
@@ -45,182 +45,145 @@ var areaComponent = {
       indexListMap:{},
       // 原始数组
       provinceListMap: {
-          '#': ['全国'],
-          A: ['安徽', '澳门'],
-          B: ['北京'],
-          C: ['重庆'],
-          F: ['福建'],
-          G: ['广东', '广西', '贵州', '甘肃'],
-          H: ['河北', '湖北', '黑龙江', '海南', '河南', '湖南'],
-          J: ['吉林', '江苏', '江西'],
-          L: ['辽宁'],
-          N: ['内蒙古', '宁夏'],
-          Q: ['青海'],
-          S: ['山西', '陕西', '上海', '山东', '四川'],
-          T: ['天津', '台湾'],
-          X: ['西藏', '新疆', '香港'],
-          Y: ['云南'],
-          Z: ['浙江']
+        '#': ['全国'],
+        A: ['安徽', '澳门'],
+        B: ['北京'],
+        C: ['重庆'],
+        F: ['福建'],
+        G: ['广东', '广西', '贵州', '甘肃'],
+        H: ['河北', '湖北', '黑龙江', '海南', '河南', '湖南'],
+        J: ['吉林', '江苏', '江西'],
+        L: ['辽宁'],
+        N: ['内蒙古', '宁夏'],
+        Q: ['青海'],
+        S: ['山西', '陕西', '上海', '山东', '四川'],
+        T: ['天津', '台湾'],
+        X: ['西藏', '新疆', '香港'],
+        Y: ['云南'],
+        Z: ['浙江']
       },
     }
   },
   created () {
-    var recover = this.recover()
-    if (!recover) {
-        this.arrangeListMap()
-        this.recoverData()
-    }
+    this.arrangeListMap(this.provinceListMap)
     if(this.selectarealist.length !== 0) {
       this.setState()
     }
-},
+  },
   methods: {
-    recover: function () {
-      var excludeKey = ['sessStorageKey','minDate','maxDate','currentDate']
-      var $data = sessionStorage.getItem(this.sessStorageKey)
-      if ($data) {
-          $data = JSON.parse($data)
-          for (var key in $data) {
-              if (excludeKey.indexOf(key) !== -1) {
-                  continue
-              }
-              this.$data[key] = $data[key]
+    // 整理数据得到indexListMap,同时获得indexList
+    arrangeListMap: function (provinceListMap) {
+      this.indexList = []
+      this.indexListMap = {}
+
+      for (var key in provinceListMap) {
+        this.indexList.push(key)
+        this.indexListMap[key] = provinceListMap[key].map(function (item) {
+          return {
+            name: item,
+            selected: item === '全国'
           }
-          sessionStorage.removeItem(this.sessStorageKey)
+        })
       }
-      return !!$data
-  },
-    // 整理数据得到indexListMap,同时获得indexList
-    arrangeListMap: function () {
-      for (var key in this.provinceListMap) {
-          this.indexList.push(key)
-          this.indexListMap[key] = this.provinceListMap[key].map(function (item) {
-              return {
-              name: item,
-              selected: item === '全国'
-              }
-          })
+    },
+    // 回显数据
+    setState: function (data) {
+      let optionArr = []
+      if (data && Array.isArray(data)) {
+        optionArr = data
+      } else {
+        optionArr = this.selectarealist
       }
-  },
-  recoverData () {
-    if (!Array.isArray(this.recover) || this.recover.length === 0) return
-    this.indexListMap['#'][0].selected = false
-    this.recover.forEach((item) => {
-    for (var key in this.indexListMap) {
-        this.indexListMap[key].forEach(function (iitem) {
-        if (iitem.name === item) {
-            iitem.selected = true
-        }
+      for (var key in this.indexListMap) {
+        this.indexListMap[key].forEach(function (item) {
+            item.selected = false
+            optionArr.forEach(function(sum) {
+              if(item.name == sum) {
+                item.selected = true
+              }
+            })
         })
-    }
-    })
-},
-  // 回显数据
-  setState: function () {
-    console.log(this.selectarealist)
-    let optionArr = this.selectarealist
-    for (var key in this.indexListMap) {
-      this.indexListMap[key].forEach(function (item) {
-          item.selected = false
-          optionArr.forEach(function(sum) {
-            if(item.name == sum) {
-              item.selected = true
-            }
-          })
-      })
-    }
-  },
-   // 每个按钮点击事件
-  clickItems:function (item) {
+      }
+    },
+    // 每个按钮点击事件
+    clickItems:function (item) {
       if (this.multiple) {
-          this.selectedMultiple(item)
+        this.selectedMultiple(item)
       } else {
-          this.selectedOne(item)
+        this.selectedOne(item)
       }
       // 这里有bug需要手动刷新视图
       this.refresh = !this.refresh
       this.refresh = !this.refresh
       this.$emit('onChange', this.getSelectedProvinceArr())
-  },
-
-  // 单选逻辑
-  selectedOne:function (item) {
+    },
+    // 单选逻辑
+    selectedOne:function (item) {
       this.setAllDisSelected(false)
       item.selected = !item.selected
-  },
-
-  // 多选逻辑
-  selectedMultiple:function (item) {
+    },
+    // 多选逻辑
+    selectedMultiple:function (item) {
       // 选全国
       if (item.name === '全国') {
-          this.setAllDisSelected(false)
-          item.selected = true
+        this.setAllDisSelected(false)
+        item.selected = true
       } else {
-          this.indexListMap['#'][0].selected = false
-          item.selected = !item.selected
+        this.indexListMap['#'][0].selected = false
+        item.selected = !item.selected
       }
-
       // 此处判断是否全部选中
       var state = this.getAllStateExceptCountryWide()
       if (state !== 0) {
-          // 全国选中
-          this.setAllDisSelected(false)
-          this.indexListMap['#'][0].selected = true
+        // 全国选中
+        this.setAllDisSelected(false)
+        this.indexListMap['#'][0].selected = true
       }
-  },
-
-  // 获得所有选中的省份名字的数组
-  getSelectedProvinceArr:function () {
+    },
+    // 获得所有选中的省份名字的数组
+    getSelectedProvinceArr:function () {
       var arr = []
       for (var key in this.indexListMap) {
-      this.indexListMap[key].forEach(function (item) {
+        this.indexListMap[key].forEach(function (item) {
           if (item.name !== '全国' && item.selected) {
-          arr.push(item.name)
+            arr.push(item.name)
           }
-      })
+        })
       }
       return arr
-  },
-
-  // 所有按钮设置状态
-  setAllDisSelected:function (state) {
+    },
+    // 所有按钮设置状态
+    setAllDisSelected:function (state) {
       for (var key in this.indexListMap) {
-      this.indexListMap[key].forEach(function (item) {
+        this.indexListMap[key].forEach(function (item) {
           item.selected = state
-      })
+        })
       }
-  },
-   // 除了全国其余所有按钮是否全选或者是否全不选
-        // 1 全选   -1 全部不选  0 其他
-        getAllStateExceptCountryWide:function () {
-          var arr = []
-          for (let i = 1; i < this.indexList.length; i++) {
-          this.indexListMap[this.indexList[i]].forEach(function (item) {
-              // 判断select的和是否为0,为0则全不选
-              // state += item.selected
-              arr.push(item.selected)
-          })
-          }
-          let selectedCount = 0
-          arr.forEach(function (item) {
-          if (item) selectedCount++
-          })
+    },
+    // 除了全国其余所有按钮是否全选或者是否全不选
+    // 1 全选   -1 全部不选  0 其他
+    getAllStateExceptCountryWide:function () {
+      var arr = []
+      for (let i = 1; i < this.indexList.length; i++) {
+        this.indexListMap[this.indexList[i]].forEach(function (item) {
+          // 判断select的和是否为0,为0则全不选
+          // state += item.selected
+          arr.push(item.selected)
+        })
+      }
+      let selectedCount = 0
+      arr.forEach(function (item) {
+        if (item) selectedCount++
+      })
 
-          if (selectedCount === arr.length) {
-          // 除了全国以外其他所有都被选中
-          return 1
-          } else if (selectedCount === 0) {
-          return -1
-          } else {
-          return 0
-          }
-      },
-      onReset (v) {
-        ;(this.$refs.areaRef).toggle(true)
-        this.dropdownItemText.area = '地区'
-        this.setParam.area = v.join(',')
-        // this.listState.pageNum = 1
-        // this.getPushList(this.time, '', this.listState.pageNum)
+      if (selectedCount === arr.length) {
+        // 除了全国以外其他所有都被选中
+        return 1
+      } else if (selectedCount === 0) {
+        return -1
+      } else {
+        return 0
+      }
     },
     resetAll:function () {
       if (this.multiple) {
@@ -238,17 +201,14 @@ var areaComponent = {
       this.$emit('cancel', params)
       return params
     },
-
     onConfirm:function() {
       var value = this.getSelectedProvinceArr()
       let t = '地区'
       if (value.length) {
-          t = `地区 ${value.length}`
+        t = `地区 ${value.length}`
       } else {
-          t = '全国'
+        t = '全国'
       }
-      console.log(t)
-      console.log(value.join(','))
       let params = {
         name: 'areaItem',
         t:t,

+ 29 - 34
src/web/staticres/common-module/collection/js/ent_portrait.js

@@ -62,8 +62,8 @@ var vNode = {
             // tab2中的项目动态
             topProject: {
                 list: [],
-                count: '',
-                pageSign: '',
+                count: 0, // 总共多少条数据
+                pageSize: 3,
                 showGetNextButton: true
             },
             entPortraitInfo: {},
@@ -231,6 +231,9 @@ var vNode = {
         hideDt: function() {
           // 是新超级订阅 且不是大会员且次数已用完   或大会员没有项目动态权限
           return this.isVip && this.powerInfo.memberStatus <= 0 && this.entvisit.total <= this.entvisit.usage || this.conf.arr.indexOf(13) === -1
+        },
+        isMemberAndSvip: function () {
+          return this.powerInfo.memberStatus > 0 || this.powerInfo.vipStatus > 0
         }
     },
     methods: {
@@ -387,18 +390,8 @@ var vNode = {
                 }
             });
         },
-        // 获取项目动态
-        getProjectNews: function () {
+        getProjectNewsUrl: function () {
             var _this = this
-            var data = {
-                entId: _this.entInfo.id,
-                count: _this.topProject.count,
-                pageSign: _this.topProject.pageSign
-            }
-
-            if (data.pageSign) {
-                this.loading = this.showLoading()
-            }
             var urls = ''
             // 判断专家版、智慧版; 商机版和自定义版时判断是不是超级订阅 
             if (_this.powerInfo.memberStatus > 0 && _this.powerInfo.memberStatus <= 2) {
@@ -416,6 +409,21 @@ var vNode = {
             } else {
               urls = '/bigmember/portrait/subVipPortrait/winnerNewMsg'
             }
+            return urls
+          },
+        // 获取项目动态
+        getProjectNews: function () {
+            var _this = this
+            var data = {
+                entId: _this.entInfo.id,
+                pageNum: 1,
+                pageSize: _this.topProject.pageSize
+            }
+
+            this.loading = this.showLoading()
+
+            var urls = this.getProjectNewsUrl()
+
             $.ajax({
                 type: 'POST',
                 url: urls,
@@ -425,27 +433,8 @@ var vNode = {
                         _this.loading.clear()
                         _this.topProject.count = res.data.count
                         if (res.data.list && $.isArray(res.data.list)) {
-                            if (!_this.topProject.pageSign) {
-                                _this.singleTab = false
-                            }
-
-                            // 修改当前pageSign值
-                            if (!_this.topProject.pageSign) {
-                                _this.topProject.list = []
-                                _this.topProject.pageSign = 'more'
-                                if(res.data.count <= 3) {
-                                    _this.topProject.showGetNextButton = false
-                                }
-                            } else if (_this.topProject.pageSign === 'more') {
-                                _this.topProject.pageSign = 'max'
-                                if(res.data.count <= 23) {
-                                    _this.topProject.showGetNextButton = false
-                                }
-                            } else if (_this.topProject.pageSign === 'max') {
-                                _this.topProject.showGetNextButton = false
-                            }
-
-                            _this.topProject.list = _this.topProject.list.concat(res.data.list)
+                            _this.singleTab = false
+                            _this.topProject.list = res.data.list
                         }
                     } else {
                         _this.$toast(res.error_msg)
@@ -1049,6 +1038,12 @@ var vNode = {
                 location.href = href
             }
         },
+        goToFilterProjectNews: function () {
+            this.savePageState()
+            var url = this.getProjectNewsUrl()
+            var reqSign = url.indexOf('subVipPortrait') === -1 ? 'bigmember' : 'svip'
+            location.href = '/big/wx/page/free_ent_project_news?eid=' + this.entInfo.id + '&reqSign=' + reqSign
+        },
         savePageState: function () {
             this.scrollTop = $('#ent-portrait').scrollTop()
             var data = {

+ 3 - 3
src/web/staticres/common-module/collection/js/history-project.js

@@ -105,11 +105,11 @@ var hisproComponent = {
                 } else {
                   item.date = ''
                 }
-                console.log(Object.keys(item.contacts))
+                // console.log(Object.keys(item.contacts))
 
                 Object.keys(item.contacts).forEach(function(items, index) {
-                  console.log(items)
-                  console.log({[items]: item.contacts[Object.keys(item.contacts)[index]]})
+                  // console.log(items)
+                  // console.log({[items]: item.contacts[Object.keys(item.contacts)[index]]})
                   phoneArr.push({[items]: item.contacts[Object.keys(item.contacts)[index]]})
                 })
                 item.contacts = phoneArr

+ 84 - 44
src/web/staticres/common-module/collection/js/notice-mobile.js

@@ -1,3 +1,46 @@
+var infoTypeSelectorMap = [
+  {
+    "拟建项目": [
+      "拟建项目"
+    ]
+  },
+  {
+    "招标预告": [
+      "预告",
+      "预审",
+      "预审结果",
+      "论证意见",
+      "需求公示",
+    ]
+  },
+  {
+    "招标公告": [
+      "招标",
+      "邀标",
+      "询价",
+      "竞谈",
+      "单一",
+      "竞价",
+      "变更"
+    ]
+  },
+  {
+    "招标结果": [
+      "中标",
+      "成交",
+      "废标",
+      "流标"
+    ]
+  },
+  {
+    "招标信用信息": [
+      "合同",
+      "验收",
+      "违规"
+    ]
+  }
+]
+
 // 公告类型
 var noticeComponentTemplate = `<div class="j-container">
 <div class="j-main">
@@ -89,51 +132,13 @@ var noticeComponent = {
   },
   methods: {
     // 获取行业数据
-    getIndustryData: function(){
+    getIndustryData: function (tablist) {
       const _this = this
-      _this.tablist =  [
-        {
-          "拟建项目": [
-            "拟建项目"
-          ]
-        },
-        {
-          "招标预告": [
-            "预告",
-            "预审",
-            "预审结果",
-            "论证意见",
-            "需求公示",
-          ]
-        },
-        {
-          "招标公告": [
-            "招标",
-            "邀标",
-            "询价",
-            "竞谈",
-            "单一",
-            "竞价",
-            "变更",
-            "其它"
-          ]
-        },
-        {
-          "招标结果": [
-            "中标",
-            "成交",
-            "废标",
-            "流标"
-          ]
-        },
-        {
-          "招标信用信息": [
-            "合同",
-            "验收",
-            "违规"
-          ]
-        }
-      ]
+      if (tablist) {
+        _this.tablist = tablist
+      } else {
+        _this.tablist = infoTypeSelectorMap
+      }
       let maxarr = []
       _this.tablist.forEach(function(item,index) {
         let minarr = []
@@ -272,6 +277,41 @@ var noticeComponent = {
         this.canClick = false
       }
     },
+    // 设置选择器状态
+    setState: function (data) {
+      if (Array.isArray(data)) {
+        var moduleCheckArr = []
+        this.setState()
+        this.tablist.forEach(function (item) {
+          for (var key in item) {
+            if (Array.isArray(item[key])) {
+              var typeArr = []
+              item[key].forEach(function (t) {
+                if (data.indexOf(t.name) !== -1) {
+                  t.type = true
+                }
+                typeArr.push(t.type)
+              })
+              // 没有找到false则为全选
+              item.type = typeArr.indexOf(false) === -1
+            }
+          }
+          moduleCheckArr.push(item.type)
+        })
+        this.checkedAll = moduleCheckArr.indexOf(false) === -1
+      } else {
+        this.tablist.forEach(function (item) {
+          for (var key in item) {
+            item.type = false
+            if (Array.isArray(item[key])) {
+              item[key].forEach(function (t) {
+                t.type = false
+              })
+            }
+          }
+        })
+      }
+    },
     resetAll:function() {
       let params = {
         name: 'noticeItem',

+ 196 - 0
src/web/staticres/common-module/collection/js/popup-select-mobile.js

@@ -0,0 +1,196 @@
+var popupSelectComponentTemplate = `
+<div class="j-container" :class="calcClass">
+    <van-cell-group class="j-main" v-if="buttonType === 'checkbox'">
+        <van-cell
+            v-for="(item, index) in dataListSorted"
+            clickable
+            :key="index"
+            :title="item.label"
+            class="checkbox-item"
+            :class="{ active: item.checked }"
+            @click="toggle(item, index)">
+            <template #right-icon>
+                <div class="icon-container" v-if="false">
+                    <span class="j-icon base-icon icon-tick-circle"></span>
+                    <span class="j-icon base-icon icon-tick-circle-fill"></span>
+                </div>
+                <van-checkbox checked-color="#2ABED1" v-model="item.checked"></van-checkbox>
+            </template>
+        </van-cell>
+    </van-cell-group>
+    <div class="j-main" v-if="buttonType === 'button'">
+        <div class="button-list">
+            <div
+                v-for="(item, index) in dataListSorted"
+                :key="index"
+                class="j-button j-button-item"
+                :class="{ active: item.checked }"
+                v-text="item.label"
+                @click="toggle(item, index)"></div>
+        </div>
+    </div>
+    <div class="j-footer">
+        <div class="j-button-group">
+            <button class="j-button-cancel" @click="onReset">重置</button>
+            <button class="j-button-confirm" @click="onConfirm">确认</button>
+        </div>
+    </div>
+</div>
+`
+
+var popupSelectComponent = {
+    name: 'popup-select-mobile',
+    template: popupSelectComponentTemplate,
+    props: {
+        dataList: {
+            type: Array,
+            default: function () {
+                return []
+            }
+        },
+        buttonType: {
+            type: String,
+            default: 'checkbox',
+            validator: function (value) {
+                return ['checkbox', 'button'].indexOf(value) !== -1
+            }
+        },
+        showAllButton: {
+            type: Boolean,
+            default: false
+        },
+        // 单选还是多选
+        multiple: {
+            type: Boolean,
+            default: false
+        },
+    },
+    data:function () {
+        return {
+            dataListSorted: [],
+            allTemp: {
+                label: '全部',
+                value: ''
+            }
+        }
+    },
+    created () {
+        this.setSortedList(this.dataList)
+    },
+    computed: {
+        calcClass: function () {
+            var map = {
+                checkbox: 'checkbox-select-component',
+                button: 'button-select-component',
+            }
+            return map[this.buttonType]
+        },
+        selectedList: function () {
+            return this.getState()
+        }
+    },
+    methods: {
+        sortList: function (list) {
+            if (!Array.isArray(list)) return []
+            if (this.showAllButton) {
+                list.unshift(JSON.parse(JSON.stringify(this.allTemp)))
+            }
+            list.forEach(function (item) {
+                item.checked = false
+            })
+            return JSON.parse(JSON.stringify(list))
+        },
+        setSortedList: function (list) {
+            this.dataListSorted = this.sortList(list)
+        },
+        toggle: function (item) {
+            if (this.multiple) {
+                item.checked = !item.checked
+                if (this.showAllButton) {
+                    var state = this.hasAllChecked()
+                    var clickAllButton = item.label === this.allTemp.label && item.value === this.allTemp.value
+                    var checkedAll = state.allChecked
+                    if (clickAllButton || checkedAll) {
+                        this.setAllState(item.checked)
+                    } else {
+                        this.dataListSorted[0].checked = false
+                    }
+                }
+            } else {
+                this.setState()
+                item.checked = !item.checked
+            }
+            
+            this.onChange(item)
+        },
+        setAllState: function (f) {
+            this.dataListSorted.forEach(function (item) {
+                item.checked = f
+            })
+        },
+        hasAllChecked: function () {
+            // 不计算全部
+            var stateArr = []
+            for (var i = this.showAllButton ? 1 : 0; i < this.dataListSorted.length; i++) {
+                var f = this.dataListSorted[i].checked
+                stateArr.push(f)
+            }
+            return {
+                allChecked: stateArr.indexOf(false) === -1,
+                allUnchecked: stateArr.indexOf(true) === -1,
+            }
+        },
+        // 传入一个选中的value的数组
+        setState: function (list) {
+            if (Array.isArray(list)) {
+                if (list.length) {
+                    this.dataListSorted.forEach(function (item) {
+                        item.checked = list.indexOf(item.value) !== -1
+                    })
+                } else {
+                    this.setAllState(true)
+                }
+            } else {
+                this.setAllState(false)
+            }
+        },
+        getState: function () {
+            var itemArr = []
+            this.dataListSorted.forEach(function (item) {
+                if (item.checked && item.value) {
+                    itemArr.push(item)
+                }
+            })
+            return itemArr
+        },
+        getArrValue: function (list) {
+            if (!Array.isArray(list)) return []
+            return list.map(function (item) {
+                return item.value
+            })
+        },
+        onChange: function (item) {
+            var arr = this.getState()
+            var data = {
+                changeItem: item,
+                data: this.getArrValue(arr),
+                checkedList: arr
+            }
+            this.$emit('change', data)
+        },
+        // 筛选条件确认按钮
+        onConfirm: function () {
+            var arr = this.getState()
+            var data = {
+                data: this.getArrValue(arr),
+                checkedList: arr
+            }
+            this.$emit('confirm', data)
+        },
+        // 重置
+        onReset: function () {
+            this.setState()
+            this.$emit('reset')
+        }
+    }
+}

+ 126 - 16
src/web/staticres/common-module/ent-search/ent-search-template.js

@@ -135,7 +135,8 @@ var vEntSearchComponent = new Vue({
   el: '#v-ent-search-group',
   components: {
     areaComponent: areaComponent,
-    moneyComponent: moneyComponent
+    moneyComponent: moneyComponent,
+    dateComponent: dateComponent
   },
   delimiters: ['@@', '@@'],
   data: function () {
@@ -205,6 +206,9 @@ var vEntSearchComponent = new Vue({
         {
           title: '企业状态'
         },
+        {
+          title: '成立时间'
+        },
         {
           title: '中标区域',
           disabled: true
@@ -243,6 +247,12 @@ var vEntSearchComponent = new Vue({
           //   checked: false,
           //   key: 'D'
           // },
+          {
+            title: '经营范围',
+            disabled: true,
+            checked: false,
+            key: 'F'
+          },
           {
             title: '中标项目/标的物',
             disabled: true,
@@ -304,7 +314,7 @@ var vEntSearchComponent = new Vue({
             key: 'D'
           }
         ],
-        7: [
+        8: [
           {
             title: '不限',
             checked: true,
@@ -331,7 +341,7 @@ var vEntSearchComponent = new Vue({
             key: '4'
           }
         ],
-        8: [
+        9: [
           {
             title: '不限',
             checked: true,
@@ -368,6 +378,7 @@ var vEntSearchComponent = new Vue({
         entStatus: '',
         biddingArea: '',
         entClass: '',
+        establish: '',
         entContact: ''
       },
       isSelectConditionTabs: {
@@ -378,10 +389,49 @@ var vEntSearchComponent = new Vue({
         5: false,
         6: false,
         7: false,
-        8: false
+        8: false,
+        9: false
+      },
+      moreContentList: [4,5,6,7,8,9],
+      showPopForArea: false,
+      dateComponentKey: new Date().getTime(),
+      times: [
+        {
+          name: '全部',
+          value: '',
+          selected: true
+        },
+        {
+          name: '近1年内',
+          value: '-1y',
+          selected: false
+        },
+        {
+          name: '1-3年',
+          value: '1y-3y',
+          selected: false
+        },
+        {
+          name: '3-5年',
+          value: '3y-5y',
+          selected: false
+        },
+        {
+          name: '5-10年',
+          value: '5y-10y',
+          selected: false
+        },
+        {
+          name: '10年以上',
+          value: '10y-',
+          selected: false
+        }
+      ],
+      selectDate: {
+        startDate: '',
+        endDate: '',
+        exact: ''
       },
-      moreContentList: [4,5,6,7,8],
-      showPopForArea: false
     }
   },
   computed: {
@@ -420,10 +470,11 @@ var vEntSearchComponent = new Vue({
       return resultPower
     },
     changePower (type) {
-      this.entTabs[6].disabled = type
       this.entTabs[7].disabled = type
       this.entTabs[8].disabled = type
+      this.entTabs[9].disabled = type
       this.conditionMap[1][2].disabled = type
+      this.conditionMap[1][3].disabled = type
     },
     getMoreListToStr (key) {
       if (typeof this.conditionMap[key] !== "undefined" && this.conditionMap[key].length) {
@@ -476,6 +527,58 @@ var vEntSearchComponent = new Vue({
         }
         case 6: {
           var tempParams = {}
+         try {
+           if (type) {
+             tempParams = this.$refs.dateComponentForEnt.onConfirm()
+           } else {
+             tempParams = this.$refs.dateComponentForEnt.resetAll()
+             this.dateComponentKey = new Date().getTime()
+           }
+         } catch (err) {
+           if (type) {
+             tempParams = this.$refs.dateComponentForEnt[0].onConfirm()
+           } else {
+             tempParams = this.$refs.dateComponentForEnt[0].resetAll()
+             this.dateComponentKey = new Date().getTime()
+           }
+         }
+          console.log(tempParams)
+          if (tempParams && tempParams.data) {
+            if (tempParams.data.start === '' && tempParams.data.end === '') {
+              this.selectDate = {
+                startDate: '',
+                endDate: '',
+                exact: ''
+              }
+              this.conditionStrMap.establish = ''
+              this.dateComponentKey = new Date().getTime()
+              return
+            }
+            var tempDate = tempParams.data.exact
+            this.selectDate = {
+              startDate: tempParams.data.start,
+              endDate: tempParams.data.end,
+              exact: tempParams.data.exact
+            }
+            if (tempDate === 'exact') {
+              tempDate = (tempParams.data.start ? tempParams.data.start / 1000 : '')  + '-' + (tempParams.data.end ? tempParams.data.end / 1000 : '')
+            }
+            this.conditionStrMap.establish = tempDate
+            if (this.conditionStrMap.establish === '_' || this.conditionStrMap.establish === 'all') {
+              this.conditionStrMap.establish = ''
+            }
+          } else {
+            this.selectDate = {
+              startDate: '',
+              endDate: '',
+              exact: ''
+            }
+            this.conditionStrMap.establish = ''
+          }
+          break
+        }
+        case 7: {
+          var tempParams = {}
           if (type) {
             tempParams = this.$refs.areaRadioComponent.onConfirm()
           } else {
@@ -486,12 +589,12 @@ var vEntSearchComponent = new Vue({
           }
           break
         }
-        case 7 : {
-          this.conditionStrMap.entClass = this.getMoreListToStr(7)
+        case 8 : {
+          this.conditionStrMap.entClass = this.getMoreListToStr(8)
           break
         }
-        case 8 : {
-          this.conditionStrMap.entContact = this.getMoreListToStr(8)
+        case 9 : {
+          this.conditionStrMap.entContact = this.getMoreListToStr(9)
           break
         }
       }
@@ -578,7 +681,7 @@ var vEntSearchComponent = new Vue({
       this.onLoad()
     },
     onCancelArea (tempParams) {
-      this.resetValueForData(6)
+      this.resetValueForData(7)
       if (tempParams && tempParams.data) {
         this.conditionStrMap.biddingArea = tempParams.data[0]
       }
@@ -685,7 +788,7 @@ var vEntSearchComponent = new Vue({
       if (this.entTabs[index].disabled) {
         return this.showBuyTip()
       }
-      if (index === 6) {
+      if (index === 7) {
           this.togglePopForArea(true)
       }
     },
@@ -928,12 +1031,18 @@ var vMainSearchComponent = new Vue({
             checked: false,
             key: 'agency'
           },
+          {
+            title: '项目名称/标的物',
+            disabled: true,
+            checked: false,
+            key: 'ppa'
+          },
           {
             title: '附件',
             disabled: true,
             checked: false,
             key: 'file'
-          }
+          },
         ],
         9: [
           {
@@ -1154,6 +1263,7 @@ var vMainSearchComponent = new Vue({
       this.conditionMap[1][2].disabled = type
       this.conditionMap[1][3].disabled = type
       this.conditionMap[1][4].disabled = type
+      this.conditionMap[1][5].disabled = type
       this.conditionMap[1][2].tag = ''
 
       if (tempPower.isOld && type) {
@@ -1163,10 +1273,10 @@ var vMainSearchComponent = new Vue({
 
       if (utils.isWeiXinBrowser) {
         this.entTabs[7].hide = true
-        this.$set(this.conditionMap, 1, this.conditionMap[1].slice(0,5))
+        this.$set(this.conditionMap, 1, this.conditionMap[1].slice(0,6))
       } else {
         this.entTabs[7].hide = !member
-        this.conditionMap[1][5].disabled = type
+        this.conditionMap[1][6].disabled = type
       }
     },
     getMoreListToStr (key) {

+ 6 - 0
src/web/staticres/common-module/ent-search/ent-search-template.prefixer.css

@@ -404,6 +404,12 @@
     padding: 0;
     padding-bottom: 0.32rem;
 }
+.v-ent-search-group .more-popup-content .dateTags  .timePicker .van-field__control {
+    color: #2abed1;
+}
+.v-ent-search-group .more-popup-content .dateTags .timePicker .van-cell.van-field {
+    border-color: #2abed1;
+}
 .v-ent-search-group .more-popup-content .dateTags .customTime {
     display: none;
 }

+ 4 - 2
src/web/staticres/frontRouter/pc/solution/js/pc-collect-solution-info.js

@@ -382,8 +382,10 @@ var vmSolution = new Vue({
             _this.form.branch = res.data.branch
             if (res.data.position) {
               if (jobJson.indexOf(res.data.position) == -1) {
-                _this.form.job = '其他'
-                _this.form.otherJob = res.data.position.replace('其他/', '')
+                // _this.form.job = '其他'
+                // _this.form.otherJob = res.data.position.replace('其他/', '')
+                _this.form.job = ''
+                _this.form.otherJob = ''
               } else {
                 _this.form.job = res.data.position
               }

+ 208 - 3
src/web/staticres/js/ent-search-index-pc.js

@@ -9,6 +9,7 @@ var vm = new Vue({
     },
     data: function () {
         return {
+            foundingTime:'',//成立时间
             provinceMap: provinceMap,
             searchContent: '',
             tabActive: 'qy',
@@ -30,6 +31,10 @@ var vm = new Vue({
                 //     label: '高管',
                 //     value: 'D'
                 // },
+                {
+                    label: '经营范围',
+                    value: 'F'
+                },
                 {
                     label: '中标项目/标的物',
                     value: 'E'
@@ -71,6 +76,28 @@ var vm = new Vue({
                     value: 'D'
                 }
             ],
+            entTimeList:[
+                {
+                    label: '近1年内',
+                    value: 'A'
+                },
+                {
+                    label: '1-3年',
+                    value: 'B'
+                },
+                {
+                    label: '3-5年',
+                    value: 'C'
+                },
+                {
+                    label: '5-10年',
+                    value: 'D'
+                },
+                {
+                    label: '10年以上',
+                    value: 'E'
+                },
+            ],
             priceList: [
                 {
                     label: '100万以内',
@@ -146,7 +173,9 @@ var vm = new Vue({
                 entCapital: [],
                 biddingArea: '', // 中标区域
                 entClass: '', // 单位类型
-                entContact: '' // 联系方式
+                entContact: '', // 联系方式
+                establish:[],//成立时间
+                
             },
             listState: {
                 loaded: false, // 是否已经搜索过
@@ -175,7 +204,15 @@ var vm = new Vue({
             powerLoaded: false,
             powerDialogShow: false,
             baiduName: '',
-            inputStatus: false
+            inputStatus: false,
+
+            buttonType:false,//成立时间自定义区间确定按钮的显示状态
+
+            focusColor:false,//改变获取焦点输入框的背景颜色
+            startDate:'',
+            endDate:'',
+            thisStartTime:'',
+            thisEndTime:'',
         }
     },
     watch: {
@@ -297,6 +334,7 @@ var vm = new Vue({
             ewmMoveHover()
             refreshEwmText(this.searchContent)
             insertVipIcon($('.search-type .el-checkbox:last-of-type'))
+            insertVipIcon($('.search-type .el-checkbox:nth-of-type(4)'))
             setTimeout(function () {
                 tabHover()
             }, 300)
@@ -320,7 +358,8 @@ var vm = new Vue({
             // } else if (tempList.join('') === t.join('')) {
             //     tempRef && tempRef.setState()
             // }
-
+            console.info(t);
+            console.info(hideTip);
 
             var eIndex = t.indexOf('E')
             if (!this.power && eIndex !== -1) {
@@ -331,6 +370,15 @@ var vm = new Vue({
                     return
                 }
             }
+            var eIndex1 = t.indexOf('F')
+            if (!this.power && eIndex1 !== -1) {
+                t.splice(eIndex1, 1)
+                this.$refs.searchType.setState(t)
+                if (!hideTip) {
+                    this.powerDialogShow = true
+                    return
+                }
+            }
             this.filterState.searchType = t
             this.doSearch()
         },
@@ -357,6 +405,160 @@ var vm = new Vue({
             this.filterState.entStatus = e
             this.doSearch()
         },
+        //计算几年前的时间戳
+        getTimeDate(year){
+            let time = Number(year);
+            let date = new Date();
+            let lastYear = Number(date.getFullYear()-time)+'-'+Number(date.getMonth()+1)+'-'+date.getDate();
+            let lastYearDate = new Date(lastYear);
+            lastYearDate = lastYearDate.getTime();//一年前时间戳;
+            return lastYearDate;
+
+        },
+
+        //成立时间多选
+        entTimeChange: function (e) {
+            let _this = this;
+            // console.info('成立时间多选',e);
+            _this.focusColor = false;
+            if (!e.length) {
+                _this.$refs.entTime.$data.selectList[0].selected = true;
+                _this.filterState.establish = [];
+            }else{
+                let thisList = [];
+                e.forEach(function (item) {
+                    // console.info(item);
+                    switch (item) {
+                        case 'A':
+                            // thisList.push(_this.getTimeDate(0)+'-'+_this.getTimeDate(1))
+                            thisList.push('-1y')
+                            break;
+                        case 'B':
+                            // thisList.push(_this.getTimeDate(1)+'-'+_this.getTimeDate(3))
+                            thisList.push('1y-3y')
+                            break;
+                        case 'C':
+                            // thisList.push(_this.getTimeDate(3)+'-'+_this.getTimeDate(5))
+                            thisList.push('3y-5y')
+                            break;
+                        case 'D':
+                            // thisList.push(_this.getTimeDate(5)+'-'+_this.getTimeDate(10))
+                            thisList.push('5y-10y')
+                            break;
+                        case 'E':
+                            // thisList.push(_this.getTimeDate(10)+'-'+_this.getTimeDate(1))
+                            thisList.push('10y-')
+                            break;
+                    
+                        default:
+                            break;
+                    }
+                    _this.filterState.establish = thisList;
+                })
+                // if (_this.foundingTime) {
+                //     // console.info(_this.foundingTime)
+                //     _this.filterState.establish.push(_this.foundingTime[0]+'-'+_this.foundingTime[1])
+                // }
+            }
+            console.info(_this.filterState.establish);
+            _this.doSearch()
+        },
+        //时间戳转换yyyy-mm-dd
+        getThisDate:function(time){
+            var date = new Date(time);
+            var YY = date.getFullYear() + '年';
+            var MM = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '月';
+            var DD = (date.getDate() < 10 ? '0' + (date.getDate()) : date.getDate()) + '日';
+
+            return YY + MM + DD
+        },
+        //成立时间区间
+        foundingTimeChange:function(e){
+            if (e) {
+                let time = e[0]+'-'+e[1];
+                console.info('成立时间',time);
+                console.info('成立时间',e);
+
+                this.startDate = this.getThisDate(e[0]);
+                this.endDate = this.getThisDate(e[1]);
+            }
+        },
+        startTimeChange:function(e){
+            if (e) {
+                console.info('startTimeChange',e);
+
+                this.startDate = this.getThisDate(e);
+            }
+        },
+        endTimeChange:function(e){
+            if (e) {
+                console.info('endTimeChange',e);
+
+                if (e < this.thisStartTime && this.thisStartTime) {
+                    // alert('结束日期不能小于开始日期,请重新选择')
+                    this.endDate = '';
+                    this.thisEndTime = '';
+                    this.$notify.error({
+                        title: '错误',
+                        message: '结束日期不能小于开始日期,请重新选择'
+                    });
+                }else{
+                    this.endDate = this.getThisDate(e);
+                }
+            }
+            
+        },
+        //成立时间自定义区间搜索按钮
+        establishSearch:function () {
+            let _this = this;
+            let thisList = [];
+            // console.info(_this.foundingTime);
+            // if (_this.foundingTime) {
+            //     thisList.push(_this.foundingTime[0]/1000+'-'+_this.foundingTime[1]/1000)
+            //     _this.$refs.entTime.$data.selectList.forEach(function (item) {
+            //         // console.info(item);
+            //         item.selected = false;
+            //     })
+            //     _this.filterState.establish = thisList;
+            // }else{
+            //     _this.$refs.entTime.$data.selectList.forEach(function (item) {
+            //         // console.info(item);
+            //         item.selected = false;
+            //     })
+            //     _this.$refs.entTime.$data.selectList[0].selected = true;
+            //     _this.filterState.establish = [];
+            // }
+            if (_this.thisStartTime && _this.thisEndTime) {
+                thisList.push(_this.thisStartTime/1000+'-'+_this.thisEndTime/1000)
+                _this.$refs.entTime.$data.selectList.forEach(function (item) {
+                    // console.info(item);
+                    item.selected = false;
+                })
+                _this.filterState.establish = thisList;
+            }else{
+                _this.$refs.entTime.$data.selectList.forEach(function (item) {
+                    // console.info(item);
+                    item.selected = false;
+                })
+                _this.$refs.entTime.$data.selectList[0].selected = true;
+                _this.filterState.establish = [];
+            }
+            _this.doSearch();
+            _this.buttonType = false;
+        },
+
+        showButton:function () {
+            let _this = this;
+            _this.buttonType = true;
+        },
+        hiddenButton:function () {
+            // let _this = this;
+            // _this.buttonType = false;
+        },
+        changeColor:function() {
+            let _this = this;
+            _this.focusColor = true;
+        },
         // 标准金额区间
         inexactPriceChange: function (p) {
             if (!p.length) {
@@ -454,6 +656,9 @@ var vm = new Vue({
                 entCapital: this.filterState.entCapital.join(','),
                 entType: this.filterState.entType.join(','),
                 entStatus: this.filterState.entStatus.join(','),
+
+                establish: this.filterState.establish.join(','),//成立时间筛选条件
+
                 biddingArea: this.filterState.biddingArea,
                 entClass: this.filterState.entClass,
                 entContact: this.filterState.entContact,

+ 13 - 4
src/web/staticres/js/superSearch.js

@@ -326,8 +326,11 @@ function appendDatas(datas,flag,isNew,onlyUpdateTable){
 		var index = (currentPage - 1) * pageSize + i + 1;
 		var title = datas[i].title;
 		var detail = datas[i].detail;
-		if(detail&&detail.length>200){
-			detail = detail.substring(0,200)+"..."
+		if(detail){
+			detail = detail.replace(/[^\{\u4e00-\u9fa5]{1,90}{[^\}\u4e00-\u9fa5]+?}/g,"")
+			if(detail.length>200){
+				detail = detail.substring(0,200)+"..."
+			}
 		}
 		if(flag){
 			title = keyWordHighlight(title,searchvalueArray,"<font class='com-highlight'>$1</font>");
@@ -849,10 +852,16 @@ function beforeSubmit(n){
         }
       }
     })
+    //采购单位类型
     $("#zbSeatchT [name='buyerclass']").val(buyerTypeArr)
     // $("#buyerInput").val(buyerTypeArr);
-
-		if($("#zbSeatchT [name='keywords']").val()==""&&$("#zbSeatchT [name='industry']").val()==""){//$("#zbSeatchT [name='area']").val()==""&&$("#zbSeatchT [name='publishtime']").val()==""&&$("#zbSeatchT [name='subtype']").val()==""&&$("#zbSeatchT [name='minprice']").val()==""&&$("#zbSeatchT [name='maxprice']").val()==""){
+	//采购单位联系方式有无
+    $("#zbSeatchT [name='buyertel']").val($(".custom-input[name='buyertel']").attr('data-value'));
+    //中标单位联系方式有无
+    $("#zbSeatchT [name='winnertel']").val($(".custom-input[name='winnertel']").attr('data-value'));
+    //排除词
+	$("#zbSeatchT [name='notkey']").val($(".not-key-input-group input").val().slice(0, 10));
+		if($("#zbSeatchT [name='keywords']").val()==""&&$("#zbSeatchT [name='industry']").val()==""){
 			getNewBids(currentPage);
 		}else{
 			if(n!="F"){

+ 8 - 5
src/web/staticres/js/wxSupersearch.js

@@ -263,12 +263,12 @@ var SuperSearch = {
         $("#supersearchPage input[name=super_searchinput]").blur();
         window.isKeyDownToEntSearch = true
         if (vEntSearchComponent) {
-          vEntSearchComponent.toggleEntShow(true)
+          // vEntSearchComponent.toggleEntShow(true)
         }
         return
       }
 
-      if ($(this).text().trim() !== '筛选' || $("#search-header-input").val().trim() === '') {
+      if ($(this).text().trim() !== '搜索' || $("#search-header-input").val().trim() === '') {
         return
       }
       if (vMainSearchComponent) {
@@ -1521,7 +1521,10 @@ var SuperSearch = {
         if(details && details.length > 0){
           detail = details[0];
           if(detail.length>100){
-            detail = detail.substring(0,100);
+            detail = detail.substring(0,100)//.replace(/[^\{\u4e00-\u9fa5]{1,90}{[^\}\u4e00-\u9fa5]+?}/g,"");
+            if (detail.indexOf("}")!=-1){
+				detail = detail.substring(detail.indexOf("}")+1)
+            }
           }
         }
       }
@@ -1538,9 +1541,9 @@ var SuperSearch = {
         if(detail != ""){
           try{
             $("#supersearchPage #tempDiv").html(detail);
-            detail = $("#supersearchPage #tempDiv").text().replace(/</g,"&lt;").replace(/>/g,"&gt;");
+            detail = $("#supersearchPage #tempDiv").text().replace(/[^\{\u4e00-\u9fa5]{1,90}{[^\}\u4e00-\u9fa5]+?}/g,"").replace(/</g,"&lt;").replace(/>/g,"&gt;");
           }catch(e){
-            detail = detail.replace(/</g,"&lt;").replace(/>/g,"&gt;");
+            detail = detail.replace(/[^\{\u4e00-\u9fa5]{1,90}{[^\}\u4e00-\u9fa5]+?}/g,"").replace(/</g,"&lt;").replace(/>/g,"&gt;");
           }
           detail = keyWordHighlight(detail,wordsArray,'<font class="keyword">$1</font>');
         }

+ 139 - 0
src/web/templates/big-member/wx/page_free_ent_project_news.html

@@ -0,0 +1,139 @@
+<!DOCTYPE html>
+<html lang="zh-CN" style="font-size: 50px;">
+<head>
+    <title>项目动态</title>
+
+    <!--引入公共资源头部-->
+    {{include "/big-member/wx/meta.html"}}
+
+    <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='{{Msg "seo" "cdn"}}/common-module/collection/css/index.css?v={{Msg "seo" "version"}}'>
+    <link rel="stylesheet" href='{{Msg "seo" "cdn"}}/common-module/big-member/css/ent_project_news.css?v={{Msg "seo" "version"}}'>
+    <!--临时处理区域选择仅有一个时展示问题-->
+    <style>
+        .select-area-box.j-container.hide-all .van-index-bar__sidebar + .key-card-box {
+            display: none;
+        }
+        .select-area-box.j-container.hide-all .van-index-bar__sidebar + .key-card-box + .key-card-box .area-card-item:after {
+            content: "";
+            position: absolute;
+            right: 0;
+            bottom: 0;
+            background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAHHSURBVHgB7ZS/TsJQFMa/tkpIVEIMCRodIMQEZYGBB8An8AWMuOqgbm46uqFPIImzCS9gqrMDYhxYNAwODiQi/iMEe72nUkJJbe/FwuQ33Z57en49t+d+wL98VEovp1WMSUm9sgGm6grGIIKpDEVaj7zDFb1yYMFII+2QYGA47I+NDJjSbwuMsd3BuO/AtF4Ot6EVwFjead9XoAnjk0jL33J8A3JYrAuLueX5AhSF+QKUgf0ZSFZF7sGAsOg7Q198y6pkYEMDl/XKDrmHG2x9MYLz7BKS00FbXIOkyD0UhiO3nO1YFHuJeUQCk6i3O7huvPf2pDp0sion2FY8aq6rb584e6zb9oU7JKvisP1seMqctNeO4QnLlx943pctx3NK+62KYMVMwiySL9/zoi0pGEn1hNEd6/oiAZq8yMyEZoKtgRCF8e5uFBeY44UmyCmHhTiUil7UX7A2N+sJIzGGE0UG5gS15AUjGYoRV2VhP8Vb2OT/sNktLgKDohSruUzN1qGsVS0EA1iNhFB6enaHATXeXc4GJKvSGI5lrUpAPRg9mEcqYlVDiR/jh2JkLJgZEnEP4fpAg390jU/jlaYapbtc5nIw5xuaNAINUmtJBQAAAABJRU5ErkJggg==);
+            width: 14px;
+            height: 14px;
+            background-size: 100% 100%;
+        }
+        .select-area-box.j-container.hide-all .van-index-bar__sidebar + .key-card-box + .key-card-box .area-card-item {
+            position: relative;
+            background: #E8FAFD;
+            color: #2ABED1;
+        }
+    </style>
+</head>
+<body>
+    <div id="ent-project-news" class="j-container search-container" v-cloak>
+        <div class="search-header">
+            <div class="header-ent-name border-line-b clickable">
+                <span class="j-icon icon-company"></span>
+                <span class="ent-title">${ entInfo.name }</span>
+                <div class="ent-follow">
+                    <span class="j-icon"
+                        :class="!!entInfo.follow ? 'icon-favorite' : 'icon-add-favorite'"
+                        @click="changeFollowState"
+                        v-if="entInfo.followSearchFinish && entInfo.entExist">
+                    </span>
+                    <van-loading v-if="!entInfo.followSearchFinish" size="24px"></van-loading>
+                </div>
+            </div>
+            <div class="search-input">
+                <van-search
+                    v-model.trim="searchInfo.content"
+                    @search="doSearch"
+                    maxlength="50"
+                    placeholder="输入关键词">
+                    <template #left-icon>
+                        <span class="j-icon base-icon icon-search"></span>
+                    </template>
+                </van-search>
+                <div class="action-text clickable" @click="doSearch">搜索</div>
+            </div>
+            <div class="search-filters">
+                <van-dropdown-menu :close-on-click-outside="false">
+                    <van-dropdown-item get-container="body" :lazy-render="false" title="搜索范围" ref="matchTypeMenu">
+                        <popup-select-component :data-list="matchTypeList" multiple show-all-button @confirm="pConfirm($event, 'matchType')" ref="matchTypeSelector"></popup-select-component>
+                    </van-dropdown-item>
+                    <van-dropdown-item get-container="body" :lazy-render="false" title="信息类型" class="collection" ref="infoTypeMenu">
+                        <notice-component class="collection" @cancel="cancel" @confirm="confirm" :selectnoticelist="searchFilters.infoType"  ref="infoTypeSelector"></notice-component>
+                    </van-dropdown-item>
+                    <van-dropdown-item get-container="body" :lazy-render="false" title="项目地区" ref="projectAreaMenu">
+                        <area-component :class="{'hide-all': filterInitData.areaArr.length == 2}" ref="projectAreaSelector" @cancel="cancel" @confirm="confirm"></area-component>
+                    </van-dropdown-item>
+                    <van-dropdown-item get-container="body" :lazy-render="false" title="发布时间" ref="publishTimeMenu">
+                        <popup-select-component ref="publishTimeSelector" button-type="button" :data-list="publishTimeList" @confirm="pConfirm($event, 'publishTime')"></popup-select-component>
+                    </van-dropdown-item>
+                </van-dropdown-menu>
+            </div>
+        </div>
+        <div class="j-main" ref="jList">
+            <div class="list-wrapper">
+                <van-list
+                    v-model="listState.loading"
+                    :finished="listState.finished"
+                    :immediate-check="false"
+                    finished-text=""
+                    @load="onLoad"
+                    class="project-info-list">
+                    <div
+                        v-for="(item, index) in listState.list"
+                        class="project-info-item bg-white border-line-b clickable"
+                        :immediate-check="false"
+                        @click="goToDetail(item)"
+                        :key="item.id">
+                        <div class="project-name">${ item.title }</div>
+                        <div class="project-info">
+                            <span class="tags">
+                                <span class="tag tag-success" v-if="item.area">${item.area}</span>
+                                <span class="tag tag-success" v-if="item.bidstatus">${item.bidstatus}</span>
+                                <span class="tag tag-success" v-if="item.bidamount">${utils.moneyUnit(item.bidamount)}</span>
+                            </span>
+                            <span class="project-time">
+                                ${item.firsttime ? new Date(item.firsttime * 1000).pattern('yyyy-MM-dd') : '-'}
+                            </span>
+                        </div>
+                    </div>
+                </van-list>
+                <div class="empty-container" v-show="listState.list.length === 0 && listState.loaded && !listState.loading">
+                    <div class="empty-content-position">
+                        <div class="image">
+                            <img src="/big-member/image/img-empty.png">
+                        </div>
+                        <div class="empty-main tip-text">暂无数据</div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <link rel="stylesheet" href='{{Msg "seo" "cdn"}}/common-module/collection/css/index.css?v={{Msg "seo" "version"}}'>
+    <link rel="stylesheet" href='{{Msg "seo" "cdn"}}/common-module/big-member/css/ent_project_news.css?v={{Msg "seo" "version"}}'>
+
+    <!--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>
+    <script>
+        var pageInfo = {
+            version: {{Msg "seo" "version"}},
+            platform: 'wx'
+        }
+    </script>
+    {{include "/big-member/wx/commonjs.html"}}
+    <script src='{{Msg "seo" "cdn"}}/common-module/collection/js/popup-select-mobile.js?v={{Msg "seo" "version"}}'></script>
+    <script src='{{Msg "seo" "cdn"}}/common-module/collection/js/notice-mobile.js?v={{Msg "seo" "version"}}'></script>
+    <script src='{{Msg "seo" "cdn"}}/common-module/collection/js/area-mobile.js?v={{Msg "seo" "version"}}'></script>
+    <script src='{{Msg "seo" "cdn"}}/common-module/big-member/js/ent_project_news.js?v={{Msg "seo" "version"}}'></script>
+</body>
+</html>

+ 2 - 2
src/web/templates/common/pcbottom.html

@@ -43,13 +43,13 @@
                         <dd><a href="/jyblog/index.html">剑鱼标讯博客</a></dd>
                         <dd><a href="/front/busicooperation.html">商务合作</a></dd>
                         <dd><a href="/front/advservices.html">广告服务</a></dd>
-                        <dd>
+<!--                        <dd>
                             <a href="javascript:;">剑鱼标讯社区</a>
                             <div class="jy_community">
                                 <img src='{{Msg "seo" "cdn"}}/images/pc/community.jpeg?v={{Msg "seo" "version"}}' alt="">
                                 <p>扫码关注</p>
                             </div>
-                        </dd>
+                        </dd>-->
                         <dd><a href="/swordfish/frontPage/partner/free/index">产品销售合作</a></dd>
                     </dl>
                 </div>

+ 4 - 4
src/web/templates/frontRouter/pc/solution/free/index.html

@@ -46,7 +46,7 @@
                     <el-tab-pane  name="first">
                         <div class="el-title" slot="label">
                             <span class="el-icon el-icon-1"></span>
-                            <span class="el-text">用户管理</span>
+                            <span class="el-text">内部监控管理</span>
                         </div>
                         <div class="solution_content">
                             行业相关信息和实际掌握信息比对,<br/> 查漏补缺,及时跟进项目进展状况。
@@ -55,7 +55,7 @@
                     <el-tab-pane  name="second">
                         <div class="el-title" slot="label">
                             <span class="el-icon el-icon-2"></span>
-                            <span class="el-text">配置管理</span>
+                            <span class="el-text">辅助市场决策</span>
                         </div>
                         <div class="solution_content">
                             可视化市场数据分析,清晰了解市场份额占比状况,<br/> 洞察市场动向,及时调整市场战略。
@@ -64,7 +64,7 @@
                     <el-tab-pane name="third">
                         <div class="el-title" slot="label">
                             <span class="el-icon el-icon-3"></span>
-                            <span class="el-text">角色管理</span>
+                            <span class="el-text">潜在商机获取</span>
                         </div>
                         <div class="solution_content">
                             结合招投标大数据,掌握招标预算,<br/> 中标企业概况等,挖掘潜在商机。
@@ -73,7 +73,7 @@
                     <el-tab-pane name="fourth">
                         <div class="el-title" slot="label">
                             <span class="el-icon el-icon-4"></span>
-                            <span class="el-text">定时任务补偿</span>
+                            <span class="el-text">完善业务汇报</span>
                         </div>
                         <div class="solution_content">
                             全量化的数据分析结果,<br/> 为业务汇报提供权威数据支撑。

+ 13 - 6
src/web/templates/frontRouter/wx/collection/sess/ent_portrait.html

@@ -245,8 +245,15 @@
                     <div class="j-img img-empty empty-img"></div>
                     <p class="empty-text">暂无项目动态</p>
                 </div>
-                <div class="bg-white tab-card cell-list" v-show="conf._13 && topProject.list.length !== 0">
-                    <div class="tab-card-title">项目动态</div>
+                <div class="bg-white tab-card cell-list project-news" v-show="conf._13 && topProject.list.length !== 0">
+                    <div class="tab-card-title">
+                        <span class="t-c-t-l">项目动态</span>
+                        <span class="t-c-t-r" v-if="isMemberAndSvip" @click="goToFilterProjectNews">
+                            <div class="link">高级搜索</div>
+                            <div class="preferential-tag">New</div>
+                        </span>
+                        <span v-else></span>
+                    </div>
                     <div class="tab-card-content">
                         <ul class="project-info-list">
                             <li
@@ -265,9 +272,9 @@
                                 </div>
                             </li>
                             <li
-                                class="show-more"
-                                v-if="topProject.showGetNextButton"
-                                @click="getProjectNews">查看更多</li>
+                                class="show-more clickable"
+                                v-if="topProject.showGetNextButton && isMemberAndSvip && topProject.count > 3"
+                                @click="goToFilterProjectNews">查看更多</li>
                         </ul>
                     </div>
                 </div>
@@ -413,7 +420,7 @@
                         </li>
                         <li
                             class="show-more"
-                            v-if="topProject.showGetNextButton"
+                            v-if="topProject.showGetNextButton && topProject.count > 3"
                             @click="getProjectNews">查看更多</li>
                     </ul>
                 </div>

+ 19 - 5
src/web/templates/frontRouter/wx/collection/sess/ent_portrait_change.html

@@ -33,19 +33,33 @@
     .bigVip_com{
         display: none;
     }
+    .j-container .empty-group {
+        position: relative;
+        padding-top: 0.3rem;
+        width: 100%;
+        height: 100%;
+        min-height: 6rem;
+        box-sizing: border-box;
+        background: #f5f4f9;
+        display: flex;
+        flex-direction: column;
+        align-items: center;
+    }
 </style>
 <body>
 <div class="j-container">
     {{include "/big-member/header.html"}}
     <div id="ent-portrait-change" class="j-main" v-cloak>
-        <div class="j-container empty" v-if="changeList.length === 0 && getStatus" key="changeList">
-            <div class="j-img img-empty empty-img"></div>
-            <p class="empty-text">暂无企业情报历史记录</p>
+        <div class="j-container" v-show="changeList.length === 0 && getStatus" key="changeList">
+            <div class="empty-group">
+                <div class="j-img img-empty empty-img"></div>
+                <p class="empty-text">暂无企业情报历史记录</p>
+            </div>
         </div>
-        <div class="vip_component bigVip_com" v-if="!getStatus" style="height:100%;background:url('/common-module/collection/image/bg/vip_bg_8.png') no-repeat;background-size:100% 100%">
+        <div class="vip_component bigVip_com" v-show="!getStatus" style="height:100%;background:url('/common-module/collection/image/bg/vip_bg_8.png') no-repeat;background-size:100% 100%">
             <vip-component type="item_8" :power="conf" :vipststus="vipststus" :entvisit="entvisit" imgurl='{{Msg "seo" "cdn"}}/common-module/collection/image/bg/vip_ex_8.png'></vip-component>
         </div>
-        <ul class="ent-change-list" v-else key="changeList">
+        <ul class="ent-change-list" v-show="!(changeList.length === 0 && getStatus)" key="changeList">
             <li class="ent-change-item" v-for="(item,index) in changeList" :key="item.changeTime">
                 <div class="header-time">${new Date(item.changeTime).pattern('yyyy.MM.dd')}</div>
                 <ul class="change-type-list bg-white" v-for="(iitem, iindex) in item.changeTerms" :key="iindex">

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

@@ -2299,7 +2299,7 @@ $(function(){
     _loop = true;
 	var infoDetail = $(".com-detail").html();
 	if(infoDetail){
-		$(".com-detail").html(infoDetail.replace(/(<\/?br\/?>)+/ig,"<br>"));
+		$(".com-detail").html(infoDetail.replace(/(<\/?br\/?>)+/ig,"<br>").replace(/[^\{\u4e00-\u9fa5]{1,90}{[^\}\u4e00-\u9fa5]+?}/g,""));
 	}
 	$(".com-wxshare,.com-guanzhu").hover(function(){
 		$(this).children(".scanqr").show();

+ 4 - 4
src/web/templates/pc/dataExport_sieve.html

@@ -838,8 +838,8 @@
                         <span class="info-select-now split">招标公告</span><span data-value="招标公告_招标">招标</span><span
                                 data-value="招标公告_邀标">邀标</span><span data-value="招标公告_询价">询价</span><span
                                 data-value="招标公告_竞谈">竞谈</span><span data-value="招标公告_单一">单一</span><span
-                                data-value="招标公告_竞价">竞价</span><span data-value="招标公告_变更">变更</span><span
-                                data-value="招标公告_其他">其他</span>
+                                data-value="招标公告_竞价">竞价</span><span data-value="招标公告_变更">变更</span><!--<span
+                                data-value="招标公告_其他">其他</span>-->
                         <span class="info-select-now split">招标结果</span><span data-value="招标结果_中标">中标</span><span
                                 data-value="招标结果_成交">成交</span><span data-value="招标结果_废标">废标</span><span
                                 data-value="招标结果_流标">流标</span>
@@ -1853,8 +1853,8 @@
 
     /* 信息 */
     var InfoData = {
-        '招标预告': ['预告', '预审', '预审结果', '论证意见', '需求公示', '其他'],
-        '招标公告': ['招标', '邀标', '询价', '竞谈', '单一', '竞价', '变更', '其他'],
+        '招标预告': ['预告', '预审', '预审结果', '论证意见', '需求公示'],
+        '招标公告': ['招标', '邀标', '询价', '竞谈', '单一', '竞价', '变更'],
         '招标结果': ['中标', '成交', '废标', '流标'],
         '招标信用信息': ['合同', '验收', '违规']
     }

+ 120 - 0
src/web/templates/pc/entsearchindex.html

@@ -57,6 +57,74 @@
                 background: #f5f6f7;
                 border-radius: 2px;
             }
+            .founding-div .selector-content{
+                flex: none;
+            }
+
+            
+            .timerInput {
+                /* margin-top: -9px; */
+                /* margin-left: 40px; */
+                /* border: 1px solid #fff; */
+                background-color: #F5F6F7;
+                padding: 5px 5px;
+                position: relative;
+            }
+            .timerInput.active{
+                background-color: #2cb7ca;
+            }
+
+            .timerInput input[type="text"] {
+                float: left;
+                width: 160px;
+                height: 28px;
+                padding: 0 15px;
+                box-sizing: border-box;
+                border: 1px solid #e0e0e0;
+                border-radius: 2px;
+            }
+
+            .timerInput span {
+                float: left;
+                width: 15px;
+                height: 2px;
+                line-height: 15px;
+                background-color: #E0E0E0;
+                padding: 0;
+                margin: 12px 6px 0;
+            }
+
+            .timerInput button {
+                float: left;
+                width: 58px;
+                height: 28px;
+                margin: 0 0 0 8px;
+                background-color: #2cb7ca;
+                color: #ffffff;
+                cursor: pointer;
+                border-radius:2px;
+            }
+            .this_opacity0{
+                position: absolute;
+                top: 0;
+                left: 0;
+                opacity: 0;
+            }
+            .focus_color{
+                background-color: #2cb7ca;
+            }
+            .this_opacity_end{
+                position: absolute;
+                right: -55px;
+                top: 5px;
+                opacity: 0;
+            }
+            .this_opacity_start{
+                position: absolute;
+                left: 5px;
+                top: 5px;
+                opacity: 0;
+            }
         </style>
 	</head>
 
@@ -194,6 +262,58 @@
                             ></select-list-component>
                         </div>
                     </div>
+                    <div class="selector-card">
+                        <div class="selector-card-header">成立时间:</div>
+                        <div class="selector-card-content founding-div">
+                            <select-list-component
+                                ref="entTime"
+                                select-button-type="checkbox"
+                                :list="entTimeList"
+                                @change="entTimeChange"
+                            ></select-list-component>
+                            <div class="timerInput fl" @click="changeColor()" :class="focusColor?'focus_color':''">
+                                <input type="text" id="starttime" readonly="true" placeholder="" :value="startDate"/>
+                                <span></span>
+                                <input type="text" name="maxtime" id="endtime" readonly="true" placeholder="" :value="endDate" />
+                            
+                                <!-- <el-date-picker
+                                    class="this_opacity0"
+                                    v-model="foundingTime"
+                                    type="daterange"
+                                    range-separator="-"
+                                    start-placeholder="开始日期"
+                                    end-placeholder="结束日期"
+                                    value-format="timestamp"
+                                    @change="foundingTimeChange"
+                                    @focus="showButton"
+                                    @blur="hiddenButton"
+                                    >
+                                </el-date-picker> -->
+                                <el-date-picker
+                                    class="this_opacity_start"
+                                    v-model="thisStartTime"
+                                    type="date"
+                                    value-format="timestamp"
+                                    @change="startTimeChange"
+                                    @focus="showButton"
+                                    @blur="hiddenButton"
+                                    placeholder="">
+                                </el-date-picker>
+                                <el-date-picker
+                                    class="this_opacity_end"
+                                    v-model="thisEndTime"
+                                    type="date"
+                                    value-format="timestamp"
+                                    @change="endTimeChange"
+                                    @focus="showButton"
+                                    @blur="hiddenButton"
+                                    placeholder="">
+                                </el-date-picker>
+                            </div>
+                            <button class="j-button-item active bgc" style="min-width: 60px; margin-left: 10px; color: #fff;
+                            background-color: #2abed1;position: relative;z-index: 99;" @click="establishSearch" v-show="buttonType">确定</button>
+                        </div>
+                    </div>
                     <div class="selector-card vip filter-zbly">
                         <div class="selector-card-header">
                             <span>招标领域筛选条件</span>

+ 31 - 7
src/web/templates/pc/orderDetail.html

@@ -348,6 +348,8 @@
                         for (var j = 0; j < appended.length; j++) {
                             keywordsHtml += "<span>" + appended[j] + "</span>";
                         }
+                    }else{
+                      keywordsHtml +="-"
                     }
                     keywordsHtml +=
                         "</p>" +
@@ -356,24 +358,42 @@
                         for (var j = 0; j < exclude.length; j++) {
                             keywordsHtml += "<span>" + exclude[j] + "</span>";
                         }
+                    }else{
+                      keywordsHtml +="-"
                     }
                     keywordsHtml += "</p>";
                     keywordsHtml += "</div>";
                 }
             } else {
+                keywordsHtml += "-";
                 marginBottom = 10;
             }
             keywordsHtml += "</div>";
-            var selectTypeHtml = "";
+            var selectTypeHtml = "<span>";
             if (selectType) {
-                if (selectType == "title") {
-                    selectTypeHtml += "<span>按标题匹配</span>";
-                } else if (selectType == "all") {
-                    selectTypeHtml += "<span>按全文匹配</span>";
+                selectTypeHtml += "按"
+                var selectTypeArr = selectType.split(",");
+                var snArray = [];
+                for (var i=0;i<selectTypeArr.length;i++){
+                  if (selectTypeArr[i] == "title") {
+                      snArray.push("标题");
+                  } else if (selectTypeArr[i] == "detail") {
+                      snArray.push("正文");
+                  } else if (selectTypeArr[i] == "mwinner") {
+                      snArray.push("中标企业");
+                  } else if (selectTypeArr[i] == "mbuyer") {
+                      snArray.push("采购单位");
+                  } else if (selectTypeArr[i] == "magency") {
+                      snArray.push("招标代理机构");
+                  } else if (selectTypeArr[i] == "filetext") {
+                      snArray.push("附件");
+                  } else if (selectTypeArr[i].indexOf("purchasing")!=-1) {
+                      snArray.push("项目名称/标的物");
+                  } 
                 }
-            } else {
-                selectTypeHtml += "<span></span>";
+                 selectTypeHtml += snArray.join("、")+"匹配";
             }
+            selectTypeHtml += "</span>"
             var priceHtml = "";
             if (price) {
                 priceHtml += "<span>" + price + "</span>";
@@ -398,12 +418,16 @@
                 for (var i = 0; i < buyer.length; i++) {
                     buyerHtml += "<span>" + buyer[i] + "</span>";
                 }
+            }else{
+              buyerHtml = "-"
             }
             var winnerHtml = "";
             if (winner && winner.length > 0) {
                 for (var i = 0; i < winner.length; i++) {
                     winnerHtml += "<span>" + winner[i] + "</span>";
                 }
+            }else{
+              winnerHtml = "-"
             }
             var filterHtml =
                 "<div class=\"inner\">" +

+ 6 - 3
src/web/templates/pc/supsearch.html

@@ -981,6 +981,7 @@ var IframeOnClick = {
           <input type="hidden" name="buyertel" value="{{.T.buyertel}}">
           <input type="hidden" name="winnertel" value="{{.T.winnertel}}">
           <input type="hidden" name="selectType" value="{{.T.selectType}}">
+          <input type="hidden" name="notkey" value="{{.T.notkey}}">
 				</form>
 				<!--筛选-->
 				<div id="screenBtn" class="screen down">
@@ -1064,6 +1065,10 @@ var IframeOnClick = {
           <span class="search-list">
             <span data-name="file" class="search-list-checkbox">附件</span>
             <img class="icon-vip" src="/images/biddingSearch/VIP.png" alt="">
+          </span>
+          <span class="search-list">
+            <span data-name="ppa" class="search-list-checkbox">项目名称/标的物</span>
+            <img class="icon-vip" src="/images/biddingSearch/VIP.png" alt="">
           </span>
 				</div>
 			</div>
@@ -1206,7 +1211,7 @@ var IframeOnClick = {
 					<font data-value="单一">单一</font>
 					<font data-value="竞价">竞价</font>
 					<font data-value="变更">变更</font>
-					<font data-value="其他">其他</font>
+<!--					<font data-value="其他">其他</font>-->
 					<i class="diver"></i>
 					<font class="parent-node">招标结果</font>
 					<font data-value="中标">中标</font>
@@ -1701,8 +1706,6 @@ $(function(){
       var text = $(this).text()
       $(this).parent().siblings().children('.custom-input').val(text).attr('data-value', val)
       beforeSubmit();
-      $("#zbSeatchT [name='buyertel']").val($(".custom-input[name='buyertel']").attr('data-value'));
-      $("#zbSeatchT [name='winnertel']").val($(".custom-input[name='winnertel']").attr('data-value'));
     })
   })
   // 点击其他区域 隐藏其他筛选条件下拉框

+ 1 - 1
src/web/templates/weixin/dataExport/dataExport_subType.html

@@ -128,7 +128,7 @@
                             <dd>单一</dd>
                             <dd>竞价</dd>
                             <dd>变更</dd>
-                            <dd>其他</dd>
+<!--                            <dd>其他</dd>-->
                         </dl>
                     </li>
                     <li>

+ 22 - 7
src/web/templates/weixin/dataExport/dataExport_toOrderDetail.html

@@ -240,16 +240,31 @@
                 }
                 $(".money").append(priceHtml);
 
-                var selectTypeHtml = "";
+                var selectTypeHtml = "<span>";
                 if (selectType) {
-                    if (selectType == "title") {
-                        selectTypeHtml += "<span>按标题匹配</span>";
-                    } else if (selectType == "all") {
-                        selectTypeHtml += "<span>按全文匹配</span>";
+                    selectTypeHtml += "按"
+                    var selectTypeArr = selectType.split(",");
+                    var snArray = [];
+                    for (var i=0;i<selectTypeArr.length;i++){
+                      if (selectTypeArr[i] == "title") {
+                          snArray.push("标题");
+                      } else if (selectTypeArr[i] == "detail") {
+                          snArray.push("正文");
+                      } else if (selectTypeArr[i] == "mwinner") {
+                          snArray.push("中标企业");
+                      } else if (selectTypeArr[i] == "mbuyer") {
+                          snArray.push("采购单位");
+                      } else if (selectTypeArr[i] == "magency") {
+                          snArray.push("招标代理机构");
+                      } else if (selectTypeArr[i] == "filetext") {
+                          snArray.push("附件");
+                      } else if (selectTypeArr[i].indexOf("purchasing")!=-1) {
+                          snArray.push("项目名称/标的物");
+                      } 
                     }
-                } else {
-                    selectTypeHtml += "<span></span>";
+                     selectTypeHtml += snArray.join("、")+"匹配";
                 }
+                selectTypeHtml += "</span>"
                 $(".selectType").append(selectTypeHtml);
 
                 var subTypeHtml = "";

+ 8 - 2
src/web/templates/weixin/search/tabSearch.html

@@ -597,6 +597,9 @@
         color: #2ABED1;
     }
 
+    #diyDateComponent .area-card-item {
+        width: auto;
+    }
 </style>
 
 <!--S-Loading-->
@@ -693,7 +696,7 @@
                                     <area-component ref="areaComponent" @select="updateScrollTop" v-show="activeTabIndex === 2"></area-component>
                                     <money-component :radio="false" :all="true" :tags="moneyTags" ref="moneyComponent"  v-show="activeTabIndex === 3"></money-component>
                                     <div class="more-popup-content" v-show="isMoreContent">
-                                        <div class="select-more-tag-group" @click="onSelectMoreGroup(item)"  v-for="(item,i) in moreContentList" :class="{'row-group': !conditionMap[item]}">
+                                        <div class="select-more-tag-group" @click="onSelectMoreGroup(item)"  v-for="(item,i) in moreContentList" :class="{'row-group': entTabs[item].title == '中标区域'}">
                                             <div class="select-tag-title">
                                                 @@entTabs[item].title@@
                                                 <div class="disabled-tag"  v-if="entTabs[item].disabled === true">开通</div>
@@ -701,10 +704,13 @@
                                             <div class="select-tag-content" v-if="conditionMap[item]">
                                                 <div class="select-more-tag-item" @click.stop="onSelectMoreItem(item, tags, ii)" v-for="(tags,ii) in conditionMap[item]" :class="{active: tags.checked}">@@tags.title@@</div>
                                             </div>
-                                            <div class="select-area-content" v-else>
+                                            <div class="select-area-content" v-else-if="entTabs[item].title == '中标区域'">
                                                 已选:@@conditionStrMap.biddingArea || '全国'@@
                                                 <van-icon name="arrow"></van-icon>
                                             </div>
+                                            <div id="diyDateComponent" class="select-tag-content collection" v-else-if="entTabs[item].title == '成立时间'">
+                                                <date-component :diy="true" :times="times"  :selectdate="selectDate" :key="'dateForEnt' + dateComponentKey" ref="dateComponentForEnt"></date-component>
+                                            </div>
                                         </div>
                                     </div>
                                 </div>

+ 4 - 1
src/web/templates/weixin/vipsubscribe/messageType.html

@@ -75,7 +75,7 @@
                     <dd>单一</dd>
                     <dd>竞价</dd>
                     <dd>变更</dd>
-                    <dd>其它</dd>
+<!--                    <dd style="display:none;">其它</dd>-->
                 </dl>
             </li>
             <li>
@@ -174,6 +174,9 @@
         for (var i = infoTypeData.length - 1; i >= 0; i--) {
             $(".list ul li dl dd").each(function (index) {
                 if ($(this).text() == infoTypeData[i]) {
+                    if(infoTypeData[i]=="其它"){
+                       $(this).show();
+                    }
                     $(this).addClass("active");
                     isDtSelected(this);
                     isAllSelected();