Pārlūkot izejas kodu

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

TANGSHIZHE 4 gadi atpakaļ
vecāks
revīzija
793addd5b3
38 mainītis faili ar 1417 papildinājumiem un 355 dzēšanām
  1. 14 13
      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. 12 11
      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. 13 12
      src/jfw/modules/app/src/app/front/ws_dataExport.go
  9. 64 99
      src/jfw/modules/common/src/qfw/util/dataexport/dataexport.go
  10. 44 0
      src/jfw/modules/common/src/qfw/util/jy/jy.go
  11. 12 5
      src/jfw/modules/common/src/qfw/util/jy/pushmapping.go
  12. 1 1
      src/jfw/modules/publicapply/src/bidcollection.json
  13. 127 32
      src/jfw/modules/publicapply/src/bidcollection/entity/entity.go
  14. 0 1
      src/jfw/modules/publicapply/src/bidcollection/service/service.go
  15. 2 1
      src/jfw/modules/publicapply/src/config.json
  16. 1 0
      src/jfw/modules/publicapply/src/config/config.go
  17. 10 0
      src/jfw/modules/publicapply/src/db.json
  18. 28 12
      src/jfw/modules/publicapply/src/db/db.go
  19. 6 0
      src/jfw/modules/publicapply/src/filter/sessionfilter.go
  20. 11 0
      src/jfw/modules/publicapply/src/free/init.go
  21. 10 0
      src/jfw/modules/publicapply/src/free/service/action.go
  22. 30 0
      src/jfw/modules/publicapply/src/free/service/service.go
  23. 1 0
      src/jfw/modules/publicapply/src/main.go
  24. 1 0
      src/jfw/modules/subscribepay/src/service/dataExportPay.go
  25. 23 16
      src/web/staticres/css/dev2/biddingSearch.css
  26. 435 0
      src/web/staticres/css/dev2/newBidSearch.css
  27. BIN
      src/web/staticres/images/biddingSearch/VIP.png
  28. BIN
      src/web/staticres/images/biddingSearch/icon-checked.png
  29. BIN
      src/web/staticres/images/biddingSearch/trapezoid.png
  30. BIN
      src/web/staticres/images/collect.png
  31. BIN
      src/web/staticres/images/collected.png
  32. BIN
      src/web/staticres/images/focus.png
  33. BIN
      src/web/staticres/images/focused.png
  34. BIN
      src/web/staticres/images/new-weixin.png
  35. 9 4
      src/web/staticres/js/biddingSearch.js
  36. 17 8
      src/web/staticres/js/superSearch.js
  37. 32 10
      src/web/templates/pc/biddetail_rec.html
  38. 494 20
      src/web/templates/pc/supsearch.html

+ 14 - 13
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))

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

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

@@ -374,17 +374,18 @@ func (wd *WsDataExport) SearchExport() error {
 	}
 	//接收超级搜索页面参数
 	reqData := public.BidSearchExport{
-		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"),                   //是否有中标电话
+		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
 	}

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

@@ -340,18 +340,19 @@ func (wd *WsDataExport) SearchExport() error {
 	}
 	//接收超级搜索页面参数
 	reqData := public.BidSearchExport{
-		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"),                   //是否有中标电话
+		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()

+ 64 - 99
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"
@@ -47,8 +46,8 @@ type SieveCondition struct {
 	MaxPrice     string    `json:"maxprice"`     //金额——最多
 	SelectType   string    `json:"selectType"`   //筛选(正文 or 标题)
 	Subtype      string    `json:"subtype"`      //信息类型
+	SelectIds    []string  `json:"selectId"`     //选择信息导出
 	Comeinfrom   string    `json:"comeinfrom"`   //查询来源
-	DisWord      string    `json:"disWord"`      //分销系统 口令
 }
 
 const (
@@ -65,6 +64,11 @@ 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],"must_not":[%s],"should":[%s],"minimum_should_match": %d}}}`
 	query_bool_should := `{"bool":{"should":[%s],"minimum_should_match": 1}}`
@@ -296,12 +300,16 @@ func GetSqlObjFromId(mongo mg.MongodbSim, _id string) *SieveCondition {
 		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)
 }
 
@@ -379,6 +387,9 @@ func isNullSearch(scd *SieveCondition) (isNull bool) {
 
 func GetDataExportSearchResultByScdId(sim mg.MongodbSim, elasticAddress, id, dataType string, checkCount int) (*[]map[string]interface{}, error) {
 	scd := GetSqlObjFromId(sim, id)
+	//if scd.SelectIds != nil {
+	//	return GetDataExportSelectResult(scd, dataType, checkCount)
+	//}
 	return GetDataExportSearchResult(elasticAddress, scd, dataType, checkCount)
 }
 
@@ -387,16 +398,48 @@ func GetDataExportSearchResultByScdId(sim mg.MongodbSim, elasticAddress, id, dat
 //checkCount -1 预览500条
 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++ {
@@ -409,27 +452,27 @@ func GetDataExportSearchResult(elasticAddress string, scd *SieveCondition, dataT
 				}()
 				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...)
@@ -437,100 +480,22 @@ func GetDataExportSearchResult(elasticAddress string, scd *SieveCondition, dataT
 			}(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))
+			log.Printf("%s-一次性加载数据总量为%d\n", flag, 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]
-				}
-			}
-		}
-	}
-	//校验数量
-	if checkCount != len(res) && checkCount != -1 {
-		return nil, fmt.Errorf("GetDataExportSearchResult-%s-数据总量校验异常,期望:%d,实际:%d", scd.Id, checkCount, len(res))
-		//发邮件
-	}
-	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
@@ -543,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("winner_enterprise", 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"] {

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

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

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

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

+ 1 - 0
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 {

+ 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")){

+ 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");