Selaa lähdekoodia

Merge branch 'dev4.5' of http://192.168.3.207:8080/qmx/jy into dev4.5

wangshan 4 vuotta sitten
vanhempi
commit
d33ed75806
62 muutettua tiedostoa jossa 3925 lisäystä ja 434 poistoa
  1. 15 14
      src/jfw/front/dataExport.go
  2. 7 7
      src/jfw/front/pcIndex.go
  3. 8 10
      src/jfw/front/search.go
  4. 1 46
      src/jfw/front/supsearch.go
  5. 13 12
      src/jfw/front/ws_dataExport.go
  6. 1 46
      src/jfw/modules/app/src/app/front/front.go
  7. 3 1
      src/jfw/modules/app/src/app/front/search.go
  8. 14 13
      src/jfw/modules/app/src/app/front/ws_dataExport.go
  9. 399 0
      src/jfw/modules/app/src/web/staticres/jyapp/css/index.css
  10. 25 6
      src/jfw/modules/app/src/web/staticres/jyapp/css/subscribe.css
  11. 37 0
      src/jfw/modules/app/src/web/staticres/jyapp/js/historypush.js
  12. 10 1
      src/jfw/modules/app/src/web/staticres/jyapp/js/track/track.js
  13. 0 0
      src/jfw/modules/app/src/web/staticres/jyapp/js/track/track.umd.min.js
  14. 142 0
      src/jfw/modules/app/src/web/templates/frontRouter/collection/sess/index.html
  15. 57 26
      src/jfw/modules/app/src/web/templates/weixin/historypush.html
  16. 122 139
      src/jfw/modules/common/src/qfw/util/dataexport/dataexport.go
  17. 44 0
      src/jfw/modules/common/src/qfw/util/jy/jy.go
  18. 12 5
      src/jfw/modules/common/src/qfw/util/jy/pushmapping.go
  19. 1 1
      src/jfw/modules/publicapply/src/bidcollection.json
  20. 127 32
      src/jfw/modules/publicapply/src/bidcollection/entity/entity.go
  21. 0 1
      src/jfw/modules/publicapply/src/bidcollection/service/service.go
  22. 2 1
      src/jfw/modules/publicapply/src/config.json
  23. 1 0
      src/jfw/modules/publicapply/src/config/config.go
  24. 10 0
      src/jfw/modules/publicapply/src/db.json
  25. 28 12
      src/jfw/modules/publicapply/src/db/db.go
  26. 154 0
      src/jfw/modules/publicapply/src/enterpriseSearch/entity/entQuery.go
  27. 11 0
      src/jfw/modules/publicapply/src/enterpriseSearch/init.go
  28. 60 0
      src/jfw/modules/publicapply/src/enterpriseSearch/service/search.go
  29. 6 0
      src/jfw/modules/publicapply/src/filter/sessionfilter.go
  30. 11 0
      src/jfw/modules/publicapply/src/free/init.go
  31. 10 0
      src/jfw/modules/publicapply/src/free/service/action.go
  32. 30 0
      src/jfw/modules/publicapply/src/free/service/service.go
  33. 2 0
      src/jfw/modules/publicapply/src/main.go
  34. 3 1
      src/jfw/modules/subscribepay/src/service/dataExportPay.go
  35. 1 1
      src/jfw/public/entdataexport.go
  36. 399 0
      src/web/staticres/collection/css/index.css
  37. BIN
      src/web/staticres/collection/image/shoucang.png
  38. BIN
      src/web/staticres/collection/image/weishoucang.png
  39. BIN
      src/web/staticres/collection/image/wxqc.png
  40. 237 0
      src/web/staticres/collection/js/area-mobile.js
  41. 80 0
      src/web/staticres/collection/js/cate-mobile.js
  42. 209 0
      src/web/staticres/collection/js/date-mobile.js
  43. 146 0
      src/web/staticres/collection/js/index.js
  44. 361 0
      src/web/staticres/collection/js/industry-mobile.js
  45. 80 0
      src/web/staticres/collection/js/keyword-mobile.js
  46. 26 0
      src/web/staticres/collection/js/notice-mobile.js
  47. 23 16
      src/web/staticres/css/dev2/biddingSearch.css
  48. 435 0
      src/web/staticres/css/dev2/newBidSearch.css
  49. BIN
      src/web/staticres/images/biddingSearch/VIP.png
  50. BIN
      src/web/staticres/images/biddingSearch/icon-checked.png
  51. BIN
      src/web/staticres/images/biddingSearch/trapezoid.png
  52. BIN
      src/web/staticres/images/collect.png
  53. BIN
      src/web/staticres/images/collected.png
  54. BIN
      src/web/staticres/images/focus.png
  55. BIN
      src/web/staticres/images/focused.png
  56. BIN
      src/web/staticres/images/new-weixin.png
  57. 9 4
      src/web/staticres/js/biddingSearch.js
  58. 17 8
      src/web/staticres/js/superSearch.js
  59. 10 1
      src/web/staticres/js/track/track.js
  60. 0 0
      src/web/staticres/js/track/track.umd.min.js
  61. 32 10
      src/web/templates/pc/biddetail_rec.html
  62. 494 20
      src/web/templates/pc/supsearch.html

+ 15 - 14
src/jfw/front/dataExport.go

@@ -10,6 +10,7 @@ import (
 	"os"
 	"qfw/util"
 	"qfw/util/dataexport"
+	"qfw/util/jy"
 	"qfw/util/redis"
 	"regexp"
 	"strconv"
@@ -79,7 +80,7 @@ var (
 )
 
 func (d *DataExport) ToSieve() error {
-	industrylist, sortArray = getindustrys()
+	industrylist, sortArray = jy.Getindustrys(util.ObjToString(config.Sysconfig["industry"]), public.MQFW)
 	d.T["industrylist"] = industrylist
 	d.T["sortArray"] = sortArray
 	d.T["logid"] = config.Seoconfig["dataexport"].(string)
@@ -336,17 +337,18 @@ func (d *DataExport) SuperSearchExport() error {
 	}
 	//接收超级搜索页面参数
 	reqData := public.BidSearchExport{
-		Keywords:     d.GetString("keywords"),                    //搜索词
-		Publishtime:  d.GetString("publishtime"),                 //发布时间
-		Area:         d.GetString("area"),                        //地区
-		Subtype:      d.GetString("subtype"),                     //信息类型
-		Minprice:     d.GetString("minprice"),                    //最低价格
-		Maxprice:     d.GetString("maxprice"),                    //最高价格
-		Industry:     strings.TrimSpace(d.GetString("industry")), //选中的行业
-		SelectType:   d.GetString("selectType"),                  //标题 or 全文
-		Buyerclass:   d.GetString("buyerclass"),                  //采购单位行业
-		Hasbuyertel:  d.GetString("buyertel"),                    //是否有采购电话
-		Haswinnertel: d.GetString("winnertel"),                   //是否有中标电话
+		Keywords:     d.GetString("keywords"),                     //搜索词
+		Publishtime:  d.GetString("publishtime"),                  //发布时间
+		Area:         d.GetString("area"),                         //地区
+		Subtype:      d.GetString("subtype"),                      //信息类型
+		Minprice:     d.GetString("minprice"),                     //最低价格
+		Maxprice:     d.GetString("maxprice"),                     //最高价格
+		Industry:     strings.TrimSpace(d.GetString("industry")),  //选中的行业
+		SelectType:   d.GetString("selectType"),                   //标题 or 全文
+		Buyerclass:   d.GetString("buyerclass"),                   //采购单位行业
+		Hasbuyertel:  d.GetString("buyertel"),                     //是否有采购电话
+		Haswinnertel: d.GetString("winnertel"),                    //是否有中标电话
+		SelectIds:    strings.TrimSpace(d.GetString("selectIds")), //选择信息id
 	}
 
 	//数据回显
@@ -366,7 +368,6 @@ func (d *DataExport) SuperSearchExport() error {
 	saveData := reqData.PassBidSearchExport()
 	saveData["s_openid"] = openid
 	saveData["s_userid"] = userId
-
 	//存入数据库
 	_id := mongodb.Save(dataexport.ExportTable, saveData)
 	return d.Redirect("/front/dataExport/toCreateOrderPage/" + util.SE.Encode2Hex(_id))
@@ -510,7 +511,7 @@ func (d *DataExport) PreviewData(source, _id string) error {
 	//从500条数据中筛选字段最全五条
 	scd := dataexport.GetSqlObjFromId(public.MQFW, _id)
 	kws := scd.Keyword
-	res, err := dataexport.GetDataExportSearchResult(public.Mgo_Ent, public.DbConf.Elasticsearch.Main.Address, scd, dataType, -1, util.ObjToString(config.Seoconfig["webdomain"]))
+	res, err := dataexport.GetDataExportSearchResult(public.DbConf.Elasticsearch.Main.Address, scd, dataType, -1)
 	if res == nil || err != nil {
 		log.Println("PreviewData查询出错", res)
 		return d.Render("/pc/dataExport_noDataErr.html", &d.T)

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

@@ -1,22 +1,22 @@
 package front
 
 import (
+	"encoding/json"
 	"fmt"
 	"jfw/config"
-	"log"
-	"qfw/util/bidsearch"
-	"strconv"
-	"strings"
-
-	"encoding/json"
 	"jfw/jylabutil"
 	"jfw/public"
 	"jfw/wx"
+	"log"
 	"math/rand"
 	"qfw/util"
+	"qfw/util/bidsearch"
 	"qfw/util/elastic"
+	"qfw/util/jy"
 	"qfw/util/redis"
 	"regexp"
+	"strconv"
+	"strings"
 	"time"
 
 	"github.com/go-xweb/xweb"
@@ -290,7 +290,7 @@ func (f *PcIndex) SearchResult(at, name string) error {
 	if len(industrylist) > 0 {
 		f.T["industrylist"], f.T["sortArray"] = industrylist, sortArray
 	} else {
-		f.T["industrylist"], f.T["sortArray"] = getindustrys()
+		f.T["industrylist"], f.T["sortArray"] = jy.Getindustrys(util.ObjToString(config.Sysconfig["industry"]), public.MQFW)
 	}
 	var shareid = f.GetString("id")
 	if len(shareid) == 0 {

+ 8 - 10
src/jfw/front/search.go

@@ -2,21 +2,19 @@ package front
 
 import (
 	"fmt"
+	"jfw/config"
 	"jfw/jyutil"
-	"net/url"
-	"qfw/util/bidsearch"
-	"time"
-
-	"github.com/go-xweb/log"
-
-	//	"fmt"
+	"jfw/public"
 	"jfw/wx"
-	//	"log"
-	"jfw/config"
+	"net/url"
 	"qfw/util"
+	"qfw/util/bidsearch"
+	"qfw/util/jy"
 	"qfw/util/redis"
 	"strings"
+	"time"
 
+	"github.com/go-xweb/log"
 	"github.com/go-xweb/xweb"
 )
 
@@ -98,7 +96,7 @@ func (s *Search) MainSearch() error {
 		s.T["industry"] = industrylist
 		s.T["sortArray"] = sortArray
 	} else {
-		industry, sortA := getindustrys()
+		industry, sortA := jy.Getindustrys(util.ObjToString(config.Sysconfig["industry"]), public.MQFW)
 		s.T["industry"] = industry
 		s.T["sortArray"] = sortA
 	}

+ 1 - 46
src/jfw/front/supsearch.go

@@ -34,15 +34,13 @@ type Pcsearch struct {
 //
 var industrylist map[string][]string
 var sortArray []string
-var industryname string
 var PCS_index map[string]interface{}
 var PCS_time int
 
 //
 func init() {
 	xweb.AddAction(&Pcsearch{})
-	industryname = util.ObjToString(config.Sysconfig["industry"])
-	industrylist, sortArray = getindustrys()
+	industrylist, sortArray = jy.Getindustrys(util.ObjToString(config.Sysconfig["industry"]), mongodb)
 	//清除搜索列表内存缓存 间隔时间
 	PCS_time = util.IntAll(config.Sysconfig["PCS_time"])
 	go func() {
@@ -404,49 +402,6 @@ func (p *Pcsearch) PcSearchIndex() error {
 	return p.Render("/pc/supsearch.html", &p.T)
 }
 
-//
-func getindustrys() (industry map[string][]string, sortArray []string) {
-	industry = map[string][]string{}
-	sortArray = []string{}
-	classdata, ok1 := mongodb.FindOneByField("rc_task", `{"s_name":"`+industryname+`"}`, `{"s_class":1}`)
-	if ok1 && len(*classdata) > 0 {
-		classid := ""
-		if util.ObjToString((*classdata)["s_class"]) != "" {
-			classids := strings.Split(util.ObjToString((*classdata)["s_class"]), ",")
-			for k, v := range classids {
-				if k > 0 {
-					classid += `,`
-				}
-				classid += `"` + v + `"`
-			}
-		}
-		industryData, ok := mongodb.Find("rc_rule", `{"s_pid":{"$ne":""},"s_classid":{"$in":[`+classid+`]}}`, `{"i_order":1}`, `{"_id":1,"s_name":1}`, false, -1, -1)
-		if ok && industryData != nil && len(*industryData) > 0 {
-			for _, v := range *industryData {
-				fatFlag := 0
-				industryname, _ := v["s_name"].(string)
-				if strings.Contains(industryname, "_") {
-					fat := strings.Split(industryname, "_")[0]
-					child := strings.Split(industryname, "_")[1]
-					if len(industry[fat]) == 0 {
-						sortArray = append(sortArray, fat)
-					}
-					for _, fv := range industry[fat] {
-						if fv == strings.Trim(child, " ") {
-							fatFlag = 1
-							break
-						}
-					}
-					if fatFlag != 1 {
-						industry[fat] = append(industry[fat], child)
-					}
-				}
-			}
-		}
-	}
-	return industry, sortArray
-}
-
 //
 func Newbids(p string) []interface{} {
 	pages, _ := redis.Get("other", "index_list"+p).([]interface{})

+ 13 - 12
src/jfw/front/ws_dataExport.go

@@ -202,7 +202,7 @@ func (w *WsDataExport) GetPreview() error {
 	//从500条数据中筛选字段最全五条
 	scd := dataexport.GetSqlObjFromId(public.MQFW, _id)
 	kws := scd.Keyword
-	res, err := dataexport.GetDataExportSearchResult(public.Mgo_Ent, public.DbConf.Elasticsearch.Main.Address, scd, dataType, -1, util.ObjToString(config.Seoconfig["webdomain"]))
+	res, err := dataexport.GetDataExportSearchResult(public.DbConf.Elasticsearch.Main.Address, scd, dataType, -1)
 	if res == nil || err != nil {
 		log.Println("PreviewData查询出错")
 		return w.Render("/pc/dataExport_noDataErr.html", &w.T)
@@ -374,17 +374,18 @@ func (wd *WsDataExport) SearchExport() error {
 	}
 	//接收超级搜索页面参数
 	reqData := public.BidSearchExport{
-		Keywords:     wd.GetString("keywords"),                    //搜索词
-		Publishtime:  wd.GetString("publishtime"),                 //发布时间
-		Area:         wd.GetString("area"),                        //地区
-		Subtype:      wd.GetString("subtype"),                     //信息类型
-		Minprice:     wd.GetString("minprice"),                    //最低价格
-		Maxprice:     wd.GetString("maxprice"),                    //最高价格
-		Industry:     strings.TrimSpace(wd.GetString("industry")), //选中的行业
-		SelectType:   wd.GetString("selectType"),                  //标题 or 全文
-		Buyerclass:   wd.GetString("buyerclass"),                  //采购单位行业
-		Hasbuyertel:  wd.GetString("buyertel"),                    //是否有采购电话
-		Haswinnertel: wd.GetString("winnertel"),                   //是否有中标电话
+		Keywords:     wd.GetString("searchvalue"),                  //搜索词
+		Publishtime:  wd.GetString("publishtime"),                  //发布时间
+		Area:         wd.GetString("scope"),                        //地区
+		Subtype:      wd.GetString("subtype"),                      //信息类型
+		Minprice:     wd.GetString("minprice"),                     //最低价格
+		Maxprice:     wd.GetString("maxprice"),                     //最高价格
+		Industry:     strings.TrimSpace(wd.GetString("industry")),  //选中的行业
+		SelectType:   wd.GetString("selectType"),                   //标题 or 全文
+		Buyerclass:   wd.GetString("buyerclass"),                   //采购单位行业
+		Hasbuyertel:  wd.GetString("buyertel"),                     //是否有采购电话
+		Haswinnertel: wd.GetString("winnertel"),                    //是否有中标电话
+		SelectIds:    strings.TrimSpace(wd.GetString("selectIds")), //选择信息id
 	}
 
 	saveData := reqData.PassBidSearchExport()

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

@@ -83,15 +83,13 @@ var mongodb = public.MQFW
 var se = util.SE //移到tools中
 var industrylist map[string][]string
 var sortArray []string
-var industryname string
 var mLock *sync.Mutex
 
 func init() {
 	mLock = new(sync.Mutex)
 	sewx = util.SimpleEncrypt{Key: "topnet"}
 	xweb.AddAction(&Front{})
-	industryname = util.ObjToString(config.Sysconfig["industry"])
-	industrylist, sortArray = getindustrys()
+	industrylist, sortArray = jy.Getindustrys(util.ObjToString(config.Sysconfig["industry"]), mongodb)
 }
 
 func (f *Front) PushMsgCallback() {
@@ -228,49 +226,6 @@ func mesCaLog(mid, url, userId, recType string) {
 	}
 }
 
-//
-func getindustrys() (industry map[string][]string, sortArray []string) {
-	industry = map[string][]string{}
-	sortArray = []string{}
-	classdata, ok1 := mongodb.FindOneByField("rc_task", `{"s_name":"`+industryname+`"}`, `{"s_class":1}`)
-	if ok1 && len(*classdata) > 0 {
-		classid := ""
-		if util.ObjToString((*classdata)["s_class"]) != "" {
-			classids := strings.Split(util.ObjToString((*classdata)["s_class"]), ",")
-			for k, v := range classids {
-				if k > 0 {
-					classid += `,`
-				}
-				classid += `"` + v + `"`
-			}
-		}
-		industryData, ok := mongodb.Find("rc_rule", `{"s_pid":{"$ne":""},"s_classid":{"$in":[`+classid+`]}}`, `{"i_order":1}`, `{"_id":1,"s_name":1}`, false, -1, -1)
-		if ok && industryData != nil && len(*industryData) > 0 {
-			for _, v := range *industryData {
-				fatFlag := 0
-				industryname, _ := v["s_name"].(string)
-				if strings.Contains(industryname, "_") {
-					fat := strings.Split(industryname, "_")[0]
-					child := strings.Split(industryname, "_")[1]
-					if len(industry[fat]) == 0 {
-						sortArray = append(sortArray, fat)
-					}
-					for _, fv := range industry[fat] {
-						if fv == strings.Trim(child, " ") {
-							fatFlag = 1
-							break
-						}
-					}
-					if fatFlag != 1 {
-						industry[fat] = append(industry[fat], child)
-					}
-				}
-			}
-		}
-	}
-	return industry, sortArray
-}
-
 func (m *Front) Wxerr() error {
 	return m.Render("/_err.html")
 }

+ 3 - 1
src/jfw/modules/app/src/app/front/search.go

@@ -6,8 +6,10 @@ import (
 	. "app/jyutil"
 	"app/tag"
 	. "jfw/config"
+	"jfw/public"
 	"qfw/util"
 	"qfw/util/bidsearch"
+	"qfw/util/jy"
 	"qfw/util/redis"
 	"strings"
 	"time"
@@ -33,7 +35,7 @@ func (s *Search) MainSearch() error {
 		s.T["industry"] = industrylist
 		s.T["sortArray"] = sortArray
 	} else {
-		industry, sortA := getindustrys()
+		industry, sortA := jy.Getindustrys(util.ObjToString(Sysconfig["industry"]), public.MQFW)
 		s.T["industry"] = industry
 		s.T["sortArray"] = sortA
 	}

+ 14 - 13
src/jfw/modules/app/src/app/front/ws_dataExport.go

@@ -65,7 +65,7 @@ func (w *WsDataExport) GetPreview() error {
 	//从500条数据中筛选字段最全五条
 	scd := dataexport.GetSqlObjFromId(public.MQFW, _id)
 	kws := scd.Keyword
-	res, err := dataexport.GetDataExportSearchResult(public.Mgo_Ent, public.DbConf.Elasticsearch.Main.Address, scd, dataType, -1, util.ObjToString(config.Seoconfig["webdomain"]))
+	res, err := dataexport.GetDataExportSearchResult(public.DbConf.Elasticsearch.Main.Address, scd, dataType, -1)
 	if res == nil || err != nil {
 		log.Println("PreviewData查询出错")
 		return w.Render("/pc/dataExport_noDataErr.html", &w.T)
@@ -340,18 +340,19 @@ func (wd *WsDataExport) SearchExport() error {
 	}
 	//接收超级搜索页面参数
 	reqData := public.BidSearchExport{
-		Keywords:     wd.GetString("keywords"),                    //搜索词
-		Publishtime:  wd.GetString("publishtime"),                 //发布时间
-		Area:         wd.GetString("area"),                        //地区
-		Subtype:      wd.GetString("subtype"),                     //信息类型
-		Minprice:     wd.GetString("minprice"),                    //最低价格
-		Maxprice:     wd.GetString("maxprice"),                    //最高价格
-		Industry:     strings.TrimSpace(wd.GetString("industry")), //选中的行业
-		SelectType:   wd.GetString("selectType"),                  //标题 or 全文
-		Buyerclass:   wd.GetString("buyerclass"),                  //采购单位行业
-		Winner:       wd.GetString("winner"),                      //中标单位
-		Hasbuyertel:  wd.GetString("buyertel"),                    //是否有采购电话
-		Haswinnertel: wd.GetString("winnertel"),                   //是否有中标电话
+		Keywords:     wd.GetString("searchvalue"),                  //搜索词
+		Publishtime:  wd.GetString("publishtime"),                  //发布时间
+		Area:         wd.GetString("scope"),                        //地区
+		Subtype:      wd.GetString("subtype"),                      //信息类型
+		Minprice:     wd.GetString("minprice"),                     //最低价格
+		Maxprice:     wd.GetString("maxprice"),                     //最高价格
+		Industry:     strings.TrimSpace(wd.GetString("industry")),  //选中的行业
+		SelectType:   wd.GetString("selectType"),                   //标题 or 全文
+		Buyerclass:   wd.GetString("buyerclass"),                   //采购单位行业
+		Winner:       wd.GetString("winner"),                       //中标单位
+		Hasbuyertel:  wd.GetString("buyertel"),                     //是否有采购电话
+		Haswinnertel: wd.GetString("winnertel"),                    //是否有中标电话
+		SelectIds:    strings.TrimSpace(wd.GetString("selectIds")), //选择信息id
 	}
 
 	saveData := reqData.PassBidSearchExport()

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

@@ -0,0 +1,399 @@
+.collection{
+  width: 100%;
+}
+
+/* 时间选择弹窗s */
+.headertitle{
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  padding: .44rem .32rem .24rem;
+  width: 100%;
+  font-size: .4rem;
+  font-weight: 500;
+  color: #171826;
+}
+.headertitle .title_close{
+  display: flex;
+  width: .4rem;
+  height: .4rem;
+  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAMAAAAM7l6QAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAgVBMVEUAAAChoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaEAAADUxRFJAAAAKXRSTlMABUuRxuj4EH7q6VXnA5Srk1b+wcP8f2UBm6BgxL+SxfkGgFhX60zH+uqurTcAAAABYktHRACIBR1IAAAACXBIWXMAAAsSAAALEgHS3X78AAAA00lEQVQoz4WT1xaCMAxAwyh7uVAQAVFG/v8HLSAjiO19aU7vOZBmAEwoqqYzw2C6piqwxbRsnHEsk1rXQ4LnrqQf4A+BP9sQdwgnH+Eu0fe/+IfDkPOY1fG03J8vw8H6/OPRXm/JZFP/PvqYV2N8b+bD5FMePobIVkDF5TIhAUeFHKlfW8whQ+KJxQJWpe4VsWhDicQTi6VMSz5eiFMTPiySlUVY1KewJVXfUCZsqGQcZMMkG0XJIHNejEr23ixRVS+yrjZL1K9gk7dO1zlt3iwr+AHFoWJRdvcdHQAAAABJRU5ErkJggg==) no-repeat;
+  background-size: contain;
+}
+.datepopup .van-picker-column__item.van-picker-column__item--selected{
+  font-size: .36rem;
+  color: #2ABED1;
+}
+.datepopup .van-picker-column__item{
+  float: none!important;
+}
+/* end */
+.collection .search-container{
+  position: relative;
+}
+.collection .van-dropdown-menu__bar.van-dropdown-menu__bar--opened{
+  width: auto;
+  overflow: auto;
+  height: .88rem;
+  box-shadow: none;
+  border-bottom: 1.5px solid rgba(0,0,0,0.05);
+  z-index: 10;
+}
+.collection .van-dropdown-menu__item{
+  flex: none;
+  padding: .24rem .38rem;
+}
+.collection .my-search.van-search.van-search--show-action{
+  border-bottom:1.5px solid rgba(0,0,0,0.05);
+}
+.collection .van-search__content{
+  border-radius: .18rem;
+  height: .8rem;
+}
+
+.collection .van-search .van-cell{
+  padding: 10px 12px;
+}
+
+.collection .van-dropdown-menu__title.van-dropdown-menu__title--active.van-dropdown-menu__title--down{
+  color: #2ABED1;
+  font-size: .28rem;
+}
+.collection .van-icon.van-icon-search{
+  width: .4rem;
+  height: .4rem;
+}
+.collection .van-list{
+  padding: 0 .32rem;
+  background: #ffffff;
+}
+.collection .listaction{
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  padding: 0 .32rem;
+  width: 100%;
+  height: .88rem;
+  background: #ffffff;
+  font-size: .28rem;
+  font-weight: 500;
+  color: #2abed1;
+  line-height: .4rem;
+}
+.collection .data_report .collec_datareport{
+  display: flex;
+}
+.collection .data_download{
+  display: flex;
+  margin-right: .08rem;
+  width: .32rem;
+  height: .32rem;
+  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAeCAYAAABNChwpAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAJkSURBVFhH7ZbLaxNRFMb9e5RWtCKoCzelO0FEpAg+Fy7adalvBAVd6E78H0QXgtWKYhu1BJtEm7RJ20zS1Ngkk1jzaB6TmWQmX88ZJ8poksmMjW7ywV3ce7nz/eaec8+9u/Cf1QdwDKA2GsgpdfgLFYSKEurUdyLHAMW6ipfpPI7OhXDSI0CsKsaMPTkGSEoKHsXS2D0TwOEPQUyJeWPGnhwDxCsyHkRTfYA+QB+g9wBCqYq337YQLkmQNc0YtQYoU6FyZ0vw5kp6xWwnS4C7QhKnfRFcW/6KefpYE6ITAJs/TWZxyR/DWGAdc9miMfOnLAHGAjEMuRZx4N0SLofiWCiUoRBEO4CKqmI6k8cpr4C9s4sYdi9jKp3T51rJEoAXX/gc/QkxSRB+goiUqyaA52IOkqphmu6HE54wBsn8CI3fCSf0MLZTV0n4OlPAeYLYb0BMBON4QUb3KDwMcOh9EI8T3ylXChhxr2Bg9sfYzZUNPXc6qSsA1hv6OEPsI4gh1xJGvRGMU3wZgKGuU47wzbiH+geN/hrtkpW6BmDxH54jCI4tG7dqHKqrZB6XZGNVZ9kCYLk2t3DmUxQDLcwZ7AaZ23kb2AaoaQ19J0Z9gsl8kOI+Efyin3nNxuvINgCrStk+QztxlnaCzTk5+XTYNWc5AmDxeffly7i1uqEfx3/+JGPJtBMJepqJsjNz1l8B7IRMAFznPVTvn1Ad71V7RUVtvfKrPpgANpUaLi6s4djH1Z41LmAPY6Lh+BtARq7h+HzYdLx2unGJvk33Q1MmAM7sZ6ksrlAx6VW7H0nRO6F5PQPb/EEL2Uq9DN4AAAAASUVORK5CYII=) no-repeat;
+  background-size: contain;
+}
+.collection .collec_active{
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+.collec_active .cancel_collec{
+  margin-right: .22rem;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+}
+.collection .collec_li{
+  padding: .36rem 0 .4rem;
+  width: 100%;
+  background: #ffffff;
+  border-bottom: 0.5px solid rgba(0,0,0,0.05);
+}
+.collection .collec_li .collec_head{
+  display: flex;
+  justify-content: space-between;
+  align-items: flex-start;
+}
+.collection .collec_li .collec_title{
+  flex: 1;
+  font-size: .32rem;
+  color: #171826;
+  font-weight: 500;
+  line-height: .48rem;
+}
+.collec_star{
+  margin-left: .36rem;
+  width: .4rem;
+  height: .4rem;
+}
+.collec_star .shoucang{
+  display: flex;
+  width: .4rem;
+  height: .4rem;
+  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAHRSURBVHgB1VVLTsMwEH1jCB8hpHICwpIVsASERE4CV+AEcARuAjdoJYTY0e4QbBpOQBGC8quH5/RD2jiti7rhSZNY8fjNmxnbAaaAVlFxNs2a+WmcEeECJhslmDX0Cod6Dc2M49B1JtQRgtPBeC43nkWATLHkVCuzCcwiLAODo8K3wCxkkgN3TYwFNL2TFokcoIbQAHpDsi9sU3FMW6fKWFfkEO+oyIf61qdkSPluMNgjS9fgupbs850PwHqecaKQsi5yerWn4UshL+pUh0FwIns47/bA4JLPVsFpKTeOBLpmoMsTq+o2QYtW61K7YN2UkkKQSEZVASsM5LIyY8iFvemVaeCWfTDYAbKaulNbDpZOK8YXJM2T9zUNC3CNtqiyFLFTOxau72/sTVu75Ibkuz2BZQH6QViGOksUdLHJm6Z41wK5g7eSmWMkKUJg1e2wlo/cYdxtuo1J+N26cZmLN4PPhwnkSuJX2vPgXFT0lgczNIDRuRhlcKqfSNweOdlt/z/C3wOrxQxEax1rE5InVJ0W5kvK5O2BMbqlgw2mjY7Vk2hz6FLb4I/nmG93vcQ9qd4SeWEfpGrvpfl9l5GMhQtEa9LqCIXWp/ux/3XN/8APC++o0hFQWAMAAAAASUVORK5CYII=) no-repeat;
+  background-size: contain;
+}
+.collec_star .weishoucang{
+  display: flex;
+  width: .4rem;
+  height: .4rem;
+  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAJESURBVHgB1VXRbdswEL2jqH5rg7gT1NnA3iAdIKmNxiqCfhSdQOkETb+M2goUxO13vEHcCapOEGUDfQaQyOsdYQV2ItdU/noATYt6994deUcBdLAsyyIZXXx0F3Bt9M3679DXR/kCp/PFgCc35vNs4OvnLaAREgQqAKgE1Imvn5dAE7218MUSfoMOWXgJhIjvJPo4Prl6peuLLlnsFZhOsx4BjSR6eR6Px2WXLPApmQp1H4h6WqkDwzMDBhx9GQTmUMgFJ6Vam+AOQZUsXijEvLb23oLJLUH5MR7nWwLf54tzxYe4rc3bAFggUm4N/JLt2XybposjC8BbBz3G8sCt/rBEnz9MTi5cHyDVS8Dgk4DY4W1V1fnZ2biAf9jp6fGSp2XzLFlVVXCECjMJDsmsZN2dQcwpkTXDddRf4QX28AARKJUIh3DF6216PGRZqCtzaMFCGIa3ch6+5IIN2Eex7ya5GLaDAwYrqKpquG+rNsmryjzDPytTARgGEthIhzqDPRaG+mYXeatAI4JcQeBnBQGWuzLd2WgE0OfxB/YYn9k9uFJtt1aB2Szrr0VWzZqU4fxykcxm16MtMDcZ/0Zp+vPAW0Ap3ZO5tnXhBC+vR5UJf7PiudR5mv64exQyxlWMdWXuKWDIugy4u6MZkyFh5q5q4g8NDynlRogwGLhskXptXK1ftADVG5KXqG/ZNRfSyeR4tQF5LVkRUcL3kGvMQOGBtwCTRxKx3KBP76DG4vdu/UqE2CHhFPrga10/7C/1+T/sL+2vJ0ALxXBYAAAAAElFTkSuQmCC) no-repeat;
+  background-size: contain;
+}
+.collection .collec_li .collec_action{
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-top: .24rem;
+}
+
+.collec_action .collec_tags{
+  display: flex;
+  align-items: center;
+}
+.collec_action .collec_tags .tag_active{
+  margin-right: .08rem;
+  padding: .02rem .16rem;
+  height: .36rem;
+  font-size: .24rem;
+  font-weight: 500;
+  text-align: CENTER;
+  color: #5f5e64;
+  border-radius: .05rem;
+  opacity: 1;
+  background: #f7f9fa;
+  border: 1px solid rgba(0,0,0,0.05);
+}
+.collec_action .collec_time{
+  font-size: .24rem;
+  font-weight: 500;
+  color: #9b9ca3;
+  line-height: .36rem;
+}
+
+.collection .taglist{
+  flex: none;
+  height: 6rem;
+  display: flex;
+  flex-wrap: wrap;
+  padding: .32rem;
+  flex-direction: row;
+
+}
+.collection .taglist .area-card-item{
+  height: .72rem;
+  background: #F5F6F7;
+  border-radius: .08rem;
+  color: #5F5E64;
+  font-size: .28rem;
+  line-height: .72rem;
+  padding: 0 .4rem;
+  margin:0 .2rem .2rem 0;
+}
+.collection .taglist .area-card-item.active{
+  position: relative;
+  background: #E8FAFD;
+  color: #2ABED1;
+}
+.collection .taglist .area-card-item.active::after{
+  content: "";
+  position: absolute;
+  right: 0;
+  bottom: 0;
+  background: url(/jyapp/big-member/image/icon-check.png);
+  width: .28rem;
+  height: .28rem;
+  background-size: 100% 100%;
+}
+
+.collection .dateTags{
+  padding: 0 .32rem;
+  flex: none;
+  height: 6rem;
+}
+.collection .dateTags .van-field__control{
+  font-size: .28rem;
+  color: #171826;
+  line-height: .4rem;
+}
+.collection .timeTag{
+  display: flex;
+  padding: .32rem 0;
+}
+.collection .timeTag .area-card-item{
+  width: 1.56rem;
+  height: .72rem;
+  background: #F5F6F7;
+  border-radius: .08rem;
+  color: #5F5E64;
+  font-size: .28rem;
+  text-align: center;
+  line-height: .72rem;
+  margin:0 .2rem .2rem 0;
+}
+.collection .timeTag .area-card-item.active{
+  position: relative;
+  background: #E8FAFD;
+  color: #2ABED1;
+}
+.collection .timeTag .area-card-item.active::after{
+  content: "";
+  position: absolute;
+  right: 0;
+  bottom: 0;
+  background: url(/jyapp/big-member/image/icon-check.png);
+  width: .28rem;
+  height: .28rem;
+  background-size: 100% 100%;
+}
+.collection .timePicker{
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  padding: .16rem;
+  width: 100%;
+  height: 1.04rem;
+  opacity: 1;
+  background: #f5f6f7;
+  border-radius: .08rem;
+}
+.collection .timePicker.clickactive{
+  position: relative;
+ background: #E8FAFD;
+}
+.collection .timePicker.clickactive::after{
+  content: '';
+  position: absolute;
+  right: 0;
+  bottom: 0;
+  background: url(/jyapp/big-member/image/icon-check.png);
+  width: .28rem;
+  height: .28rem;
+  background-size: 100% 100%;
+ }
+.timePicker .line{
+  width: 12px;
+  height: 1px;
+  background: #ACACAD;
+}
+.timePicker .van-cell.van-field {
+  width: 2.96rem;
+  height: .72rem;
+  background: #ffffff;
+  border: 1px solid rgba(0,0,0,0.10);
+  border-radius: .1rem;
+  align-items: center;
+}
+.collection .j-footer{
+  box-shadow: 0px -2px 8px rgb(54 147 179 / 5%);
+  z-index: inherit;
+}
+.collection .j-button-group {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  width: 100%;
+  padding: 0.16rem 0.32rem 0.24rem;
+  background-color: #fff;
+  box-sizing: border-box;
+}
+.collection .j-button-group .j-button-confirm, .j-button-cancel {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  flex: 1;
+  width: 100%;
+  height: 0.8rem;
+  font-size: 0.32rem;
+  line-height: inherit;
+  text-align: center;
+  border-radius: 0.16rem;
+}
+.collection .j-button-group .j-button-cancel {
+  margin-right: 0.26rem;
+  color: #5f5e64;
+  background-color: #edeff2;
+}
+.collection .j-button-group .j-button-confirm {
+  color: #fff;
+  background-color: #2cb7ca;
+}
+/* 地区 */
+.collection .area-list.van-index-bar{
+  height: 8.6rem;
+  overflow: auto;
+}
+/* 采购单位类型 */
+.collection .unitTab{
+  overflow: hidden;
+  height: 7.5rem;
+  flex: none;
+}
+.collection .unitTab .van-tabs__content{
+  height: 7.5rem;
+  overflow: auto;
+}
+.collection .unitType {
+  height: 100%;
+  /* overflow: auto; */
+  flex: 1;
+  display: flex;
+}
+.collection .unitType .van-tabs__wrap{
+  height: 100%;
+  overflow: auto;
+}
+.collection .unitType .van-tabs__content{
+  flex: 1;
+}
+.unitType .van-tabs__wrap .van-tabs__nav.van-tabs__nav--card{
+  height: auto;
+  margin: 0;
+  display: flex;
+  flex-direction: column;
+  border: 0;
+  overflow: auto;
+}
+.unitType .van-tabs__wrap .van-tabs__nav.van-tabs__nav--card .van-tab{
+  flex: none;
+  width: 2.5rem;
+  min-height: .8rem;
+  background: #f5f6f7;
+  border: 0;
+  padding: 0;
+}
+.unitType .van-tab__text.van-tab__text--ellipsis{
+  padding: 0 0.08rem 0 .32rem;
+  display: flex;
+  align-items: center;
+  width: 100%;
+  height: 100%;
+  font-size: .3rem;
+  font-weight: 500;
+  text-align: LEFT;
+  color: #171826;
+  line-height: .44rem;
+}
+.unitType .van-tab__text.van-tab__text--ellipsis .tabtitle{
+  flex: 1;
+}
+.unitType .van-tab__text.van-tab__text--ellipsis .optionnum{
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  margin-left: .1rem;
+  width: .8rem;
+  height: .4rem;
+  background: #2abed1;
+  border: 1px solid #ffffff;
+  border-radius: .82rem;
+  font-size: .22rem;
+  font-weight: 500;
+  text-align: CENTER;
+  color: #ffffff;
+}
+.unitType .van-tabs__wrap .van-tabs__nav.van-tabs__nav--card .van-tab.van-tab--active {
+  background: #ffffff;
+}
+.unitType .van-tabs__wrap .van-tabs__nav.van-tabs__nav--card .van-tab.van-tab--active .van-tab__text.van-tab__text--ellipsis{
+  color: #2ABED1;
+}

+ 25 - 6
src/jfw/modules/app/src/web/staticres/jyapp/css/subscribe.css

@@ -133,6 +133,7 @@ img{
 	padding: 17px 0px 17px 0px;
 }
 .resnumb .two{
+  width: 100%;
 	font-size:16px;
 	font-weight:500;
 	padding-left:25px;
@@ -854,9 +855,12 @@ font-weight: bold;
 
 .filter_tab {
   position: relative;
-  padding: 12px 10px;
+  /* padding: 12px 0 0; */
   background: #fff;
-      border-bottom: 1px solid #E6E6E6;
+  border-bottom: 1px solid #E6E6E6;
+}
+.filter_tab .van-dropdown-menu__title{
+  padding: 0 8px 0 0;
 }
 
 /*.filter_tab:after {
@@ -1559,6 +1563,7 @@ body .loading_ p span {
 ._header {
     /*position: fixed;
     top: 1.3rem;*/
+    margin-top: 12px;
     width: 100%;
     z-index: 999;
 }
@@ -1572,12 +1577,14 @@ body .loading_ p span {
 }
 
 .app-content {
+  padding-bottom: .16rem;
     position: relative;
     display: none;
     justify-content: space-between;
     flex-direction: column;
     overflow: hidden;
-    height: 100%;
+    background: #F5F6F7;
+    /* height: 100%; */
 }
 
 html, body {
@@ -1597,7 +1604,6 @@ html, body {
   padding-left: 10px;
   padding-right: 10px;
   line-height: normal;
-  border-bottom: none;
 }
 .app-layout-header>ul{
   display: flex;
@@ -1676,11 +1682,24 @@ html, body {
 .app-layout-header .only-personal{
   background: linear-gradient(270deg, #F1D090 0%, #FAE7CA 100%);
 }
+.tab_right{
+  display: flex;
+  align-items: center;
+}
 .vip_report {
+  margin-right: .2rem;
   color: #686868;
   font-size: .3rem;
-  padding-left: 13.5px;
-  border-left: 1.5px solid rgba(0, 0, 0, 0.1);
+  padding-right: .27rem;
+  border-right: 1.5px solid rgba(0, 0, 0, 0.1);
+}
+.tab_right .report_book{
+  margin-right: .08rem;
+  display: flex;
+  width: .32rem;
+  height: .32rem;
+  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACUAAAAnCAYAAACIVoEIAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAOvSURBVFhH7VgJM1thFO0vrTV2YqctWtRaOkNHtEbNVFsqxBZLbVkwiBqdtsQ2g8QuJIqJ3em737wIXiRP+qLLODNnGN6777z7nXvf/b4H+Avx74my2+1YX9+AadHskUtLy9ja2sLJyQl/t/cQiDo/P8fx8THW1tYxNjaO9rZOKOsaPFLV0Iye7j5MThqxvb3NYngLgaizszNsbGzibeU7RITLEeAfgsCAUI+k6/z9ZIiJjkdraxsXY4PF8gYCUUdHx+js7EJGeibkMYnIzSnEq1KFR9J1fg+DOXEydl9trRIWi4WPejsIRB0eHrHlSE56jKzMXPT2aLCwsOiRWq2eiSJSxpISH+Hjh0+csNv7zIWoQ9TWKFnQwoKX+P7tB/8f95gyTl+IkgVHIEQWicSEVNRxL2gymbkVOOKv9AyfiMpIz0J6WiaCg8IRFRmHlpY2Vp1ize8TUZ0dXejmKjEhPpUtJWWtqbFFtPl9IkqvH4DVaoNeN8BMHxQYxv1MEG1+n4ga6B/E6ekpM7lW28+WkrJFMcWY32eiCCRsZ+cnq+DsrDzR5pdO1NQ0a6Akqrmp9eLzs7hgwsSEEYqyCtaMyWMO86+urrn0mGSiZmfnEB0Vx4RRj3uenX+FqSlpCA+LucgmZa2vT8u+r9chmSjLpoU1XfrM0GcnOCjsCulvlCWHKPpdoXgDo3GKj+CEZKLIH7Qcw0MGdHR85pZH7ZJKpQqlpWVc1qKRn/cCo4YvfAQnRIlyTA6bXDYcXrlOs2mJidrd3WXtgErfFefnF6BubWetgpZ1aGiEf7ITokSRGZeXV6Dp010ZVy6zXtnIxhwSTlV3E3ZsO6wa42KTf08ULQ29XXrasyvjynVSdRkMY9jb2+ejCSGZKHpzSrtK1exybHHwdXklZmbmcHBwwEcTQjJR5Cm7/YBNo67GFgepIe7v79/N8okxujuucH602WzMBpKJEmP0m6liHX5kZJRtQu7c6O6Yn1cEAyfszo3ujhqNjs1Td250d6Rtl6Seujc6h3uj//9GlxJeiaK3qa9vREryE3aTjtuNrK6sSsaZmVk0qlq4CTUBuTkFGBk28E92QiCKSr+3V4OnGdmIlSeiIL8Y5YoKyVhaUoaszByEhkSiuKgE4+Nf+Sc7IRBF5W+1WlFVVY3ICDnbetOQLxXpnIFi0ixPpzs0pV6HQBSZmqrNbF7C4OAQl+pmvK+ukYy1NXVQq9vZgRw1Y1ebUoGoy7jN8aJYijmGdCvqzwD4BQiog2iJWMtkAAAAAElFTkSuQmCC) no-repeat;
+  background-size: contain;
 }
 .vip_report > a {
     display: none;

+ 37 - 0
src/jfw/modules/app/src/web/staticres/jyapp/js/historypush.js

@@ -0,0 +1,37 @@
+
+var vm = new Vue({
+  el: '#select-meau',
+  components: {
+    dateComponent: dateComponent,
+    areaComponent: areaComponent,
+    industryComponent: industryComponent,
+    cateComponent: cateComponent,
+    keywordComponent: keywordComponent,
+    noticeComponent: noticeComponent
+  },
+  data () {
+    return {
+      // 时间参数
+      time:'',
+      // 地区参数
+      area: ''
+    }
+  },
+  methods: {
+    confirm: function(data){
+      console.log(data)
+      if(data.name === 'dateItem'){
+        this.$refs.dateItem.toggle()
+        this.time = data.data
+        initpage()
+      } else if(data.name === 'areaitem'){
+        this.$refs.areaItem.toggle()
+        this.area = data.data.join('、')
+      }
+    },
+    cancel: function(data){
+      console.log(data)
+      this.$refs.dateItem.toggle()
+    }
+  }
+})

+ 10 - 1
src/jfw/modules/app/src/web/staticres/jyapp/js/track/track.js

@@ -417,6 +417,10 @@ class JyTrackUtils {
         timeCount = timeStep.length - 1
       }
       const nextTime = timeStep[timeCount]
+      if (nextTime === -1) {
+        clearTimeout(timeTn)
+        return
+      }
       timeTn = setTimeout(timeTempFn, nextTime)
       timeCount++
       typeof cb === 'function' ? cb() : null
@@ -809,7 +813,7 @@ class JyTrackRecord {
       } else if (viewTime <= 5) {
         return nextTimeInterval = 30
       } else {
-        return nextTimeInterval = 120
+        return nextTimeInterval = -1
       }
     }
     // 发送
@@ -818,6 +822,11 @@ class JyTrackRecord {
       if (!this.canTimeCache(location.href + 'sendData' + type)) {
         return
       }
+      if (nextTimeInterval === -1) {
+        console.log('stop page time')
+        clearTimeout(sendPageTn)
+        return
+      }
       // 计数
       params.count++
       params.viewtime = Math.round(this.getDiffTime() / 1000)

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
src/jfw/modules/app/src/web/staticres/jyapp/js/track/track.umd.min.js


+ 142 - 0
src/jfw/modules/app/src/web/templates/frontRouter/collection/sess/index.html

@@ -0,0 +1,142 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+
+<head>
+    <!--引入公共资源头部-->
+    {{include "/big-member/meta.html"}}
+    <title>标讯收藏</title>
+
+    <!--S-当前页面的css资源-->
+    <link rel="stylesheet" href=//cdn.jsdelivr.net/npm/reset-css@4.0.1/reset.min.css />
+    <link rel="stylesheet" href=//cdn.jsdelivr.net/npm/vant@2.11.1/lib/index.css />
+    <link rel="stylesheet" href=//cdn.jsdelivr.net/npm/vant@2.11.1/lib/icon/local.css />
+    <link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/collection/css/index.css?v={{Msg "seo" "version"}}' />
+</head>
+<body>
+  <div class="j-container">
+    {{include "/big-member/header.html"}}
+    <div class="j-main collection" id="myCollection" v-cloak ref="main">
+      <div class="j-container">
+        <div class="j-main">
+          <div class="search-container van-fade-an" ref="searchContainer">
+            <div class="listaction">
+              <div class="action_editor" @click="screenBtn">筛选</div>
+              <div class="data_report">
+                <div class="collec_datareport">
+                  <span class="data_download"></span>
+                  <span class="data text">数据导出</span>
+                </div>
+              </div>
+            </div>
+          </div>
+          <van-dropdown-menu v-if="limitshow" :get-container="getContainer">
+            <van-dropdown-item v-model="params.value1" title="个人标签" :options="params.option1">
+              <div class="j-container">
+                <div class="taglist j-main">
+                  <div class="area-card-item" :class="{active:index==personTagactive}" v-for="(item, index) in 100" :key="index" @click="selectTags(index)">标签1</div>
+                </div>
+                <div class="j-footer">
+                  <div class="j-button-group">
+                    <button class="j-button-cancel" @click="resetAll">重置</button>
+                    <button class="j-button-confirm" @click="onConfirm">确认</button>
+                  </div>
+                </div>
+              </div>
+            </van-dropdown-item>
+            <van-dropdown-item v-model="params.value2" title="收藏日期" :options="params.option2">
+              <date-component />
+            </van-dropdown-item>
+            <van-dropdown-item v-model="params.value2" title="采购单位类型" :options="params.option2">
+              <div class="j-container">
+                <div class="j-main unitTab">
+                  <van-tabs type="card" class="unitType">
+                    <van-tab title="标签 1">
+                      <van-checkbox-group v-model="result" ref="checkboxGroup">
+                        <van-cell-group>
+                          <van-cell
+                          clickable
+                          title="全选"
+                          @click="checkAll"
+                          >
+                          <template #right-icon>
+                            <van-checkbox checked-color="#2ABED1"></van-checkbox>
+                          </template>
+                          </van-cell>
+                          <van-cell
+                            v-for="(item, index) in list"
+                            clickable
+                            :key="item"
+                            :title="`复选框 ${item}`"
+                            @click="toggle(index)"
+                          >
+                            <template #right-icon>
+                              <van-checkbox checked-color="#2ABED1" :name="item" ref="checkboxes" />
+                            </template>
+                          </van-cell>
+                        </van-cell-group>
+                      </van-checkbox-group>
+                    </van-tab>
+                    <van-tab>
+                      <template #title>
+                        党政机关<br/>事业单位
+                      </template>
+                      3
+                    </van-tab>
+                    <van-tab title="标签 3">内容 3</van-tab>
+                    <van-tab title="标签 4">内容 4</van-tab>
+                  </van-tabs>
+                </div>
+                <div class="j-footer">
+                  <div class="j-button-group">
+                    <button class="j-button-cancel" @click="resetAll">重置</button>
+                    <button class="j-button-confirm" @click="onConfirm">确认</button>
+                  </div>
+                </div>
+              </div>
+            </van-dropdown-item>
+            <van-dropdown-item v-model="params.value2" title="采购单位联系方式" :options="params.option4"></van-dropdown-item>
+            <van-dropdown-item v-model="params.value2" title="中标企业联系方式" :options="params.option5"></van-dropdown-item>
+          </van-dropdown-menu>
+          <van-list
+            v-model="listState.loading"
+            :finished="listState.finished"
+            finished-text="没有更多了"
+            @load="getList"
+          >
+            <div class="collec_li" v-for="(item, index) in listState.list" :key="index">
+              <div class="collec_head">
+                <div class="collec_title ellipsis-2">
+                  ${item.docName}
+                </div>
+                <div class="collec_star" @click="collecClick(item.id)">
+                  <span class="shoucang" v-if="condition"></span>
+                  <span class="weishoucang" v-if="!condition"></span>
+                </div>
+              </div>
+              <div class="collec_action">
+                <ul class="collec_tags">
+                  <li class="tag_active">${item.area}</li>
+                  <li class="tag_active">${item.industry}</li>
+                  <li class="tag_active">${item.type}</li>
+                  <li class="tag_active">${item.price}</li>
+                </ul>
+                <div class="collec_time">${item.time}</div>
+              </div>
+            </div>
+          </van-list>
+        </div>
+      </div>
+    </div>
+  </div>
+  <!--S-当前页面的资源-->
+  <script src=//cdn.jsdelivr.net/npm/vue@2.6.11/dist/vue.min.js></script>
+  <script src=//cdn.jsdelivr.net/npm/vant@2.11.1/lib/vant.min.js></script>
+  <script src=//cdn.jsdelivr.net/npm/zepto@1.2.0/dist/zepto.min.js></script>
+  <!--E-当前页面的资源-->
+  {{include "/big-member/commonjs.html"}}
+  <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/collection/js/date-mobile.js?v={{Msg "seo" "version"}}'></script>
+  <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/collection/js/index.js?v={{Msg "seo" "version"}}'></script>
+  {{include "/common/baiducc.html"}}
+</body>
+
+</html>

+ 57 - 26
src/jfw/modules/app/src/web/templates/weixin/historypush.html

@@ -12,6 +12,11 @@
     <link rel="stylesheet" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/vipsubscribe/css/weui.min.css?v={{Msg "seo" "version"}}"/>
     <link rel="stylesheet" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/vipsubscribe/iconfont/iconfont.css?v={{Msg "seo" "version"}}"/>
     <link href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/css/p13.css?v={{Msg "seo" "version"}}" rel="stylesheet">
+    <link rel="stylesheet" href=//cdn.jsdelivr.net/npm/reset-css@4.0.1/reset.min.css />
+    <link rel="stylesheet" href=//cdn.jsdelivr.net/npm/vant@2.8.2/lib/index.css />
+    <link rel="stylesheet" href=//cdn.jsdelivr.net/npm/vant@2.8.2/lib/icon/local.css />
+    <link rel="stylesheet" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/css/index.css?v={{Msg "seo" "version"}}"/>
+    <link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/big-member/css/page_big_subscribe.css?v={{Msg "seo" "mod_version"}}' />
 
     <style>
         .merge-dialog,
@@ -51,11 +56,12 @@
             font-size: 12px;
         }
         ._header .filter_tab{
-            padding-left: 16px;
+            height: .88rem;
+            /* padding-left: 16px; */
         }
     </style>
 </head>
-<body class="p13">
+<body class="p13" id="viperSuper">
 <!-- 加载数据-->
 <div class="loading_" id="loading">
     <p><span></span></p>
@@ -68,9 +74,18 @@
         <span></span>
       </div>
     </li>
+    <li>
+        <div class="tab_right">
+            <span class="report_book"></span>
+            <div class="vip_report" style="display: none;">
+                <a></a>报告
+            </div>
+        </div>
+    </li>
     <li id="sub_manager" data-need-bind-phone style="visibility: hidden;">订阅管理</li>
   </ul>
 </div>
+{{include "/big-member/commonjs.html"}}
 <div class="app-layout-content-b">
     <div class="app-content">
       {{if and (not .T.isIosExam) (not .T.isIosExamPhone)}}
@@ -82,10 +97,10 @@
   			</div>
   		</div>
       {{end}}
-        <div class="_header">
+        <div class="_header collection" id="select-meau">
             <!-- 筛选条件 -->
             <div class="filter_tab">
-                <div class="tab_left">
+                <!-- <div class="tab_left">
                     <div class="time">
                         <p class="time_box" id="showDatePicker">
                             <span class="time_result jymobile-tab-triangle">时间</span>
@@ -95,26 +110,27 @@
                         <p class="area_box" id="showArea">
                             <span class="jymobile-tab-triangle">地区</span>
                         </p>
-                    </div>
-                </div>
-                <div class="tab_right">
-                    <div class="vip_report" style="display: none;">
-                        <a></a>报告
-                    </div>
+                    </div> -->
+                    <van-dropdown-menu style="width: auto;overflow-x: auto;">
+                        <van-dropdown-item title="时间"  ref="dateItem">
+                            <date-component @cancel="cancel" @confirm="confirm" />
+                        </van-dropdown-item>
+                        <van-dropdown-item title="地区" ref="areaItem">
+                            <area-component @cancel="cancel" @confirm="confirm"></area-component>
+                        </van-dropdown-item>
+                        <van-dropdown-item title="行业" ref="">
+                            <industry-component></industry-component>
+                        </van-dropdown-item>
+                        <van-dropdown-item title="采购单位" ref="">
+                            <cate-component></cate-component>
+                        </van-dropdown-item>
+                        <van-dropdown-item title="关键词" ref="">
+                            <keyword-component></keyword-component>
+                        </van-dropdown-item>
+                        <notice-component></notice-component>
+                    </van-dropdown-menu>
                 </div>
                 <div class="screen"></div>
-                <div class="area_container" style="clear:both;flex: 1;overflow-y: scroll;">
-                    <section class="area_wrap">
-                        <div class="area_data">
-                            <!-- 这里省份的顺序,和下面省份的顺序对应 -->
-
-                        </div>
-                        <div class="handle_menu">
-                            <button class="reset_btn">重置</button>
-                            <button class="enter_btn">确认</button>
-                        </div>
-                    </section>
-                </div>
             </div>
         </div>
         <div class="color_top" style="display:none;"></div>
@@ -265,6 +281,17 @@
 </div>
 
 </body>
+<script src=//cdn.jsdelivr.net/npm/vue@2.6.11/dist/vue.min.js></script>
+<script src=//cdn.jsdelivr.net/npm/vant@2.8.2/lib/vant.min.js></script>
+<script src=//cdn.jsdelivr.net/npm/zepto@1.2.0/dist/zepto.min.js></script>
+<script src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/big-member/js/utils.js?v={{Msg "seo" "version"}}"></script>
+<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/collection/js/date-mobile.js?v={{Msg "seo" "version"}}'></script>
+<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/collection/js/area-mobile.js?v={{Msg "seo" "version"}}'></script>
+<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/collection/js/industry-mobile.js?v={{Msg "seo" "version"}}'></script>
+<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/collection/js/cate-mobile.js?v={{Msg "seo" "version"}}'></script>
+<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/collection/js/keyword-mobile.js?v={{Msg "seo" "version"}}'></script>
+<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/collection/js/notice-mobile.js?v={{Msg "seo" "version"}}'></script>
+<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/js/historypush.js?v={{Msg "seo" "version"}}'></script>
 <!--<script src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/local/weui.min.js"></script>-->
 <script src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/vipsubscribe/js/weui.min.js?v={{Msg "seo" "version"}}"></script>
    <script>
@@ -564,7 +591,7 @@
             $.ajax({
                 type: 'post',
                 url: '/jyapp/front/hasPushHistory?t=' + new Date().getTime(),
-                data: {"selectTime": firstTime, "pageNum": 1, "area": selectCity},
+                data: {"selectTime": firstTime, "pageNum": 1, "area": selectCity,},
                 async: false,
                 dataType: 'json',
                 success: function (data) {
@@ -763,9 +790,9 @@ window.listScroll = function() {
       }
       //地区渲染
       try{
-        loadJS("{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/vipsubscribe/js/mapArea.js?v={{Msg "seo" "version"}}",function(){
+        // loadJS("{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/vipsubscribe/js/mapArea.js?v={{Msg "seo" "version"}}",function(){
           mapData();
-        })
+        // })
       }catch(error){}
   }
 
@@ -993,8 +1020,12 @@ function hasNoData() {
               + '<div class="one">'
               + '<span class="xh ' + visited + '">' + count + '.</span>'
               + '</div>'
-              + '<div class="two bt-parent" style="padding-left:' + paddingLeft + 'px;">'
+              + '<div class="two bt-parent" style="display: flex;justify-content: space-between;padding-left:' + paddingLeft + 'px;">'
               + '<a class="bt ' + visited + '" eid="' + obj["_id"] + '"  push_date="' + obj["ca_date"] + '" list_index="' + obj["ca_index"] + '" projectM="' + obj["ca_type"] + '">' + title + '</a>'
+              + '<div class="collec_star">'
+              + '<span class="shoucang"></span>'
+              + '<span class="weishoucang" style="display:none"></span>'
+              + '</div>'
               + '</div>'
               + '</div>'
               + '<div style="clear:both;">'

+ 122 - 139
src/jfw/modules/common/src/qfw/util/dataexport/dataexport.go

@@ -5,7 +5,6 @@ import (
 	"encoding/json"
 	"errors"
 	"fmt"
-	"go.mongodb.org/mongo-driver/bson"
 	"log"
 	"math"
 	mg "mongodb"
@@ -29,24 +28,26 @@ type KeyWord struct {
 
 /*筛选条件*/
 type SieveCondition struct {
-	Id          string    `json:"id"`
-	PublishTime string    `json:"publishtime"` //发布时间
-	Area        []string  `json:"area"`        //地区-省份
-	City        []string  `json:"city"`        //地区-城市
-	Region      []string  `json:"region"`      //地区-省份+城市
-	Industry    []string  `json:"industry"`    //行业
-	Keyword     []KeyWord `json:"keywords"`    //关键词
-	Buyer       []string  `json:"buyer"`       //招标单位(采购单位)
-	Buyerclass  []string  `json:"buyerclass"`  //采购单位类型
-	Winner      []string  `json:"winner"`      //中标单位
-	ComeInTime  int64     `json:"comeintime"`  //入库时间(秒)
-	OpenId      string    `json:"openid"`      //用户openid
-	MinPrice    string    `json:"minprice"`    //金额——最少
-	MaxPrice    string    `json:"maxprice"`    //金额——最多
-	SelectType  string    `json:"selectType"`  //筛选(正文 or 标题)
-	Subtype     string    `json:"subtype"`     //信息类型
-	Comeinfrom  string    `json:"comeinfrom"`  //查询来源
-	DisWord     string    `json:"disWord"`     //分销系统 口令
+	Id           string    `json:"id"`
+	PublishTime  string    `json:"publishtime"`  //发布时间
+	Area         []string  `json:"area"`         //地区-省份
+	City         []string  `json:"city"`         //地区-城市
+	Region       []string  `json:"region"`       //地区-省份+城市
+	Industry     []string  `json:"industry"`     //行业
+	Keyword      []KeyWord `json:"keywords"`     //关键词
+	Buyer        []string  `json:"buyer"`        //招标单位(采购单位)
+	Buyerclass   []string  `json:"buyerclass"`   //采购单位类型
+	HasBuyerTel  string    `json:"hasBuyertel"`  //是否有采购单位电话
+	Winner       []string  `json:"winner"`       //中标单位
+	HasWinnerTel string    `json:"hasWinnertel"` //是否有中标单位电话
+	ComeInTime   int64     `json:"comeintime"`   //入库时间(秒)
+	OpenId       string    `json:"openid"`       //用户openid
+	MinPrice     string    `json:"minprice"`     //金额——最少
+	MaxPrice     string    `json:"maxprice"`     //金额——最多
+	SelectType   string    `json:"selectType"`   //筛选(正文 or 标题)
+	Subtype      string    `json:"subtype"`      //信息类型
+	SelectIds    []string  `json:"selectId"`     //选择信息导出
+	Comeinfrom   string    `json:"comeinfrom"`   //查询来源
 }
 
 const (
@@ -63,17 +64,24 @@ var searchPool = make(chan bool, 8)
 
 //获取数据导出查询语句
 func getDataExportSql(scd *SieveCondition) string {
+	if len(scd.SelectIds) > 0 {
+		query := `{"query":{"bool":{"must":[%s]}}}`
+		doSearchSql := fmt.Sprintf(`{"terms":{"_id":[%s]}}`, `"`+strings.Join(scd.SelectIds, `","`)+`"`)
+		return fmt.Sprintf(query, doSearchSql)
+	}
 	multi_match := `{"multi_match": {"query": %s,"type": "phrase", "fields": [%s]}}`
-	query := `{"query":{"bool":{"must":[%s],"should":[%s],"minimum_should_match": %d}}}`
+	query := `{"query":{"bool":{"must":[%s],"must_not":[%s],"should":[%s],"minimum_should_match": %d}}}`
 	query_bool_should := `{"bool":{"should":[%s],"minimum_should_match": 1}}`
 	query_price := `{"bool":{"must":[{"range":{"bidamount":{%s}}}]}},{"bool":{"must":[{"range":{"budget":{%s}}}],"must_not":[{"range":{"bidamount":{"gte":-1}}}]}}`
 	query_bool_must := `{"terms":{"%s":[%s]}}`
 	query_bool_must_and := `{"bool":{"must":[%s]%s}}`
+	query_missing := `{"constant_score":{"filter":{"missing":{"field":"%s"}}}}`
 	gte := `"gte": %s`
 	lte := `"lte": %s`
 
 	bools := []string{}
 	musts := []string{fmt.Sprintf(`{"range":{"comeintime":{"lt":%d}}}`, scd.ComeInTime)}
+	must_not := []string{}
 	//省份
 	areaCity := []string{}
 	if len(scd.Area) > 0 {
@@ -247,7 +255,21 @@ func getDataExportSql(scd *SieveCondition) string {
 			}
 		}
 	}
-	qstr := fmt.Sprintf(query, strings.Join(musts, ","), strings.Join(bools, ","), boolsNum)
+	if scd.HasBuyerTel != "" {
+		if scd.HasBuyerTel == "y" {
+			must_not = append(must_not, fmt.Sprintf(query_missing, "buyertel"))
+		} else {
+			musts = append(musts, fmt.Sprintf(query_missing, "buyertel"))
+		}
+	}
+	if scd.HasWinnerTel != "" {
+		if scd.HasWinnerTel == "y" {
+			must_not = append(must_not, fmt.Sprintf(query_missing, "winnertel"))
+		} else {
+			musts = append(musts, fmt.Sprintf(query_missing, "winnertel"))
+		}
+	}
+	qstr := fmt.Sprintf(query, strings.Join(musts, ","), strings.Join(must_not, ","), strings.Join(bools, ","), boolsNum)
 	return qstr
 }
 
@@ -261,27 +283,33 @@ func GetSqlObjFromId(mongo mg.MongodbSim, _id string) *SieveCondition {
 		return nil
 	}
 	return &SieveCondition{
-		Id:          _id,
-		Keyword:     getKeyWordArrFromDbResult((*query)["keywords"]),
-		Industry:    getStringArrFromDbResult((*query)["industry"]),
-		MinPrice:    qutil.ObjToString((*query)["minprice"]),
-		MaxPrice:    qutil.ObjToString((*query)["maxprice"]),
-		Subtype:     qutil.ObjToString((*query)["subtype"]),
-		Area:        getStringArrFromDbResult((*query)["area"]),
-		City:        getStringArrFromDbResult((*query)["city"]),
-		SelectType:  qutil.ObjToString((*query)["selectType"]),
-		PublishTime: qutil.ObjToString((*query)["publishtime"]),
-		Buyer:       getStringArrFromDbResult((*query)["buyer"]),
-		Buyerclass:  getStringArrFromDbResult((*query)["buyerclass"]),
-		Winner:      getStringArrFromDbResult((*query)["winner"]),
-		ComeInTime:  qutil.Int64All((*query)["comeintime"]),
-		Comeinfrom:  qutil.ObjToString((*query)["comeinfrom"]),
+		Id:           _id,
+		Keyword:      getKeyWordArrFromDbResult((*query)["keywords"]),
+		Industry:     getStringArrFromDbResult((*query)["industry"]),
+		MinPrice:     qutil.ObjToString((*query)["minprice"]),
+		MaxPrice:     qutil.ObjToString((*query)["maxprice"]),
+		Subtype:      qutil.ObjToString((*query)["subtype"]),
+		Area:         getStringArrFromDbResult((*query)["area"]),
+		City:         getStringArrFromDbResult((*query)["city"]),
+		SelectType:   qutil.ObjToString((*query)["selectType"]),
+		PublishTime:  qutil.ObjToString((*query)["publishtime"]),
+		Buyer:        getStringArrFromDbResult((*query)["buyer"]),
+		Buyerclass:   getStringArrFromDbResult((*query)["buyerclass"]),
+		HasBuyerTel:  qutil.ObjToString((*query)["hasBuyertel"]),
+		Winner:       getStringArrFromDbResult((*query)["winner"]),
+		HasWinnerTel: qutil.ObjToString((*query)["hasWinnertel"]),
+		ComeInTime:   qutil.Int64All((*query)["comeintime"]),
+		Comeinfrom:   qutil.ObjToString((*query)["comeinfrom"]),
+		SelectIds:    getStringArrFromDbResult((*query)["selectIds"]),
 	}
 }
 
 //数据导出-查询结果数量
 func GetDataExportSearchCountByScdId(sim mg.MongodbSim, elasticAddress, id string) (count int) {
 	scd := GetSqlObjFromId(sim, id) //用户筛选条件
+	if scd.SelectIds != nil {
+		return len(scd.SelectIds)
+	}
 	return GetDataExportSearchCountBySieveCondition(scd, elasticAddress)
 }
 
@@ -356,28 +384,62 @@ func isNullSearch(scd *SieveCondition) (isNull bool) {
  * webdomain 三级页域名
  * count 返回数量 (-1:预览数据查询)
  */
-var EntTable = "winner_enterprise"
 
-func GetDataExportSearchResultByScdId(sim, entmg mg.MongodbSim, elasticAddress, id string, dataType string, checkCount int, webdomain string) (*[]map[string]interface{}, error) {
+func GetDataExportSearchResultByScdId(sim mg.MongodbSim, elasticAddress, id, dataType string, checkCount int) (*[]map[string]interface{}, error) {
 	scd := GetSqlObjFromId(sim, id)
-	return GetDataExportSearchResult(entmg, elasticAddress, scd, dataType, checkCount, webdomain)
+	//if scd.SelectIds != nil {
+	//	return GetDataExportSelectResult(scd, dataType, checkCount)
+	//}
+	return GetDataExportSearchResult(elasticAddress, scd, dataType, checkCount)
 }
 
 //GetDataExportSearchResult 获取数据导出内容
 //entmg 高级字段包查询企业电话邮箱等字段
 //checkCount -1 预览500条
-func GetDataExportSearchResult(entmg mg.MongodbSim, elasticAddress string, scd *SieveCondition, dataType string, checkCount int, webdomain string) (*[]map[string]interface{}, error) {
+func GetDataExportSearchResult(elasticAddress string, scd *SieveCondition, dataType string, checkCount int) (*[]map[string]interface{}, error) {
 	defer qutil.Catch()
-	var res []map[string]interface{}
-	//获取查询语句
 	if scd == nil {
 		return nil, errors.New("GetDataExportSearchResult-获取查询条件")
 	}
+	//获取查询语句
 	qstr := getDataExportSql(scd)
 	log.Printf("GetDataExportSearchResult-%s-sql:%s\n", scd.Id, qstr)
+	log.Println("len(scd.SelectIds)=", len(scd.SelectIds))
 	//数据导出数据查询
-	if checkCount > onceSearchCount { //分批次查询
-		batchNum := qutil.IntAll(math.Ceil(float64(checkCount) / float64(onceSearchCount)))
+	res := doSearchByBatch(qstr, dataType, checkCount, fmt.Sprintf("%s-%s", "GetDataExportSearchResult", scd.Id))
+	//超级搜索一致的检索(防止数据导出和超级搜索数据量不一致)
+	if scd.Comeinfrom == "supersearchPage" && (len(scd.Keyword) != 0 || len(scd.Industry) != 0) && len(scd.SelectIds) == 0 {
+		if len(scd.Keyword) != 0 {
+			num := len(res)
+			searchTextSize := 0
+			if len(scd.Keyword) > 0 {
+				searchTextSize = len([]rune(scd.Keyword[0].Keyword))
+			}
+			if searchTextSize > 3 && num < 50 {
+				secondKWS := jy.HttpEs(scd.Keyword[0].Keyword, "ik_smart", elasticAddress)
+				scd.Keyword[0].Keyword = secondKWS
+				scd.SelectType = "title"
+				qstr = getDataExportSql(scd)
+				log.Printf("GetDataExportSearchResult-%s-分词查询-sql:%s\n", scd.Id, qstr)
+				res2 := doSearch(qstr, 0, 100, "")
+				res = *delRepeatMapArr(&res, res2)
+				if len(res) > 100 {
+					res = res[:100]
+				}
+			}
+		}
+	}
+	//校验数量
+	if checkCount != len(res) && checkCount != -1 {
+		return nil, fmt.Errorf("GetDataExportSearchResult-%s-数据总量校验异常,期望:%d,实际:%d", scd.Id, checkCount, len(res))
+		//发邮件
+	}
+	return &res, nil
+}
+
+func doSearchByBatch(query, dataType string, searchCount int, flag string) (res []map[string]interface{}) {
+	if searchCount > onceSearchCount { //分批次查询
+		batchNum := qutil.IntAll(math.Ceil(float64(searchCount) / float64(onceSearchCount)))
 		var searchWaitGroup = &sync.WaitGroup{}
 		var lock sync.Mutex
 		for n := 0; n < batchNum; n++ {
@@ -390,27 +452,27 @@ func GetDataExportSearchResult(entmg mg.MongodbSim, elasticAddress string, scd *
 				}()
 				checkNum, checkOk := onceSearchCount, false
 				if start == (batchNum - 1) {
-					if checkCount%onceSearchCount != 0 {
-						checkNum = checkCount % onceSearchCount
+					if searchCount%onceSearchCount != 0 {
+						checkNum = searchCount % onceSearchCount
 					}
 				}
 
 				var tmp *[]map[string]interface{}
 				for i := 0; i < 3; i++ {
-					tmp = doSearch(qstr, start*onceSearchCount, onceSearchCount, dataType)
+					tmp = doSearch(query, start*onceSearchCount, onceSearchCount, dataType)
 					if tmp != nil && (len(*tmp) == checkNum) { //校验数据量是否够
 						checkOk = true
 						break
 					}
 				}
 				if tmp == nil {
-					log.Printf("GetDataExportSearchResult-%s-第%d页数据查询结果为空\n", scd.Id, start+1)
+					log.Printf("%s-第%d页数据查询结果为空\n", flag, start+1)
 					return
 				}
 				if checkOk {
-					log.Printf("GetDataExportSearchResult-%s-第%d页数据加载完成,共%d条\n", scd.Id, start+1, len(*tmp))
+					log.Printf("%s-第%d页数据加载完成,共%d条\n", flag, start+1, len(*tmp))
 				} else {
-					log.Printf("GetDataExportSearchResult-%s-第%d页数据加载异常,共%d条,预期%d条\n", scd.Id, start+1, len(*tmp), checkNum)
+					log.Printf("%s-第%d页数据加载异常,共%d条,预期%d条\n", flag, start+1, len(*tmp), checkNum)
 				}
 				lock.Lock()
 				res = append(res, *tmp...)
@@ -418,101 +480,22 @@ func GetDataExportSearchResult(entmg mg.MongodbSim, elasticAddress string, scd *
 			}(n)
 		}
 		searchWaitGroup.Wait()
-		log.Printf("GetDataExportSearchResult-%s-分批次加载数据总量为%d\n", scd.Id, len(res))
+		log.Printf("%s-分批次加载数据总量为%d\n", flag, len(res))
 	} else {
-		queryCount := qutil.If(checkCount == -1, 500, checkCount).(int)
-		tmp := doSearch(qstr, 0, queryCount, dataType)
+		queryCount := qutil.If(searchCount == -1, onceSearchCount, searchCount).(int)
+		searchPool <- true
+		tmp := doSearch(query, 0, queryCount, dataType)
+		<-searchPool
 		if tmp == nil || len(*tmp) == 0 {
-			log.Printf("GetDataExportSearchResult-%s-一次性加载数据异常\n", scd.Id)
+			log.Printf("%s-一次性加载数据异常\n", flag)
 		} else {
 			res = *tmp
-			log.Printf("GetDataExportSearchResult-%s-一次性加载数据总量为%d\n", scd.Id, len(res))
-		}
-	}
-	//超级搜索一致的检索(防止数据导出和超级搜索数据量不一致)
-	if scd.Comeinfrom == "supersearchPage" && (len(scd.Keyword) != 0 || len(scd.Industry) != 0) {
-		if len(scd.Keyword) != 0 {
-			num := len(res)
-			searchTextSize := 0
-			if len(scd.Keyword) > 0 {
-				searchTextSize = len([]rune(scd.Keyword[0].Keyword))
-			}
-			if searchTextSize > 3 && num < 50 {
-				secondKWS := jy.HttpEs(scd.Keyword[0].Keyword, "ik_smart", elasticAddress)
-				scd.Keyword[0].Keyword = secondKWS
-				scd.SelectType = "title"
-				qstr = getDataExportSql(scd)
-				log.Printf("GetDataExportSearchResult-%s-分词查询-sql:%s\n", scd.Id, qstr)
-				res2 := doSearch(qstr, 0, 100, "")
-				res = *delRepeatMapArr(&res, res2)
-				if len(res) > 100 {
-					res = res[:100]
-				}
-			}
+			log.Printf("%s-一次性加载数据总量为%d\n", flag, len(res))
 		}
 	}
-	//校验数量
-	if checkCount != len(res) && checkCount != -1 {
-		return nil, fmt.Errorf("GetDataExportSearchResult-%s-数据总量校验异常,期望:%d,实际:%d", scd.Id, checkCount, len(res))
-		//发邮件
-	}
-	res = *FormatExportData(entmg, &res, webdomain, dataType)
-	return &res, nil
+	return
 }
 
-//数据导出预览
-//func GetDataExportSearchResultPreview(sim mg.MongodbSim, elasticAddress string, _id, dataType string) (*[]map[string]interface{}, []KeyWord) {
-//	defer qutil.Catch()
-//	var res []map[string]interface{}
-//	var kws []KeyWord
-//	scd := GetSqlObjFromId(sim, _id)
-//	//获取查询语句
-//	qstr := getDataExportSql(scd)
-//	log.Printf("GetDataExportSearchResultUseId-%s-sql:%s\n", scd.Id, qstr)
-//	kws = scd.Keyword
-//	//数据预览数据查询
-//	if scd.Comeinfrom == "supersearchPage" && len(scd.Keyword) == 0 && len(scd.Industry) == 0 {
-//		//空查询
-//		obj := redis.Get("other", "export_news")
-//		if obj != nil {
-//			res = qutil.ObjArrToMapArr(obj.([]interface{}))
-//		} else {
-//			res = *doSearch(qstr, 0, 500, "2")
-//			if len(res) > 0 {
-//				redis.Put("other", "export_news", res, 7200)
-//			}
-//		}
-//		return &res, kws
-//	} else if scd.Comeinfrom == "supersearchPage" {
-//		//超级搜索非空查询
-//		count := int(elastic.Count(INDEX, TYPE, qstr))
-//		searchTextSize := 0
-//		if len(scd.Keyword) > 0 {
-//			searchTextSize = len([]rune(scd.Keyword[0].Keyword))
-//		}
-//		if searchTextSize > 3 && count < 50 {
-//			var res *[]map[string]interface{}
-//			if count > 0 {
-//				res = doSearch(qstr, 0, count, "")
-//			}
-//			secondKWS := jy.HttpEs(scd.Keyword[0].Keyword, "ik_smart", elasticAddress)
-//			scd.Keyword[0].Keyword = secondKWS
-//			scd.SelectType = "title"
-//			qstr = getDataExportSql(scd)
-//			log.Printf("GetDataExportSearchResultUseId-%s-分词-sql:%s\n", scd.Id, qstr)
-//			res2 := doSearch(qstr, 0, 100, "")
-//			if len(*res2) > 100 {
-//				res2_temp := (*res2)[:100]
-//				res2 = &res2_temp
-//			}
-//			return delRepeatMapArr(res, res2), kws
-//		}
-//	}
-//	//非空查询
-//	res = *doSearch(qstr, 0, 500, dataType)
-//	return &res, kws
-//}
-
 func FormatExportData(entmg mg.MongodbSim, data *[]map[string]interface{}, webdomain string, dataType string, encry ...bool) *[]map[string]interface{} {
 	//格式化输出
 	isEncry := false
@@ -525,7 +508,7 @@ func FormatExportData(entmg mg.MongodbSim, data *[]map[string]interface{}, webdo
 			//查询企业公示 法人 公司电话 公司邮箱地址
 			s_winner, ok := v["s_winner"].(string) //改为entidlist?
 			if ok && s_winner != "" {
-				if entData, ok := entmg.Find(EntTable, bson.M{"company_name": s_winner}, nil, `{"company_name":1,"company_email":1,"legal_person":1,"company_phone":1}`, false, -1, -1); ok {
+				if entData, ok := entmg.Find("winner_enterprise", map[string]interface{}{"company_name": s_winner}, nil, `{"company_name":1,"company_email":1,"legal_person":1,"company_phone":1}`, false, -1, -1); ok {
 					if entData != nil && *entData != nil && len(*entData) > 0 {
 						for _, ev := range *entData {
 							if v["s_winner"] == ev["company_name"] {
@@ -683,6 +666,7 @@ func doSearch(sql string, start, count int, dataType string) *[]map[string]inter
 		//分页排序
 		sql = sql[:len(sql)-1] + `,"sort": {"publishtime":"desc"},"from":` + strconv.Itoa(start) + `,"size":` + strconv.Itoa(count) + "}"
 	}
+	log.Println("doSearch", sql)
 	return elastic.Get(INDEX, TYPE, sql)
 }
 
@@ -751,7 +735,6 @@ func ScreenData(arr *[]map[string]interface{}, dataType string, resultNum int, k
 		keys = append(keys, k)
 	}
 	sort.Ints(keys)
-	log.Println("空字段数量", keys)
 	//选取结果
 	for _, v := range keys {
 		if len(AllMap[v]) >= resultNum {

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

@@ -7,6 +7,7 @@ import (
 	"io/ioutil"
 	"log"
 	"math/big"
+	. "mongodb"
 	"net/http"
 	"net/url"
 	"qfw/util"
@@ -256,3 +257,46 @@ func IsEmail(value string) bool {
 func IsPhone(phone string) bool {
 	return PhoneReg.MatchString(phone)
 }
+
+//获取信息行业
+func Getindustrys(industryname string, mongodb MongodbSim) (industry map[string][]string, sortArray []string) {
+	industry = map[string][]string{}
+	sortArray = []string{}
+	classdata, ok1 := mongodb.FindOneByField("rc_task", `{"s_name":"`+industryname+`"}`, `{"s_class":1}`)
+	if ok1 && len(*classdata) > 0 {
+		classid := ""
+		if util.ObjToString((*classdata)["s_class"]) != "" {
+			classids := strings.Split(util.ObjToString((*classdata)["s_class"]), ",")
+			for k, v := range classids {
+				if k > 0 {
+					classid += `,`
+				}
+				classid += `"` + v + `"`
+			}
+		}
+		industryData, ok := mongodb.Find("rc_rule", `{"s_pid":{"$ne":""},"s_classid":{"$in":[`+classid+`]}}`, `{"i_order":1}`, `{"_id":1,"s_name":1}`, false, -1, -1)
+		if ok && industryData != nil && len(*industryData) > 0 {
+			for _, v := range *industryData {
+				fatFlag := 0
+				industryname, _ := v["s_name"].(string)
+				if strings.Contains(industryname, "_") {
+					fat := strings.Split(industryname, "_")[0]
+					child := strings.Split(industryname, "_")[1]
+					if len(industry[fat]) == 0 {
+						sortArray = append(sortArray, fat)
+					}
+					for _, fv := range industry[fat] {
+						if fv == strings.Trim(child, " ") {
+							fatFlag = 1
+							break
+						}
+					}
+					if fatFlag != 1 {
+						industry[fat] = append(industry[fat], child)
+					}
+				}
+			}
+		}
+	}
+	return industry, sortArray
+}

+ 12 - 5
src/jfw/modules/common/src/qfw/util/jy/pushmapping.go

@@ -9,11 +9,12 @@ import (
 var PushMapping = &pushMapping{}
 
 type pushMapping struct {
-	Area       map[string]int
-	City       map[string]int
-	Toptype    map[string]int
-	Subtype    map[string]int
-	Buyerclass map[string]int
+	Area          map[string]int
+	City          map[string]int
+	Toptype       map[string]int
+	Subtype       map[string]int
+	Buyerclass    map[string]int
+	Subscopeclass map[string]int
 }
 
 func (p *pushMapping) Init(Mysql *mysql.Mysql) {
@@ -21,6 +22,7 @@ func (p *pushMapping) Init(Mysql *mysql.Mysql) {
 	p.Toptype = map[string]int{}
 	p.Subtype = map[string]int{}
 	p.Buyerclass = map[string]int{}
+	p.Subscopeclass = map[string]int{}
 	for _, v := range *infotype {
 		id := util.IntAll(v["id"])
 		tp := util.IntAll(v["type"])
@@ -31,6 +33,8 @@ func (p *pushMapping) Init(Mysql *mysql.Mysql) {
 			p.Subtype[name] = id
 		} else if tp == 3 {
 			p.Buyerclass[name] = id
+		} else if tp == 4 {
+			p.Subscopeclass[name] = id
 		}
 	}
 	if len(p.Toptype) == 0 {
@@ -42,6 +46,9 @@ func (p *pushMapping) Init(Mysql *mysql.Mysql) {
 	if len(p.Buyerclass) == 0 {
 		log.Fatalln("PushMapping Buyerclass Init Error")
 	}
+	if len(p.Subscopeclass) == 0 {
+		log.Fatalln("PushMapping Buyerclass Init Error")
+	}
 	//
 	p.Area = map[string]int{}
 	p.City = map[string]int{}

+ 1 - 1
src/jfw/modules/publicapply/src/bidcollection.json

@@ -1,5 +1,5 @@
 {
-    "payUserCollLimit":5000,
+    "payUserCollLimit":6,
     "freeUserCollLimit":100,
     "pageSize":10
 }

+ 127 - 32
src/jfw/modules/publicapply/src/bidcollection/entity/entity.go

@@ -21,9 +21,9 @@ import (
 )
 
 const (
-	query          = `{"query":{"terms":{"_id":["%s"]}},"_source":["_id","area", "publishtime", "s_subscopeclass", "subtype", "title", "toptype", "type", "buyerclass","bidamount","budget"],"from":0,"size":%d}`
-	mongodb_fields = `{"_id":1,"area":1,"publishtime":1,"s_subscopeclass":1,"subtype":1,"title":1,"toptype":1,"type":1, "buyerclass":1,"budget":1,"bidamount":1}`
-	querys         = `{"query":{"terms":{"_id":["%s"]}},"_source":["_id","title","detail","area","city","publishtime","projectname","buyer","buyerclass","s_winner","bidamount","subtype","toptype","href","projectcode","buyerperson","buyertel","budget","bidopentime","agency","projectscope","winnerperson","winnertel"]}`
+	query          = `{"query":{"terms":{"_id":["%s"]}},"_source":["_id","subtype","s_winner","buyertel","winnertel"],"from":0,"size":%d}`
+	mongodb_fields = `{"_id":1,"area":1,"publishtime":1,"s_subscopeclass":1,"subtype":1,"title":1,"toptype":1,"type":1, "buyerclass":1,"budget":1,"bidamount":1,"winnertel":1,"s_winner":1,"buyertel":1}`
+	querys         = `{"query":{"terms":{"_id":["%s"]}},"_source":["_id","title","detail","area","city","publishtime","projectname","buyer","buyerclass","s_winner","bidamount","subtype","toptype","projectcode","buyertel","budget","bidopentime","agency","projectscope","winnerperson","winnertel"],"from":0,"size":%d}}`
 )
 
 //招标信息是否被收藏
@@ -79,6 +79,15 @@ type BidInfo struct {
 func BidCollOrRemByIds(bidAction BidAction, userid string) bool {
 	var i = 0
 	var wg sync.WaitGroup
+	maxCount := config.BidCollConfig.FreeUserCollLimit
+	isPay := Power(userid)
+	if isPay {
+		maxCount = config.BidCollConfig.PayUserCollLimit
+	}
+	//已收藏的次数
+	collCount := db.Mysql.Count(db.DbConf.Bdcollection, map[string]interface{}{"userid": userid})
+	//格式化数据
+	bidAction.Binfo = FormatColl(bidAction.Binfo)
 	for _, v := range bidAction.Binfo {
 		wg.Add(1)
 		go func(bd BidInfo) {
@@ -95,19 +104,24 @@ func BidCollOrRemByIds(bidAction BidAction, userid string) bool {
 				}
 			} else {
 				if db.Mysql.Count(db.DbConf.Bdcollection, queryMap) == 0 {
-					now := time.Now().Unix()
-					inserMap := map[string]interface{}{
-						"bid":        util.DecodeId(bd.Bid),
-						"buyerclass": jy.PushMapping.Buyerclass[bd.Buyerclass],
-						"buyerinfo":  bd.Buyerinfo,
-						"winnerinfo": bd.Winnerinfo,
-						"userid":     userid,
-						"createdate": qu.FormatDateByInt64(&now, qu.Date_Full_Layout),
-					}
-					if it := db.Mysql.Insert(db.DbConf.Bdcollection, inserMap); it > 0 {
-						i++
+					if int(collCount) >= maxCount {
+						log.Printf("userid :%s,收藏失败 id : %s ,已收藏数量:%v ,上限数量:%v", userid, util.DecodeId(bd.Bid), collCount, maxCount)
 					} else {
-						log.Printf("userid :%s,收藏失败 id : %s", userid, util.DecodeId(bd.Bid))
+						now := time.Now().Unix()
+						inserMap := map[string]interface{}{
+							"bid":        util.DecodeId(bd.Bid),
+							"buyerclass": jy.PushMapping.Buyerclass[bd.Buyerclass],
+							"buyerinfo":  bd.Buyerinfo,
+							"winnerinfo": bd.Winnerinfo,
+							"userid":     userid,
+							"createdate": qu.FormatDateByInt64(&now, qu.Date_Full_Layout),
+						}
+						if it := db.Mysql.Insert(db.DbConf.Bdcollection, inserMap); it > 0 {
+							i++
+							collCount++
+						} else {
+							log.Printf("userid :%s,收藏失败 id : %s", userid, util.DecodeId(bd.Bid))
+						}
 					}
 				} else {
 					log.Printf("userid :%s,已收藏 id : %s", userid, util.DecodeId(bd.Bid))
@@ -170,8 +184,16 @@ func LabelAction(labInfo *LabelInfo, userid string) (ibool bool) {
 		}
 		//收藏招标信息
 		if labInfo.Lids != "" && len(labInfo.Binfo) > 0 {
+			maxCount := config.BidCollConfig.FreeUserCollLimit
+			isPay := Power(userid)
+			if isPay {
+				maxCount = config.BidCollConfig.PayUserCollLimit
+			}
+			//已收藏的次数
+			collCount := db.Mysql.Count(db.DbConf.Bdcollection, map[string]interface{}{"userid": userid})
 			var i = 0
 			var wg sync.WaitGroup
+			labInfo.Binfo = FormatColl(labInfo.Binfo)
 			for _, v := range labInfo.Binfo {
 				wg.Add(1)
 				go func(bd BidInfo) {
@@ -189,19 +211,24 @@ func LabelAction(labInfo *LabelInfo, userid string) (ibool bool) {
 						lids += qu.SE.DecodeString(lv)
 					}
 					if db.Mysql.Count(db.DbConf.Bdcollection, queryMap) == 0 {
-						inserMap := map[string]interface{}{
-							"labelid":    lids,
-							"bid":        util.DecodeId(bd.Bid),
-							"buyerclass": jy.PushMapping.Buyerclass[bd.Buyerclass],
-							"buyerinfo":  bd.Buyerinfo,
-							"winnerinfo": bd.Winnerinfo,
-							"userid":     userid,
-							"createdate": qu.FormatDateByInt64(&now, qu.Date_Full_Layout),
-						}
-						if it := db.Mysql.Insert(db.DbConf.Bdcollection, inserMap); it > 0 {
-							i++
+						if int(collCount) >= maxCount {
+							log.Printf("userid :%s,收藏失败 id : %s ,已收藏数量:%v ,上限数量:%v", userid, util.DecodeId(bd.Bid), collCount, maxCount)
 						} else {
-							log.Printf("userid :%s,收藏失败 id : %s", userid, util.DecodeId(bd.Bid))
+							inserMap := map[string]interface{}{
+								"labelid":    lids,
+								"bid":        util.DecodeId(bd.Bid),
+								"buyerclass": jy.PushMapping.Buyerclass[bd.Buyerclass],
+								"buyerinfo":  bd.Buyerinfo,
+								"winnerinfo": bd.Winnerinfo,
+								"userid":     userid,
+								"createdate": qu.FormatDateByInt64(&now, qu.Date_Full_Layout),
+							}
+							if it := db.Mysql.Insert(db.DbConf.Bdcollection, inserMap); it > 0 {
+								i++
+								collCount++
+							} else {
+								log.Printf("userid :%s,收藏失败 id : %s", userid, util.DecodeId(bd.Bid))
+							}
 						}
 					} else {
 						if db.Mysql.Update(db.DbConf.Bdcollection, queryMap, map[string]interface{}{"labelid": lids}) {
@@ -325,7 +352,7 @@ func GetCollList(c *CollList, userid string) map[string]interface{} {
 	// rdata["res"] = result
 	rdata["count"] = count
 	rdata["haveNextPage"] = haveNextPage
-	rdata["res"] = GetInfoById(db.Mgo_Bidding, db.DbConf.Mongodb.Bidding.Collection, db.DbConf.Mongodb.Bidding.Collection_change, result)
+	rdata["res"] = GetInfoById(db.Mgo_Bidding, db.DbConf.Mongodb.Bidding.Collection, db.DbConf.Mongodb.Bidding.Collection_change, userid, result)
 	return rdata
 }
 
@@ -353,7 +380,6 @@ func Power(userid string) bool {
 			}
 		}
 	}
-	log.Println(isVip, isEnt, isMember)
 	return isVip || isEnt || isMember
 }
 
@@ -367,10 +393,13 @@ type InfoList struct {
 	Publishtime     int64       `json:"publishtime"`
 	Budget          interface{} `json:"budget"`
 	Bidamount       interface{} `json:"bidamount"`
+	Buyer           string      `json:"buyer"`
+	S_winner        string      `json:"s_winner"`
+	Bidopentime     int64       `json:"bidopentime"`
 }
 
 //根据id取内容
-func GetInfoById(Mgo_bidding mg.MongodbSim, bidding, bidding_back string, idlist []map[string]interface{}) []*InfoList {
+func GetInfoById(Mgo_bidding mg.MongodbSim, bidding, bidding_back, userid string, idlist []map[string]interface{}) []*InfoList {
 	array := make([]*InfoList, len(idlist))
 	if len(idlist) == 0 {
 		return array
@@ -400,7 +429,7 @@ func GetInfoById(Mgo_bidding mg.MongodbSim, bidding, bidding_back string, idlist
 	//	log.Println(es_ids)
 	//elasticsearch
 	if len(es_ids) > 0 {
-		list := elastic.Get("bidding", "bidding", fmt.Sprintf(query, strings.Join(es_ids, `","`), len(es_ids)))
+		list := elastic.Get("bidding", "bidding", fmt.Sprintf(querys, strings.Join(es_ids, `","`), len(es_ids)))
 		if list != nil {
 			for _, v := range *list {
 				_id := qu.ObjToString(v["_id"])
@@ -454,7 +483,7 @@ func GetInfoById(Mgo_bidding mg.MongodbSim, bidding, bidding_back string, idlist
 	return array
 }
 
-//历史推送记录中单条信息格式化
+//列表单条信息格式化
 func InfoFormat(p string, info *map[string]interface{}) *InfoList {
 	area := qu.ObjToString((*info)["area"])
 	if area == "A" {
@@ -497,5 +526,71 @@ func InfoFormat(p string, info *map[string]interface{}) *InfoList {
 		Publishtime:     qu.Int64All((*info)["publishtime"]),
 		Budget:          (*info)["budget"],
 		Bidamount:       (*info)["bidamount"],
+		Buyer:           qu.ObjToString((*info)["buyer"]),
+		S_winner:        qu.ObjToString((*info)["s_winner"]),
+		Bidopentime:     qu.Int64All((*info)["bidopentime"]),
+	}
+}
+
+func FormatColl(bidinfo []BidInfo) []BidInfo {
+	es_ids := []string{}
+	infos := map[string]interface{}{}
+	for _, v := range bidinfo {
+		es_ids = append(es_ids, util.DecodeId(v.Bid))
+	}
+	if len(es_ids) > 0 {
+		list := elastic.Get("bidding", "bidding", fmt.Sprintf(query, strings.Join(es_ids, `","`), len(es_ids)))
+		if list != nil {
+			for _, v := range *list {
+				_id := qu.ObjToString(v["_id"])
+				//中标电话 需要查企业库 和三级页保持一致
+				winnertel := qu.ObjToString(v["winnertel"])
+				if winnertel == "" && isbid(v["subtype"]) {
+					v["winnertel"] = getwinnertel(v["s_winner"])
+				}
+				infos[_id] = v
+			}
+		}
+	}
+	if len(infos) > 0 {
+		for k, v := range bidinfo {
+			id := util.DecodeId(v.Bid)
+			if infos[id] != nil {
+				infoMap, _ := (infos[id]).(map[string]interface{})
+				if qu.ObjToString(infoMap["winnertel"]) != "" {
+					v.Winnerinfo = true
+					bidinfo[k].Winnerinfo = true
+				}
+				if qu.ObjToString(infoMap["buyertel"]) != "" {
+					v.Buyerinfo = true
+					bidinfo[k].Buyerinfo = true
+
+				}
+			}
+
+		}
+	}
+	return bidinfo
+}
+
+func isbid(typ interface{}) bool {
+	if typ != nil {
+		subtype := qu.ObjToString(typ)
+		if subtype == "中标" || subtype == "合同" || subtype == "成交" {
+			return true
+		}
+	}
+	return false
+}
+
+func getwinnertel(company interface{}) string {
+	if company != nil {
+		data, _ := db.Mgo_Ent.FindOneByField("winner_enterprise", map[string]interface{}{
+			"company_name": qu.ObjToString(company),
+		}, map[string]interface{}{"company_phone": 1})
+		if (*data)["company_phone"] != nil {
+			return qu.ObjToString((*data)["company_phone"])
+		}
 	}
+	return ""
 }

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

@@ -4,7 +4,6 @@ import (
 	. "api"
 	"bidcollection/entity"
 	"encoding/json"
-	"log"
 	qu "qfw/util"
 )
 

+ 2 - 1
src/jfw/modules/publicapply/src/config.json

@@ -13,5 +13,6 @@
             "pwd": "ue9Rg9Sf4CVtdm5a",
             "user": "public03@topnet.net.cn"
         }
-    ]
+    ],
+    "industry": "分类综合测试"
 }

+ 1 - 0
src/jfw/modules/publicapply/src/config/config.go

@@ -12,6 +12,7 @@ type config struct {
 		Pwd  string
 		User string
 	}
+	Industry string
 }
 type BidColl struct {
 	PayUserCollLimit  int

+ 10 - 0
src/jfw/modules/publicapply/src/db.json

@@ -22,6 +22,16 @@
 			"collection_change": "bidding_back",
 			"userName": "jyDevGroup",
 			"password": "jy@DevGroup"
+		},
+		"ent": {
+			"address": "192.168.3.207:27001,192.168.3.206:27002",
+	 		"size": 5,
+	 		"dbName": "mixdata",
+			"replSet": "",
+			"collection": "qyxy",
+			"collection_change": "qyxy_change",
+			"userName": "jyDevGroup",
+			"password": "jy@DevGroup"
 		}
 	},
 	"elasticsearch": {

+ 28 - 12
src/jfw/modules/publicapply/src/db/db.go

@@ -16,6 +16,7 @@ type dbConf struct {
 		Main    *mgoConf
 		Log     *mgoConf
 		Bidding *mgoConf
+		Ent     *mgoConf
 	}
 	Elasticsearch struct {
 		Main *esConf
@@ -62,6 +63,7 @@ var (
 	Mgo         m.MongodbSim
 	Mgo_Log     m.MongodbSim
 	Mgo_Bidding m.MongodbSim
+	Mgo_Ent     m.MongodbSim
 	Mysql       *mysql.Mysql
 	MysqlPush   *mysql.Mysql
 )
@@ -104,6 +106,32 @@ func init() {
 			}
 			Mgo_Log.InitPool()
 		}
+		//
+		if DbConf.Mongodb.Bidding != nil {
+			log.Println("初始化 mongodb bidding")
+			Mgo_Bidding = m.MongodbSim{
+				MongodbAddr: DbConf.Mongodb.Bidding.Address,
+				Size:        DbConf.Mongodb.Bidding.Size,
+				DbName:      DbConf.Mongodb.Bidding.DbName,
+				ReplSet:     DbConf.Mongodb.Bidding.ReplSet,
+				UserName:    DbConf.Mongodb.Bidding.UserName,
+				Password:    DbConf.Mongodb.Bidding.Password,
+			}
+			Mgo_Bidding.InitPool()
+		}
+		//
+		if DbConf.Mongodb.Ent != nil {
+			log.Println("初始化 mongodb ent")
+			Mgo_Ent = m.MongodbSim{
+				MongodbAddr: DbConf.Mongodb.Ent.Address,
+				Size:        DbConf.Mongodb.Ent.Size,
+				DbName:      DbConf.Mongodb.Ent.DbName,
+				ReplSet:     DbConf.Mongodb.Ent.ReplSet,
+				UserName:    DbConf.Mongodb.Ent.UserName,
+				Password:    DbConf.Mongodb.Ent.Password,
+			}
+			Mgo_Ent.InitPool()
+		}
 		if DbConf.Mysql.Main != nil {
 			log.Println("初始化 mysql")
 			Mysql = &mysql.Mysql{
@@ -129,17 +157,5 @@ func init() {
 			MysqlPush.Init()
 			jy.PushMapping.Init(MysqlPush)
 		}
-		if DbConf.Mongodb.Bidding != nil {
-			log.Println("初始化 mongodb bidding")
-			Mgo_Bidding = m.MongodbSim{
-				MongodbAddr: DbConf.Mongodb.Bidding.Address,
-				Size:        DbConf.Mongodb.Bidding.Size,
-				DbName:      DbConf.Mongodb.Bidding.DbName,
-				ReplSet:     DbConf.Mongodb.Bidding.ReplSet,
-				UserName:    DbConf.Mongodb.Bidding.UserName,
-				Password:    DbConf.Mongodb.Bidding.Password,
-			}
-			Mgo_Bidding.InitPool()
-		}
 	}
 }

+ 154 - 0
src/jfw/modules/publicapply/src/enterpriseSearch/entity/entQuery.go

@@ -0,0 +1,154 @@
+package entity
+
+import (
+	"fmt"
+	"log"
+	qutil "qfw/util"
+	"qfw/util/elastic"
+	"strings"
+)
+
+type EnterpriseSearch struct {
+	Match       string //搜索内容
+	MatchType   string //搜索范围[A:企业名称,B:法定代表人,C:股东,D:高管,E:标的物]
+	EntArea     string //注册地省份[多个用逗号分割]
+	EntCity     string //注册地城市[多个用逗号分割]
+	EntCapital  string //注册资本[min-max,必有-]
+	EntType     string //企业类型[]
+	EntStatus   string //企业状态[吊销、存续、撤销、(停业??)]
+	BiddingArea string //中标地区[会员:多个用逗号分割]
+	EntClass    string //单位类型[会员:采购单位、投标企业、代理机构、厂商]
+	EntContact  string //联系方式[会员:固定电话、手机号、邮箱、不存在]
+
+	PageSize int  //每页数量
+	PageNum  int  //页码
+	IsVip    bool //是否是会员
+}
+
+const (
+	searchMaxLimit = 100 //最大查询数量限制
+	freeSearchNum  = 5   //免费查询数量限制
+
+	index, itype = "qyxy", "qyxy"
+)
+
+var (
+	AllMatchType = map[string]string{
+		"A": `{"match_phrase":{"ent_ikname":"%s"}}`, //企业名称
+		"B": `{"term":{"legal_person":"%s"}}`,       // 法定代表人
+		"C": `{"term":{"stock_name":"%s"}}`,         //股东
+		"D": `{"term":{"employee_name":"%s"}}`,      //高管
+		"E": `{"term":{"bid_purchasing":"%s"}}`,     //标的物
+	}
+)
+
+//Check 校验查询参数是否合法
+func (es *EnterpriseSearch) Check() (*EnterpriseSearch, error) {
+	if es.PageSize == 0 { //默认十条
+		es.PageSize = 10
+	}
+	if (es.PageNum+1)*es.PageSize > searchMaxLimit {
+		return nil, fmt.Errorf("超出查询数量限制")
+	}
+	if es.EntCapital != "" && strings.Index(es.EntCapital, "-") < 0 {
+		return es, fmt.Errorf("金额查询参数异常")
+	}
+	return es, nil
+}
+
+//GetQuerySql 获取检索语句
+//return  company_name、company_status、legal_person、capital、company_address、id
+//返回字段 企业名称、企业状态、法人、注册资本、地址、企业id
+func (es *EnterpriseSearch) GetQuerySql() string {
+	query := `{"query":{"bool":{"must":[%s]}},"_source":["id","company_name","GetQuerySql","legal_person","capital","company_address"]}`
+	musts := make([]string, 0, 0)
+	//输入查询
+	if es.Match != "" {
+		if es.MatchType != "" { //查询指定内容
+			for _, t := range strings.Split(es.MatchType, ",") {
+				if thisQuery, exists := AllMatchType[t]; exists {
+					musts = append(musts, fmt.Sprintf(thisQuery, es.Match))
+				}
+			}
+		} else { //查询全部
+			for _, q := range AllMatchType {
+				musts = append(musts, fmt.Sprintf(q, es.Match))
+			}
+		}
+	}
+	//注册地
+	if es.EntArea != "" {
+		musts = append(musts, fmt.Sprintf(`{"terms":{"company_area":["%s"]}}`, strings.ReplaceAll(es.EntArea, ",", "\",\"")))
+	}
+	if es.EntCity != "" {
+		musts = append(musts, fmt.Sprintf(`{"terms":{"company_city":["%s"]}}`, strings.ReplaceAll(es.EntCity, ",", "\",\"")))
+	}
+	//注册资本
+	if es.EntCapital != "" {
+		moneyRange := strings.Split(es.EntCapital, "-")
+		limit, max, moneyQuery := qutil.Int64All(moneyRange[0]), qutil.Int64All(moneyRange[1]), ""
+		if limit > 0 {
+			moneyQuery = fmt.Sprintf(`"from": "%d"`, qutil.Int64All(limit))
+		}
+		if max > 0 {
+			if moneyQuery != `` {
+				moneyQuery += ","
+			}
+			moneyQuery += fmt.Sprintf(`"to": "%d"`, qutil.Int64All(max))
+		}
+		if moneyQuery != "" {
+			musts = append(musts, fmt.Sprintf(`{"range": {"capital": {%s}}}`, moneyQuery))
+		}
+	}
+	//企业类型(页面显示的企业与数据已存在的类型不一致)
+	if es.EntType != "" {
+		musts = append(musts, fmt.Sprintf(`{"terms":{"xxx":["%s"]}}`, strings.ReplaceAll(es.EntType, ",", "\",\"")))
+	}
+	//企业状态
+	if es.EntStatus != "" {
+		musts = append(musts, fmt.Sprintf(`{"terms":{"company_status":["%s"]}}`, strings.ReplaceAll(es.EntStatus, ",", "\",\"")))
+	}
+	//中标区域 vip
+	if es.BiddingArea != "" && es.IsVip {
+		musts = append(musts, fmt.Sprintf(`{"term":{"bid_area":"%s"}}`, es.BiddingArea))
+	}
+	//单位类型 vip
+	if es.EntClass != "" && es.IsVip {
+		musts = append(musts, fmt.Sprintf(`{"term":{"bid_unittype":"%s"}}`, es.EntClass))
+	}
+	//联系方式 vip
+	if es.EntContact != "" && es.IsVip {
+		musts = append(musts, fmt.Sprintf(`{"term":{"bid_contracttype":"%s"}}`, es.EntContact))
+	}
+	return fmt.Sprintf(query, strings.Join(musts, ","))
+}
+
+//DoQuery 根据EnterpriseSearch参数进行企业相关查询
+func (es *EnterpriseSearch) DoQuery() (list *[]map[string]interface{}, total int64, err error) {
+	sql := es.GetQuerySql()
+	log.Println("EnterpriseSearch DoQuery sql", sql)
+
+	start, limit := es.PageNum*es.PageSize, es.PageSize
+	total = -1
+
+	if !es.IsVip {
+		start, limit = 0, freeSearchNum
+	} else if start == 0 {
+		if total = elastic.Count(index, itype, sql); total == 0 {
+			return
+		}
+	}
+	sql = sql[:len(sql)-1] + fmt.Sprintf(`,"from":%d,"size":%d}"`, start, limit)
+	list = elastic.Get(index, itype, sql)
+	//格式化字段,加密id
+	if list != nil {
+		for index, _ := range *list {
+			encodeId := ""
+			if encode := qutil.DecodeArticleId2ByCheck(qutil.ObjToString((*list)[index]["id"])); len(encode) > 0 {
+				encodeId = encode[0]
+			}
+			(*list)[index]["id"] = encodeId
+		}
+	}
+	return
+}

+ 11 - 0
src/jfw/modules/publicapply/src/enterpriseSearch/init.go

@@ -0,0 +1,11 @@
+package enterpriseSearch
+
+import (
+	"enterpriseSearch/service"
+
+	"github.com/go-xweb/xweb"
+)
+
+func init() {
+	xweb.AddAction(&service.EnterpriseSearchAction{})
+}

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

@@ -0,0 +1,60 @@
+package service
+
+import (
+	. "api"
+	"db"
+	"enterpriseSearch/entity"
+	"github.com/go-xweb/xweb"
+	"log"
+	qutil "qfw/util"
+	"qfw/util/jy"
+)
+
+type EnterpriseSearchAction struct {
+	*xweb.Action
+	doEntSearch xweb.Mapper `xweb:"/enterpriseSearch/doQuery"` //企业搜索
+}
+
+//企业搜索
+func (esa *EnterpriseSearchAction) DoEntSearch() {
+	userId, _ := esa.GetSession("userId").(string)
+	rData, errMsg := func() (interface{}, error) {
+		entSearch, err := (&entity.EnterpriseSearch{
+			Match:       esa.GetString("match"),
+			MatchType:   esa.GetString("matchType"),
+			EntArea:     esa.GetString("entArea"),
+			EntCity:     esa.GetString("entCity"),
+			EntCapital:  esa.GetString("entCapital"),
+			EntType:     esa.GetString("entType"),
+			EntStatus:   esa.GetString("entStatus"),
+			BiddingArea: esa.GetString("biddingArea"),
+			EntClass:    esa.GetString("entClass"),
+			EntContact:  esa.GetString("entContact"),
+			PageSize:    qutil.IntAll(esa.GetString("pageSize")),
+			PageNum:     qutil.IntAll(esa.GetString("pageNum")),
+		}).Check()
+		if err != nil {
+			return nil, err
+		}
+		//查询是否是会员
+		if vipData := jy.GetBigVipUserBaseMsg(userId, db.Mysql, db.Mgo); vipData.Status > 0 || vipData.VipStatus > 0 {
+			entSearch.IsVip = true
+		}
+		//查询
+		searchList, total, err := entSearch.DoQuery()
+		if err != nil {
+			return nil, err
+		}
+		returnData := map[string]interface{}{
+			"list": searchList,
+		}
+		if total >= 0 {
+			returnData["total"] = total
+		}
+		return returnData, nil
+	}()
+	if errMsg != nil {
+		log.Printf("%s EnterpriseSearchAction DoEntSearch异常:%s\n", userId, errMsg.Error())
+	}
+	esa.ServeJson(NewResult(rData, errMsg))
+}

+ 6 - 0
src/jfw/modules/publicapply/src/filter/sessionfilter.go

@@ -3,6 +3,7 @@ package filter
 import (
 	. "api"
 	"net/http"
+	"regexp"
 
 	"github.com/go-xweb/xweb"
 )
@@ -12,7 +13,12 @@ type sessionfilter struct {
 	App *xweb.App
 }
 
+var reg = regexp.MustCompile("^/publicapply/free/.*")
+
 func (l *sessionfilter) Do(w http.ResponseWriter, req *http.Request) bool {
+	if reg.MatchString(req.URL.Path) {
+		return true
+	}
 	session := l.App.SessionManager.Session(req, w)
 	userId, ok := session.Get("userId").(string)
 	if !ok || userId == "" {

+ 11 - 0
src/jfw/modules/publicapply/src/free/init.go

@@ -0,0 +1,11 @@
+package bidcollection
+
+import (
+	. "free/service"
+
+	"github.com/go-xweb/xweb"
+)
+
+func init() {
+	xweb.AddAction(&Free{})
+}

+ 10 - 0
src/jfw/modules/publicapply/src/free/service/action.go

@@ -0,0 +1,10 @@
+package service
+
+import (
+	"github.com/go-xweb/xweb"
+)
+
+type Free struct {
+	*xweb.Action
+	getindustrys xweb.Mapper `xweb:"/free/getindustrys"` //获取信息行业
+}

+ 30 - 0
src/jfw/modules/publicapply/src/free/service/service.go

@@ -0,0 +1,30 @@
+package service
+
+import (
+	. "api"
+	. "config"
+	. "db"
+	"qfw/util/jy"
+)
+
+var industrylist map[string][]string
+var sortArray []string
+
+//
+func init() {
+	industrylist, sortArray = jy.Getindustrys(Config.Industry, Mgo)
+}
+func (f *Free) Getindustrys() {
+	list := []map[string]interface{}{}
+	for _, v := range sortArray {
+		if industrylist[v] == nil || len(industrylist[v]) == 0 {
+			continue
+		}
+		list = append(list, map[string]interface{}{
+			v: industrylist[v],
+		})
+	}
+	f.ServeJson(Result{
+		Data: list,
+	})
+}

+ 2 - 0
src/jfw/modules/publicapply/src/main.go

@@ -5,7 +5,9 @@ import (
 	_ "bidcollection"
 	. "config"
 	_ "db"
+	_ "enterpriseSearch"
 	_ "filter"
+	_ "free"
 	"net/http"
 
 	"github.com/go-xweb/xweb"

+ 3 - 1
src/jfw/modules/subscribepay/src/service/dataExportPay.go

@@ -120,6 +120,7 @@ func (p *DataExportPay) CreateOrder() {
 					disWord = fmt.Sprint((*infoList)[0]["password"])
 				}
 			}
+			delete(*userfilter, "selectIds")
 			filterByte, _ := json.Marshal(userfilter)
 			filter = string(filterByte)
 		} else {
@@ -151,7 +152,8 @@ func (p *DataExportPay) CreateOrder() {
 		ordercode := pay.GetOrderCode(openId)
 		download_url := util.GetExcelFilePath(ordercode)
 		go func() {
-			list, err := dataexport.GetDataExportSearchResultByScdId(util.MQFW, util.MQFWENT, config.Config.Elasticsearch, id, qutil.If(data_spec == "高级字段包", "2", "1").(string), data_count, config.Config.WebDomain)
+			list, err := dataexport.GetDataExportSearchResultByScdId(util.MQFW, config.Config.Elasticsearch, id, qutil.If(data_spec == "高级字段包", "2", "1").(string), data_count)
+			list = dataexport.FormatExportData(util.MQFWENT, list, config.Config.WebDomain, qutil.If(data_spec == "高级字段包", "2", "1").(string))
 			if err == nil {
 				err = util.CreateDataExportExcelFile(list, data_spec == "高级字段包", download_url)
 			}

+ 1 - 1
src/jfw/public/entdataexport.go

@@ -30,7 +30,7 @@ func GetEntDataExportCount(_id string, entId, entUserId, limitNum, current int,
 	dataType := "2"
 	//数据导出数据查询
 
-	res, err := dataexport.GetDataExportSearchResultByScdId(Mgo_Ent, MQFW, DbConf.Elasticsearch.Main.Address, _id, dataType, count, webdomain)
+	res, err := dataexport.GetDataExportSearchResultByScdId(MQFW, DbConf.Elasticsearch.Main.Address, _id, dataType, count)
 	if err != nil {
 		log.Println("企业数据导出错误 ", err)
 		return 0, 0, nil

+ 399 - 0
src/web/staticres/collection/css/index.css

@@ -0,0 +1,399 @@
+.collection{
+  width: 100%;
+}
+
+/* 时间选择弹窗s */
+.headertitle{
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  padding: .44rem .32rem .24rem;
+  width: 100%;
+  font-size: .4rem;
+  font-weight: 500;
+  color: #171826;
+}
+.headertitle .title_close{
+  display: flex;
+  width: .4rem;
+  height: .4rem;
+  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAMAAAAM7l6QAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAgVBMVEUAAAChoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaEAAADUxRFJAAAAKXRSTlMABUuRxuj4EH7q6VXnA5Srk1b+wcP8f2UBm6BgxL+SxfkGgFhX60zH+uqurTcAAAABYktHRACIBR1IAAAACXBIWXMAAAsSAAALEgHS3X78AAAA00lEQVQoz4WT1xaCMAxAwyh7uVAQAVFG/v8HLSAjiO19aU7vOZBmAEwoqqYzw2C6piqwxbRsnHEsk1rXQ4LnrqQf4A+BP9sQdwgnH+Eu0fe/+IfDkPOY1fG03J8vw8H6/OPRXm/JZFP/PvqYV2N8b+bD5FMePobIVkDF5TIhAUeFHKlfW8whQ+KJxQJWpe4VsWhDicQTi6VMSz5eiFMTPiySlUVY1KewJVXfUCZsqGQcZMMkG0XJIHNejEr23ixRVS+yrjZL1K9gk7dO1zlt3iwr+AHFoWJRdvcdHQAAAABJRU5ErkJggg==) no-repeat;
+  background-size: contain;
+}
+.datepopup .van-picker-column__item.van-picker-column__item--selected{
+  font-size: .36rem;
+  color: #2ABED1;
+}
+.datepopup .van-picker-column__item{
+  float: none!important;
+}
+/* end */
+.collection .search-container{
+  position: relative;
+}
+.collection .van-dropdown-menu__bar.van-dropdown-menu__bar--opened{
+  width: auto;
+  overflow: auto;
+  height: .88rem;
+  box-shadow: none;
+  border-bottom: 1.5px solid rgba(0,0,0,0.05);
+  z-index: 10;
+}
+.collection .van-dropdown-menu__item{
+  flex: none;
+  padding: .24rem .38rem;
+}
+.collection .my-search.van-search.van-search--show-action{
+  border-bottom:1.5px solid rgba(0,0,0,0.05);
+}
+.collection .van-search__content{
+  border-radius: .18rem;
+  height: .8rem;
+}
+
+.collection .van-search .van-cell{
+  padding: 10px 12px;
+}
+
+.collection .van-dropdown-menu__title.van-dropdown-menu__title--active.van-dropdown-menu__title--down{
+  color: #2ABED1;
+  font-size: .28rem;
+}
+.collection .van-icon.van-icon-search{
+  width: .4rem;
+  height: .4rem;
+}
+.collection .van-list{
+  padding: 0 .32rem;
+  background: #ffffff;
+}
+.collection .listaction{
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  padding: 0 .32rem;
+  width: 100%;
+  height: .88rem;
+  background: #ffffff;
+  font-size: .28rem;
+  font-weight: 500;
+  color: #2abed1;
+  line-height: .4rem;
+}
+.collection .data_report .collec_datareport{
+  display: flex;
+}
+.collection .data_download{
+  display: flex;
+  margin-right: .08rem;
+  width: .32rem;
+  height: .32rem;
+  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAeCAYAAABNChwpAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAJkSURBVFhH7ZbLaxNRFMb9e5RWtCKoCzelO0FEpAg+Fy7adalvBAVd6E78H0QXgtWKYhu1BJtEm7RJ20zS1Ngkk1jzaB6TmWQmX88ZJ8poksmMjW7ywV3ce7nz/eaec8+9u/Cf1QdwDKA2GsgpdfgLFYSKEurUdyLHAMW6ipfpPI7OhXDSI0CsKsaMPTkGSEoKHsXS2D0TwOEPQUyJeWPGnhwDxCsyHkRTfYA+QB+g9wBCqYq337YQLkmQNc0YtQYoU6FyZ0vw5kp6xWwnS4C7QhKnfRFcW/6KefpYE6ITAJs/TWZxyR/DWGAdc9miMfOnLAHGAjEMuRZx4N0SLofiWCiUoRBEO4CKqmI6k8cpr4C9s4sYdi9jKp3T51rJEoAXX/gc/QkxSRB+goiUqyaA52IOkqphmu6HE54wBsn8CI3fCSf0MLZTV0n4OlPAeYLYb0BMBON4QUb3KDwMcOh9EI8T3ylXChhxr2Bg9sfYzZUNPXc6qSsA1hv6OEPsI4gh1xJGvRGMU3wZgKGuU47wzbiH+geN/hrtkpW6BmDxH54jCI4tG7dqHKqrZB6XZGNVZ9kCYLk2t3DmUxQDLcwZ7AaZ23kb2AaoaQ19J0Z9gsl8kOI+Efyin3nNxuvINgCrStk+QztxlnaCzTk5+XTYNWc5AmDxeffly7i1uqEfx3/+JGPJtBMJepqJsjNz1l8B7IRMAFznPVTvn1Ad71V7RUVtvfKrPpgANpUaLi6s4djH1Z41LmAPY6Lh+BtARq7h+HzYdLx2unGJvk33Q1MmAM7sZ6ksrlAx6VW7H0nRO6F5PQPb/EEL2Uq9DN4AAAAASUVORK5CYII=) no-repeat;
+  background-size: contain;
+}
+.collection .collec_active{
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+.collec_active .cancel_collec{
+  margin-right: .22rem;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+}
+.collection .collec_li{
+  padding: .36rem 0 .4rem;
+  width: 100%;
+  background: #ffffff;
+  border-bottom: 0.5px solid rgba(0,0,0,0.05);
+}
+.collection .collec_li .collec_head{
+  display: flex;
+  justify-content: space-between;
+  align-items: flex-start;
+}
+.collection .collec_li .collec_title{
+  flex: 1;
+  font-size: .32rem;
+  color: #171826;
+  font-weight: 500;
+  line-height: .48rem;
+}
+.collec_star{
+  margin-left: .36rem;
+  width: .4rem;
+  height: .4rem;
+}
+.collec_star .shoucang{
+  display: flex;
+  width: .4rem;
+  height: .4rem;
+  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAHRSURBVHgB1VVLTsMwEH1jCB8hpHICwpIVsASERE4CV+AEcARuAjdoJYTY0e4QbBpOQBGC8quH5/RD2jiti7rhSZNY8fjNmxnbAaaAVlFxNs2a+WmcEeECJhslmDX0Cod6Dc2M49B1JtQRgtPBeC43nkWATLHkVCuzCcwiLAODo8K3wCxkkgN3TYwFNL2TFokcoIbQAHpDsi9sU3FMW6fKWFfkEO+oyIf61qdkSPluMNgjS9fgupbs850PwHqecaKQsi5yerWn4UshL+pUh0FwIns47/bA4JLPVsFpKTeOBLpmoMsTq+o2QYtW61K7YN2UkkKQSEZVASsM5LIyY8iFvemVaeCWfTDYAbKaulNbDpZOK8YXJM2T9zUNC3CNtqiyFLFTOxau72/sTVu75Ibkuz2BZQH6QViGOksUdLHJm6Z41wK5g7eSmWMkKUJg1e2wlo/cYdxtuo1J+N26cZmLN4PPhwnkSuJX2vPgXFT0lgczNIDRuRhlcKqfSNweOdlt/z/C3wOrxQxEax1rE5InVJ0W5kvK5O2BMbqlgw2mjY7Vk2hz6FLb4I/nmG93vcQ9qd4SeWEfpGrvpfl9l5GMhQtEa9LqCIXWp/ux/3XN/8APC++o0hFQWAMAAAAASUVORK5CYII=) no-repeat;
+  background-size: contain;
+}
+.collec_star .weishoucang{
+  display: flex;
+  width: .4rem;
+  height: .4rem;
+  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAJESURBVHgB1VXRbdswEL2jqH5rg7gT1NnA3iAdIKmNxiqCfhSdQOkETb+M2goUxO13vEHcCapOEGUDfQaQyOsdYQV2ItdU/noATYt6994deUcBdLAsyyIZXXx0F3Bt9M3679DXR/kCp/PFgCc35vNs4OvnLaAREgQqAKgE1Imvn5dAE7218MUSfoMOWXgJhIjvJPo4Prl6peuLLlnsFZhOsx4BjSR6eR6Px2WXLPApmQp1H4h6WqkDwzMDBhx9GQTmUMgFJ6Vam+AOQZUsXijEvLb23oLJLUH5MR7nWwLf54tzxYe4rc3bAFggUm4N/JLt2XybposjC8BbBz3G8sCt/rBEnz9MTi5cHyDVS8Dgk4DY4W1V1fnZ2biAf9jp6fGSp2XzLFlVVXCECjMJDsmsZN2dQcwpkTXDddRf4QX28AARKJUIh3DF6216PGRZqCtzaMFCGIa3ch6+5IIN2Eex7ya5GLaDAwYrqKpquG+rNsmryjzDPytTARgGEthIhzqDPRaG+mYXeatAI4JcQeBnBQGWuzLd2WgE0OfxB/YYn9k9uFJtt1aB2Szrr0VWzZqU4fxykcxm16MtMDcZ/0Zp+vPAW0Ap3ZO5tnXhBC+vR5UJf7PiudR5mv64exQyxlWMdWXuKWDIugy4u6MZkyFh5q5q4g8NDynlRogwGLhskXptXK1ftADVG5KXqG/ZNRfSyeR4tQF5LVkRUcL3kGvMQOGBtwCTRxKx3KBP76DG4vdu/UqE2CHhFPrga10/7C/1+T/sL+2vJ0ALxXBYAAAAAElFTkSuQmCC) no-repeat;
+  background-size: contain;
+}
+.collection .collec_li .collec_action{
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-top: .24rem;
+}
+
+.collec_action .collec_tags{
+  display: flex;
+  align-items: center;
+}
+.collec_action .collec_tags .tag_active{
+  margin-right: .08rem;
+  padding: .02rem .16rem;
+  height: .36rem;
+  font-size: .24rem;
+  font-weight: 500;
+  text-align: CENTER;
+  color: #5f5e64;
+  border-radius: .05rem;
+  opacity: 1;
+  background: #f7f9fa;
+  border: 1px solid rgba(0,0,0,0.05);
+}
+.collec_action .collec_time{
+  font-size: .24rem;
+  font-weight: 500;
+  color: #9b9ca3;
+  line-height: .36rem;
+}
+
+.collection .taglist{
+  flex: none;
+  height: 6rem;
+  display: flex;
+  flex-wrap: wrap;
+  padding: .32rem;
+  flex-direction: row;
+
+}
+.collection .taglist .area-card-item{
+  height: .72rem;
+  background: #F5F6F7;
+  border-radius: .08rem;
+  color: #5F5E64;
+  font-size: .28rem;
+  line-height: .72rem;
+  padding: 0 .4rem;
+  margin:0 .2rem .2rem 0;
+}
+.collection .taglist .area-card-item.active{
+  position: relative;
+  background: #E8FAFD;
+  color: #2ABED1;
+}
+.collection .taglist .area-card-item.active::after{
+  content: "";
+  position: absolute;
+  right: 0;
+  bottom: 0;
+  background: url(/jyapp/big-member/image/icon-check.png);
+  width: .28rem;
+  height: .28rem;
+  background-size: 100% 100%;
+}
+
+.collection .dateTags{
+  padding: 0 .32rem;
+  flex: none;
+  height: 6rem;
+}
+.collection .dateTags .van-field__control{
+  font-size: .28rem;
+  color: #171826;
+  line-height: .4rem;
+}
+.collection .timeTag{
+  display: flex;
+  padding: .32rem 0;
+}
+.collection .timeTag .area-card-item{
+  width: 1.56rem;
+  height: .72rem;
+  background: #F5F6F7;
+  border-radius: .08rem;
+  color: #5F5E64;
+  font-size: .28rem;
+  text-align: center;
+  line-height: .72rem;
+  margin:0 .2rem .2rem 0;
+}
+.collection .timeTag .area-card-item.active{
+  position: relative;
+  background: #E8FAFD;
+  color: #2ABED1;
+}
+.collection .timeTag .area-card-item.active::after{
+  content: "";
+  position: absolute;
+  right: 0;
+  bottom: 0;
+  background: url(/jyapp/big-member/image/icon-check.png);
+  width: .28rem;
+  height: .28rem;
+  background-size: 100% 100%;
+}
+.collection .timePicker{
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  padding: .16rem;
+  width: 100%;
+  height: 1.04rem;
+  opacity: 1;
+  background: #f5f6f7;
+  border-radius: .08rem;
+}
+.collection .timePicker.clickactive{
+  position: relative;
+ background: #E8FAFD;
+}
+.collection .timePicker.clickactive::after{
+  content: '';
+  position: absolute;
+  right: 0;
+  bottom: 0;
+  background: url(/jyapp/big-member/image/icon-check.png);
+  width: .28rem;
+  height: .28rem;
+  background-size: 100% 100%;
+ }
+.timePicker .line{
+  width: 12px;
+  height: 1px;
+  background: #ACACAD;
+}
+.timePicker .van-cell.van-field {
+  width: 2.96rem;
+  height: .72rem;
+  background: #ffffff;
+  border: 1px solid rgba(0,0,0,0.10);
+  border-radius: .1rem;
+  align-items: center;
+}
+.collection .j-footer{
+  box-shadow: 0px -2px 8px rgb(54 147 179 / 5%);
+  z-index: inherit;
+}
+.collection .j-button-group {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  width: 100%;
+  padding: 0.16rem 0.32rem 0.24rem;
+  background-color: #fff;
+  box-sizing: border-box;
+}
+.collection .j-button-group .j-button-confirm, .j-button-cancel {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  flex: 1;
+  width: 100%;
+  height: 0.8rem;
+  font-size: 0.32rem;
+  line-height: inherit;
+  text-align: center;
+  border-radius: 0.16rem;
+}
+.collection .j-button-group .j-button-cancel {
+  margin-right: 0.26rem;
+  color: #5f5e64;
+  background-color: #edeff2;
+}
+.collection .j-button-group .j-button-confirm {
+  color: #fff;
+  background-color: #2cb7ca;
+}
+/* 地区 */
+.collection .area-list.van-index-bar{
+  height: 8.6rem;
+  overflow: auto;
+}
+/* 采购单位类型 */
+.collection .unitTab{
+  overflow: hidden;
+  height: 7.5rem;
+  flex: none;
+}
+.collection .unitTab .van-tabs__content{
+  height: 7.5rem;
+  overflow: auto;
+}
+.collection .unitType {
+  height: 100%;
+  /* overflow: auto; */
+  flex: 1;
+  display: flex;
+}
+.collection .unitType .van-tabs__wrap{
+  height: 100%;
+  overflow: auto;
+}
+.collection .unitType .van-tabs__content{
+  flex: 1;
+}
+.unitType .van-tabs__wrap .van-tabs__nav.van-tabs__nav--card{
+  height: auto;
+  margin: 0;
+  display: flex;
+  flex-direction: column;
+  border: 0;
+  overflow: auto;
+}
+.unitType .van-tabs__wrap .van-tabs__nav.van-tabs__nav--card .van-tab{
+  flex: none;
+  width: 2.5rem;
+  min-height: .8rem;
+  background: #f5f6f7;
+  border: 0;
+  padding: 0;
+}
+.unitType .van-tab__text.van-tab__text--ellipsis{
+  padding: 0 0.08rem 0 .32rem;
+  display: flex;
+  align-items: center;
+  width: 100%;
+  height: 100%;
+  font-size: .3rem;
+  font-weight: 500;
+  text-align: LEFT;
+  color: #171826;
+  line-height: .44rem;
+}
+.unitType .van-tab__text.van-tab__text--ellipsis .tabtitle{
+  flex: 1;
+}
+.unitType .van-tab__text.van-tab__text--ellipsis .optionnum{
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  margin-left: .1rem;
+  width: .8rem;
+  height: .4rem;
+  background: #2abed1;
+  border: 1px solid #ffffff;
+  border-radius: .82rem;
+  font-size: .22rem;
+  font-weight: 500;
+  text-align: CENTER;
+  color: #ffffff;
+}
+.unitType .van-tabs__wrap .van-tabs__nav.van-tabs__nav--card .van-tab.van-tab--active {
+  background: #ffffff;
+}
+.unitType .van-tabs__wrap .van-tabs__nav.van-tabs__nav--card .van-tab.van-tab--active .van-tab__text.van-tab__text--ellipsis{
+  color: #2ABED1;
+}

BIN
src/web/staticres/collection/image/shoucang.png


BIN
src/web/staticres/collection/image/weishoucang.png


BIN
src/web/staticres/collection/image/wxqc.png


+ 237 - 0
src/web/staticres/collection/js/area-mobile.js

@@ -0,0 +1,237 @@
+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">
+    <div 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
+          class="area-card-item"
+          v-for="(iitem, index) in indexListMap[item]"
+          :key="index"
+          @click="clickItems(iitem)"
+          :class="iitem.selected ? 'active' : ''">{{iitem.name}}</div>
+      </div>
+    </div>
+  </van-index-bar>
+</div>
+<div class="j-footer">
+    <div class="j-button-group">
+        <button class="j-button-cancel" @click="resetAll">重置</button>
+        <button class="j-button-confirm" @click="onConfirm">确认</button>
+      </div>
+</div>
+</div>`
+
+var areaComponent = {
+  name: 'area-mobile',
+  template: areaComponentTemplate,
+  data:function () {
+    return {
+      // 选择地区变量
+      refresh: true,
+      indexList:[],
+      indexListMap:{},
+      multiple:true,
+      // 原始数组
+      provinceListMap: {
+          '#': ['全国'],
+          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()
+        // 从推送到订阅页面获取参数,时间默认是接收的参数
+        if(utils.getParam('pushtime')){
+            var pushtime = parseInt(utils.getParam('pushtime'))
+            this.setParam.time = pushtime
+            this.nowTime = new Date(pushtime*1000).pattern('yyyy-MM-dd')
+            this.currentDate = new Date(new Date(pushtime*1000).pattern('yyyy/MM/dd'))
+            this.optionData(this.setParam.area,pushtime)
+        }
+    }
+},
+  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]
+          }
+          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 === '全国'
+              }
+          })
+      }
+  },
+  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
+        }
+        })
+    }
+    })
+},
+   // 每个按钮点击事件
+  clickItems:function (item) {
+      if (this.multiple) {
+          this.selectedMultiple(item)
+      } else {
+          this.selectedOne(item)
+      }
+      // 这里有bug需要手动刷新视图
+      this.refresh = !this.refresh
+      this.refresh = !this.refresh
+      this.$emit('onChange', this.getSelectedProvinceArr())
+  },
+
+  // 单选逻辑
+  selectedOne:function (item) {
+      this.setAllDisSelected(false)
+      item.selected = !item.selected
+  },
+
+  // 多选逻辑
+  selectedMultiple:function (item) {
+      // 选全国
+      if (item.name === '全国') {
+          this.setAllDisSelected(false)
+          item.selected = true
+      } else {
+          this.indexListMap['#'][0].selected = false
+          item.selected = !item.selected
+      }
+
+      // 此处判断是否全部选中
+      var state = this.getAllStateExceptCountryWide()
+      if (state !== 0) {
+          // 全国选中
+          this.setAllDisSelected(false)
+          this.indexListMap['#'][0].selected = true
+      }
+  },
+
+  // 获得所有选中的省份名字的数组
+  getSelectedProvinceArr:function () {
+      var arr = []
+      for (var key in this.indexListMap) {
+      this.indexListMap[key].forEach(function (item) {
+          if (item.name !== '全国' && item.selected) {
+          arr.push(item.name)
+          }
+      })
+      }
+      return arr
+  },
+
+  // 所有按钮设置状态
+  setAllDisSelected:function (state) {
+      for (var key in this.indexListMap) {
+      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++
+          })
+
+          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)
+    },
+    resetAll:function () {
+      if (this.multiple) {
+        this.setAllDisSelected(false)
+        this.indexListMap['#'][0].selected = true
+      } else {
+        this.setAllDisSelected(false)
+      }
+      this.refresh = !this.refresh
+      this.refresh = !this.refresh
+      let params = {
+        name: 'areaitem',
+        data: []
+      }
+      this.$emit('cancel', params)
+    },
+
+    onConfirm:function() {
+      var value = this.getSelectedProvinceArr()
+      let t = '地区'
+      if (value.length) {
+          t = `地区 ${value.length}`
+      } else {
+          t = '全国'
+      }
+      console.log(t)
+      console.log(value.join(','))
+      let params = {
+        name: 'areaitem',
+        data: value
+      }
+      this.$emit('confirm', params)
+    },
+  }
+}

+ 80 - 0
src/web/staticres/collection/js/cate-mobile.js

@@ -0,0 +1,80 @@
+var cateComponentTemplate = `<div class="j-container">
+<div class="j-main unitTab">
+  <van-tabs type="card" class="unitType">
+    <van-tab title="全部">内容 3</van-tab>
+    <van-tab v-for="(item, index) in Object.keys(list)" :key="index">
+      <template #title>
+        <div class="tabtitle">
+          {{item}}
+        </div>
+        <div class="optionnum">36/51</div>
+      </template>
+      <van-checkbox-group v-model="result" ref="checkboxGroup">
+        <van-cell-group>
+          <van-cell
+          v-model="checked"
+          clickable
+          type="primary"
+          title="全选"
+          @click="checkAll"
+          >
+          <template #right-icon>
+            <van-checkbox checked-color="#2ABED1"></van-checkbox>
+          </template>
+          </van-cell>
+          <van-cell
+            v-for="(con, i) in list[item]"
+            clickable
+            :key="i"
+            :title="con"
+            @click="toggle(index)"
+          >
+            <template #right-icon>
+              <van-checkbox checked-color="#2ABED1" :name="con" ref="checkboxes" />
+            </template>
+          </van-cell>
+        </van-cell-group>
+      </van-checkbox-group>
+    </van-tab>
+  </van-tabs>
+</div>
+<div class="j-footer">
+  <div class="j-button-group">
+    <button class="j-button-cancel" @click="resetAll">重置</button>
+    <button class="j-button-confirm" @click="onConfirm">确认</button>
+  </div>
+</div>
+</div>
+`
+
+var cateComponent = {
+  name: 'cate-mobile',
+  template: cateComponentTemplate,
+  data:function () {
+    return {
+      result: [],
+      list: {
+        "党政机关事业单位": ['人大', '政协', '党委办','组织', '宣传', '统战', '纪委', '政府办', '发改委','财政','教育','科技','工信','民政', '民宗', '人社', '公安', '检察院','法院', '司法', '应急管理', '军队', '自然资源', '生态环境','住建', '市政',  '城管', '交通', '水利','农业','气象','文旅', '卫健委','医疗','学校','档案', '体育', '政务中心', '机关事务', '国资委','海关','税务', '市场监管', '商务','人行', '银保监', '证监', '审计', '出版广电','统计', '公共资源交易', '社会团体','气象'],
+        "企业": ['传媒','采矿业', '电信行业', '金融业', '建筑业', '能源化工', '农林牧渔','批发零售', '信息技术', '运输物流', '制造业', '住宿餐饮']  
+      },
+      checked: true
+    }
+  },
+  methods: {
+    checkAll: function(){
+      console.log(this.checked)
+      if(this.checked){
+        this.checked = false
+        this.$refs.checkboxGroup.toggleAll(true);
+      }else{
+        this.checked = true
+        this.$refs.checkboxGroup.toggleAll(false);
+      }
+    },
+    resetAll:function() {},
+    onConfirm:function() {},
+    toggle: function (index) {
+      this.$refs.checkboxes[index].toggle()
+    }
+  }
+}

+ 209 - 0
src/web/staticres/collection/js/date-mobile.js

@@ -0,0 +1,209 @@
+var dateComponentTemplate = `<div class="j-container">
+<div class="dateTags j-main">
+    <div class="timeTag">
+    <div class="area-card-item" :class="{active:index==colDate}" v-for="(item, index) in dateOption" :key="index" @click="selectFixedDate(index, item.value)">{{item.name}}</div>
+    </div>
+    <div class="timePicker" @click="dateShowEvent" :class="{clickactive:dateStyle==true}">
+    <van-field v-model="selectDate.startDate" placeholder="开始时间"></van-field>
+    <div class="line"></div>
+    <van-field @focus="getEndFocus" v-model="selectDate.endDate" placeholder="结束时间"></van-field>
+    </div>
+</div>
+<van-popup v-model="datePicker.startshow" round position="bottom" :style="{ height: '43%' }">
+    <div class="j-container">
+      <div class="j-header">
+        <div class="headertitle">
+          <div class="title_left">
+            选择开始时间
+          </div>
+          <span class="title_close" @click="pickerClose">
+          </span>
+        </div>
+      </div>
+      <div class="j-main">
+        <van-datetime-picker
+          @change="changeDate"
+          class="datepopup"
+          :show-toolbar="false"
+          swipe-duration="300"
+          v-model="datePicker.currentDate"
+          type="date"
+          title="选择年月日"
+          ref="getstartValues"
+          :formatter="formatter"
+          :min-date="datePicker.minDate"
+          :max-date="datePicker.maxDate"
+        >
+        </van-datetime-picker>
+      </div>
+      <div class="j-footer">
+        <div class="j-button-group">
+          <button class="j-button-cancel" @click="resetAll">重置</button>
+          <button class="j-button-confirm" @click="onStartConfirm">确认</button>
+        </div>
+      </div>
+    </div>
+  </van-popup>
+  <van-popup v-model="datePicker.endshow" round position="bottom" :style="{ height: '43%' }">
+    <div class="j-container">
+      <div class="j-header">
+        <div class="headertitle">
+          <div class="title_left">
+            选择结束时间
+          </div>
+          <span class="title_close" @click="pickerClose">
+          </span>
+        </div>
+      </div>
+      <div class="j-main">
+        <van-datetime-picker
+          @change="changeDate"
+          class="datepopup"
+          :show-toolbar="false"
+          swipe-duration="300"
+          v-model="datePicker.currentDate"
+          ref="getendValues"
+          type="date"
+          title="选择年月日"
+          :formatter="formatter"
+          :min-date="datePicker.minDate"
+          :max-date="datePicker.maxDate"
+        >
+        </van-datetime-picker>
+      </div>
+      <div class="j-footer">
+        <div class="j-button-group">
+          <button class="j-button-cancel" @click="resetAll">重置</button>
+          <button class="j-button-confirm" @click="onendConfirm">确认</button>
+        </div>
+      </div>
+    </div>
+  </van-popup>
+  <div class="j-footer">
+    <div class="j-button-group">
+      <button class="j-button-cancel" @click="resetAll">重置</button>
+      <button class="j-button-confirm" @click="onConfirm">确认</button>
+    </div>
+  </div>
+</div>
+`
+
+var dateComponent = {
+  name: 'date-mobile',
+  template: dateComponentTemplate,
+  data:function () {
+    return {
+      colDate: 0,
+      dateOption:[
+        {
+          name: '不限',
+          value: 'all'
+        },
+        {
+          name: '最近7天',
+          value: 'lately-7'
+        },
+        {
+          name: '最近30天',
+          value: 'lately-30'
+        },
+        {
+          name: '去年',
+          value: 'lastyear'
+        }
+      ],
+      // 点击选择时间添加样式
+      dateStyle: false,
+      // 时间选择参数
+      datePicker:{
+        startshow: false,
+        endshow: false,
+        minDate: new Date(2020, 0, 1),
+        maxDate: new Date(2025, 10, 1),
+        currentDate: new Date(),
+      },
+      selectDate: {
+        tagDate: '',
+        startDate: '',
+        endDate: ''
+      }
+    }
+  },
+  methods: {
+    selectFixedDate: function(i, value) {
+      this.colDate = i
+      this.dateStyle = false
+      this.selectDate.tagDate = value
+      this.selectDate.startDate = ''
+      this.selectDate.endDate = ''
+    },
+    // 显示选择时间弹窗
+    dateShowEvent: function() {
+      this.colDate = -1
+      this.dateStyle = true
+      this.datePicker.startshow = true
+    },
+    // 获取选中的时间
+    changeDate: function(e) {
+      console.log(e.getValues())
+      let timer = e.getValues()
+      console.log(timer)
+    },
+    formatter: function(type, val) {
+      if (type === 'year') {
+        return val + '年';
+      }
+      if (type === 'month') {
+        return val + '月';
+      }
+      if (type === 'day') {
+        return val + '日';
+      }
+      return val;
+    },
+    // 结束时间获取焦点
+    getEndFocus: function(){
+      this.datePicker.endshow = true
+    },
+    resetAll:function() {
+      this.$emit('cancel', 'datecancel')
+    },
+    // 选择开始时间弹窗确认按钮
+    onStartConfirm:function() {
+      this.selectDate.tagDate = ''
+      this.selectDate.startDate = this.$refs.getstartValues.value.pattern('yyyy年MM月dd日')
+      this.datePicker.startshow = false
+      // 如果结束时间不为空 选择过开始时间不弹出结束时间弹窗
+      if(this.selectDate.endDate == '') {
+        this.datePicker.endshow = true
+      }else{
+        this.datePicker.endshow = false
+      }
+    },
+    // 选择结束时间弹窗确认按钮
+    onendConfirm: function(){
+      this.selectDate.tagDate = ''
+      this.selectDate.endDate = this.$refs.getendValues.value.pattern('yyyy年MM月dd日')
+      this.datePicker.endshow = false
+    },
+    // 选择时间弹窗关闭按钮
+    pickerClose: function() {
+      this.datePicker.startshow = false
+      this.datePicker.endshow = false
+    },
+    // 筛选条件确认按钮
+    onConfirm: function(){
+      let timerDate = ''
+      if(this.selectDate.tagDate == ''){
+        timerDate = this.selectDate.startDate-this.selectDate.endDate
+      }else{
+        timerDate = this.selectDate.tagDate
+      }
+      let params = {
+        name: 'dateItem',
+        data: timerDate
+      }
+      this.$emit('confirm', params)
+    }
+  }
+}

+ 146 - 0
src/web/staticres/collection/js/index.js

@@ -0,0 +1,146 @@
+var vNode = {
+  delimiters: ['${', '}'],
+  el: '#myCollection',
+  components: {
+    dateComponent: dateComponent
+  },
+  data: {
+    listState: {
+      value: '',
+      loading: false,
+      finished: true,
+      pageNum: 1,
+      pageSize: 10,
+      offset: 80,
+      scrollTop: 0,
+      total: 0,
+      list: []
+    },
+    dateOption:[
+      '不限',
+      '最近7天',
+      '最近30天',
+      '去年'
+    ],
+    list: ['a', 'b'],
+    result: [],
+    // 下拉菜单参数
+    params: {
+      value1: '',
+      value2: '',
+      option4: [
+        { text: '有联系方式', value: 'a' },
+        { text: '无联系方式', value: 'b' },
+      ],
+      option5: [
+        { text: '有联系方式', value: 'a' },
+        { text: '无联系方式', value: 'b' },
+      ]
+    },
+    // 收藏日期选择时间参数
+    selectDate: {
+      startDate: '',
+      endDate: ''
+    },
+    limitshow: false, // 筛选框显示
+    condition: true, // 列表星星显示
+    checked: false,
+    personTagactive:0, //个人标签选择按钮下标
+    colDate:0 // 收藏日期选择按钮下标
+  },
+  computed: {},
+  created () {
+    this.getList()
+  },
+  mounted() {
+  },
+  methods: {
+    toggle(index) {
+      this.$refs.checkboxes[index].toggle();
+    },
+    onClick: function(){},
+    screenBtn(val) {
+      this.limitshow = true
+    },
+    getContainer: function() {
+      return this.$refs.searchContainer
+    },
+    getList: function() {
+      this.checked = false
+      this.listState.list = [
+        {
+          id: 1,
+          docName: '淮安市高级职业技术学校台式电脑采购项目招标公告淮安市高级职业技术学校台式电...',
+          area: '江苏',
+          industry: '建筑工程',
+          type: '招标',
+          price: 10,
+          time: '2021/06/15'
+        },
+        {
+          id: 2,
+          docName: '淮安市高级职业技术学校台式电脑采购项目招标公告淮安业技术学校台式电...',
+          area: '江苏',
+          industry: '建筑工程',
+          type: '招标',
+          price: 100,
+          time: '2021/06/14'
+        },
+        {
+          id: 2,
+          docName: '淮安市高级职业技术学校台式电脑采购项目招标公告淮安业技术学校台式电...',
+          area: '江苏',
+          industry: '建筑工程',
+          type: '招标',
+          price: 100,
+          time: '2021/06/14'
+        },
+        {
+          id: 2,
+          docName: '淮安市高级职业技术学校台式电脑采购项目招标公告淮安业技术学校台式电...',
+          area: '江苏',
+          industry: '建筑工程',
+          type: '招标',
+          price: 100,
+          time: '2021/06/14'
+        },
+        {
+          id: 2,
+          docName: '淮安市高级职业技术学校台式电脑采购项目招标公告淮安业技术学校台式电...',
+          area: '江苏',
+          industry: '建筑工程',
+          type: '招标',
+          price: 100,
+          time: '2021/06/14'
+        }
+      ]
+    },
+    // 取消收藏
+    collecClick: function(id) {
+      this.listState.list.map((item) => {
+        console.log(item)
+        if(id === item.id) {
+          this.condition = false
+        }
+      })
+    },
+    // 个人标签重置
+    resetAll: function() {},
+    // 个人标签确定
+    onConfirm: function(){},
+    // 个人标签点击
+    selectTags: function(i) {
+      console.log(i)
+      this.personTagactive = i
+    },
+    // 收藏日期标签选择
+    selectFixedDate: function(i) {
+      this.colDate = i
+    },
+    // 采购单位类型全选
+    checkAll:function() {
+      this.$refs.checkboxGroup.toggleAll();
+    },
+  }
+}
+var myCollection = new Vue(vNode)

+ 361 - 0
src/web/staticres/collection/js/industry-mobile.js

@@ -0,0 +1,361 @@
+var industryComponentTemplate = `<div class="j-container">
+<div class="j-main unitTab">
+  <van-tabs type="card" class="unitType">
+  <van-checkbox-group v-model="resultAll" ref="checkboxGroupAll">
+    <van-tab title="全部">
+      <van-cell
+      v-model="checkedAll"
+      clickable
+      type="primary"
+      title="全选"
+      @click="checkBoxAll"
+      >
+      <template #right-icon>
+        <van-checkbox checked-color="#2ABED1"></van-checkbox>
+      </template>
+      </van-cell>
+    </van-tab>
+    <van-tab v-for="(item, index) in tablist" :key="index">
+    <template #title>
+        <div class="tabtitle">
+          {{Object.keys(item)[0]}}
+        </div>
+        <div class="optionnum">36/{{item[Object.keys(item)[0]].length}}</div>
+      </template>
+      <van-checkbox-group v-model="result" ref="checkboxGroup">
+        <van-cell-group>
+          <van-cell
+          v-model="checked"
+          clickable
+          type="primary"
+          title="全选"
+          @click="checkAll(item)"
+          >
+          <template #right-icon>
+            <van-checkbox v-model="checked" checked-color="#2ABED1" name="全选"></van-checkbox>
+          </template>
+          </van-cell>
+          <van-cell
+            v-for="(iitem, i) in item[Object.keys(item)[0]]"
+            clickable
+            label-disabled="false"
+            :key="i"
+            :title="iitem.name"
+            @click="toggle(i)"
+          >
+            <template #right-icon>
+              <van-checkbox checked-color="#2ABED1" :name="iitem" ref="checkboxes" />
+            </template>
+          </van-cell>
+        </van-cell-group>
+      </van-checkbox-group>
+    </van-tab>
+  </van-tabs>
+</div>
+<div class="j-footer">
+  <div class="j-button-group">
+    <button class="j-button-cancel" @click="resetAll">重置</button>
+    <button class="j-button-confirm" @click="onConfirm">确认</button>
+  </div>
+</div>
+</div>
+`
+
+var industryComponent = {
+  name: 'industry-mobile',
+  template: industryComponentTemplate,
+  data:function () {
+    return {
+      tablist: [],
+      resultAll:[],
+      result: [],
+      conlist: [],
+      checkedAll: false,
+      checked: false
+    }
+  },
+  created () {
+    this.getIndustryData()
+  },
+  methods: {
+    // 获取行业数据
+    getIndustryData: function(){
+      const _this = this
+      _this.tablist =  [
+        {
+          "建筑工程": [
+            "勘察设计",
+            "工程施工",
+            "监理咨询",
+            "材料设备",
+            "机电安装"
+          ]
+        },
+        {
+          "水利水电": [
+            "水利工程",
+            "发电工程",
+            "航运工程",
+            "其他工程"
+          ]
+        },
+        {
+          "能源化工": [
+            "原材料",
+            "仪器仪表",
+            "新能源",
+            "设备物资",
+            "化工产品",
+            "设备"
+          ]
+        },
+        {
+          "弱电安防": [
+            "综合布线",
+            "智能系统",
+            "智能家居"
+          ]
+        },
+        {
+          "信息技术": [
+            "系统集成及安全",
+            "软件开发",
+            "运维服务",
+            "其他"
+          ]
+        },
+        {
+          "行政办公": [
+            "办公家具",
+            "通用办公设备",
+            "专业设备",
+            "办公用品",
+            "生活用品"
+          ]
+        },
+        {
+          "机械设备": [
+            "矿山机械",
+            "工程机械",
+            "机械零部件",
+            "机床相关",
+            "车辆",
+            "其他机械设备"
+          ]
+        },
+        {
+          "交通工程": [
+            "道路",
+            "轨道",
+            "桥梁",
+            "隧道",
+            "其他"
+          ]
+        },
+        {
+          "医疗卫生": [
+            "设备",
+            "耗材",
+            "药品"
+          ]
+        },
+        {
+          "市政设施": [
+            "道路",
+            "绿化",
+            "线路管网",
+            "综合项目"
+          ]
+        },
+        {
+          "服务采购": [
+            "法律咨询",
+            "会计",
+            "物业",
+            "审计",
+            "安保",
+            "仓储物流",
+            "广告宣传印刷",
+            "其他"
+          ]
+        },
+        {
+          "农林牧渔": [
+            "生产物资",
+            "生产设备",
+            "相关服务"
+          ]
+        }
+      ]
+      let maxarr = []
+      _this.tablist.forEach(function(item,index) {
+        let minarr = []
+        let keyname = Object.keys(item)[0]
+        let eachArr = item[Object.keys(item)[0]]
+        eachArr.forEach(function(data, i){
+          data = {
+            name: data,
+            type: true
+          }
+          minarr.push(data)
+        })
+        console.log(minarr)
+        let obj = {
+          [keyname]: minarr
+        }
+        maxarr.push(obj)
+      })
+      console.log(maxarr)
+      _this.tablist = maxarr
+      // $.ajax({
+      //   url: '/publicapply/free/getindustrys',
+      //   type:'POST',
+      //   success: function(res){
+      //     console.log(res)
+      //     // _this.tablist = res.data
+      //     res.data =  [
+      //       {
+      //         "建筑工程": [
+      //           "勘察设计",
+      //           "工程施工",
+      //           "监理咨询",
+      //           "材料设备",
+      //           "机电安装"
+      //         ]
+      //       },
+      //       {
+      //         "水利水电": [
+      //           "水利工程",
+      //           "发电工程",
+      //           "航运工程",
+      //           "其他工程"
+      //         ]
+      //       },
+      //       {
+      //         "能源化工": [
+      //           "原材料",
+      //           "仪器仪表",
+      //           "新能源",
+      //           "设备物资",
+      //           "化工产品",
+      //           "设备"
+      //         ]
+      //       },
+      //       {
+      //         "弱电安防": [
+      //           "综合布线",
+      //           "智能系统",
+      //           "智能家居"
+      //         ]
+      //       },
+      //       {
+      //         "信息技术": [
+      //           "系统集成及安全",
+      //           "软件开发",
+      //           "运维服务",
+      //           "其他"
+      //         ]
+      //       },
+      //       {
+      //         "行政办公": [
+      //           "办公家具",
+      //           "通用办公设备",
+      //           "专业设备",
+      //           "办公用品",
+      //           "生活用品"
+      //         ]
+      //       },
+      //       {
+      //         "机械设备": [
+      //           "矿山机械",
+      //           "工程机械",
+      //           "机械零部件",
+      //           "机床相关",
+      //           "车辆",
+      //           "其他机械设备"
+      //         ]
+      //       },
+      //       {
+      //         "交通工程": [
+      //           "道路",
+      //           "轨道",
+      //           "桥梁",
+      //           "隧道",
+      //           "其他"
+      //         ]
+      //       },
+      //       {
+      //         "医疗卫生": [
+      //           "设备",
+      //           "耗材",
+      //           "药品"
+      //         ]
+      //       },
+      //       {
+      //         "市政设施": [
+      //           "道路",
+      //           "绿化",
+      //           "线路管网",
+      //           "综合项目"
+      //         ]
+      //       },
+      //       {
+      //         "服务采购": [
+      //           "法律咨询",
+      //           "会计",
+      //           "物业",
+      //           "审计",
+      //           "安保",
+      //           "仓储物流",
+      //           "广告宣传印刷",
+      //           "其他"
+      //         ]
+      //       },
+      //       {
+      //         "农林牧渔": [
+      //           "生产物资",
+      //           "生产设备",
+      //           "相关服务"
+      //         ]
+      //       }
+      //     ]
+      //     _this.tablist = res.data
+      //     res.data.forEach(function(item,i) {
+      //       console.log(item[Object.keys(item)[0]])
+      //     })
+      //   },
+      //   error: function(err){
+      //     console.log(err)
+      //   }
+      // })
+    },
+    // 总全选
+    checkBoxAll:function() {
+      if(this.checkedAll){
+        this.checkedAll = false
+        // this.$refs.checkboxGroupAll.toggleAll(true);
+      }else{
+        this.checkedAll = true
+        // this.$refs.checkboxGroupAll.toggleAll(false);
+      }
+    },
+    // 模块全选
+    checkAll: function(data){
+      console.log(data)
+      if(this.checked){
+        this.checked = false
+        this.result = data[Object.keys(data)[0]]
+        // console.log(this.$refs.checkboxGroup)
+        this.$refs.checkboxGroup.toggleAll(true);
+      }else{
+        this.$refs.checkboxGroup.toggleAll(false);
+        // this.checked = true
+      }
+    },
+    resetAll:function() {},
+    onConfirm:function() {},
+    toggle: function (index) {
+      this.$refs.checkboxes[index].toggle()
+    }
+  }
+}

+ 80 - 0
src/web/staticres/collection/js/keyword-mobile.js

@@ -0,0 +1,80 @@
+var keywordComponentTemplate = `<div class="j-container">
+<div class="j-main unitTab">
+  <van-tabs type="card" class="unitType">
+    <van-tab title="全部">内容 3</van-tab>
+    <van-tab v-for="(item, index) in Object.keys(list)" :key="index">
+      <template #title>
+        <div class="tabtitle">
+          {{item}}
+        </div>
+        <div class="optionnum">36/51</div>
+      </template>
+      <van-checkbox-group v-model="result" ref="checkboxGroup">
+        <van-cell-group>
+          <van-cell
+          v-model="checked"
+          clickable
+          type="primary"
+          title="全选"
+          @click="checkAll"
+          >
+          <template #right-icon>
+            <van-checkbox checked-color="#2ABED1"></van-checkbox>
+          </template>
+          </van-cell>
+          <van-cell
+            v-for="(con, i) in list[item]"
+            clickable
+            :key="i"
+            :title="con"
+            @click="toggle(index)"
+          >
+            <template #right-icon>
+              <van-checkbox checked-color="#2ABED1" :name="con" ref="checkboxes" />
+            </template>
+          </van-cell>
+        </van-cell-group>
+      </van-checkbox-group>
+    </van-tab>
+  </van-tabs>
+</div>
+<div class="j-footer">
+  <div class="j-button-group">
+    <button class="j-button-cancel" @click="resetAll">重置</button>
+    <button class="j-button-confirm" @click="onConfirm">确认</button>
+  </div>
+</div>
+</div>
+`
+
+var keywordComponent = {
+  name: 'keyword-mobile',
+  template: keywordComponentTemplate,
+  data:function () {
+    return {
+      result: [],
+      list: {
+        "党政机关事业单位": ['人大', '政协', '党委办','组织', '宣传', '统战', '纪委', '政府办', '发改委','财政','教育','科技','工信','民政', '民宗', '人社', '公安', '检察院','法院', '司法', '应急管理', '军队', '自然资源', '生态环境','住建', '市政',  '城管', '交通', '水利','农业','文旅', '卫健委','医疗','学校','档案', '体育', '政务中心', '机关事务', '国资委','海关','税务', '市场监管', '商务','人行', '银保监', '证监', '审计', '出版广电','统计', '公共资源交易', '社会团体','气象'],
+        "企业": ['传媒','采矿业', '电信行业', '金融业', '建筑业', '能源化工', '农林牧渔','批发零售', '信息技术', '运输物流', '制造业', '住宿餐饮']  
+      },
+      checked: true
+    }
+  },
+  methods: {
+    checkAll: function(){
+      console.log(this.checked)
+      if(this.checked){
+        this.checked = false
+        this.$refs.checkboxGroup.toggleAll(true);
+      }else{
+        this.checked = true
+        this.$refs.checkboxGroup.toggleAll(false);
+      }
+    },
+    resetAll:function() {},
+    onConfirm:function() {},
+    toggle: function (index) {
+      this.$refs.checkboxes[index].toggle()
+    }
+  }
+}

+ 26 - 0
src/web/staticres/collection/js/notice-mobile.js

@@ -0,0 +1,26 @@
+var noticeComponentTemplate = `
+<van-dropdown-item title="公告类型" v-model="params.value" :options="params.option4">
+                            
+</van-dropdown-item>`
+
+var noticeComponent = {
+  name: 'notice-mobile',
+  template: noticeComponentTemplate,
+  data:function () {
+    return {
+      // 下拉菜单参数
+      params: {
+        value: 'a',
+        option4: [
+          { text: '有联系方式', value: 'a' },
+          { text: '无联系方式', value: 'b' },
+          { text: '无联系方式', value: 'b' },
+          { text: '无联系方式', value: 'b' },
+          { text: '无联系方式', value: 'b' },
+        ],
+      },
+    }
+  },
+  methods: {
+  }
+}

+ 23 - 16
src/web/staticres/css/dev2/biddingSearch.css

@@ -15,7 +15,7 @@
 /*白色字体*/
 #searchInner .searchHeader {
   /*头部*/
-  height: 110px;
+  /* height: 110px; */
   background-color: #f5f5fb;
   border-top: 1px solid #e0e0e0;
 }
@@ -335,8 +335,9 @@ margin-left: 176px;
 }
 
 #searchInner .searchControl .searchTender .industry .parent-node {
-  color: #2cb7ca;
+  /* color: #2cb7ca; */
   margin-right: 11px;
+  font-weight: bold;
 }
 
 #searchInner .searchControl .searchTender .industry .parent-node.secondActice {
@@ -632,8 +633,9 @@ border-radius:2px;
 }
 
 #searchInner .searchControl .searchTender .information .info-content .parent-node {
-  color: #2cb7ca;
+  /* color: #2cb7ca; */
   margin-right: 8px;
+  font-weight: bold;
 }
 
 #searchInner .searchControl .searchTender .information .info-content .parent-node.secondActice {
@@ -862,26 +864,31 @@ width:1200px;
 }
 
 #searchInner .searchControl .seaTender-inner .tabContainer .lucene li .luce-right a {
-  padding: 0.5px 6px .5px;
-    color: #FFFFFF;
-    font-size: 14px;
-    border-radius: 3px;
-    margin-left: 5px;
+  display: inline-block;
+  padding: 1px 8px;
+  line-height: 20px;
+  /* color: #FFFFFF; */
+  font-size: 12px;
+  border-radius: 3px;
+  margin-left: 5px;
+  background: #F5F5FB;
+  color: #686868;
+  box-sizing: border-box;
 }
 
 #searchInner .searchControl .seaTender-inner .tabContainer .lucene li .luce-right a:nth-of-type(1) {
-  background-color: #2cb7ca;
+  /* background-color: #2cb7ca; */
 }
 
 #searchInner .searchControl .seaTender-inner .tabContainer .lucene li .luce-right a:nth-of-type(2) {
-  background-color: #ffba00;
+  /* background-color: #ffba00; */
 }
 
 #searchInner .searchControl .seaTender-inner .tabContainer .lucene li .luce-right a:nth-of-type(3) {
-  background-color: #25c78c;
+  /* background-color: #25c78c; */
 }
 #searchInner .searchControl .seaTender-inner .tabContainer .lucene li .luce-right a:nth-of-type(4) {
-  background-color: #FE8594;
+  /* background-color: #FE8594; */
 }
 #searchInner .searchControl .seaTender-inner .tabContainer .lucene li .luce-right a:hover {
   text-decoration: underline;
@@ -889,10 +896,10 @@ width:1200px;
 
 #searchInner .searchControl .seaTender-inner .tabContainer .lucene li .luce-right span {
       display: inline-block;
-    padding-left: 25px;
+    padding-left: 8px;
     color: #888888;
-    background: transparent url(/images/biddingSearch/lists-timeImg.png) 5px center no-repeat;
-    font-size: 14px;
+    /* background: transparent url(/images/biddingSearch/lists-timeImg.png) 5px center no-repeat; */
+    font-size: 12px;
 }
 
 #searchInner .searchControl .seaTender-inner .tabContainer .lucene-table {
@@ -1027,4 +1034,4 @@ width:1200px;
   -ms-transform: translateZ(0);
   -o-transform: translateZ(0);
   transform: translateZ(0);
-}
+}

+ 435 - 0
src/web/staticres/css/dev2/newBidSearch.css

@@ -0,0 +1,435 @@
+
+/* 高级筛选 */
+.advanced-filter{
+  padding: 12px 0px 16px;
+  border-top: 1px solid #ebebeb;
+}
+.advanced-filter .advanced-title{
+  margin-bottom: 14px;
+}
+.advanced-filter .advanced-title strong{
+  font-size: 16px;
+  color: #996118;
+  line-height: 20px;
+}
+.advanced-filter .advanced-title img{
+  width: 38px;
+  height: 18px;
+  margin-left: 2px;
+  vertical-align: top;
+}
+.advanced-filter .buyclass{
+  float: left;
+  width: calc(100% - 116px);
+}
+.advanced-filter .buyclass-all{
+  display: inline-block;
+  padding: 4px 7px;
+  cursor: pointer;
+  margin: 0 8px 4px 0;
+}
+.advanced-filter .buyclass-content .buy-list{
+  float: left;
+  padding: 4px 7px;
+  cursor: pointer;
+  margin: 0 4px 8px 0;
+}
+.buy-type{
+  color: #2cb7ca;
+}
+.buyclass-all.active,
+.buyclass-all:hover,
+.buyclass-content .buy-list.active
+{
+  color: #FFFFFF;
+  background-color: #2cb7ca;
+  border-radius: 2px;
+}
+/* 其他筛选条件 */
+.other-filter{
+  padding: 15px 0;
+  border-top: 1px dashed #e0e0e0;
+}
+.other-filter .other-content{
+  float: left;
+  width: calc(100% - 116px);
+}
+.other-filter .buy-select,
+.other-filter .bid-select{
+  position: relative;
+  float: left;
+  margin-right: 12px;
+}
+.custom-select{
+  position: relative;
+  width: 168px;
+  height: 30px;
+  line-height: 30px;
+  padding: 0 10px;
+  border: 1px solid #e0e0e0;
+  border-radius: 5px;
+  box-sizing: border-box;
+  cursor: pointer;
+  overflow: hidden;
+}
+.custom-select .icon-arrow{
+  position: absolute;
+  top: 10px;
+  right: 10px;
+  display: inline-block;
+  width: 10px;
+  height: 8px;
+  background: url(/images/biddingSearch/more.png) center no-repeat;
+  background-size: contain;
+}
+.custom-select .up{
+  background: url(/images/biddingSearch/moreup.png) center no-repeat;
+  background-size: contain;
+}
+.custom-input{
+  padding: 0;
+  width: 130px;
+  border: 0;
+  text-align: center;
+  overflow: hidden;
+  color: #1d1d1d;
+  cursor: pointer;
+}
+.custom-input::placeholder{
+  color: #1d1d1d;
+}
+.custom-option{
+  position: absolute;
+  top: 30px;
+  left: 0;
+  width: 100%;
+  right: 0;
+  border-radius: 5px;
+  border: 1px solid #2cb7ca;
+  overflow: hidden;
+  z-index: 10;
+}
+.custom-option > li{
+  height: 30px;
+  line-height: 30px;
+  color: #1d1d1d;
+  background: #fff;
+  cursor: pointer;
+  text-align: center;
+}
+.custom-option > li:hover{
+  background: #ececec;
+}
+.other-filter .buy-select > select,
+.other-filter .bid-select > select{
+  border: 0;
+}
+/* 收藏、全选 */
+.custom-checkbox{
+  float: left;
+  width: 16px;
+  height: 16px;
+  border: 1px solid #E0E0E0;
+  border-radius: 3px;
+  background-color: #fff;
+  margin: 6px 16px 0 0!important;
+}
+.check-all{
+  margin: 16px 0 0 15px!important;
+}
+.custom-checkbox:checked{
+  width: 16px;
+  height: 16px;
+  background: url(/images/biddingSearch/icon-checked.png) no-repeat center;
+  background-size: contain;
+  border: 0;
+}
+.custom-checkbox:checked:disabled{
+  opacity: 0.5;
+}
+#bid-collect{
+  width: 100px!important;
+  background: transparent url(/images/collect.png) 10px center no-repeat;
+  background-size: 20px;
+}
+#bid-collect.active{
+  width: 100px!important;
+  background: transparent url(/images/collected.png) 10px center no-repeat;
+  background-size: 20px;
+}
+.icon-collect{
+  display: inline-block;
+  width: 20px;
+  height: 20px;
+  margin-left: 6px;
+  background: transparent url(/images/collect.png) center no-repeat;
+  background-size: contain;
+  cursor: pointer;
+  vertical-align: middle;
+}
+.icon-collect.checked{
+  background: transparent url(/images/collected.png) center no-repeat;
+  background-size: contain;
+}
+.fold{
+  width: 64px;
+  height: 20px;
+  line-height: 20px;
+  margin: -1px auto 0;
+  background: url(/images/biddingSearch/trapezoid.png) no-repeat center;
+  background-size: contain;
+  text-align: center;
+  cursor: pointer;
+}
+.fold .icon-arrow{
+  display: inline-block;
+  width: 10px;
+  height: 8px;
+  margin-top: 6px;
+  background: url(/images/biddingSearch/more.png) center no-repeat;
+  background-size: contain;
+}
+.fold .icon-arrow.down{
+  background: url(/images/biddingSearch/moreup.png) center no-repeat;
+  background-size: contain;
+}
+/* 弹框 */
+.mask{
+  position: fixed;
+  width: 100%;
+  height: 100%;
+  right: 0;
+  left: 0;
+  top: 0;
+  bottom: 0;
+  background: rgba(0, 0, 0, .65);
+  z-index: 1031;
+}
+.custom-dialog{
+  display: none;
+}
+.custom-dialog .dialog-container{
+  position: fixed;
+  top: 50%;
+  left: 50%;
+  padding: 32px;
+  width: 380px;
+  transform: translateX(-50%) translateY(-50%);
+  background: #ffffff;
+  border-radius: 8px;
+  transition: all 2s linear;
+  z-index: 1038;
+  box-sizing: border-box;
+}
+.custom-dialog .dialog-header {
+  padding: 0 0 20px;
+}
+.custom-dialog .dialog-header .dialog-title{
+  text-align: center;
+  color: #1D1D1D;
+  font-size: 18px;
+  line-height: 28px;
+}
+.custom-dialog .dialog-content{
+  color: #686868;
+  text-align: center;
+  font-size: 14px;
+  line-height: 22px;
+}
+.custom-dialog .dialog-footer{
+  margin-top: 32px;
+}
+.custom-dialog .dialog-footer .dialog-btn{
+  display: inline-block;
+  width: 132px;
+  height: 36px;
+  line-height: 36px;
+  text-align: center;
+  border-radius: 6px;
+  text-decoration: none;
+}
+.custom-dialog .default-btn{
+  float: right;
+  border: 1px solid #e0e0e0;
+  background-color: #fff;
+  color: #686868;;
+}
+.custom-dialog .confirm-btn{
+  float: left;
+  background-color: #2cb7ca;
+  color: #fff;
+}
+.custom-toast {
+  display: none;
+}
+.custom-toast .toast-container{
+  /* display: none; */
+  position: fixed;
+  top: 50%;
+  left: 50%;
+  width: auto;
+  padding: 16px 32px;
+  font-size: 16px;
+  background: rgba(0, 0, 0, 0.65);
+  border-radius: 8px;
+  color: #fff;
+  transform: translateX(-50%) translateY(-50%);
+  z-index: 99;
+}
+/* 自定义标签弹框 */
+.tags-box{
+  display: none;
+  position: absolute;
+  top: 0;
+  right: 0;
+  width:332px;
+  height: 340px;
+  padding: 20px 16px;
+  background: #FFFFFF;
+  border: 1px solid #ECECEC;
+  box-sizing: border-box;
+  border-radius: 8px;
+  box-shadow: 0px 0px 28px 0px rgba(0,0,0,0.08);
+}
+.tags-box .tags-inputs{
+  position: relative;
+  width: 100%;
+}
+.tags-box .tags-inputs .tag-input{
+  width: 100%;
+  padding: 0;
+  min-height: 34px;
+  max-height: 74px;
+  overflow-y: scroll;
+  display: inline-block;
+  border: 1px solid #ccc;
+  border-radius: 4px;
+  background-color: #fff;
+  cursor: text;
+}
+.tags-inputs .tag-input::-webkit-scrollbar{
+  width: 8px;
+}
+.tags-inputs .tag-input::-webkit-scrollbar-thumb{
+  border-radius: 4px;
+  background-color: #ECECEC;
+}
+.tag-input > .tag-labels{
+  display: inline;
+  vertical-align: middle;
+}
+.tag-input > .clear-input{
+  display: inline-block;
+  padding: 0 10px;
+  width: 98px;
+  height: 36px;
+  line-height: 1;
+  background: #fff;
+  border-radius: 2px;
+  vertical-align: middle;
+  border: none;
+  background-color: transparent;
+  box-shadow: none;
+  box-sizing: border-box;
+  font-size: 14px;
+  color: #1d1d1d;
+}
+.tag-input>.tag-labels>.tag-label {
+  display: inline-block;
+  padding: 5px 12px;
+  font-size: 14px;
+  line-height: 1.2;
+  margin: 5px;
+  cursor: pointer;
+  border: 1px solid #ECECEC;
+  box-sizing: border-box;
+  border-radius: 4px;
+  background: #F5F6F7;
+  color: #1D1D1D;
+}
+.tag-close{
+  display: inline-block;
+  width: 16px;
+  height: 16px;
+  margin-left: 8px;
+  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAEwSURBVHgB7ZWxDYMwEEXPER1NRmEFJggUiJpJQiahRhSECViBUdzQIYgdgYQIPnwXmkT+DcbY/s9n3wHg5PTPKoriejRGYB+rqrpP0xT1fR9mWSaBaO77fiuEeCZJ8gAqwGyez68dBWIxV83gbSJEboK47HXWda1DF626Ar2gTUi35lo6iqbxuwBxHEvP80JF3lEg9sxhjp5pDnoHdCSGYWjVDj4W3B4HZo4dHQpgC8E1twI4gtANrrk1AAYxP1nmJAAEArjmZIADiI5TsC5AlJRS5zWcJVIEDLd9LXIUrCNgSjVqsWIBYHnOqZhrHR6BTZGhVEwSAKXCcSHEGebfQBjvAKe8cv6iRgC1i4ZijkHotUxz0TtQlmWuFrpxKtxyHOM4Nmma5sAVJaednH5SLxmyS6JIrGjkAAAAAElFTkSuQmCC);
+  background-position: center 2px;
+  background-repeat: no-repeat;
+  background-size: contain;
+}
+.tag-placeholder{
+  position: absolute;
+  top: 12px;
+  left: 16px;
+  color: #bbb;
+  font-size: 14px;
+}
+
+
+/* .tags-box .tags-textarea{
+  position: relative;
+  width: 100%;
+  max-height: 90px;
+  border: 1px solid #ECECEC;
+  box-sizing: border-box;
+  line-height: 20px;
+  overflow: hidden;
+  border-radius: 4px;
+}
+
+.tags-box .tags-textarea > pre {
+  padding: 7px 16px;
+  margin: 0;
+  box-sizing: border-box;
+  width: 100%;
+  white-space: pre-wrap;
+  word-wrap: break-word;
+  visibility: hidden;
+  font-size: 14px;
+}
+.tags-box .tags-textarea > textarea{
+  width: 100%;
+  height: 100%;
+  display: block;
+  border: none;
+  position: absolute;
+  top: 0;
+  left: 0;
+  font: 400 14px/20px helvetica, arial, sans-serif;
+  padding: 7px 16px;
+  box-sizing: border-box;
+  white-space: pre-wrap;
+  word-wrap: break-word;
+  resize: none;
+}
+.tags-box textarea::-webkit-scrollbar{
+  width: 8px;
+}
+.tags-box textarea::-webkit-scrollbar-thumb{
+  border-radius: 3px;
+  background-color: #ECECEC;
+} */
+
+.tags-box .tags-list .tags-item{
+  float: left;
+  min-width: 44px;
+  padding: 0 8px;
+  margin: 10px 8px 0 0;
+  height: 24px;
+  line-height: 24px;
+  border-radius: 4px;
+  border: 1px solid #ECECEC;
+  box-sizing: border-box;
+  color: #1D1D1D;
+  text-align: center;
+  font-size: 14px;
+  background: #F5F6F7;
+  cursor: pointer;
+}
+.tags-item.tags-active{
+  padding: 0 8px 0 24px!important;
+  background: #2CB7CA url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAADPSURBVHgB7ZNREcIwDIYjYRImYRLmZHPAHAwHlUAdIAEJSKiESgjpEY7Qg7uFdXnKd5eXdMmfpX8BHMdxDEDEgSJQ9GANiU4UGZ9cwBISXPFNGWIAKyrxZLr+suq/xdkwV4oFlFBNR3ET4veS0zaJosGoqOtZ8EVUi4tGWbM+rklC/Ax7KH++dY18ZbmZuGi8iKbhxzdTJT5DSyo/LNXZSZxljV80A3T4aayR86vIJTzyjX8xZTATF0NIU24y5xFDSFNGU3ExxNzsmTmO4zAPYEiZdz83IV0AAAAASUVORK5CYII=) no-repeat 6px center!important;
+  color: #fff!important;
+  background-size: 16px!important;
+  border: 0!important;
+}

BIN
src/web/staticres/images/biddingSearch/VIP.png


BIN
src/web/staticres/images/biddingSearch/icon-checked.png


BIN
src/web/staticres/images/biddingSearch/trapezoid.png


BIN
src/web/staticres/images/collect.png


BIN
src/web/staticres/images/collected.png


BIN
src/web/staticres/images/focus.png


BIN
src/web/staticres/images/focused.png


BIN
src/web/staticres/images/new-weixin.png


+ 9 - 4
src/web/staticres/js/biddingSearch.js

@@ -182,8 +182,9 @@ $(function() {
 		}
 		/*全选功能*/
 		$content.on('click', 'font:not(".parent-node")' ,function() {
-			var $prevNode = $(this).prevAll(".parent-node:eq(0)");
-			$(this).toggleClass("active").siblings().removeClass("active").removeClass("secondActice");
+      var $prevNode = $(this).prevAll(".parent-node:eq(0)");
+      // $(this).toggleClass("active").siblings().removeClass("active").removeClass("secondActice"); // 原单选功能
+			$(this).toggleClass("active");
 			if($prevNode.nextUntil(".diver").filter(".active").length === 0) {
 				$prevNode.removeClass("active").removeClass("secondActice");
 			} else {
@@ -192,8 +193,12 @@ $(function() {
 			beforeSubmit();			
 		});
 		$parentNode.on('click', function() {
-			$(this).parent().find("font").removeClass("active").removeClass("secondActice");
-			$(this).toggleClass("active").removeClass("secondActice");
+      /* 
+        // 原行业单选需求
+        $(this).parent().find("font").removeClass("active").removeClass("secondActice");
+        $(this).toggleClass("active").removeClass("secondActice"); 
+      */
+      $(this).toggleClass("active").removeClass("secondActice").nextUntil('.driver', $('font')).removeClass('active');
 			beforeSubmit();
 		});
 		/*如果点击没有内容给全部添加类名*/

+ 17 - 8
src/web/staticres/js/superSearch.js

@@ -45,11 +45,13 @@ $(function() {
 	})
 	//
 	$(".nbprev").click(function(){
-		$(window).scrollTop(0);
+    $(window).scrollTop(0);
+    $('.custom-checkbox.check-all').prop('checked', false)
 		prev();
 	})
 	$(".nbnext").click(function(){
-		$(window).scrollTop(0);
+    $(window).scrollTop(0);
+    $('.custom-checkbox.check-all').prop('checked', false)
 		next();
 	})
 	//筛选关闭和打开
@@ -246,7 +248,8 @@ function getNewBiddings(){
 				minprice : $("#zbSeatchT [name='minprice']").val(),
 				maxprice : $("#zbSeatchT [name='maxprice']").val(),
 				industry : $("#zbSeatchT [name='industry']").val(),
-			};
+      };
+      console.log(param, '1111')
 	$.post("/front/pcAjaxReq",param,function(r){
 		if(r&&r.list!=null&&r.list.length>0){
 			$(".tabContainer").show();
@@ -341,7 +344,8 @@ function appendDatas(datas,flag,isNew,onlyUpdateTable){
 			//	listHtml +='<div class="liLuceneList">'
 			//}else{
 				listHtml +='<div class="liLuceneList" style="border-bottom: 1px solid #EBEBEB;">'
-			//}
+      //}
+      listHtml += '<input class="custom-checkbox" type="checkbox" dataid="'+datas[i]._id+'" />'
 			listHtml +='<div class="luce-left"><em>'+index+'.</em>'
 						+'<div class="left-title">'
 						+'<a onclick="noIn(this)" dataid="'+datas[i]._id+'" dataindustry="'+datas[i].industry+'" target="_blank"> '+title+'</a>'
@@ -382,7 +386,11 @@ function appendDatas(datas,flag,isNew,onlyUpdateTable){
 				if(diff != null){
 					listHtml += '<span class="com-time">'+diff+'</span>';
 				}
-			}
+      }
+      // 是否收藏
+      if (true) {
+        listHtml += '<i class="icon-collect" dataid="'+datas[i]._id+'"></i>'
+      }
 			listHtml += '</div></li>';
 		}
 
@@ -643,7 +651,7 @@ function getVIPData(clickpaging){
 				maxprice : $("#zbSeatchT [name='maxprice']").val(),
 				industry : $("#zbSeatchT [name='industry']").val(),
 				tabularflag : tabularflag,
-			};
+      };
 	$.ajax({
        type:'post',
        url:'/front/pcAjaxReq',
@@ -751,7 +759,7 @@ function beforeSubmit(n){
 					thisText = $(this).attr("data-value");
 					if(selectIndustrys != ""){
 						selectIndustrys += ",";
-					}
+          }
 					selectIndustrys += thisText;
 				});
 			}else{
@@ -761,7 +769,8 @@ function beforeSubmit(n){
 				}
 				selectIndustrys += thisText;
 			}
-		});
+    });
+    console.log(selectIndustrys, '1111')
 		$("#zbSeatchT [name='industry']").val(selectIndustrys);
 		//价格
 		if(!$("#priceAll").hasClass("active")){

+ 10 - 1
src/web/staticres/js/track/track.js

@@ -417,6 +417,10 @@ class JyTrackUtils {
         timeCount = timeStep.length - 1
       }
       const nextTime = timeStep[timeCount]
+      if (nextTime === -1) {
+        clearTimeout(timeTn)
+        return
+      }
       timeTn = setTimeout(timeTempFn, nextTime)
       timeCount++
       typeof cb === 'function' ? cb() : null
@@ -809,7 +813,7 @@ class JyTrackRecord {
       } else if (viewTime <= 5) {
         return nextTimeInterval = 30
       } else {
-        return nextTimeInterval = 120
+        return nextTimeInterval = -1
       }
     }
     // 发送
@@ -818,6 +822,11 @@ class JyTrackRecord {
       if (!this.canTimeCache(location.href + 'sendData' + type)) {
         return
       }
+      if (nextTimeInterval === -1) {
+        console.log('stop page time')
+        clearTimeout(sendPageTn)
+        return
+      }
       // 计数
       params.count++
       params.viewtime = Math.round(this.getDiffTime() / 1000)

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
src/web/staticres/js/track/track.umd.min.js


+ 32 - 10
src/web/templates/pc/biddetail_rec.html

@@ -240,6 +240,21 @@ a{
 .portrait_img:hover + .portrait_tip {
 	display: block !important;
 }
+.com-collect{
+  float: right;
+  margin-left: 18px;
+  position: relative;
+  font-size: 14px;
+  cursor: pointer;
+}
+.icon-title-img{
+  width: 20px;
+  height: 20px;
+  margin-right: 4px;
+}
+.j-content .com-wxshare, .j-content .com-guanzhu{
+  margin-left: 18px!important;
+}
 </style>
 </head>
 <body>
@@ -271,14 +286,21 @@ function isWechat() {
 
 		</div>
 		<div class="com-statusbar" id="statusbar">
+      <span class="com-collect" id="bidCollect">
+        <img class="icon-title-img" src='{{Msg "seo" "cdn"}}/images/collect.png' />
+        标讯收藏
+      </span>
+      <script>
+        
+      </script>
 				{{if .T.isMember}}
 					<!--大会员用户,可直接在pc端关注项目 -->
-					<span class="com-guanzhu" id="followedProject" style="width:90px;display: none">
-						<img src="{{Msg "seo" "cdn"}}/images/guanzhued.png">
+					<span class="com-guanzhu" id="followedProject" style="display: none">
+						<img class="icon-title-img" src="{{Msg "seo" "cdn"}}/images/focused.png">
                     	<font>已关注</font>
 					</span>
-					<span class="com-guanzhu" id="unfollowedProject" style="width:90px;display: none;cursor: pointer;">
-						<img src="{{Msg "seo" "cdn"}}/images/guanzhu.png">
+					<span class="com-guanzhu" id="unfollowedProject" style="display: none;cursor: pointer;">
+						<img class="icon-title-img" src="{{Msg "seo" "cdn"}}/images/focus.png">
                     	<font>关注项目</font>
 					</span>
 
@@ -339,7 +361,7 @@ function isWechat() {
 				{{else}}
 					<!--非大会员用户,只能扫码跳转微信关注项目 -->
 					<span class="com-guanzhu">
-						<img src="{{Msg "seo" "cdn"}}/images/guanzhu.png">
+						<img class="icon-title-img" src="{{Msg "seo" "cdn"}}/images/focus.png">
 						<font>关注项目</font>
 						<div class="scanqr">
 							<span>微信扫一扫</span>
@@ -347,15 +369,15 @@ function isWechat() {
 							<span>扫码关注此项目<br>实时查看最新公告</span>
 						</div>
 					</span>
-				{{end}}
-
+        {{end}}
+      
 			<span class="com-wxshare">
-				<img src="{{Msg "seo" "cdn"}}/images/wxshare.png">微信分享
+				<img class="icon-title-img" src="{{Msg "seo" "cdn"}}/images/new-weixin.png">微信分享
 				<div class="scanqr">
 					<span>微信扫一扫</span>
 					<img class="img" src="/biddetail/normal/qr/{{.T.obj._id}}" alt="微信分享">
 				</div>
-			</span>
+      </span>
 		</div>
 		<div class="cutline"></div>
 		<div class="com-prebuilt hidden">
@@ -527,7 +549,7 @@ function isWechat() {
 						<tr>
 							<td class="tab-type">中标单位</td>
 							<td class="tab-cont">
-								{{if .T.isMember}}
+								{{if or .T.isVip .T.isMember}}
 									<div class="cont-cont portrait_img" {{if .T.obj.entId}} href-data="/swordfish/page_big_pc/ent_portrait/{{.T.obj.entId}}"  tip-data="查看企业画像"{{end}}>{{.T.obj.winner}}</div>
 								{{else}}
 									<div class="cont-cont">{{.T.obj.winner}}</div>

+ 494 - 20
src/web/templates/pc/supsearch.html

@@ -13,6 +13,7 @@
 <link href="{{Msg "seo" "cdn"}}/css/dev2/reset_pc.css?v={{Msg "seo" "version"}}" rel="stylesheet">
 <link href="{{Msg "seo" "cdn"}}/css/dev2/biddingSearch.css?v={{Msg "seo" "version"}}" rel="stylesheet">
 <link href="{{Msg "seo" "cdn"}}/css/dev2/superSearch.css?v={{Msg "seo" "version"}}" rel="stylesheet">
+<link href="{{Msg "seo" "cdn"}}/css/dev2/newBidSearch.css?v={{Msg "seo" "version"}}" rel="stylesheet">
 <link rel="stylesheet" type="text/css" href="{{Msg "seo" "cdn"}}/pccss/public-nav-1200.css?v={{Msg "seo" "version"}}" />
 <script type="text/javascript" src="{{Msg "seo" "cdn"}}/js/public-nav.js?v={{Msg "seo" "version"}}"></script>
 <script src="{{Msg "seo" "cdn"}}/js/jquery.cookie.js"></script>
@@ -238,6 +239,10 @@
 }
 </style>
 <script>
+var buyclassArr = {
+  "党政机关事业单位": ['人大', '政协', '党委办','组织', '宣传', '统战', '纪委', '政府办', '发改委','财政','教育','科技','工信','民政', '民宗', '人社', '公安', '检察院','法院', '司法', '应急管理', '军队', '自然资源', '生态环境','住建', '市政',  '城管', '交通', '水利','农业','文旅', '卫健委','医疗','学校','档案', '体育', '政务中心', '机关事务', '国资委','海关','税务', '市场监管', '商务','人行', '银保监', '证监', '审计', '出版广电','统计', '公共资源交易', '社会团体','气象'],
+  "企业": ['传媒','采矿业', '电信行业', '金融业', '建筑业', '能源化工', '农林牧渔','批发零售', '信息技术', '运输物流', '制造业', '住宿餐饮']  
+}
 var areas = {{.T.area}}!=null?{{.T.area}}:"";
 var selectPublishtime = {{.T.publishtime}}!=null?{{.T.publishtime}}:"";
 var selectTimeslot = {{.T.timeslot}}!=null?{{.T.timeslot}}:"";
@@ -271,7 +276,7 @@ $(function(){
 	moveEnd(oInput)
 
 	$(".working").show();
-	$(document).keydown(function(e){
+	$('.searchname').keydown(function(e){
 	    if(e.keyCode == "13"){
 			if($("#bidLogin").is(":visible")){
 				return;
@@ -352,7 +357,7 @@ $(function(){
 		}
 		$(".industry-content").html(industryhtml)
 	}
-	//
+  //
 	if(industry!=""){
 		$("#induAll").removeClass("active");
 		industry = industry.split(",");
@@ -540,7 +545,23 @@ $(function(){
 		}else{
 			maxnum = maxp;
 		}
-	})
+  })
+  
+  // 采购单位类型
+  if (buyclassArr) {
+    var buyhtml = '';
+    for(var i in buyclassArr){
+      buyhtml+='<div class="clearfix">'
+      buyhtml+= '<span class="buy-list buy-type">'+ i +'</span>'
+      var childlist = buyclassArr[i]
+      childlist.forEach(function(v,i) {
+        buyhtml+='<span class="buy-list">'+ v +'</span>'
+      });
+      buyhtml+="</div>"
+		}
+		$(".buyclass-content").html(buyhtml)
+    
+  }
 	/**
 	//ie11 backspace禁止
 	window.onload=function(){
@@ -579,6 +600,29 @@ $(function(){
 </script>
 <script src="/js/biddingSearch.js?v={{Msg "seo" "version"}}"></script>
 <script src="/js/superSearch.js?v={{Msg "seo" "version"}}"></script>
+<style>
+  .control-tabBtn{
+    margin-top: 0;
+    padding: 8px;
+    height: auto!important;
+    line-height: 24px;
+  }
+  .control-tabBtn a{
+    margin-top: 0!important;
+  }
+  .bidbutdir{
+    border: none;
+    top: 36px;
+    left: 8px;
+    display: inline-block;
+    width: 56px;
+    height: 2px;
+    background-color: #2cb7ca;
+  }
+  .on{
+    color: #2cb7ca!important;
+  }
+</style>
 </head>
 <body>
 {{include "/common/pchead.html"}}
@@ -635,7 +679,10 @@ $(function(){
 					<input type="hidden" name="minprice" value="{{.T.minprice}}">
 					<input type="hidden" name="maxprice" value="{{.T.maxprice}}">
 					<input type="hidden" name="industry" value="{{.T.industry}}">
-					<input type="hidden" name="selectType" value="all">
+          <input type="hidden" name="selectType" value="all">
+          <input type="hidden" name="buyerclass " value="">
+          <input type="hidden" name="buyertel" value="">
+          <input type="hidden" name="winnertel" value="">
 				</form>
 				<!--筛选-->
 				<div id="screenBtn" class="screen down">
@@ -661,14 +708,22 @@ $(function(){
 			<!--整体页面切换tab-->
 			<div class="control-tabBtn">
 				<span class="bidbutdir"></span>
-				<a href="#" class="on" left="50">
-					<i></i><font>招标搜索</font>
+				<a href="#" class="on" left="8">
+          <!-- <i></i> -->
+          <font>招标搜索</font>
 				</a>
-				<a id="entsearch" href="javascript:" left="170" datahref="/jylab/entSearch/index.html">
-					<i></i>企业搜索
+				<a id="entsearch" href="javascript:" left="98" datahref="/jylab/bidsearchforent/index.html">
+          <!-- <i></i> -->
+          企业搜索
 				</a>
-				<a href="{{Msg "seo" "url.portrait_winner"}}"{{if not .T.portraitpower}} class="hidden"{{end}} left="305"><i></i>中标企业画像</a>
-				<a href="{{Msg "seo" "url.portrait_buyer"}}"{{if not .T.portraitpower}} class="hidden"{{end}} left="455"><i></i>采购单位画像</a>
+				<a href="{{Msg "seo" "url.portrait_winner"}}"{{if not .T.portraitpower}} class="hidden"{{end}} left="335">
+          <!-- <i></i> -->
+          中标企业画像
+        </a>
+				<a href="{{Msg "seo" "url.portrait_buyer"}}"{{if not .T.portraitpower}} class="hidden"{{end}} left="485">
+          <!-- <i></i> -->
+          采购单位画像
+        </a>
 			</div>
 		</div>
 	</div>
@@ -833,12 +888,57 @@ $(function(){
 					<span class="remindonebak"></span>
 					<span class="remindtwo"><span>"拟建项目"</span>是指那些处于前期立项、审批阶段的项目。供应商应在立项阶段掌握项目信息,做到早介入,稳拿单。</span>
 				</span>
-			</div>
-		</div>
+      </div>
+      <!-- 高级筛选 -->
+      <div class="advanced-filter clearfix">
+        <div class="advanced-title">
+          <strong>高级筛选</strong>  
+          <img class="icon-vip" src="{{Msg "seo" "cdn"}}/images/biddingSearch/VIP.png" alt="" />
+        </div>
+        <div class="leftTitle" style="width: 116px;">采购单位类型:</div>
+        <div class="buyclass">
+          <span class="buyclass-all active">全部</span>
+          <div class="buyclass-content" style="display: none;"></div>
+        </div>
+      </div>
+      <!-- 其他筛选条件 -->
+      <div class="other-filter clearfix">
+        <div class="leftTitle" style="width: 116px;">其他筛选条件:</div>
+        <div class="other-content">
+          <div class="buy-select">
+            <div class="custom-select">
+              <input class="custom-input" name="buyertel" data-value="" type="text" readonly placeholder="采购单位联系方式" />
+              <i class="icon-arrow"></i>
+            </div>
+            <ol class="custom-option" style="display:none;">
+              <li data-value="y">有联系方式</li>
+              <li data-value="n">无联系方式</li>
+            </ol>
+          </div>
+          <div class="bid-select">
+            <div class="custom-select">
+              <input class="custom-input" name="winnertel" data-value="" type="text" readonly placeholder="中标企业联系方式" />
+              <i class="icon-arrow"></i>
+            </div>
+            <ol class="custom-option" style="display:none;">
+              <li data-value="y">有联系方式</li>
+              <li data-value="n">无联系方式</li>
+            </ol>
+          </div>
+        </div>
+      </div>
+    </div>
+    <!-- 展开收起 -->
+    <div class="w" style="text-align: center;">
+      <div class="fold" id="fold">
+        <i class="icon-arrow"></i>
+      </div>
+    </div>
 		<!--招标搜索列表内容-->
-		<div class="seaTender-inner w">
+		<div class="seaTender-inner w" style="position: relative;">
 			<!--招标tab切换-->
 			<div class="tabTitle clearfix">
+        <input class="custom-checkbox check-all" type="checkbox" />
 				<ul id="newsclass" style="display:none;">
 					<li>
 						<a class="active" href="javascript:;" style="width:70px;">标题搜索</a>
@@ -852,11 +952,13 @@ $(function(){
 						<a class="active" href="javascript:;" style="width:100px;">最新招标信息</a>
 					</li>
 				</ul>
-                <div class="right-tabBtn right-tabBtn-superSearch">
+                <div class="right-tabBtn right-tabBtn-superSearch" style="width: 370px;">
 					<button class="active" id="right-list">列表</button>
 					<button  id="right-table">表格</button>
 					<div class="split-line"></div>
-					<button id="right-export" data-need-bind-phone>数据导出</button>
+          <button id="right-export" data-need-bind-phone>数据导出</button>
+          <div class="split-line"></div>
+          <button id="bid-collect">标讯收藏</button>
 				</div>
 			</div>
 			<!--tab切换内容-->
@@ -951,7 +1053,23 @@ $(function(){
 			<div class="working" style="display: none;">
 				<img style="width: 216px;margin: 45px auto;" src="{{Msg "seo" "cdn"}}/images/wx/working.gif">
 				<div style="color:#2cb7ca;">剑鱼标讯正在努力工作中···</div>
-			</div>
+      </div>
+      <!-- 自定义标签弹框 -->
+      <div class="tags-box">
+        <!-- <div class="tags-textarea" id="tags-textarea">
+          <pre><span></span><br></pre>
+          <textarea name="" id="" rows="1" placeholder="新增或搜索标签"></textarea>
+        </div> -->
+        <div class="tags-inputs">
+          <input type="hidden" class="tag-input-hidden" value="">
+          <div class="tag-input">
+            <div class="tag-labels"></div>
+            <input type="text" class="clear-input">
+            <div class="tag-placeholder">新增或搜索标签</div>
+          </div>
+        </div>
+        <div class="tags-list"></div>
+      </div>
 		</div>
 		<!--分页-->
 		<div class="pagination clearfix w" style="display: none;">
@@ -960,7 +1078,42 @@ $(function(){
 				<span>1</span>
 				<a class="nbnext">下一页<i>></i></a>
 			</div>
-		</div>
+    </div>
+    <!-- 暂无权限、开通提醒弹框弹框 -->
+    <div class="custom-dialog auth-dialog">
+      <div class="mask"></div>
+      <div class="dialog-container">
+        <div class="dialog-header">
+          <h3 class="dialog-title">您暂无使用权限</h3>
+        </div>
+        <div class="dialog-content">开通超级订阅,搜索招标采购项目更精准,300万+投标人都在用!</div>
+        <div class="dialog-footer clearfix">
+          <a href="#" class="dialog-btn confirm-btn">去开通</a>
+          <a href="javascript:;" class="dialog-btn default-btn">取消</a>
+        </div>
+      </div>
+    </div>
+    <!-- 升级弹框 -->
+    <div class="custom-dialog update-dialog">
+      <div class="mask"></div>
+      <div class="dialog-container">
+        <div class="dialog-header">
+          <h3 class="dialog-title">提示信息</h3>
+        </div>
+        <div class="dialog-content">您的标讯收藏上限为100条,请升级为会员服务。</div>
+        <div class="dialog-footer clearfix">
+          <a href="#" class="dialog-btn confirm-btn">去升级</a>
+          <a href="javascript:;" class="dialog-btn default-btn">取消</a>
+        </div>
+      </div>
+    </div>
+    <!-- toast提醒 -->
+    <div class="custom-toast">
+      <div class="mask" style="background-color: transparent;"></div>
+      <div class="toast-container">
+        <span></span>
+      </div>
+    </div>
 		<!--广告-->
 		<div  onclick="adv_statistics(this)" adv_name="PC搜索列表页-底部" class="adv-pcsearch-bottom" id="A1" style="cursor:default;">
 			<script>
@@ -984,7 +1137,7 @@ $(function(){
                     $("#A1").html(ADHtml);
                 }
 			</script>
-		</div>
+    </div>
 	</div>
 	<!--招标搜索页面 END-->
 
@@ -993,6 +1146,7 @@ $(function(){
 {{include "/common/baiducc.html"}}
 <script type="text/javascript">
 $(function(){
+  var vipState = {{.T.portraitpower}};
     $(".shade_table .more").on('click', toPaydataExport)
 	$(".control-tabBtn>a").hover(function(){
 		$(".control-tabBtn>a").removeClass("on");
@@ -1041,8 +1195,329 @@ $(function(){
 		}else{
 			$("#backTop").hide();
 		}
-	});
+  });
+  /*
+    dev4.5新增需求(高级筛选、标讯收藏、自定义标签)
+  */
+  // 采购单位行业选择
+  buyClassFn() 
+  function buyClassFn() {
+    // 采购单位类型全部点击事件
+    $('.buyclass-all').click(function() {
+      // if (!vipState) {
+      //   openVipDialog()
+      //   return
+      // }
+      $(this).addClass('active').siblings('.buyclass-content').find('.buy-list').removeClass('active')
+    })
+    // 采购单位类型子分类点击事件
+    $('.buyclass-content .buy-list:not(.buy-type)').click(function() {
+      // if (!vipState) {
+      //   openVipDialog()
+      //   return
+      // }
+      $(this).toggleClass('active').parents('.buyclass').children('.buyclass-all').removeClass('active')
+      $(this).siblings('.buy-type').removeClass('active')
+      var activeLen = $('.buyclass-content .buy-list:not(.buy-type)').filter(".active").length;
+      var listLen = $('.buyclass-content .buy-list:not(.buy-type)').length;
+      var curListLen = $(this).parent('.clearfix').find('.buy-list:not(.buy-type)').length;
+      var curActiveLen = $(this).parent('.clearfix').find(".active").length;
+      console.log(curListLen,curActiveLen)
+      console.log(listLen, activeLen)
+      if (activeLen === listLen || activeLen === 0) {
+        $('.buyclass-content .buy-list').removeClass('active')
+        $('.buyclass-all').addClass('active')
+      } else if (curListLen === curActiveLen) {
+        $(this).siblings('.buy-type').addClass('active')
+      }
+    })
+    // 采购单位类型大分类点击事件
+    $('.buyclass-content .buy-list.buy-type').click(function() {
+      $(this).toggleClass('active').parents('.buyclass').children('.buyclass-all').removeClass('active')
+      if ($(this).hasClass('active')) {
+        $(this).siblings('.buy-list').addClass('active')
+      }
+      var activeLen = $('.buyclass-content .buy-type').filter(".active").length;
+      var listLen = $('.buyclass-content .buy-type').length;
+      console.log(activeLen,listLen)
+      if (activeLen === listLen || activeLen === 0) {
+        $('.buyclass-content .buy-list').removeClass('active')
+        $('.buyclass-all').addClass('active')
+      }
+    })
+  }
+  // 展开收起高级筛选
+  $('#fold').on('click', function() {
+    $(this).children('.icon-arrow').toggleClass('down')
+    $('.buyclass-content').slideToggle()
+    // $('.other-filter').slideToggle()
+  })
+  // 其他筛选条件
+  $('.custom-select').off('click').bind('click',function(e) {
+    if (!vipState) {
+      openVipDialog()
+      return
+    }
+    e.stopPropagation()
+    $(this).css("border-color", '#2cb7ca').siblings().show()
+    $(this).children('.icon-arrow').addClass('up')
+    $('.custom-option li').off('click').bind('click',function(e) {
+      e.stopPropagation()
+      $(this).parent().hide().siblings().children('.icon-arrow').removeClass('up')
+      $(this).parent().hide().siblings().css("border-color", '#e0e0e0')
+      var val = $(this).attr('data-value')
+      var text = $(this).text()
+      $(this).parent().siblings().children('.custom-input').val(text).attr('data-value', val)
+    })
+  })
+  // 点击其他区域 隐藏其他筛选条件下拉框
+  $(document).click(function() {
+    $('.custom-select').css("border-color", '#e0e0e0').children('.icon-arrow').removeClass('up')
+    $('.custom-select').siblings().hide()
+    $('.tags-box').hide()
+  })
+  // 全选
+  $('.custom-checkbox.check-all').on('change', function() {
+    var state = $(this).is(":checked")
+    if (state) {
+      $('.custom-checkbox').prop("checked",true)
+    } else {
+      // 将非收藏过的选项取消
+      $('.custom-checkbox:not(:disabled)').prop("checked",false)
+    }
+  })
+  // 单个收藏
+  $('.icon-collect').click(function(e) {
+    e.stopPropagation()
+    var checked = $(this).hasClass('checked')
+    var len = 1
+    if (checked) {
+      $(this).removeClass('checked').parents().siblings('input[type="checkbox"]').prop("checked",false).removeAttr('disabled')
+    } else {
+      // 如果不是会员 收藏上限为100条
+      if (!vipState) {
+        if (len > 100) {
+          updateVipDialog()
+        } else {
+          $(this).addClass('checked').parents().siblings('input[type="checkbox"]').prop("checked",true).attr('disabled', true)
+          var top = (parseInt($(this).position().top) + 60 ) + 'px';
+          console.log(top, 'top')
+          $('.tags-box').show().css('top', top)
+        }
+      } else {
+        // 如果是会员 判断收藏上限有没有达到5000
+        if (len > 5000) {
+          toastFn('您的标讯收藏上限为5000条,请联系客服人员。')
+        } else {
+          $(this).addClass('checked').parents().siblings('input[type="checkbox"]').prop("checked",true).attr('disabled', true)
+          var top = (parseInt($(this).position().top) + 60 ) + 'px';
+          console.log(top, 'top')
+          $('.tags-box').show().css('top', top)
+        }
+      }
+    }
+  })
+  // 批量收藏
+  $('#bid-collect').off('click').bind('click',function(e){
+    e.stopPropagation()
+    var top = (parseInt($(this).position().top) + 60 ) + 'px';
+    var len = $('.custom-checkbox:not(".check-all"):checked:not(:disabled)').length;
+    console.log(len)
+    // 判断有无选中的标讯信息
+    if (len > 0) {
+      $('.custom-checkbox:not(".check-all"):checked').attr('disabled', true).siblings().children('.icon-collect').addClass('checked')
+      $('.tags-box').show().css('top', top)
+    } else {
+      toastFn('尚未选择标讯,请选择')
+    }
+  })
+  // 自定义标签
+  // 渲染标签列表
+  var tagsArr = [{
+    "lid": "RQ==",
+    "lanme": "测试"
+  },
+  {
+    "lid": "RA==",
+    "lanme": "医疗"
+  },
+  {
+    "lid": "RE==",
+    "lanme": "政府"
+  }]
+  renderTagsList(tagsArr)
+  // 标签输入框事件
+  $('.tags-box').click(function(e) {
+    e.stopPropagation()
+  })
+
+  $('.tag-input').click(function(e) {
+    e.stopPropagation()
+    $(this).children('.tag-placeholder').hide()
+    $(this).children('input').focus()
+  })
+  // 标签输入框回车事件
+  $('.tag-input .clear-input').keydown(function(event){
+    event.stopPropagation()
+    if (event.keyCode == 13) {
+      if($(this).val().length >= 2 && $(this).val().length < 6) {
+        // ajax提交自定义标签
+        inputTagList()
+        tagsArr.push({
+          lid: '',
+          lanme: $(this).val()
+        })
+        renderTagsList(tagsArr)
+        $(this).val('')
+      }
+    }
+  })
+  // 标签输入框失去焦点事件
+  $('.tag-input .clear-input').blur(function() {
+    if($('.tag-labels').children().length == 0) {
+      $('.tag-placeholder').show()
+    }
+  })
+  
 })
+var activeTags = []
+function deleteInputTag(index) {
+  activeTags.splice(index, 1)
+  // inputTagList()
+  $('.tag-label').eq(index).remove()
+}
+function inputTagList () {
+  var ht = '';
+  activeTags.push({
+    lid: '',
+    lanme: $('.tag-input .clear-input').val()
+  })
+  activeTags.forEach(function(v,i) {
+    ht+='<span class="tag-label" data-id=' + v.lid + '>'+ v.lanme + '<i class="tag-close" onclick="deleteInputTag(' + i + ')"></i>' + '</span>'
+  });
+  $('.tag-labels').html(ht)
+}
+// 渲染标签列表数据
+function renderTagsList (data) {
+  if (data && data.length > 0) {
+    var ht = '';
+    data.forEach(function(v,i) {
+      ht+='<span class="tags-item" data-id=' + v.lid + '>'+ v.lanme +'</span>'
+    });
+    $(".tags-list").html(ht)
+    $('.tags-item').click(function(e) {
+      e.stopPropagation()
+      $(this).toggleClass('tags-active')
+    })
+  }
+}
+// 获取用户自定义标签
+function getUserTags () {
+  $.ajax({
+    type:'post',
+    url:'/publicapply/bidcoll/getLabel?t=' + Date.now(),
+    success: function(r){
+      if (r.error_code == 0 && r.data) {
+        renderTagsList(r.data)
+      }
+    }
+  })
+}
+/* 
+  保存或清除标签 ajax
+  params: {
+    lids: String 标签id(加密后),  非必传
+    lname: String 标签名称,  非必传
+    laction: String  用户行为:S添加或绑定标签;D删除标签  非必传
+    binfo: Array 招标信息数组(已收藏的招标信息) 非必传
+    bid: String 招标信息加密后id  必传
+    buyerclass: String 采购单位类型  非必传
+    buyerinfo: Boolean 有无采购单位联系方式  非必传
+    winnerinfo: Boolean 有无中标单位联系方式  非必传
+  }
+  1:lids为空;lname不为空;laction=”S”;binfo数组为空->新增标签
+  2:lids为空;lname不为空;laction=”S”;binfo数组不为空->新增标签并且绑定收藏信息
+  3:lids不为空;laction=”S”;binfo数组不为空->收藏信息绑定标签
+  3:lids不为空;laction=”D”;->删除标签 并解绑收藏的信息
+*/
+function editTags(params) {
+  $.ajax({
+    type:'post',
+    url:'/publicapply/bidcoll/label',
+    data: params,
+    dataType:'json',
+    success: function(r){
+      if (r.data) {
+        toastFn("操作成功")
+      }
+    }
+  })
+}
+// 自定义标签输入框自适应高度
+function autoTextarea(container) {
+  var textarea = container.getElementsByTagName('textarea')[0] ;
+  var span = container.getElementsByTagName('span')[0] ;
+  textarea.addEventListener('input', function() {
+    span.textContent = textarea.value;
+  }, false);
+  span.textContent = textarea.value;
+}
+// var tagsVal = document.getElementById('tags-textarea');
+// autoTextarea(tagsVal);
+/* 
+  收藏或取消收藏ajax 
+  params: {
+    baction: String, //用户行为:R:移除收藏;C:收藏(默认)非必填
+    binfo: Array, // 招标信息数组 必填
+    bid: String, // 招标信息加密后id 必填
+    buyerclass: String, // 采购单位类型 必填
+    buyerinfo: Boolean, // 有无采购单位联系方式 必填
+    winnerinfo: Boolean // 有无中标单位联系方式 必填
+  }
+  参数示例 (baction=R binfo数组只需要bid即可)
+*/
+function collectBidInfo (params) {
+  $.ajax({
+    type:'post',
+    url:'/publicapply/bidcoll/action',
+    data: params,
+    dataType:'json',
+    success: function(r){
+      if (r.data) {
+        toastFn("操作成功")
+      }
+    }
+  })
+}
+// 开通提醒弹框
+function  openVipDialog() {
+  $('.auth-dialog').show()
+  $('.auth-dialog .default-btn').click(function () { 
+    $('.auth-dialog').hide(300)
+  })
+}
+// 升级提醒弹框
+function  updateVipDialog() {
+  $('.update-dialog').show()
+  $('.update-dialog .default-btn').click(function () { 
+    $('.update-dialog').hide(300)
+  })
+}
+// 开通vip提醒
+function openVipDialog() {
+  $('.auth-dialog').show()
+  $('.dialog-footer .default-btn').click(function () { 
+    $('.auth-dialog').hide()
+  })
+}
+
+// toast上限提示
+function toastFn (text) {
+	$(".custom-toast").fadeIn().find("span").html(text);
+	setTimeout(function(){
+		$(".custom-toast").fadeOut();
+	},2000)
+}
 //
 function NullSuperSearch(){
 	$("#newsclass li:nth-child(2) a").click();
@@ -1104,7 +1579,6 @@ function priceCss(){
 	$(".pricefat").removeClass("customtime-active");
 	return true;
 }
-
 //关闭遮罩层
 function labClose(){
 	$("#labModal").modal("hide");

Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä