Browse Source

Merge branch 'feature/v4.9.7' into dev/v4.9.7_zsy

zhangsiya 1 year ago
parent
commit
fb551d5f86

+ 2 - 3
src/jfw/filter/anonymousUser.go

@@ -97,13 +97,13 @@ func initPrivatePublicKey() {
 }
 }
 
 
 func ChanMonitor() {
 func ChanMonitor() {
-
 	var (
 	var (
 		saveData []map[string]interface{}
 		saveData []map[string]interface{}
 		upData   []map[string]interface{}
 		upData   []map[string]interface{}
 		saveKey  = []string{"ip", "client", "os", "browse", "url", "guestUID", "mdescribe", "refer", "method", "creation_time"}
 		saveKey  = []string{"ip", "client", "os", "browse", "url", "guestUID", "mdescribe", "refer", "method", "creation_time"}
 		count    int
 		count    int
 	)
 	)
+	anonymousNumber := util.If(util.IntAll(config.Sysconfig["anonymousNumber"]) <= 0, 100, util.IntAll(config.Sysconfig["anonymousNumber"])).(int)
 	for {
 	for {
 		select {
 		select {
 		case data := <-saveChan:
 		case data := <-saveChan:
@@ -114,8 +114,7 @@ func ChanMonitor() {
 				upData = append(upData, data)
 				upData = append(upData, data)
 			}
 			}
 			// 处理 100条时处理一次 saveChan 收到的数据
 			// 处理 100条时处理一次 saveChan 收到的数据
-			anonymousNumber := util.If(util.IntAll(config.Sysconfig["anonymousNumber"]) <= 0, 100, util.IntAll(config.Sysconfig["anonymousNumber"])).(int)
-			if count == anonymousNumber {
+			if count >= anonymousNumber {
 				count = 0
 				count = 0
 				tm := time.Now()
 				tm := time.Now()
 				log.Println("开始批量操作匿名信息", len(saveData), len(upData))
 				log.Println("开始批量操作匿名信息", len(saveData), len(upData))

+ 193 - 0
src/jfw/front/hybg.go

@@ -0,0 +1,193 @@
+package front
+
+import (
+	. "app.yhyue.com/moapp/jybase/api"
+	qutil "app.yhyue.com/moapp/jybase/common"
+	. "app.yhyue.com/moapp/jybase/date"
+	"app.yhyue.com/moapp/jybase/go-xweb/xweb"
+	"app.yhyue.com/moapp/jybase/redis"
+	"app.yhyue.com/moapp/jypkg/common/src/qfw/util/jy"
+	"app.yhyue.com/moapp/jypkg/public"
+	"fmt"
+	"github.com/gogf/gf/v2/frame/g"
+	"github.com/gogf/gf/v2/os/gctx"
+	"github.com/gogf/gf/v2/util/gconv"
+	"html/template"
+	"jy/src/jfw/config"
+	"log"
+	"strings"
+	"time"
+)
+
+type DeskAnalysisReport struct {
+	*xweb.Action
+	deskReport    xweb.Mapper `xweb:"/front/project/deskAnalysisReport"` //工作桌面行业报告
+	importantNews xweb.Mapper `xweb:"/front/project/importantNews"`      //工作桌面要闻
+
+}
+
+func init() {
+	xweb.AddAction(&DeskAnalysisReport{})
+}
+
+var (
+	Date_MMdd     = "0102"
+	departmentMap = map[string]string{
+		"建筑工程": "装修施工、环保工程、劳务分包、园林绿化、结构建材、外檐工程、门窗工程、厨房卫浴、照明工程、钢结构、消防工程、土方工程、五金管材、地坪工程、防腐保温、防水防滑、水电管道、电力工程、土地整理、电梯",
+		"行政办公": "办公家具、家具/家装、电气设备、福利品、紧固件、废旧物资、办公设备、笔记本电脑、打印设备、触控一体机、图书、劳保/工装、无人机、车辆",
+		"医疗卫生": "医疗器械",
+		"服务采购": "仓储运输、金融服务、法律服务、财务税务、物业管理、培训咨询、广告传媒、餐饮服务、安检服务、人力外包、档案服务、后勤服务、信息服务、场地租赁、房屋管理和维修、医疗健康体检、警卫安保服务、印刷出版、安全服务、车辆保险、车辆租赁",
+		"机械设备": "机电设备、机械设备",
+		"能源化工": "化工用品包装材料、变压器",
+		"弱电安防": "弱电工程、电线电缆安防/门禁电缆",
+		"信息技术": "软件开发",
+		"交通工程": "交通设施",
+		"市政设施": "市政/道路",
+		"农林牧渔": "浇灌工程",
+	}
+)
+
+func (l *DeskAnalysisReport) ImportantNews() {
+	defer qutil.Catch()
+	rData := func() interface{} {
+		//res := redis.Get("limitation", "important_news")
+		//if res != nil {
+		//	resData, _ := res.([]interface{})
+		//	return qutil.ObjArrToMapArr(resData)
+		//}
+		columnCode, _ := config.Sysconfig["columnCode"].(map[string]interface{})
+		queryMap := map[string]interface{}{"s_contenttype": qutil.InterfaceToStr(columnCode["招投标攻略"]), "s_secondclassifytype": "zbjq", "i_status": 1, "releasetime": map[string]interface{}{"$lt": time.Now().Unix()}}
+		data, _ := mongodb.Find("content", queryMap, `{"releasetime":-1}`, `{"_id":1,"s_title":1,"releasetime":1,"l_createdate":1}`, false, 0, 10)
+		if data != nil {
+			for _, v := range *data {
+				s_title, _ := v["s_title"].(string)
+				v["s_title"] = template.HTML(s_title)
+				tmpdate, _ := v["l_createdate"]
+				v["l_createdate"] = qutil.TimeDiff(time.Unix(qutil.Int64All(tmpdate), 0))
+				tmpdate1, _ := v["releasetime"]
+				//v["releasetime"] = util.TimeDiff(time.Unix(util.Int64All(tmpdate1), 0))
+				reltime := time.Unix(qutil.Int64All(tmpdate1), 0)
+				v["time"] = reltime.Format(Date_Short_Layout) //首页展示
+				//v["date"] = reltime                             //首页展示
+				v["_id"] = se.EncodeString(qutil.InterfaceToStr(v["_id"]))
+			}
+			redis.Put("limitation", "important_news", *data, 24*3600)
+		}
+		return data
+	}()
+
+	l.ServeJson(NewResult(rData, nil))
+}
+
+func (l *DeskAnalysisReport) DeskReport() {
+	defer qutil.Catch()
+	userId := gconv.String(l.GetSession("userId"))
+	mgoUserId := gconv.String(l.GetSession("mgoUserId"))
+	rData := func() interface{} {
+		res := redis.Get("limitation", "user_desk_report")
+		if res != nil {
+			resData, _ := res.([]interface{})
+			return qutil.ObjArrToMapArr(resData)
+		}
+		data, ok := mongodb.FindOne("saleLeads", map[string]interface{}{
+			"userid": userId,
+			"source": "app_xzcyh",
+		})
+		var (
+			industry []string
+			areas    []string
+			strSql   string
+		)
+		industryMap := make(map[string]bool)
+		if ok && data != nil && len(*data) > 0 {
+			department := gconv.String((*data)["department"])
+			if department != "" {
+				for _, s := range strings.Split(department, ",") {
+					for s2, s3 := range departmentMap {
+						if strings.Contains(s3, s) {
+							industryMap[s2] = true
+						}
+					}
+				}
+				for key := range industryMap {
+					industry = append(industry, key)
+				}
+			}
+			for _, s := range strings.Split(gconv.String((*data)["area"]), ",") {
+				if s != "" && s != "全国" {
+					areas = append(areas, s)
+				}
+			}
+		}
+		if len(industry) == 0 { //从分析库获取行业
+			delSess := public.Mgo_Log.GetMgoConn()
+			defer public.Mgo_Log.DestoryMongoConn(delSess)
+			userSubscribe := make(map[string]interface{})
+			delSess.DB("sales_leads").C("user_subscribe").FindId(mgoUserId).One(&userSubscribe)
+			if userSubscribe != nil && len(userSubscribe) > 0 {
+				topscope, _ := userSubscribe["topscope_dy"].([]interface{})
+				industry = qutil.ObjArrToStringArr(topscope)
+			}
+		}
+		//订阅信息
+		if len(areas) == 0 {
+			userData := jy.GetBigVipUserBaseMsg(l.Session(), *config.Middleground)
+			var types string
+			oArea := &map[string]interface{}{}
+			if userData.Data.Member.Status > 0 {
+				types = "m"
+			} else if userData.Data.Vip.Status > 0 {
+				types = "v"
+			} else {
+				types = "m"
+			}
+			vipJy := jy.GetSubScribeInfo(l.Session(), mongodb, types, "10000")
+			oArea = qutil.ObjToMap((*vipJy)["o_area"])
+			for key := range *oArea {
+				areas = append(areas, key)
+			}
+		}
+
+		var sql []string
+		if len(industry) > 0 {
+			sql = append(sql, fmt.Sprintf(`industry in('%s')`, strings.Join(industry, `','`)))
+		}
+		if len(areas) > 0 {
+			sql = append(sql, fmt.Sprintf(`area in('%s')`, strings.Join(areas, `','`)))
+		}
+		if len(sql) > 0 {
+			strSql = fmt.Sprintf(" WHERE %s", strings.Join(sql, " and "))
+		}
+		log.Printf("用户userId:%s,mgoid:%s,sql:%s\n", userId, mgoUserId, sql)
+		var dataArrMap []map[string]interface{}
+		reportRes, _ := g.DB().Query(gctx.New(), fmt.Sprintf(`SELECT * FROM analysis_report %s ORDER BY show_time DESC,classify desc LIMIT 10
+`, strSql))
+		if !reportRes.IsEmpty() {
+			for _, row := range reportRes.List() {
+				var title string
+				showTime, classifys := time.Unix(gconv.Int64(row["show_time"]), 0), gconv.Int(row["classify"])
+				if gconv.String(row["key_word"]) == "" {
+					switch classifys { //1周报 2月报
+					case 1: //1周报
+						year, week := showTime.ISOWeek()
+						title = fmt.Sprintf("%s%s行业%d年第%d周(%s-%s)市场分析简报", gconv.String(row["area"]), gconv.String(row["industry"]), year, week, showTime.Format(Date_MMdd), showTime.AddDate(0, 0, 6).Format(Date_MMdd))
+					case 2: //2月报
+						year, month := showTime.Year(), int(showTime.Month())
+						title = fmt.Sprintf("%s%s行业%d年%d月份市场分析简报", gconv.String(row["area"]), gconv.String(row["industry"]), year, month)
+					}
+				} else {
+					title = fmt.Sprintf("%d年%d月份%s市场分析简报", showTime.Year(), int(showTime.Month()), gconv.String(row["industry"]))
+				}
+				row["title"] = title
+				dataArrMap = append(dataArrMap, map[string]interface{}{"title": title,
+					"url": fmt.Sprintf("/hybg/%s.html", gconv.String(row["id"]))})
+			}
+			redis.Put("limitation", "user_desk_report", dataArrMap, 2*3600)
+			return dataArrMap
+		}
+
+		return nil
+	}()
+
+	l.ServeJson(NewResult(rData, nil))
+}

+ 219 - 17
src/jfw/front/searchOptimize.go

@@ -3,6 +3,7 @@ package front
 import (
 import (
 	"encoding/json"
 	"encoding/json"
 	"fmt"
 	"fmt"
+	"github.com/gogf/gf/v2/util/gconv"
 	"jy/src/jfw/config"
 	"jy/src/jfw/config"
 	"jy/src/jfw/jyutil"
 	"jy/src/jfw/jyutil"
 	"log"
 	"log"
@@ -26,6 +27,7 @@ const (
 	queryBoolShould         = `{"bool":{"should":[%s],"minimum_should_match": 1}}`
 	queryBoolShould         = `{"bool":{"should":[%s],"minimum_should_match": 1}}`
 	queryBoolMustBoolShould = `{"bool":{"must":[{"range":{"bidamount":{%s}}}]}},{"bool":{"must":[{"range":{"budget":{%s}}}],"must_not":[{"range":{"bidamount":{"gte":-1}}}]}}`
 	queryBoolMustBoolShould = `{"bool":{"must":[{"range":{"bidamount":{%s}}}]}},{"bool":{"must":[{"range":{"budget":{%s}}}],"must_not":[{"range":{"bidamount":{"gte":-1}}}]}}`
 	queryBoolMust           = `{"bool":{"must":[{"terms":{"s_subscopeclass":[%s]}}]}}`
 	queryBoolMust           = `{"bool":{"must":[{"terms":{"s_subscopeclass":[%s]}}]}}`
+	queryBoolMustA          = `{"bool":{"must":[{"terms":{"%s":[%s]}}]}}`
 	queryBoolMustTerm       = `{"bool": {"must": [{ "term": {"isValidFile": %t }}]}}`
 	queryBoolMustTerm       = `{"bool": {"must": [{ "term": {"isValidFile": %t }}]}}`
 	queryExists             = `{"constant_score":{"filter":{"exists":{"field":"%s"}}}}`
 	queryExists             = `{"constant_score":{"filter":{"exists":{"field":"%s"}}}}`
 	gte                     = `"gte": %s`
 	gte                     = `"gte": %s`
@@ -85,13 +87,32 @@ type SearchOptimize struct {
 	VipStatus           int           `json:"vipStatus"`
 	VipStatus           int           `json:"vipStatus"`
 	BigMemberStatus     int           `json:"bigMemberStatus"`
 	BigMemberStatus     int           `json:"bigMemberStatus"`
 	EntStatus           int           `json:"entStatus"`
 	EntStatus           int           `json:"entStatus"`
-	HeightKeys          string        `json:"heightKeys"` //需要高亮的关键词
-	R                   *http.Request `json:"r"`          //http.request
-	District            string        `json:"district"`   //需要高亮的关键词
+	HeightKeys          string        `json:"heightKeys"`     //需要高亮的关键词
+	R                   *http.Request `json:"r"`              //http.request
+	District            string        `json:"district"`       //需要高亮的关键词
+	PropertyForm        string        `json:"propertyForm"`   //物业业态
+	ExpireTime          string        `json:"expireTime"`     //到期时间
+	Subinformation      string        `json:"subinformation"` //业务类型
+	Period              string        `json:"period"`         //合同周期
+	Changehand          int           `json:"changehand"`     // 换手率
+	Scale               string        `json:"scale"`          //价格区间
+	Isfile              int           `json:"isfile"`         //有无附件
+
 }
 }
 
 
 // NewSearchOptimize  初始化
 // NewSearchOptimize  初始化
-func NewSearchOptimize(userId, phone, province, city, district, subtype, topType, publishTime, selectType, price, industry, buyerClass, buyerTel, winnerTel, fileExists, keyWords, additionalWords, exclusionWords, platform, territorialization string, pageNum, pageSize, searchGroup, searchMode, wordsMode int, userInfo jy.VipState, searchTypeSwitch bool, r *http.Request) *SearchOptimize {
+func NewSearchOptimize(userId, phone, province, city, district, subtype, topType, publishTime, selectType, price, industry, buyerClass, buyerTel, winnerTel, fileExists, keyWords, additionalWords, exclusionWords, platform, territorialization, expireTime, propertyForm, subinformation string,
+	pageNum, pageSize, searchGroup, searchMode, wordsMode int, period, scale string, changehand, isfile int,
+	userInfo jy.VipState, searchTypeSwitch bool, r *http.Request, accountId, entAccountId, entId, entUserId int64) *SearchOptimize {
+	IsPay := userInfo.IsPayedUser()
+	if territorialization == "BIProperty" {
+		res := config.Middleground.ResourceCenter.Haspowers(accountId, entAccountId, entId, entUserId)
+		for _, pCode := range res.Powers {
+			if pCode == "bi_yx_wyzb" {
+				IsPay = true
+			}
+		}
+	}
 	var so = &SearchOptimize{
 	var so = &SearchOptimize{
 		AppId:            "10000",
 		AppId:            "10000",
 		UserId:           userId,
 		UserId:           userId,
@@ -117,7 +138,7 @@ func NewSearchOptimize(userId, phone, province, city, district, subtype, topType
 		AdditionalWords:  additionalWords,
 		AdditionalWords:  additionalWords,
 		ExclusionWords:   exclusionWords,
 		ExclusionWords:   exclusionWords,
 		Platform:         platform,
 		Platform:         platform,
-		IsPay:            userInfo.IsPayedUser(),
+		IsPay:            IsPay,
 		BidField:         territorialization,
 		BidField:         territorialization,
 		SearchTypeSwitch: searchTypeSwitch,
 		SearchTypeSwitch: searchTypeSwitch,
 		IsOldVip:         userInfo.VipState > 0 && userInfo.RegisterData < util.Int64All(config.Sysconfig["contextOldVipLimit"]),
 		IsOldVip:         userInfo.VipState > 0 && userInfo.RegisterData < util.Int64All(config.Sysconfig["contextOldVipLimit"]),
@@ -126,6 +147,13 @@ func NewSearchOptimize(userId, phone, province, city, district, subtype, topType
 		EntStatus:        userInfo.EntMember,
 		EntStatus:        userInfo.EntMember,
 		R:                r,
 		R:                r,
 		District:         district,
 		District:         district,
+		PropertyForm:     propertyForm,
+		ExpireTime:       expireTime,
+		Subinformation:   subinformation,
+		Period:           period,
+		Changehand:       changehand,
+		Scale:            scale,
+		Isfile:           isfile,
 	}
 	}
 	so.SearchParamsHandle()
 	so.SearchParamsHandle()
 	return so
 	return so
@@ -155,7 +183,7 @@ func (so *SearchOptimize) SearchParamsHandle() {
 		so.SearchGroup = 1
 		so.SearchGroup = 1
 	}
 	}
 	//信息类型
 	//信息类型
-	if so.Subtype == "" && so.TopType == "" {
+	if so.Subtype == "" && so.TopType == "" && so.BidField != "BIProperty" {
 		// 所有用户都可以搜索,判断是否能使用超前项目  老版超级订阅、大会员、商机管理有权限
 		// 所有用户都可以搜索,判断是否能使用超前项目  老版超级订阅、大会员、商机管理有权限
 		if so.SearchGroup > 0 && len(DefaultTopTypes) >= so.SearchGroup {
 		if so.SearchGroup > 0 && len(DefaultTopTypes) >= so.SearchGroup {
 			so.Subtype = DefaultTopTypes[so.SearchGroup-1]
 			so.Subtype = DefaultTopTypes[so.SearchGroup-1]
@@ -289,13 +317,22 @@ func (so *SearchOptimize) GetBidSearchList(isCache bool) (count, total int64, li
 		fields := util.If(so.IsPay, BidSearchFieldOfVip, BidSearchFieldBase).(string)
 		fields := util.If(so.IsPay, BidSearchFieldOfVip, BidSearchFieldBase).(string)
 		esIndex := util.If(so.UserId == "", INDEXOther, INDEX).(string)
 		esIndex := util.If(so.UserId == "", INDEXOther, INDEX).(string)
 		esType := util.If(so.UserId == "", TYPEOther, TYPE).(string)
 		esType := util.If(so.UserId == "", TYPEOther, TYPE).(string)
+		Fields := ""
+		switch so.BidField {
+		case "BIProperty":
+			Fields = BidSearchFieldProperty
+		case "":
+			Fields = fields
+		default:
+			Fields = BidSearchDomainField
+		}
 		biddingSearch := SearchByES{
 		biddingSearch := SearchByES{
 			Index:      esIndex,
 			Index:      esIndex,
 			IType:      esType,
 			IType:      esType,
 			Query:      so.GetSearchQuery(so.GetBidSearchQuery()),
 			Query:      so.GetSearchQuery(so.GetBidSearchQuery()),
 			FindFields: util.If(isCache, "title", "detail").(string),
 			FindFields: util.If(isCache, "title", "detail").(string),
 			Order:      BidSearchSort,
 			Order:      BidSearchSort,
-			Fields:     util.If(so.BidField != "", BidSearchDomainField, fields).(string), //BidField ===医疗领域化数据
+			Fields:     Fields, //BidField ===医疗领域化数据
 			Start:      util.If(isCache, 0, start).(int),
 			Start:      util.If(isCache, 0, start).(int),
 			Limit:      util.If(isCache, util.If(so.IsPay, bidsearch.SearchMaxPageCount_PAYED, bidsearch.SearchMaxPageCount_PC).(int), so.PageSize).(int), //缓存数据: 付费或未登录用户一次性5000条,100页数据;免费用户一次性500条,10页数据;实时数据:每页50条数据请求
 			Limit:      util.If(isCache, util.If(so.IsPay, bidsearch.SearchMaxPageCount_PAYED, bidsearch.SearchMaxPageCount_PC).(int), so.PageSize).(int), //缓存数据: 付费或未登录用户一次性5000条,100页数据;免费用户一次性500条,10页数据;实时数据:每页50条数据请求
 			Count:      util.If(strings.Contains(so.SelectType, "detail"), 115, 0).(int),                                                                  //高亮正文数量
 			Count:      util.If(strings.Contains(so.SelectType, "detail"), 115, 0).(int),                                                                  //高亮正文数量
@@ -315,7 +352,7 @@ func (so *SearchOptimize) GetBidSearchList(isCache bool) (count, total int64, li
 		total, repl = biddingSearch.GetAllByNgramWithCount()
 		total, repl = biddingSearch.GetAllByNgramWithCount()
 		if repl != nil && *repl != nil && len(*repl) > 0 {
 		if repl != nil && *repl != nil && len(*repl) > 0 {
 			//格式化查询结果
 			//格式化查询结果
-			list = SearchListFormat(so.Industry, *repl, strings.Contains(so.SelectType, "detail"))
+			list = SearchListFormat(so.Industry, so.Subinformation, so.PropertyForm, *repl, strings.Contains(so.SelectType, "detail"), so.BidField)
 			count = util.If(so.IsPay, int64(bidsearch.SearchMaxPageCount_PAYED), int64(bidsearch.SearchMaxPageCount_PC)).(int64)
 			count = util.If(so.IsPay, int64(bidsearch.SearchMaxPageCount_PAYED), int64(bidsearch.SearchMaxPageCount_PC)).(int64)
 			//数据如果>最大数据结果量 total==count,否则count = 付费:5000;免费:500;
 			//数据如果>最大数据结果量 total==count,否则count = 付费:5000;免费:500;
 			count = util.If(count > total, total, count).(int64)
 			count = util.If(count > total, total, count).(int64)
@@ -421,9 +458,9 @@ func (so *SearchOptimize) GetSearchQuery(mustQuery string) (qstr string) {
 		} else {
 		} else {
 			wordsMusts = append(wordsMusts, keyWordsMusts...)
 			wordsMusts = append(wordsMusts, keyWordsMusts...)
 		}
 		}
-	}
-	//附加词
-	if so.AdditionalWords != "" {
+		//附加词
+		if so.AdditionalWords != "" {
+		}
 		//多组附加词,每组间,号隔开。每组内如果关键词中间有空格,自动分词
 		//多组附加词,每组间,号隔开。每组内如果关键词中间有空格,自动分词
 		var (
 		var (
 			addWordsMusts []string
 			addWordsMusts []string
@@ -496,6 +533,58 @@ func (so *SearchOptimize) GetSearchQuery(mustQuery string) (qstr string) {
 	if so.Industry != "" && isLogin {
 	if so.Industry != "" && isLogin {
 		musts = append(musts, fmt.Sprintf(queryBoolMust, `"`+strings.ReplaceAll(so.Industry, ",", `","`)+`"`))
 		musts = append(musts, fmt.Sprintf(queryBoolMust, `"`+strings.ReplaceAll(so.Industry, ",", `","`)+`"`))
 	}
 	}
+	if so.BidField == "BIProperty" {
+		musts = append(musts, fmt.Sprintf(queryBoolMustA, "tag_topinformation", `"情报_物业"`))
+	}
+	//物业业态
+	if so.PropertyForm != "" && isLogin {
+		arr := []string{}
+		for _, v := range strings.Split(so.PropertyForm, ",") {
+			arr = append(arr, fmt.Sprintf(`"%s"`, v))
+		}
+		musts = append(musts, fmt.Sprintf(queryBoolShould, fmt.Sprintf(`{"terms":{"tag_set.wuye.property_form":[%s]}}`, strings.Join(arr, ","))))
+		//musts = append(musts, fmt.Sprintf(queryBoolShould, "property_form", `"`+strings.ReplaceAll(so.PropertyForm, ", ", `", "`)+`"`))
+	}
+	//业务类型
+	if so.Subinformation != "" && isLogin {
+		arr := []string{}
+		for _, v := range strings.Split(so.Subinformation, ",") {
+			arr = append(arr, fmt.Sprintf(`"%s"`, v))
+		}
+		musts = append(musts, fmt.Sprintf(queryBoolShould, fmt.Sprintf(`{"terms":{"tag_subinformation":[%s]}}`, strings.Join(arr, ","))))
+	}
+	//价格区间
+	if so.Scale != "" && isLogin {
+		arr := []string{}
+		for _, v := range strings.Split(so.Scale, ",") {
+			arr = append(arr, fmt.Sprintf(`"%s"`, v))
+		}
+		musts = append(musts, fmt.Sprintf(queryBoolShould, fmt.Sprintf(`{"terms":{"tag_set.wuye.scale":[%s]}}`, strings.Join(arr, ","))))
+	}
+	//合同周期
+	if so.Period != "" && isLogin {
+		arr := []string{}
+		for _, v := range strings.Split(so.Period, ",") {
+			arr = append(arr, fmt.Sprintf(`"%s"`, v))
+		}
+		musts = append(musts, fmt.Sprintf(queryBoolShould, fmt.Sprintf(`{"terms":{"tag_set.wuye.period":[%s]}}`, strings.Join(arr, ","))))
+	}
+	//换手率
+	if so.Changehand != 0 && isLogin {
+		if so.Changehand > 0 {
+			//存在
+			musts = append(musts, `{"range":{"tag_set.wuye.changehand":{"gt":0.3}}}`)
+		}
+	}
+	if so.Isfile != 0 && isLogin {
+		if so.Isfile > 0 {
+			//存在
+			musts = append(musts, fmt.Sprintf(queryBoolMustA, "tag_set.wuye.isfile", `"63"`))
+		} else {
+			//不存在
+			mustNot = append(mustNot, fmt.Sprintf(queryExists, "tag_set.wuye.isfile"))
+		}
+	}
 	//价格
 	//价格
 	if so.Price != "" && len(strings.Split(so.Price, "-")) > 1 && isLogin {
 	if so.Price != "" && len(strings.Split(so.Price, "-")) > 1 && isLogin {
 		minPrice, maxPrice := strings.Split(so.Price, "-")[0], strings.Split(so.Price, "-")[1]
 		minPrice, maxPrice := strings.Split(so.Price, "-")[0], strings.Split(so.Price, "-")[1]
@@ -549,15 +638,27 @@ func (so *SearchOptimize) GetSearchQuery(mustQuery string) (qstr string) {
 	}
 	}
 	//附件
 	//附件
 	fileExists := so.FileExists
 	fileExists := so.FileExists
+
 	if !isFileSearch && fileExists != "" && isLogin {
 	if !isFileSearch && fileExists != "" && isLogin {
-		if fileExists == "1" { //有附件
-			musts = append(musts, fmt.Sprintf(queryBoolMustTerm, true))
-		} else if fileExists == "-1" { //无附件
-			mustNot = append(mustNot, fmt.Sprintf(queryBoolMustTerm, true))
+		if so.BidField == "BIProperty" {
+			//物业
+			if fileExists == "1" {
+				//存在
+				musts = append(musts, fmt.Sprintf(queryBoolMustA, "tag_set.wuye.isfile", `"63"`))
+			} else if fileExists == "-1" {
+				//不存在
+				mustNot = append(mustNot, fmt.Sprintf(queryExists, "tag_set.wuye.isfile"))
+			}
+		} else {
+			if fileExists == "1" { //有附件
+				musts = append(musts, fmt.Sprintf(queryBoolMustTerm, true))
+			} else if fileExists == "-1" { //无附件
+				mustNot = append(mustNot, fmt.Sprintf(queryBoolMustTerm, true))
+			}
 		}
 		}
 	}
 	}
 	// 如果是领域化数据则需要加标签
 	// 如果是领域化数据则需要加标签
-	if so.BidField != "" {
+	if so.BidField != "" && so.BidField != "BIProperty" {
 		musts = append(musts, fmt.Sprintf(queryBoolMustTermDomain, so.BidField))
 		musts = append(musts, fmt.Sprintf(queryBoolMustTermDomain, so.BidField))
 	}
 	}
 	qstr = fmt.Sprintf(query, strings.Join(musts, ","), strings.Join(mustNot, ","))
 	qstr = fmt.Sprintf(query, strings.Join(musts, ","), strings.Join(mustNot, ","))
@@ -659,6 +760,50 @@ func (so *SearchOptimize) GetBidSearchQuery() string {
 		}
 		}
 		query += `}}}`
 		query += `}}}`
 	}
 	}
+	if so.ExpireTime != "" {
+		if len(query) > 0 {
+			query += ","
+		}
+		startTime, endTime := "", ""
+		now := time.Now()
+		if so.ExpireTime == "1" { //本月到期
+			startTime = fmt.Sprint(now.Unix())
+			first := time.Date(now.Year(), now.Month()+1, 1, 0, 0, 0, 0, time.Local)
+			endTime = fmt.Sprint(first.AddDate(0, 0, 0).Unix())
+			/* endTime = fmt.Sprint(time.Date(now.Year(), now.Month()+1, 1, 0, 0, 0, 0, time.Local).Unix())*/
+		} else if so.ExpireTime == "1-3" { //1-3个月到期
+			startTime = fmt.Sprint(time.Date(now.Year(), now.Month()+1, now.Day(), 0, 0, 0, 0, time.Local).Unix())
+			endTime = fmt.Sprint(time.Date(now.Year(), now.Month()+3, now.Day(), 0, 0, 0, 0, time.Local).Unix())
+		} else if so.ExpireTime == "3-6" { //3-6个月到期
+			startTime = fmt.Sprint(time.Date(now.Year(), now.Month()+3, now.Day(), 0, 0, 0, 0, time.Local).Unix())
+			endTime = fmt.Sprint(time.Date(now.Year(), now.Month()+6, now.Day(), 0, 0, 0, 0, time.Local).Unix())
+		} else if so.ExpireTime == "6-12" { //6-12个月到期
+			startTime = fmt.Sprint(time.Date(now.Year(), now.Month()+6, now.Day(), 0, 0, 0, 0, time.Local).Unix())
+			endTime = fmt.Sprint(time.Date(now.Year(), now.Month()+12, now.Day(), 0, 0, 0, 0, time.Local).Unix())
+		} else if so.ExpireTime == "12" { //12个月以后
+			startTime = fmt.Sprint(time.Date(now.Year(), now.Month()+12, now.Day(), 0, 0, 0, 0, time.Local).Unix())
+		} else if len(strings.Split(so.ExpireTime, "_")) > 1 {
+			startTime = strings.Split(so.ExpireTime, "_")[0]
+			endTime = strings.Split(so.ExpireTime, "_")[1]
+			etTime := time.Now()
+			if endTime != "" {
+				et, _ := strconv.ParseInt(endTime, 0, 64)
+				etTime = time.Unix(et, 0)
+			}
+			endTime = fmt.Sprint(time.Date(etTime.Year(), etTime.Month(), etTime.Day()+1, 0, 0, 0, 0, time.Local).Unix())
+		}
+		query += `{"range":{"expiredate":{`
+		if startTime != "" {
+			query += `"gte":` + startTime
+		}
+		if startTime != "" && endTime != "" {
+			query += `,`
+		}
+		if endTime != "" {
+			query += `"lt":` + endTime
+		}
+		query += `}}}`
+	}
 	//信息类型-二级
 	//信息类型-二级
 	subtype := so.Subtype
 	subtype := so.Subtype
 	topType := util.If(so.TopType != "", strings.Split(so.TopType, ","), []string{}).([]string)
 	topType := util.If(so.TopType != "", strings.Split(so.TopType, ","), []string{}).([]string)
@@ -840,7 +985,7 @@ func (e *SearchByES) GetAllByNgramWithCount() (int64, *[]map[string]interface{})
 }
 }
 
 
 // SearchListFormat  格式化数据
 // SearchListFormat  格式化数据
-func SearchListFormat(industry string, repl []map[string]interface{}, b bool) (list []*map[string]interface{}) {
+func SearchListFormat(industry, subinformation, propertyForm string, repl []map[string]interface{}, b bool, bidField string) (list []*map[string]interface{}) {
 	for _, v := range repl {
 	for _, v := range repl {
 		//正文
 		//正文
 		if b {
 		if b {
@@ -918,6 +1063,63 @@ func SearchListFormat(industry string, repl []map[string]interface{}, b bool) (l
 				})
 				})
 			}
 			}
 			v["winnerInfo"] = winnerInfo
 			v["winnerInfo"] = winnerInfo
+
+		}
+		if bidField == "BIProperty" {
+			v["fileExists"] = false
+			//物业数据处理
+			subinformationArr := gconv.SliceStr(v["tag_subinformation"])
+			if len(subinformationArr) > 0 {
+				if len(subinformation) > 0 {
+					fool := false
+					for _, s1 := range subinformationArr {
+						for _, s2 := range strings.Split(subinformation, ",") {
+							if s2 == s1 {
+								v["tag_subinformation"] = strings.Split(s1, "_")[1]
+								fool = true
+								break
+							}
+						}
+						if fool {
+							break
+						}
+					}
+				} else {
+					v["tag_subinformation"] = strings.Split(subinformationArr[0], "_")[1]
+				}
+			}
+			//是否有附件
+			tag := gconv.Map(v["tag_set"])
+			if tag != nil {
+				wuye := gconv.Map(tag["wuye"])
+				if tag != nil {
+					isFile := gconv.Int64(wuye["isfile"])
+					propertyFormStr := gconv.String(wuye["property_form"])
+					if isFile == 63 {
+						v["fileExists"] = true
+					}
+					if propertyFormStr != "" {
+						if propertyForm != "" {
+							fool := false
+							for _, s1 := range strings.Split(propertyFormStr, ",") {
+								for _, s2 := range strings.Split(propertyForm, ",") {
+									if s2 == s1 {
+										v["property_form"] = s2
+										fool = true
+										break
+									}
+								}
+								if fool {
+									break
+								}
+							}
+						} else {
+							v["property_form"] = strings.Split(propertyFormStr, ",")[0]
+						}
+					}
+				}
+			}
+			delete(v, "tag_set")
 		}
 		}
 		tmp := v
 		tmp := v
 		list = append(list, &tmp)
 		list = append(list, &tmp)

+ 13 - 2
src/jfw/front/supsearch.go

@@ -330,6 +330,10 @@ func (p *Pcsearch) PcSearchIndex(module string) error {
 	if pageSize == 0 {
 	if pageSize == 0 {
 		pageSize = 50
 		pageSize = 50
 	}
 	}
+	accountId := util.Int64All(sessVal["accountId"])
+	entAccountId := util.Int64All(sessVal["entAccountId"])
+	entId := util.Int64All(sessVal["entId"])
+	entUserId := util.Int64All(sessVal["entUserId"])
 	keywords := p.GetString("keywords")
 	keywords := p.GetString("keywords")
 	industry := strings.TrimSpace(p.GetString("industry")) //选中的行业
 	industry := strings.TrimSpace(p.GetString("industry")) //选中的行业
 	area := p.GetString("area")                            //地区
 	area := p.GetString("area")                            //地区
@@ -406,9 +410,14 @@ func (p *Pcsearch) PcSearchIndex(module string) error {
 		if territorialization == "" {
 		if territorialization == "" {
 			territorialization = "0101"
 			territorialization = "0101"
 		}
 		}
+	case "BIProperty":
+		territorialization = territorialization
 	default:
 	default:
 		territorialization = ""
 		territorialization = ""
 	}
 	}
+	if territorialization == "" {
+		territorialization = p.GetString("property")
+	}
 	userInfo := jy.GetVipState(p.Session(), *config.Middleground, userId)
 	userInfo := jy.GetVipState(p.Session(), *config.Middleground, userId)
 	queryItems := userInfo.GetQueryItems(selectType, util.Int64All(config.Sysconfig["bidSearchOldUserLimit"]))
 	queryItems := userInfo.GetQueryItems(selectType, util.Int64All(config.Sysconfig["bidSearchOldUserLimit"]))
 	isPayedUser := userInfo.IsPayedUser()
 	isPayedUser := userInfo.IsPayedUser()
@@ -499,7 +508,7 @@ func (p *Pcsearch) PcSearchIndex(module string) error {
 		b_word, a_word, s_word = jy.InterceptSearchKW(keywords, keywordsLimit, len(industry) == 0)
 		b_word, a_word, s_word = jy.InterceptSearchKW(keywords, keywordsLimit, len(industry) == 0)
 	}
 	}
 	//医疗领域化信息 用户前提是大会员 超级订阅,才有领域化功能的权限
 	//医疗领域化信息 用户前提是大会员 超级订阅,才有领域化功能的权限
-	if territorialization != "" {
+	if territorialization != "" && territorialization != "BIProperty" {
 		isSearch = false
 		isSearch = false
 		userInfo := jy.GetVipState(p.Session(), *config.Middleground, userId)
 		userInfo := jy.GetVipState(p.Session(), *config.Middleground, userId)
 		if userInfo.BigMember > 0 || userInfo.VipState > 0 {
 		if userInfo.BigMember > 0 || userInfo.VipState > 0 {
@@ -511,7 +520,9 @@ func (p *Pcsearch) PcSearchIndex(module string) error {
 	isLimit := 1
 	isLimit := 1
 	if isSearch {
 	if isSearch {
 		searchTypeSwitch, _ := config.Sysconfig["searchTypeSwitch"].(bool)
 		searchTypeSwitch, _ := config.Sysconfig["searchTypeSwitch"].(bool)
-		so := NewSearchOptimize(userId, phone, area, city, district, subtype, toptype, publishtime, strings.Join(queryItems, ","), fmt.Sprintf("%s-%s", minprice, maxprice), industry, buyerclass, hasBuyerTel, hasWinnerTel, fileExists, s_word, additionalWords, notkey, "PC", territorialization, 0, pageSize, searchGroup, searchMode, wordsMode, *userInfo, searchTypeSwitch, p.Request)
+		so := NewSearchOptimize(userId, phone, area, city, district, subtype, toptype, publishtime, strings.Join(queryItems, ","), fmt.Sprintf("%s-%s", minprice, maxprice), industry, buyerclass, hasBuyerTel, hasWinnerTel, fileExists, s_word, additionalWords, notkey, "PC", territorialization, "", "", "",
+			0, pageSize, searchGroup, searchMode, wordsMode, "", "", 0, 0,
+			*userInfo, searchTypeSwitch, p.Request, accountId, entAccountId, entId, entUserId)
 		heightKeys = so.HeightKeys //主关键词和附加词合并,多组空格隔开,作为前端渲染高亮关键词使用
 		heightKeys = so.HeightKeys //主关键词和附加词合并,多组空格隔开,作为前端渲染高亮关键词使用
 		//关键词  行业 附加词
 		//关键词  行业 附加词
 		//放开用户不输入关键词可搜索 --P297需求
 		//放开用户不输入关键词可搜索 --P297需求

+ 28 - 13
src/jfw/front/swordfish.go

@@ -37,11 +37,11 @@ var (
 	bidSearch_field_file     = `,"filetext","isValidFile"`
 	bidSearch_field_file     = `,"filetext","isValidFile"`
 	bidSearch_domain_field_1 = bidSearch_field_1 + `,"purchasing","s_winner","buyer"` + bidSearch_field_file //领域数据字段基本字段
 	bidSearch_domain_field_1 = bidSearch_field_1 + `,"purchasing","s_winner","buyer"` + bidSearch_field_file //领域数据字段基本字段
 
 
-	BidSearchFieldBase   = `"_id","title","publishtime","dataweight","toptype","subtype","type","area","city","s_subscopeclass","bidamount","budget","buyerclass","spidercode","site","projectname","projectcode","buyer","winner","bidopentime"` //搜索列表基础字段
-	BidSearchFieldOfVip  = BidSearchFieldBase + `,"buyertel","buyerperson","agency","agencytel","agencyperson","s_winner","winnertel","winnerperson","signendtime","bidendtime","projectinfo","entidlist","district","sinendtime","buyeraddr"`    //付费列表字段
-	BidSearchFieldFile   = `,"isValidFile"`
-	BidSearchDomainField = BidSearchFieldOfVip + `,"purchasing"` //领域数据字段基本字段
-
+	BidSearchFieldBase     = `"_id","title","publishtime","dataweight","toptype","subtype","type","area","city","s_subscopeclass","bidamount","budget","buyerclass","spidercode","site","projectname","projectcode","buyer","winner","bidopentime"` //搜索列表基础字段
+	BidSearchFieldOfVip    = BidSearchFieldBase + `,"buyertel","buyerperson","agency","agencytel","agencyperson","s_winner","winnertel","winnerperson","signendtime","bidendtime","projectinfo","entidlist","district","sinendtime","buyeraddr"`    //付费列表字段
+	BidSearchFieldFile     = `,"isValidFile"`
+	BidSearchDomainField   = BidSearchFieldOfVip + `,"purchasing"` //领域数据字段基本字段
+	BidSearchFieldProperty = BidSearchFieldBase + `,"tag_topinformation","tag_subinformation","tag_set.wuye.property_form","tag_set.wuye.isfile"`
 )
 )
 
 
 // Praise 剑鱼标讯推送三级页点赞暂弃 改成剑鱼标讯实验室点赞功能
 // Praise 剑鱼标讯推送三级页点赞暂弃 改成剑鱼标讯实验室点赞功能
@@ -84,6 +84,10 @@ func (m *Front) PcAjaxReq() {
 	tabularflag := m.GetString("tabularflag")
 	tabularflag := m.GetString("tabularflag")
 	sessVal := m.Session().GetMultiple()
 	sessVal := m.Session().GetMultiple()
 	userId := util.ObjToString(sessVal["userId"])
 	userId := util.ObjToString(sessVal["userId"])
+	accountId := util.Int64All(sessVal["accountId"])
+	entAccountId := util.Int64All(sessVal["entAccountId"])
+	entId := util.Int64All(sessVal["entId"])
+	entUserId := util.Int64All(sessVal["entUserId"])
 	phone := util.ObjToString(sessVal["phone"])
 	phone := util.ObjToString(sessVal["phone"])
 	currentPage, _ := m.GetInteger("pageNumber")
 	currentPage, _ := m.GetInteger("pageNumber")
 	pageSize, _ := m.GetInteger("pageSize")
 	pageSize, _ := m.GetInteger("pageSize")
@@ -97,7 +101,7 @@ func (m *Front) PcAjaxReq() {
 		tabularflag = ""
 		tabularflag = ""
 	}
 	}
 	userInfo := jy.GetVipState(m.Session(), *config.Middleground, userId)
 	userInfo := jy.GetVipState(m.Session(), *config.Middleground, userId)
-	if territorialization != "" { // 如果是领域化数据 判断是否是付费用户 是否有权限
+	if territorialization != "" && territorialization != "BIProperty" { // 如果是领域化数据 判断是否是付费用户 是否有权限 ,也不是物业产品
 		if (userInfo.BigMember <= 0 && userInfo.VipState <= 0) || (!jy.HasBidFieldPower(config.Middleground, m.Session(), MedicalFunctionCode)) {
 		if (userInfo.BigMember <= 0 && userInfo.VipState <= 0) || (!jy.HasBidFieldPower(config.Middleground, m.Session(), MedicalFunctionCode)) {
 			m.ServeJson(map[string]interface{}{
 			m.ServeJson(map[string]interface{}{
 				"list": []map[string]interface{}{},
 				"list": []map[string]interface{}{},
@@ -105,7 +109,6 @@ func (m *Front) PcAjaxReq() {
 			return
 			return
 		}
 		}
 	}
 	}
-
 	area := m.GetString("area")
 	area := m.GetString("area")
 	district := m.GetString("district")
 	district := m.GetString("district")
 	subtype := m.GetString("subtype")
 	subtype := m.GetString("subtype")
@@ -116,7 +119,22 @@ func (m *Front) PcAjaxReq() {
 		selectType = "title,content"
 		selectType = "title,content"
 	}
 	}
 	searchGroup, _ := m.GetInteger("searchGroup") //搜索分组;默认0:全部;1:招标采购搜索;2:超前项目。
 	searchGroup, _ := m.GetInteger("searchGroup") //搜索分组;默认0:全部;1:招标采购搜索;2:超前项目。
-
+	//物业版本参数接收
+	//地区
+	//到期时间
+	expireTime := m.GetString("expireTime")
+	//物业业态 propertyForm
+	propertyForm := m.GetString("propertyForm")
+	//业务类型  subinformation
+	subinformation := m.GetString("subinformation")
+	//合同周期 period
+	period := m.GetString("period")
+	//价格区间 scale
+	scale := m.GetString("scale")
+	//价格区间 scale
+	isfile, _ := m.GetInteger("isfile")
+	//换手率 changehand
+	changehand, _ := m.GetInteger("changehand")
 	if userId == "" {
 	if userId == "" {
 		//未登录用户访问全部信息类型 需要过滤掉 拟建和采购意向
 		//未登录用户访问全部信息类型 需要过滤掉 拟建和采购意向
 		// p397 未登录用户收回查看拟建权限
 		// p397 未登录用户收回查看拟建权限
@@ -134,7 +152,6 @@ func (m *Front) PcAjaxReq() {
 				subtype = "招标预告,招标公告,招标结果,招标信用信息"
 				subtype = "招标预告,招标公告,招标结果,招标信用信息"
 			}
 			}
 		}
 		}
-
 		//未登录用户搜索范围 标题和 正文
 		//未登录用户搜索范围 标题和 正文
 		var selectTypeArr []string
 		var selectTypeArr []string
 		selectTypeSplit := strings.Split(selectType, ",")
 		selectTypeSplit := strings.Split(selectType, ",")
@@ -179,14 +196,12 @@ func (m *Front) PcAjaxReq() {
 		notkey = m.GetString("notkey")
 		notkey = m.GetString("notkey")
 		city = m.GetString("city")
 		city = m.GetString("city")
 	}
 	}
-
 	// p329  非反爬白名单用户不放开  需要处理通用词
 	// p329  非反爬白名单用户不放开  需要处理通用词
 	onList, _ := jyutil.IsOnTheWhitelist(m.Session())
 	onList, _ := jyutil.IsOnTheWhitelist(m.Session())
 	searchValueString := m.GetString("searchvalue")
 	searchValueString := m.GetString("searchvalue")
 	if !onList && len(industry) == 0 {
 	if !onList && len(industry) == 0 {
 		searchValueString = jyutil.FilterGeneric(searchValueString)       // 关键词处理通用词
 		searchValueString = jyutil.FilterGeneric(searchValueString)       // 关键词处理通用词
 		additionalWords = jyutil.AdditionalFilterGeneric(additionalWords) // 附加词处理通用词
 		additionalWords = jyutil.AdditionalFilterGeneric(additionalWords) // 附加词处理通用词
-
 	}
 	}
 	b_word, a_word, s_word := jy.InterceptSearchKW(searchValueString, util.IntAllDef(config.Sysconfig["keywordsLimit"], 35), len(industry) == 0)
 	b_word, a_word, s_word := jy.InterceptSearchKW(searchValueString, util.IntAllDef(config.Sysconfig["keywordsLimit"], 35), len(industry) == 0)
 	//放开用户不输入关键词可搜索 --P297需求
 	//放开用户不输入关键词可搜索 --P297需求
@@ -208,7 +223,7 @@ func (m *Front) PcAjaxReq() {
 		}
 		}
 		if isLimit == 1 {
 		if isLimit == 1 {
 			searchTypeSwitch, _ := config.Sysconfig["searchTypeSwitch"].(bool)
 			searchTypeSwitch, _ := config.Sysconfig["searchTypeSwitch"].(bool)
-			so := NewSearchOptimize(userId, phone, area, city, district, subtype, toptype, publishtime, strings.Join(queryItems, ","), fmt.Sprintf("%s-%s", minprice, maxprice), industry, buyerclass, hasBuyerTel, hasWinnerTel, fileExists, s_word, additionalWords, notkey, "PC", territorialization, currentPage, pageSize, searchGroup, searchMode, wordsMode, *userInfo, searchTypeSwitch, m.Request)
+			so := NewSearchOptimize(userId, phone, area, city, district, subtype, toptype, publishtime, strings.Join(queryItems, ","), fmt.Sprintf("%s-%s", minprice, maxprice), industry, buyerclass, hasBuyerTel, hasWinnerTel, fileExists, s_word, additionalWords, notkey, "PC", territorialization, expireTime, propertyForm, subinformation, currentPage, pageSize, searchGroup, searchMode, wordsMode, period, scale, changehand, isfile, *userInfo, searchTypeSwitch, m.Request, accountId, entAccountId, entId, entUserId)
 			if so.PageNum < 0 && so.PageSize < 0 {
 			if so.PageNum < 0 && so.PageSize < 0 {
 				log.Printf("查询参数超出范围,有可能是异常请求; 用户id:%s;用户手机号:%s \n", userId, phone)
 				log.Printf("查询参数超出范围,有可能是异常请求; 用户id:%s;用户手机号:%s \n", userId, phone)
 			} else {
 			} else {
@@ -219,7 +234,7 @@ func (m *Front) PcAjaxReq() {
 		}
 		}
 	} else {
 	} else {
 		searchTypeSwitch, _ := config.Sysconfig["searchTypeSwitch"].(bool)
 		searchTypeSwitch, _ := config.Sysconfig["searchTypeSwitch"].(bool)
-		so := NewSearchOptimize(userId, phone, area, city, district, subtype, toptype, publishtime, strings.Join(queryItems, ","), fmt.Sprintf("%s-%s", minprice, maxprice), industry, buyerclass, hasBuyerTel, hasWinnerTel, fileExists, s_word, additionalWords, notkey, "PC", territorialization, currentPage, pageSize, searchGroup, searchMode, wordsMode, *userInfo, searchTypeSwitch, m.Request)
+		so := NewSearchOptimize(userId, phone, area, city, district, subtype, toptype, publishtime, strings.Join(queryItems, ","), fmt.Sprintf("%s-%s", minprice, maxprice), industry, buyerclass, hasBuyerTel, hasWinnerTel, fileExists, s_word, additionalWords, notkey, "PC", territorialization, expireTime, propertyForm, subinformation, currentPage, pageSize, searchGroup, searchMode, wordsMode, period, scale, changehand, isfile, *userInfo, searchTypeSwitch, m.Request, accountId, entAccountId, entId, entUserId)
 		list, count, total = so.GetBidSearchListByCache()
 		list, count, total = so.GetBidSearchListByCache()
 
 
 	}
 	}

+ 3 - 3
src/jfw/jyutil/classroomiInfo.go

@@ -290,7 +290,7 @@ func FormatSize(size float64, unit string) string {
 // GuidelineAndInformation t:一级栏目 s二级栏目 (首页剑鱼攻略与行业资讯首页公用)
 // GuidelineAndInformation t:一级栏目 s二级栏目 (首页剑鱼攻略与行业资讯首页公用)
 func GuidelineAndInformation(t, s string, num int) *[]map[string]interface{} {
 func GuidelineAndInformation(t, s string, num int) *[]map[string]interface{} {
 	query := map[string]interface{}{"s_contenttype": t, "s_secondclassifytype": s, "i_status": 1, "releasetime": map[string]interface{}{"$lt": time.Now().Unix()}}
 	query := map[string]interface{}{"s_contenttype": t, "s_secondclassifytype": s, "i_status": 1, "releasetime": map[string]interface{}{"$lt": time.Now().Unix()}}
-	data, _ := mongodb.Find("content", query, `{"releasetime":-1}`, `{"_id":1,"i_viewnum":1,s_title":1,"s_pic1":1,"s_pic":1,"releasetime":1,"s_description":1,"l_createdate":1,"s_contenttype":1,"s_secondclassifytype":1}`, false, 0, num)
+	data, _ := mongodb.Find("content", query, `{"releasetime":-1}`, `{"_id":1,"i_viewnum":1,"s_title":1,"s_pic1":1,"s_pic":1,"releasetime":1,"s_description":1,"l_createdate":1,"s_contenttype":1,"s_secondclassifytype":1}`, false, 0, num)
 	if data != nil {
 	if data != nil {
 		for _, v := range *data {
 		for _, v := range *data {
 			s_title, _ := v["s_title"].(string)
 			s_title, _ := v["s_title"].(string)
@@ -367,10 +367,10 @@ func ArticleRecommendation(t string, num int) map[string]interface{} {
 		"releasetime":   map[string]interface{}{"$lt": time.Now().Unix()},
 		"releasetime":   map[string]interface{}{"$lt": time.Now().Unix()},
 		//"s_secondclassifytype": 1, //二级栏目
 		//"s_secondclassifytype": 1, //二级栏目
 	}
 	}
-	res1, ok := mongodb.Find("content", query, `{"releasetime":-1}`, `{"_id":1,"i_viewnum":1,s_title":1,"s_pic1":1,"s_pic":1,"releasetime":1,"s_description":1,"l_createdate":1,"s_contenttype":1,"s_secondclassifytype":1}`, false, 0, num)
+	res1, ok := mongodb.Find("content", query, `{"releasetime":-1}`, `{"_id":1,"i_viewnum":1,"s_title":1,"s_pic1":1,"s_pic":1,"releasetime":1,"s_description":1,"l_createdate":1,"s_contenttype":1,"s_secondclassifytype":1}`, false, 0, num)
 	if ok && res1 != nil && len(*res1) > 0 {
 	if ok && res1 != nil && len(*res1) > 0 {
 		if len(*res1) == num {
 		if len(*res1) == num {
-			res, _ := mongodb.Find("content", query, `{"releasetime":-1}`, `{"_id":1,"i_viewnum":1,s_title":1,"s_pic1":1,"s_pic":1,"releasetime":1,"s_description":1,"l_createdate":1,"s_contenttype":1,"s_secondclassifytype":1}`, false, 0, 500)
+			res, _ := mongodb.Find("content", query, `{"releasetime":-1}`, `{"_id":1,"i_viewnum":1,"s_title":1,"s_pic1":1,"s_pic":1,"releasetime":1,"s_description":1,"l_createdate":1,"s_contenttype":1,"s_secondclassifytype":1}`, false, 0, 500)
 			for _, v := range GenerateRandomNumber(0, len(*res), num) {
 			for _, v := range GenerateRandomNumber(0, len(*res), num) {
 				s_title, _ := (*res)[v]["s_title"].(string)
 				s_title, _ := (*res)[v]["s_title"].(string)
 				(*res)[v]["s_title"] = template.HTML(s_title)
 				(*res)[v]["s_title"] = template.HTML(s_title)

+ 3 - 1
src/jfw/modules/bigmember/src/config.json

@@ -188,5 +188,7 @@
   "nsq_topic": "jy_event",
   "nsq_topic": "jy_event",
   "attachmentResPower": ["bi_sj_sjqk","bi_sf_sjqd","bi_sj_yyszs"],
   "attachmentResPower": ["bi_sj_sjqk","bi_sf_sjqd","bi_sj_yyszs"],
   "msgMaxCount": 20000,
   "msgMaxCount": 20000,
-  "analysisPDFPhone": "13027620557"
+  "analysisPDFPhone": "13027620557",
+  "payUserCollLimit":5000,
+  "freeUserCollLimit":100
 }
 }

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

@@ -78,6 +78,8 @@ type config struct {
 	AttachmentResPower  []string `json:"attachmentResPower"`
 	AttachmentResPower  []string `json:"attachmentResPower"`
 	MsgMaxCount         int      `json:"msgMaxCount"`
 	MsgMaxCount         int      `json:"msgMaxCount"`
 	AnalysisPDFPhone    string   `json:"analysisPDFPhone"`
 	AnalysisPDFPhone    string   `json:"analysisPDFPhone"`
+	PayUserCollLimit    int64    `json:"payUserCollLimit"`  //付费用户收藏数量最大限制
+	FreeUserCollLimit   int64    `json:"freeUserCollLimit"` //免费用户收藏数量最大限制
 }
 }
 
 
 type CustomerInfo struct {
 type CustomerInfo struct {

+ 187 - 0
src/jfw/modules/bigmember/src/service/analysis/businessIntelligence.go

@@ -0,0 +1,187 @@
+package analysis
+
+import (
+	. "app.yhyue.com/moapp/jybase/api"
+	qutil "app.yhyue.com/moapp/jybase/common"
+	. "app.yhyue.com/moapp/jybase/date"
+	"app.yhyue.com/moapp/jybase/go-xweb/httpsession"
+	"app.yhyue.com/moapp/jybase/go-xweb/xweb"
+	"app.yhyue.com/moapp/jypkg/common/src/qfw/util/jy"
+	"errors"
+	"fmt"
+	"github.com/gogf/gf/v2/util/gconv"
+	"jy/src/jfw/modules/bigmember/src/config"
+	"jy/src/jfw/modules/bigmember/src/db"
+	"jy/src/jfw/modules/bigmember/src/entity"
+	"jy/src/jfw/modules/bigmember/src/util"
+	"log"
+)
+
+type BusinessIntelligence struct {
+	*xweb.Action
+	businessDetails xweb.Mapper `xweb:"/project/businessDetails"` //商机情报详情页
+	meMonitoring    xweb.Mapper `xweb:"/project/meMonitoring"`    //我的监控
+}
+
+func init() {
+	xweb.AddAction(&BusinessIntelligence{})
+}
+
+func (this *BusinessIntelligence) BusinessDetails() {
+	defer qutil.Catch()
+	userId, _ := this.GetSession("userId").(string)
+	rData, errMsg := func() (interface{}, error) {
+		id := this.GetString("id") //项目id
+		if id == "" {
+			return nil, errors.New("id不能为空")
+		}
+		var (
+			data = &map[string]interface{}{}
+			ok   bool
+		)
+		id = util.DecodeId(id)
+		(*data)["isSubmit"] = qutil.If(db.Mgo.Count("saleLeads", map[string]interface{}{
+			"userid": userId,
+			"source": map[string]interface{}{
+				"$regex": "project_businessDetails_improve",
+			},
+		}) > 0, false, true)
+
+		data, ok = db.Mgo_Ent.FindById(C_FPContent, id, nil)
+		if ok && data != nil && (*data)["results"] != nil {
+			resultsMapArr, _ := (*data)["results"].([]interface{})
+			results := qutil.ObjArrToMapArr(resultsMapArr)
+			if (*data)["title"] != nil && (*data)["title"] != "" {
+				(*data)["title"] = fmt.Sprintf("【商机情报】%s", qutil.ObjToString((*data)["title"]))
+			}
+			// 使用自定义排序函数对数据进行排序
+			util.SortData(&resultsMapArr, "_id", true)
+			yucetime := (*data)["yucetime"]
+			(*data)["yucetime"] = FormatDateWithObj(&yucetime, "2006/01/02")
+			resultsMap := map[string]interface{}{}
+			var (
+				resultsArr []map[string]interface{}
+				projectsId string
+			)
+			if len(results) > 0 {
+				rv := results[0]
+				if rv["p_projects"] != nil {
+					p_projects := qutil.ObjArrToMapArr(rv["p_projects"].([]interface{}))
+					for _, pv := range p_projects {
+						if pv["p_id"] == nil || pv["p_purchasing"] == nil {
+							continue
+						}
+						projectsId = qutil.ObjToString(pv["p_id"])
+						pv_key := qutil.ObjToString(pv["p_purchasing"])
+						if resultsMap[pv["p_id"].(string)] != nil {
+							rmp := qutil.ObjToMap(resultsMap[pv["p_id"].(string)])
+							if qutil.ObjToString((*rmp)["p_purchasing"]) == pv_key {
+								continue
+							}
+							pv_key = qutil.ObjToString((*rmp)["p_purchasing"]) + "、" + pv["p_purchasing"].(string)
+							if pv["p_person"] == nil && (*rmp)["p_purchasing"] != nil {
+								pv["p_person"] = (*rmp)["p_person"]
+							}
+							if pv["p_phone"] == nil && (*rmp)["p_phone"] != nil {
+								pv["p_phone"] = (*rmp)["p_phone"]
+							}
+						}
+						resultsMap[pv["p_id"].(string)] = map[string]interface{}{
+							"p_purchasing": pv_key,
+							"p_phone":      pv["p_phone"],
+							"p_person":     pv["p_person"],
+							"p_id":         util.EncodeId(pv["p_id"].(string)),
+							"p_orther":     pv["p_orther"],
+						}
+					}
+					if resultsMap != nil {
+						resultsArr = append(resultsArr, *qutil.ObjToMap(resultsMap[projectsId]))
+					}
+				}
+			}
+			(*data)["results"] = []map[string]interface{}{}
+			if len(resultsArr) > 0 {
+				(*data)["results"] = resultsArr
+			}
+			delete(*data, "_id")
+			delete(*data, "infoid")
+			return *data, nil
+		}
+		return nil, errors.New("查询项目失败")
+	}()
+	if errMsg != nil {
+		log.Printf("%s   获取此预测项目信息出错-%s", userId, errMsg)
+	}
+	this.ServeJson(NewResult(rData, errMsg))
+}
+
+func (l *BusinessIntelligence) MeMonitoring() {
+	defer qutil.Catch()
+	userId := gconv.String(l.GetSession("userId"))
+	rData := func() interface{} {
+		data := make(map[string]int64)
+		for _, s := range []string{"claimCount", "collectCount", "projectFollowCount", "entFollowCount"} {
+			l.MeListCount(s, userId, data)
+		}
+		return data
+	}()
+
+	l.ServeJson(NewResult(rData, nil))
+}
+
+func (l *BusinessIntelligence) MeListCount(classify string, userid string, data map[string]int64) {
+	var count int64
+	defer func() {
+		data[classify] = count
+	}()
+	switch classify {
+	case "claimCount": //项目认领
+		p, err := entity.ClaimPermissions(l.Session())
+		if !p.Permissions || err != nil {
+			return
+		}
+		count = db.MysqlSubject.CountBySql("SELECT count(*) FROM dwd_f_user_claim a LEFT JOIN dwd_f_nzj_baseinfo b ON a.project_id = b.proposed_id WHERE a.user_id = ? AND a.status =0", qutil.Int64All(l.GetSession("positionId")))
+		return
+	case "collectCount": //收藏
+		isPay := Power(l.Session())
+		maxCount := qutil.If(isPay, config.Config.PayUserCollLimit, config.Config.FreeUserCollLimit).(int64)
+		allCount := db.Base.CountBySql(fmt.Sprintf(`select count(*) from jianyu.bdcollection where userid ='%s'`, userid))
+		count = qutil.If(allCount > maxCount, maxCount, allCount).(int64)
+		return
+	case "projectFollowCount": //项目关注
+		_, err := entity.CreateProjectFollowManager(l.Session())
+		if err != nil {
+			return
+		}
+		count = db.Base.CountBySql(`select count(*) from follow_project_monitor where s_userid= ?`, userid)
+		return
+	case "entFollowCount": //企业关注
+		followEntManager, err := entity.CreateEntFollowManager(l.Session())
+		if err != nil {
+			return
+		}
+		allCount := db.Base.CountBySql(fmt.Sprintf(`SELECT count(*) FROM follow_ent_monitor WHERE  s_userid="%s" `, userid))
+		count = qutil.If(allCount > gconv.Int64(followEntManager.MaxNum), followEntManager.MaxNum, allCount).(int64)
+		return
+	}
+}
+
+// 是否是付费用户 -bool: true:是 fasle:不是
+func Power(session *httpsession.Session) bool {
+	isVip, isMember, isEnt := false, false, false
+	resp := jy.GetBigVipUserBaseMsg(session, *config.Middleground)
+	if resp != nil {
+		if resp.VipStatus > 1 {
+			isVip = true
+		}
+		if resp.Vip_BuySet.Upgrade > 0 && isVip {
+		}
+		if resp.Status > 0 {
+			isMember = true
+		}
+		if resp.EntnicheStatus > 0 {
+			isEnt = true
+		}
+	}
+	return isVip || isEnt || isMember
+}

+ 46 - 0
src/jfw/modules/subscribepay/src/service/userAccountInfo.go

@@ -5,6 +5,7 @@ import (
 	"database/sql"
 	"database/sql"
 	"encoding/base64"
 	"encoding/base64"
 	"fmt"
 	"fmt"
+	"github.com/gogf/gf/v2/util/gconv"
 	"jy/src/jfw/modules/subscribepay/src/config"
 	"jy/src/jfw/modules/subscribepay/src/config"
 	"jy/src/jfw/modules/subscribepay/src/entity"
 	"jy/src/jfw/modules/subscribepay/src/entity"
 	"jy/src/jfw/modules/subscribepay/src/util"
 	"jy/src/jfw/modules/subscribepay/src/util"
@@ -33,6 +34,7 @@ type UserAccount struct {
 	*xweb.Action
 	*xweb.Action
 	getSimpleData      xweb.Mapper `xweb:"/user/getSimpleData"`             //客服接口-获取用户基本信息
 	getSimpleData      xweb.Mapper `xweb:"/user/getSimpleData"`             //客服接口-获取用户基本信息
 	getAccountInfo     xweb.Mapper `xweb:"/user/getAccountInfo"`            //我的页面-用户基本信息
 	getAccountInfo     xweb.Mapper `xweb:"/user/getAccountInfo"`            //我的页面-用户基本信息
+	accountShow        xweb.Mapper `xweb:"/user/account/show"`              //工作桌面-用户身份展示
 	authentication     xweb.Mapper `xweb:"/user/auth/(mail|phone)"`         //我的页面-身份验证 邮箱&手机号
 	authentication     xweb.Mapper `xweb:"/user/auth/(mail|phone)"`         //我的页面-身份验证 邮箱&手机号
 	phoneBind          xweb.Mapper `xweb:"/user/phone/bind"`                //我的页面-绑定手机号
 	phoneBind          xweb.Mapper `xweb:"/user/phone/bind"`                //我的页面-绑定手机号
 	phoneChange        xweb.Mapper `xweb:"/user/phone/change"`              //我的页面-更改绑定手机号
 	phoneChange        xweb.Mapper `xweb:"/user/phone/change"`              //我的页面-更改绑定手机号
@@ -91,6 +93,50 @@ func (this *UserAccount) GetSimpleData() {
 	})
 	})
 }
 }
 
 
+func (this *UserAccount) AccountShow() {
+	sessVal := this.Session().GetMultiple()
+	userId := qutil.ObjToString(sessVal["userId"])
+	rData, errMsg := func() (interface{}, error) {
+		if userId == "" {
+			return nil, fmt.Errorf("未登录")
+		}
+		nickname, vipType := gconv.String(sessVal["userName"]), "注册用户"
+		var endTime int64
+		//来源于接口/user/getSimpleData
+		phone, _ := sessVal["phone"].(string)
+		nickname, _ = qutil.If(sessVal["s_nickname"] != nil, sessVal["s_nickname"], sessVal["app_name"]).(string)
+		if nickname == "" {
+			var PhoneReg = regexp.MustCompile(`^(100\d{8}|1[3-9]\d{9})$`)
+			if PhoneReg.MatchString(phone) {
+				nickname = string(phone[0:3]) + "****" + string(phone[(len(phone)-4):])
+			}
+		}
+		powerRes := config.Middleground.PowerCheckCenter.Check("10000", gconv.String(sessVal["mgoUserId"]), gconv.Int64(sessVal["base_user_id"]), gconv.Int64(sessVal["accountId"]), gconv.Int64(sessVal["entId"]), gconv.Int64(sessVal["positionType"]), gconv.Int64(sessVal["positionId"]))
+		if powerRes.Vip.Status > 0 && powerRes.Vip.GetEndTime() > endTime {
+			vipType, endTime = "超级订阅", powerRes.Vip.GetEndTime()
+		}
+		if powerRes.Member.Status > 0 && powerRes.Member.GetEndTime() > endTime {
+			vipType, endTime = "大会员", powerRes.Member.GetEndTime()
+		}
+		if powerRes.Entniche.Status > 0 && powerRes.Entniche.GetEndTime() > endTime {
+			vipType, endTime = "商机管理", powerRes.Entniche.GetEndTime()
+		}
+		if powerRes.Free.PpStatus > 0 && powerRes.Free.PpEndTime > endTime {
+			vipType, endTime = "省份订阅包", powerRes.Free.GetPpEndTime()
+		}
+		rData := map[string]interface{}{
+			"vipType":  vipType,
+			"nickname": nickname,
+		}
+		if endTime > 0 {
+			rData["vipEntTime"] = time.Unix(endTime, 0).Format("2006-01-02")
+		}
+		return rData, nil
+	}()
+
+	this.ServeJson(NewResult(rData, errMsg))
+}
+
 // 我的页面 获取基本信息
 // 我的页面 获取基本信息
 // 手机号 邮箱 头像 昵称 超级订阅 大会员 用户加密id
 // 手机号 邮箱 头像 昵称 超级订阅 大会员 用户加密id
 func (this *UserAccount) GetAccountInfo() {
 func (this *UserAccount) GetAccountInfo() {

+ 114 - 6
src/web/staticres/BI-module/js/crm-action.js

@@ -10,11 +10,14 @@ var crmNode = new Vue({
         { title: '创建销售机会', 'icon-0': 'chuangjianxiaoshoujihui', 'icon-1': 'chuangjianxiaoshoujihui', class: 'jihui', active: 0, msg: 0 },
         { title: '创建销售机会', 'icon-0': 'chuangjianxiaoshoujihui', 'icon-1': 'chuangjianxiaoshoujihui', class: 'jihui', active: 0, msg: 0 },
         { title: '创建客户', 'icon-0': 'chuangjiankehu', 'icon-1': 'chuangjiankehu', class: 'custom', active: 0, msg: 0 }
         { title: '创建客户', 'icon-0': 'chuangjiankehu', 'icon-1': 'chuangjiankehu', class: 'custom', active: 0, msg: 0 }
       ],
       ],
-      pageType: '',
+      pageType: '', // 营销专版参数
+      porperty: '', // 物业专版参数
+      fromJhfp: '', // 判断是从机会复盘还是从招标搜索进
       employInfo: [], // 收录情况
       employInfo: [], // 收录情况
       dialogVisible: false,
       dialogVisible: false,
       IframeSrc: '',
       IframeSrc: '',
-      getEntData: {}
+      getEntData: {},
+      showPropertyDialog: false
     }
     }
   },
   },
   created () {
   created () {
@@ -25,6 +28,11 @@ var crmNode = new Vue({
     getList () {
     getList () {
       if (this.list[0].active === 0) {
       if (this.list[0].active === 0) {
         return this.list.slice(0, 1)
         return this.list.slice(0, 1)
+      } else if (this.property === 'BIProperty') {
+        this.list = this.list.filter(v => {
+          return v.title !== '创建销售线索'
+        })
+        return this.list
       } else {
       } else {
         return this.list
         return this.list
       }
       }
@@ -43,17 +51,54 @@ var crmNode = new Vue({
       console.log(event.storageArea)
       console.log(event.storageArea)
       if (event.storageArea === sessionStorage) {
       if (event.storageArea === sessionStorage) {
         if (event.key === 'Op-upState') {
         if (event.key === 'Op-upState') {
-          sessionStorage.setItem('Op-upState', "0")
+          sessionStorage.removeItem('Op-upState', "0")
           _this.dialogVisible = false
           _this.dialogVisible = false
+          _this.showPropertyDialog = false
+          _this.getEmployData()
         }
         }
       }
       }
     });
     });
   },
   },
   methods: {
   methods: {
+    getacount(bidamount,budget){
+      if(typeof(bidamount) != "undefined" && bidamount != null && bidamount != ""){
+        return bidamount
+      }
+      if(typeof(budget) != "undefined" && budget != null && budget != ""){
+        return budget
+      }
+      return ""
+    },
+    //金额转化   金额:0-万元以下单位为元  ,万元以上至亿元以下单位为万元 ,亿元以上单位为亿元。保留 小数点后 2 位,不进行四舍五入。
+    conversionMoeny(money){
+      var m = ""+money;
+      var m_arr = m.split(".")
+      var m_1 = m_arr[0]
+      var len_m1 = m_1.length;
+      if (len_m1 >= 9 ){
+        m = m_1.substring(0,len_m1-8) + "." + m_1.substring(len_m1-8,len_m1-6) + "亿元"
+      } else if (len_m1 >= 5) {
+        m =m_1.substring(0,len_m1-4) + "." + m_1.substring(len_m1-4,len_m1-2) + "万元"
+      } else {
+        if(m_arr.length == 1) {
+          return m + ".00元"
+        }
+        var m_2 = m_arr[1]
+        if (m_2.length > 1) {
+          m_2 = m_2.substring(0,2)
+        } else {
+          m_2 = m_2.substring(0,1) + "0"
+        }
+        m = m_1 + "." + m_2 + "元"
+      }
+      return m
+    },
     getParams () {
     getParams () {
       const urlParams = new URLSearchParams(window.location.search)
       const urlParams = new URLSearchParams(window.location.search)
       this.pageType = urlParams.get('resource')
       this.pageType = urlParams.get('resource')
-      if (this.pageType === 'BI') {
+      this.property = urlParams.get('property')
+      this.fromJhfp = urlParams.get('from')
+      if (this.pageType === 'BI' || this.property === 'BIProperty') {
         $('.com-tagsbar').hide()
         $('.com-tagsbar').hide()
         $('.com-statusbar').hide()
         $('.com-statusbar').hide()
         this.getEmployData()
         this.getEmployData()
@@ -71,7 +116,23 @@ var crmNode = new Vue({
       switch (data.class) {
       switch (data.class) {
         case 'employ':
         case 'employ':
           // 收录
           // 收录
-          this.setEmployEvent(data)
+          if(this.property === 'BIProperty') {
+            this.IframeSrc = `${location.origin}/succbi/crm_system/app/crm.app/%E9%80%9A%E7%94%A8%E5%88%9B%E5%BB%BA/create_intelligence.spg?t=${new Date().getTime()}`
+            const { bidamount, budget, title, area, buyer } = goTemplateData.params.obj
+            const propertyData = {
+              _id: id,
+              title: title,
+              buyer: buyer,
+              area: area,
+              bidamount: bidamount,
+              budget: budget
+            }
+            // 将propertyData存入本地,用于BI创建情报回显数据
+            localStorage.setItem('property-data', JSON.stringify(propertyData))
+            this.setOpEvent(data)
+          } else {
+            this.setEmployEvent(data)
+          }
           break
           break
         case 'ignore':
         case 'ignore':
           // 忽略
           // 忽略
@@ -157,7 +218,8 @@ var crmNode = new Vue({
       const url = '/jyapi/crmApplication/employ/info'
       const url = '/jyapi/crmApplication/employ/info'
       const params = {
       const params = {
         employType: 1,
         employType: 1,
-        idArr: id
+        idArr: id,
+        from: this.fromJhfp ? this.fromJhfp : ''
       }
       }
       this.ajaxComponent(url, params).then((res) => {
       this.ajaxComponent(url, params).then((res) => {
         console.info(res)
         console.info(res)
@@ -197,6 +259,52 @@ var crmNode = new Vue({
         }
         }
       })
       })
     },
     },
+    // 物业专版收录操作
+    setOpEvent (item) {
+      let url = '/jyapi/crmApplication/employ/operate'
+      let info = this.employInfo[0]
+      let params = {
+        idArr: id,
+        isEmploy: !info.isEmploy,
+        sourceType: 1,
+        employType: 1
+      }
+      if(item.active && this.fromJhfp) {
+        params.from = this.fromJhfp
+      }
+      if(!item.active) {
+        url = '/jyNewApi/property/information/exist'
+        info = this.employInfo[0]
+        params = {
+          id: id
+        }
+        this.ajaxComponent(url, params).then((res) => {
+          if(!item.active) {
+            if (res.code === 2) {
+              // 已经创建情报信息,直接收录
+              item.active = 1
+            } else if (res.code === 1) {
+              // 未创建情报信息,需要手动创建
+              this.showPropertyDialog = true
+            } else {
+              toastFn(res.msg, 1000)
+            }
+          }
+        })
+      } else {
+        this.ajaxComponent(url, params).then((res) => {
+          if(res.error_code === 0) {
+            if (res.data.status) {
+              item.active = item.active === 0 ? 1 : 0
+            } else {
+              toastFn(res.data.msg, 1000)
+            }
+          }
+        })
+      }
+      this.getEmployData()
+      console.info(this.list)
+    },
     // 收录操作
     // 收录操作
     setEmployEvent (item) {
     setEmployEvent (item) {
       const url = '/jyapi/crmApplication/employ/operate'
       const url = '/jyapi/crmApplication/employ/operate'

+ 18 - 0
src/web/staticres/css/dev2/biddingSearch.css

@@ -1696,6 +1696,7 @@ position: absolute;
   width: 54px;
   width: 54px;
   background-size: 20px 20px;
   background-size: 20px 20px;
   background-position: left center;
   background-position: left center;
+  cursor: pointer;
 }
 }
 .liLuceneList .bid-list-tags .icon-canbiao-img{
 .liLuceneList .bid-list-tags .icon-canbiao-img{
     width: 60px;
     width: 60px;
@@ -1719,6 +1720,18 @@ position: absolute;
 }
 }
 .liLuceneList .bid-list-tags .icon-shoulu::after {
 .liLuceneList .bid-list-tags .icon-shoulu::after {
   content: '收录';
   content: '收录';
+  left: 24px;
+  color: #1D1D1D;
+}
+.liLuceneList .bid-list-tags .icon-shoulu.wuye::after {
+  left: -29px;
+  color: #2ABED1;
+}
+.liLuceneList .bid-list-tags .icon-shoulu.wuye.icon-a-Property1shoulu::before{
+  display: none;
+}
+.liLuceneList .bid-list-tags .icon-shoulu.wuye.icon-a-Property1yishoulu::before{
+  display: none;
 }
 }
 .liLuceneList .bid-list-tags .icon-collect.checked{
 .liLuceneList .bid-list-tags .icon-collect.checked{
   width: 68px;
   width: 68px;
@@ -1744,6 +1757,11 @@ position: absolute;
 }
 }
 .liLuceneList .bid-list-tags .icon-shoulu.icon-a-Property1yishoulu::after{
 .liLuceneList .bid-list-tags .icon-shoulu.icon-a-Property1yishoulu::after{
   content: '已收录';
   content: '已收录';
+  left: 24px;
+  color: #2ABED1;
+}
+.liLuceneList .bid-list-tags .icon-shoulu.wuye.icon-a-Property1yishoulu::after{
+  left: -45px;
 }
 }
 .liLuceneList  .luce-field{
 .liLuceneList  .luce-field{
   margin-top: 16px;
   margin-top: 16px;

+ 32 - 0
src/web/staticres/css/dev2/superSearch.css

@@ -721,3 +721,35 @@ left: 252px;
   margin-left: 12px;
   margin-left: 12px;
   cursor: pointer;
   cursor: pointer;
 }
 }
+
+.property-filter .one-filter .mr-16 .el-input__inner, .property-filter .one-filter .mr-16 #selectArea_ .el-input__inner{
+  width: 160px;
+}
+.property-filter .two-filter .mr-16 .el-input__inner, .property-filter .two-filter #selectArea_ .el-input__inner{
+  width: 160px;
+}
+.custom-property-time{
+  position: relative;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+}
+.date-select-property{
+  position: absolute;
+  right: -380px;
+  top: -230px;
+}
+.propertyDatePicker.el-popper[x-placement^=bottom] .popper__arrow {
+  display: none;
+}
+
+.property-employ-dialog {
+  width: 650px!important;
+  height: 720px;
+}
+.el-select .el-input__inner::placeholder{
+  color: #1D1D1D;
+}
+/* .custom-property-time:hover{
+  background-color: #ececec;
+} */

+ 38 - 0
src/web/staticres/css/selectCommon.css

@@ -308,4 +308,42 @@ margin-left: 4px;
   color: #C98F37;
   color: #C98F37;
 
 
 }
 }
+.search-checkbox {
+  padding: 8px 8px;
+}
+.search-checkbox .el-checkbox{
+  height: 30px;
+}
+.search-checkbox .el-checkbox .el-checkbox__label{
+  margin-left: 4px;
+}
 
 
+.select-searchRange{
+  position: relative;
+}
+.select-searchRange .valueBox{
+  width: 180px;
+  height: 30px;
+  position: absolute;
+  left: 0;
+  top: 0;
+  z-index: 0;
+  padding-left: 16px;
+  box-sizing: border-box;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+
+.j-checkbox-group .j-checkbox-button .el-checkbox-button__inner {
+  margin: 6px 5px;
+}
+.j-checkbox-button.is-active .el-checkbox-button__inner {
+  border-color: #2CB7CA;
+}
+.j-checkbox-button:first-child .el-checkbox-button__inner, .j-checkbox-button:last-child .el-checkbox-button__inner, .j-checkbox-button .el-checkbox-button__inner {
+  border-color: transparent;
+  border-radius: 4px;
+  padding: 2px 6px;
+  line-height: 20px;
+}

+ 262 - 0
src/web/staticres/css/selector/select-card.css

@@ -0,0 +1,262 @@
+.selector-card {
+  display: flex;
+  color: #1d1d1d;
+  background-color: #fff;
+}
+
+.selector-card .selector-card-content {
+  position: relative;
+  display: flex;
+  flex: 1;
+}
+
+.selector-card .selector-card-content::v-deep .fw-bold {
+  font-weight: bold;
+}
+
+.selector-card .selector-card-content::v-deep .j-button-item {
+  display: flex;
+  align-items: center;
+  margin: 6px 5px;
+  padding: 2px 6px;
+  line-height: 20px;
+  border-radius: 4px;
+  font-size: 14px;
+  text-align: center;
+  background-color: #fff;
+  border: 1px solid rgba(0, 0, 0, 0.05);
+  cursor: pointer;
+}
+
+.selector-card .selector-card-content::v-deep .j-button-item.global {
+  padding: 6px 8px;
+  height: 24px;
+  line-height: 24px;
+  font-weight: 700;
+  color: inherit;
+  border-color: rgba(0, 0, 0, 0.05);
+}
+
+.selector-card .selector-card-content::v-deep .j-button-item.all {
+  font-weight: 700;
+  border-color: transparent;
+}
+
+.selector-card .selector-card-content::v-deep .j-button-item.hover:hover {
+  color: #2abed1;
+}
+
+.selector-card .selector-card-content::v-deep .j-button-item.active {
+  color: #2abed1;
+  border-color: #2abed1;
+}
+
+.selector-card .selector-card-content::v-deep .j-button-item.active.bgc {
+  color: #fff;
+  background-color: #2CB7CA;
+}
+
+.selector-card .selector-card-content::v-deep .j-button-item.active.bgc-opacity {
+  background-color: rgba(44, 183, 202, 0.1);
+}
+
+.selector-card .selector-card-content::v-deep [class^=el-icon-] {
+  transition: transform 0.2s ease;
+}
+
+.selector-card .selector-card-content::v-deep .rotate180 {
+  transform: rotate(180deg);
+}
+
+.selector-card.s-card {
+  width: 460px;
+  height: 582px;
+  flex-direction: column;
+  align-items: center;
+  justify-content: space-between;
+  box-shadow: 0 0 28px black;
+  border-radius: 5px;
+}
+
+.selector-card.s-card .selector-card-header,
+.selector-card.s-card .selector-card-content,
+.selector-card.s-card .selector-card-footer {
+  width: 100%;
+}
+
+.selector-card.s-card .selector-card-header {
+  padding-top: 30px;
+  margin: 0 0 40px;
+  font-size: 20px;
+  line-height: 26px;
+  text-align: center;
+  background: linear-gradient(180deg, #e0e0e0, #fff);
+  border-radius: 5px 5px 0 0;
+}
+
+.selector-card.s-card .selector-card-content {
+  align-items: center;
+  overflow: hidden;
+}
+
+.selector-card.s-card .selector-card-footer {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  padding-top: 20px;
+  padding-bottom: 40px;
+}
+
+.selector-card.s-card .selector-card-footer ::v-deep .el-button--primary {
+  color: #2cb7ca;
+  background: none;
+  border-color: #2cb7ca;
+}
+
+.selector-card.s-card .selector-card-footer ::v-deep .el-button--primary:hover {
+  color: #fff;
+  background-color: #2cb7ca;
+}
+
+.selector-card.s-card .selector-card-footer ::v-deep .el-button--primary:hover:disabled {
+  opacity: 0.6;
+}
+
+.selector-card.s-card .selector-card-footer ::v-deep .el-button--default:hover, .selector-card.s-card .selector-card-footer ::v-deep .el-button--default:active {
+  color: #2cb7ca;
+  border-color: #2cb7ca;
+}
+
+.selector-card.s-card .selector-card-footer .confirm,
+.selector-card.s-card .selector-card-footer .cancel {
+  padding: 10px 50px;
+  margin: 0 20px;
+}
+
+.selector-card.s-card::v-deep .j-button-item {
+  color: #606266;
+}
+
+.selector-card.s-card::v-deep .search-container {
+  margin: 20px auto;
+  width: 360px;
+}
+
+.selector-card.s-card::v-deep .search-container .el-input__inner {
+  padding-left: 42px;
+  background-color: #f7f7f7;
+  border-radius: 22px;
+}
+
+.selector-card.s-card::v-deep .search-container .el-input__prefix {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+
+.selector-card.s-card::v-deep .search-container .el-icon-search {
+  margin-left: 6px;
+  font-size: 18px;
+}
+
+.selector-card.s-card::v-deep .selector-content {
+  display: flex;
+  flex-direction: column;
+  margin: 0 auto;
+  width: 400px;
+  height: 100%;
+  border-radius: 5px;
+  border: 1px solid rgba(0, 0, 0, 0.05);
+}
+
+.selector-card.s-card::v-deep .select-list {
+  position: relative;
+  flex: 1;
+  overflow-y: scroll;
+}
+
+.selector-card.s-card::v-deep .index-anchor {
+  margin-top: 10px;
+  padding: 0 20px;
+  height: 30px;
+  line-height: 30px;
+  background-color: #f5f5fb;
+  text-align: left;
+}
+
+.selector-card.s-line {
+  padding: 12px 40px;
+}
+
+.selector-card.s-line .s-header {
+  line-height: 36px;
+}
+
+.selector-card.s-line .selector-card-header {
+  margin-right: 10px;
+  min-width: 100px;
+}
+
+.selector-card.s-line .selector-content {
+  position: relative;
+}
+
+.selector-card.s-line ::v-deep .j-button-item {
+  border-color: transparent;
+}
+
+.selector-card.s-line ::v-deep .action-button.show-more {
+  display: flex;
+  align-items: center;
+  position: absolute;
+  top: 8px;
+  right: 0;
+  font-size: 12px;
+  line-height: 20px;
+  color: #686868;
+  cursor: pointer;
+}
+
+.selector-card.s-line ::v-deep .action-button.show-more .action-text {
+  margin-right: 4px;
+}
+
+
+.selector-card.property-card {
+  padding: 6px;
+}
+.selector-card.property-card .el-checkbox-button__inner{
+  border-left: none;
+  /* margin: 0 10px 4px 0; */
+  border-radius: 4px;
+  color: #1d1d1d;
+}
+.selector-card.property-card .el-checkbox-button__inner:hover{
+  background-color: #2CB7CA;
+  color: #fff;
+}
+.selector-card.property-card .el-checkbox-button.is-focus .el-checkbox-button__inner {
+  border-color: transparent;
+}
+.selector-card.property-card .el-checkbox-button.is-checked .el-checkbox-button__inner {
+  color: #fff;
+}
+.selector-card.property-card .selector-card-content{
+  align-items: center;
+}
+
+#searchInner .searchControl .searchTender .release-time.property-card .timer>ul>li {
+  padding: 2px 6px;
+  line-height: 20px;
+  border-radius: 4px;
+}
+#searchInner .searchControl .searchTender .release-time.property-card .timer>ul>li:hover {
+  padding: 2px 6px;
+  line-height: 20px;
+}
+
+.area-card-content{
+  height: 44px;
+  overflow: hidden;
+  padding-top: 2px;
+}

+ 5 - 1
src/web/staticres/css/selector/selector.css

@@ -86,7 +86,7 @@
     display: flex;
     display: flex;
     align-items: center;
     align-items: center;
     justify-content: center;
     justify-content: center;
-    margin: 6px 5px;
+    margin: 6px 4px;
     padding: 2px 6px;
     padding: 2px 6px;
     line-height: 20px;
     line-height: 20px;
     border-radius: 4px;
     border-radius: 4px;
@@ -144,6 +144,10 @@
     margin-right: 4px;
     margin-right: 4px;
 }
 }
 
 
+.selector-card.property-placeholder .selector-card-content .el-select .el-input__inner::placeholder{
+  color: #1D1D1D!important;
+}
+
 .select-group-container {
 .select-group-container {
     position: relative;
     position: relative;
     display: flex;
     display: flex;

+ 9 - 3
src/web/staticres/frontRouter/pc/mesgCenter/js/index-pc.js

@@ -29,8 +29,13 @@ var vm = new Vue({
   },
   },
   methods: {
   methods: {
     init () {
     init () {
-      this.activeName = '-1'
-      this.getList()
+      if (getParam('type')) {
+        this.activeName = getParam('type')
+        window.history.replaceState({}, document.title, location.pathname);
+      } else {
+        this.activeName = '-1'
+      }
+      this.getList(this.activeName)
     },
     },
     // 获取所有栏目列表数据(包括未读数量)
     // 获取所有栏目列表数据(包括未读数量)
     getList (msgType) {
     getList (msgType) {
@@ -109,6 +114,7 @@ var vm = new Vue({
     },
     },
     tabClick(val) {
     tabClick(val) {
       this.tabsList.offset = 1
       this.tabsList.offset = 1
+      this.activeName = val.name
       this.getList(val.name)
       this.getList(val.name)
     },
     },
     onPageChange(page) {
     onPageChange(page) {
@@ -176,7 +182,7 @@ var vm = new Vue({
         url: '/jyapi/messageCenter/ClearUnreadMsg',
         url: '/jyapi/messageCenter/ClearUnreadMsg',
         type: 'POST',
         type: 'POST',
         success:function () {
         success:function () {
-          this.activeName = '-1'
+          _this.activeName = '-1'
           _this.getList()
           _this.getList()
           if(message){
           if(message){
             message.getMessageList()
             message.getMessageList()

+ 4 - 0
src/web/staticres/js/selector/area-city-data.js

@@ -9,6 +9,10 @@ var selectArea_temp = `<div id="selectArea_">
            <img class="icon_more" src='/images/more_.png' alt="">
            <img class="icon_more" src='/images/more_.png' alt="">
             <el-checkbox v-model = "item.selected" @change="handleCheckChange($event,item,index)" :indeterminate="item.indeterminate" :disabled="item.disabled"></el-checkbox>
             <el-checkbox v-model = "item.selected" @change="handleCheckChange($event,item,index)" :indeterminate="item.indeterminate" :disabled="item.disabled"></el-checkbox>
             <p class="name_" v-text="item.label" @click.self="leftclick(item,index)"></p>
             <p class="name_" v-text="item.label" @click.self="leftclick(item,index)"></p>
+            <el-tooltip class="item" effect="dark" placement="right">
+              <div slot="content">"采购意向"是指提供未发布招标公告前1-3个<br/>月,政府单位的采购意向信息,包含采购内<br/>容、预算金额、预计采购时间、采购联系人及<br/>联系方式等相关信息。</div>
+              <img v-if="item.label == '采购意向'" src="/images/biddingSearch/info-icon1.png" alt="" class="desc-icon tooltip-help-btn">
+            </el-tooltip>
           </div>
           </div>
         </div>
         </div>
       </div>
       </div>

File diff suppressed because it is too large
+ 1 - 1
src/web/staticres/js/selector/area-city-pc.js


+ 333 - 0
src/web/staticres/js/selector/info-type-data.js

@@ -0,0 +1,333 @@
+var infoTypeDataProperty = [
+  {
+    children: [
+      {
+        disabled: false,
+        indeterminate: false,
+        initialSelect: true,
+        label: "全部",
+        selected: true,
+        value: "全部"
+      }
+    ],
+    disabled: false,
+    indeterminate: false,
+    initialSelect: true,
+    label: "全部",
+    selected: true,
+    value: "全部"
+  },
+  // {
+  //   children: [
+  //     {
+  //       disabled: false,
+  //       indeterminate: false,
+  //       initialSelect: false,
+  //       label: "拟建项目",
+  //       selected: false,
+  //       value: "拟建项目"
+  //     }
+  //   ],
+  //   disabled: false,
+  //   indeterminate: false,
+  //   initialSelect: false,
+  //   label: "拟建项目",
+  //   selected: false,
+  //   value: "拟建项目"
+  // },
+  {
+    children: [
+      {
+        disabled: false,
+        indeterminate: false,
+        initialSelect: false,
+        label: "全部",
+        selected: false,
+        value: "全部"
+      },
+      {
+        disabled: false,
+        indeterminate: false,
+        initialSelect: false,
+        label: "采购意向",
+        selected: false,
+        value: "采购意向"
+      }
+    ],
+    disabled: false,
+    indeterminate: false,
+    initialSelect: false,
+    label: "采购意向",
+    selected: false,
+    value: "采购意向"
+  },
+  {
+    children: [
+      {
+        disabled: false,
+        indeterminate: false,
+        initialSelect: false,
+        label: "全部",
+        selected: false,
+        value: "全部"
+      },
+      {
+        disabled: false,
+        indeterminate: false,
+        initialSelect: false,
+        label: "预告",
+        selected: false,
+        value: "预告"
+      },
+      {
+        disabled: false,
+        indeterminate: false,
+        initialSelect: false,
+        label: "预审",
+        selected: false,
+        value: "预审"
+      },
+      {
+        disabled: false,
+        indeterminate: false,
+        initialSelect: false,
+        label: "预审结果",
+        selected: false,
+        value: "预审结果"
+      },
+      {
+        disabled: false,
+        indeterminate: false,
+        initialSelect: false,
+        label: "论证意见",
+        selected: false,
+        value: "论证意见"
+      },
+      {
+        disabled: false,
+        indeterminate: false,
+        initialSelect: false,
+        label: "需求公示",
+        selected: false,
+        value: "需求公示"
+      }
+    ],
+    disabled: false,
+    indeterminate: false,
+    initialSelect: false,
+    label: "招标预告",
+    selected: false,
+    value: "招标预告"
+  },
+  {
+    children: [
+      {
+        disabled: false,
+        indeterminate: false,
+        initialSelect: false,
+        label: "全部",
+        selected: false,
+        value: "全部"
+      },
+      {
+        disabled: false,
+        indeterminate: false,
+        initialSelect: false,
+        label: "招标",
+        selected: false,
+        value: "招标"
+      },
+      {
+        disabled: false,
+        indeterminate: false,
+        initialSelect: false,
+        label: "邀标",
+        selected: false,
+        value: "邀标"
+      },
+      {
+        disabled: false,
+        indeterminate: false,
+        initialSelect: false,
+        label: "询价",
+        selected: false,
+        value: "询价"
+      },
+      {
+        disabled: false,
+        indeterminate: false,
+        initialSelect: false,
+        label: "竞谈",
+        selected: false,
+        value: "竞谈"
+      },
+      {
+        disabled: false,
+        indeterminate: false,
+        initialSelect: false,
+        label: "单一",
+        selected: false,
+        value: "单一"
+      },
+      {
+        disabled: false,
+        indeterminate: false,
+        initialSelect: false,
+        label: "竞价",
+        selected: false,
+        value: "竞价"
+      },
+      {
+        disabled: false,
+        indeterminate: false,
+        initialSelect: false,
+        label: "变更",
+        selected: false,
+        value: "变更"
+      }
+    ],
+    disabled: false,
+    indeterminate: false,
+    initialSelect: false,
+    label: "招标公告",
+    selected: false,
+    value: "招标公告"
+  },
+  {
+    children: [
+      {
+        disabled: false,
+        indeterminate: false,
+        initialSelect: false,
+        label: "全部",
+        selected: false,
+        value: "全部"
+      },
+      {
+        disabled: false,
+        indeterminate: false,
+        initialSelect: false,
+        label: "中标",
+        selected: false,
+        value: "中标"
+      },
+      {
+        disabled: false,
+        indeterminate: false,
+        initialSelect: false,
+        label: "成交",
+        selected: false,
+        value: "成交"
+      },
+      {
+        disabled: false,
+        indeterminate: false,
+        initialSelect: false,
+        label: "废标",
+        selected: false,
+        value: "废标"
+      },
+      {
+        disabled: false,
+        indeterminate: false,
+        initialSelect: false,
+        label: "流标",
+        selected: false,
+        value: "流标"
+      }
+    ],
+    disabled: false,
+    indeterminate: false,
+    initialSelect: false,
+    label:"招标结果",
+    selected: false,
+    value: "招标结果"
+  },
+  {
+    children: [
+      {
+        disabled: false,
+        indeterminate: false,
+        initialSelect: false,
+        label: "全部",
+        selected: false,
+        value: "全部"
+      },
+      {
+        disabled: false,
+        indeterminate: false,
+        initialSelect: false,
+        label: "合同",
+        selected: false,
+        value: "合同"
+      },
+      {
+        disabled: false,
+        indeterminate: false,
+        initialSelect: false,
+        label: "验收",
+        selected: false,
+        value: "验收"
+      },
+      {
+        disabled: false,
+        indeterminate: false,
+        initialSelect: false,
+        label: "违规",
+        selected: false,
+        value: "违规"
+      }
+    ],
+    disabled: false,
+    indeterminate: false,
+    initialSelect: false,
+    label: "招标信用信息",
+    selected: false,
+    value: "招标信用信息"
+  }
+]
+
+// var propertyListData = {
+//   "error_code": 0,
+//   "error_msg": "",
+//   "data": {
+//     "业务类型": {
+//       "保安服务": "保安服务",
+//       "保洁服务": "保洁服务",
+//       "劳资派遣": "劳资派遣",
+//       "布草洗涤": "布草洗涤",
+//       "物业管理": "物业管理",
+//       "环卫服务": "环卫服务",
+//       "绿化养护": "绿化养护",
+//       "运营维护": "运营维护",
+//       "食堂承包": "食堂承包",
+//       "食材配送": "食材配送"
+//     },
+//     "价格区间": {
+//       "100-200万": 3,
+//       "200-500万": 4,
+//       "50-100万": 2,
+//       "500万以上": 5,
+//       "50万以下": 1
+//     },
+//     "合同周期": {
+//       "1年": 12,
+//       "1年以下": 11,
+//       "2年": 13,
+//       "3年": 14,
+//       "5年": 15,
+//       "其他": 16
+//     },
+//     "物业业态": {
+//       "产业园区": "产业园区",
+//       "住宅": "住宅",
+//       "办公楼": "办公楼",
+//       "医院": "医院",
+//       "商务办公楼": "商务办公楼",
+//       "学校": "学校",
+//       "政府": "政府",
+//       "旅游景区交通枢纽": "旅游景区交通枢纽",
+//       "酒店": "酒店"
+//     }
+//   }
+// }

+ 56 - 0
src/web/staticres/js/selector/select-card.js

@@ -0,0 +1,56 @@
+var selectCardTemp = `
+  <div
+    class="selector-card"
+    :class="{
+      's-card': cardType === 'card',
+      's-line': cardType === 'line',
+    }"
+    >
+    <div class="selector-card-header" :class="{ 's-header': cardType === 'line' }">
+      <slot name="header"></slot>
+    </div>
+    <div class="selector-card-content scrollbar">
+      <slot name="default"></slot>
+    </div>
+    <div class="selector-card-footer">
+      <slot name="footer">
+        <el-button v-if="cardType === 'card'" type="primary" class="confirm" :disabled="confirmDisabled" @click="onConfirm">{{ confirmText }}</el-button>
+        <el-button v-if="cardType === 'card'" class="cancel" @click="onCancel">{{ cancelText }}</el-button>
+      </slot>
+    </div>
+  </div>
+`
+
+var selectCardComponent = {
+  name: 'select-card',
+  template: selectCardTemp,
+  props: {
+    cardType: {
+      type: String,
+      default: 'card',
+      validator (value) {
+        return ['card', 'line'].indexOf(value) !== -1
+      }
+    },
+    confirmText: {
+      type: String,
+      default: '保存'
+    },
+    cancelText: {
+      type: String,
+      default: '取消'
+    },
+    confirmDisabled: {
+      type: Boolean,
+      default: false
+    }
+  },
+  methods: {
+    onCancel () {
+      this.$emit('onCancel')
+    },
+    onConfirm () {
+      this.$emit('onConfirm')
+    }
+  }
+}

+ 209 - 35
src/web/staticres/js/superSearch.js

@@ -9,10 +9,14 @@ var employList = [] // 收录情况列表
 var tParams = goTemplateData.params
 var tParams = goTemplateData.params
 // 是否在bi环境下(p364-crm营销功能)
 // 是否在bi环境下(p364-crm营销功能)
 var inResourceBIiframe = getParam('resource') === 'BI'
 var inResourceBIiframe = getParam('resource') === 'BI'
+var inBIPropertyiframe = getParam('property') === 'BIProperty'
 
 
 if (!(tParams.isEntniche || tParams.isVip || tParams.isMember)) {
 if (!(tParams.isEntniche || tParams.isVip || tParams.isMember)) {
   localStorage.setItem('login-clear-bidsearch-list-model', 'S')
   localStorage.setItem('login-clear-bidsearch-list-model', 'S')
 }
 }
+if(inBIPropertyiframe){
+  localStorage.setItem('login-clear-bidsearch-list-model', 'S')
+}
 var listModel = localStorage.getItem('login-clear-bidsearch-list-model') || 'S' // 列表精简or详细 S:精简 D:详细
 var listModel = localStorage.getItem('login-clear-bidsearch-list-model') || 'S' // 列表精简or详细 S:精简 D:详细
 // 采购单位画像中转页
 // 采购单位画像中转页
 var buyerLink = '/swordfish/page_big_pc/free/loading/buyer/'
 var buyerLink = '/swordfish/page_big_pc/free/loading/buyer/'
@@ -274,8 +278,9 @@ function getNewBiddings(num, size){
 	})
 	})
 }
 }
 //
 //
-
+var listData
 function appendDatas(datas,flag,isNew,onlyUpdateTable){
 function appendDatas(datas,flag,isNew,onlyUpdateTable){
+  listData = datas
   // flag // 是否有输入
   // flag // 是否有输入
   let is_field=$("#zbSeatchT [name='bid_field']").val() //是否是领域化
   let is_field=$("#zbSeatchT [name='bid_field']").val() //是否是领域化
   let selectContext=selectType.indexOf('content') > -1 //是否正文搜索
   let selectContext=selectType.indexOf('content') > -1 //是否正文搜索
@@ -363,7 +368,7 @@ function appendDatas(datas,flag,isNew,onlyUpdateTable){
             // 分类标签、收藏
             // 分类标签、收藏
             listHtml += '<div class="bid-list-tags">'
             listHtml += '<div class="bid-list-tags">'
                 +'<div class="bid-list-tags-left">'
                 +'<div class="bid-list-tags-left">'
-                if (datas[i].site == '剑鱼信息发布平台') {
+                if (datas[i].site == '剑鱼信息发布平台' && !searchInnerVue.inBIPropertyiframe) {
                   listHtml += '<span class="tags-item tags-publish">用户发布</span>'
                   listHtml += '<span class="tags-item tags-publish">用户发布</span>'
                 }
                 }
                 if ($.trim(datas[i].area) != "" && datas[i].area != "A"&&datas[i].area.indexOf("免费注册")<0) {
                 if ($.trim(datas[i].area) != "" && datas[i].area != "A"&&datas[i].area.indexOf("免费注册")<0) {
@@ -390,6 +395,34 @@ function appendDatas(datas,flag,isNew,onlyUpdateTable){
                 } else {
                 } else {
                   listHtml += '<a href="javascript:volid(0);" style="display:none;"></a>';
                   listHtml += '<a href="javascript:volid(0);" style="display:none;"></a>';
                 }
                 }
+                // // 物业业态
+                if (datas[i].property_form && searchInnerVue.inBIPropertyiframe) {
+                  const wyyt = [
+                    "住宅#21",
+                    "政府办公楼#22",
+                    "学校#23",
+                    "医院#24",
+                    "产业园区#25",
+                    "旅游景区#26",
+                    "交通枢纽#27",
+                    "商务办公楼#28",
+                    "酒店#29"
+                  ]
+                  wyyt.forEach(v => {
+                    if(v.indexOf(datas[i].property_form) != -1) {
+                      const val = v.split('#')[0]
+                      listHtml += '<a class="tags-item" href="javascript:volid(0);"'+'>'+val+'</a>';
+                    }
+                  })
+                } else {
+                  listHtml += '<a href="javascript:volid(0);" style="display:none;"></a>';
+                }
+                // 业务类型
+                if (datas[i].tag_subinformation && searchInnerVue.inBIPropertyiframe) {
+                  listHtml += '<a class="tags-item" href="javascript:volid(0);"'+'>'+datas[i].tag_subinformation+'</a>';
+                } else {
+                  listHtml += '<a href="javascript:volid(0);" style="display:none;"></a>';
+                }
                 var amount= getacount(datas[i].bidamount,datas[i].budget)
                 var amount= getacount(datas[i].bidamount,datas[i].budget)
                 if (amount!="") {
                 if (amount!="") {
                   /**
                   /**
@@ -421,7 +454,11 @@ function appendDatas(datas,flag,isNew,onlyUpdateTable){
                   $('.line-common').show()
                   $('.line-common').show()
                 } else {
                 } else {
                   // // 是否收录
                   // // 是否收录
-                  listHtml += '<i class="icon-shoulu iconfont icon-a-Property1shoulu" dataid="'+datas[i]._id+'"></i>'
+                  if (inBIPropertyiframe) {
+                    listHtml += '<i class="icon-shoulu icon-a-Property1shoulu wuye" dataid="'+datas[i]._id+'"></i>'
+                  } else {
+                    listHtml += '<i class="icon-shoulu iconfont icon-a-Property1shoulu" dataid="'+datas[i]._id+'"></i>'
+                  }
                   $('#right-export').hide()
                   $('#right-export').hide()
                   $('#bid-collect').hide()
                   $('#bid-collect').hide()
                   $('.line-common').hide()
                   $('.line-common').hide()
@@ -988,6 +1025,11 @@ function beforeSubmit(from){
     }
     }
   }
   }
 
 
+  // 搜索清空已勾选
+  $('.custom-checkbox').prop('checked', false)
+  selectDataIds = []
+  $('#checkNum-bid').html(0)
+
   // 关键词不为空时 存sessionStorage值
   // 关键词不为空时 存sessionStorage值
   if (searchKeywords !== "") {
   if (searchKeywords !== "") {
     sessionStorage.setItem('is-click-search', 1)
     sessionStorage.setItem('is-click-search', 1)
@@ -1196,9 +1238,11 @@ var LimitClass = {
 function searchOnsubmit(clickpaging){
 function searchOnsubmit(clickpaging){
 	var this_selectType = $("#zbSeatchT [name='selectType']").val();
 	var this_selectType = $("#zbSeatchT [name='selectType']").val();
 	if(this_selectType != "all"){
 	if(this_selectType != "all"){
-		LimitClass.limitFlag = false;
-		LimitClass.result = null;
-		LimitClass.list = null;
+    if(LimitClass) {
+      LimitClass.limitFlag = false;
+      LimitClass.result = null;
+      LimitClass.list = null;
+    }
 	}else{
 	}else{
 		if(clickpaging&&LimitClass.limitFlag){
 		if(clickpaging&&LimitClass.limitFlag){
 			LimitClass.paging(currentPage);
 			LimitClass.paging(currentPage);
@@ -1232,7 +1276,40 @@ function searchOnsubmit(clickpaging){
     additionalWords: $("#zbSeatchT [name='additionalWords']").val(),
     additionalWords: $("#zbSeatchT [name='additionalWords']").val(),
     district: $("#zbSeatchT [name='district']").val()
     district: $("#zbSeatchT [name='district']").val()
   };
   };
-
+  if(searchInnerVue.inBIPropertyiframe) {
+    // 物业专版搜索参数
+    const { propertyForm, subinformation, period, scale, changehand, searchCheckList, publishtimeValue, subType } = searchInnerVue.apiFilterProperty
+    // content,title,ppa,buyer,winner,agency
+    console.info(searchCheckList, publishtimeValue)
+    param = {
+      pageNumber: currentPage,
+      pageSize: pageSize,
+      bid_field: 'BIProperty',
+      searchvalue: $("#zbSeatchT [name='keywords']").val(),
+      area: $("#zbSeatchT [name='area']").val(),
+      subtype: subType,
+      publishtime: publishtimeValue,
+      expireTime: $("#zbSeatchT [name='publishtime']").val(),
+      propertyForm: propertyForm.toString(), // 物业业态
+      subinformation: subinformation.toString(), // 业务类型
+      period: period.toString(), // 合作周期
+      scale: scale.toString(), // 价格区间
+      changehand: changehand, // 换手率
+      selectType : searchCheckList.toString() || 'title,content',
+      tabularflag: "Y",
+      buyerclass: $("#zbSeatchT [name='buyerclass']").val(),
+      buyertel: $("#zbSeatchT [name='buyertel']").val(),
+      winnertel: $("#zbSeatchT [name='winnertel']").val(),
+      notkey: $("#zbSeatchT [name='notkey']").val(),
+      fileExists: $("#zbSeatchT [name='fileExists']").val(),
+      city: $("#zbSeatchT [name='city']").val(),
+      searchGroup: $("#zbSeatchT [name='searchGroup']").val(),
+      searchMode: $("#zbSeatchT [name='searchMode']").val(),
+      wordsMode: $("#zbSeatchT [name='wordsMode']").val(),
+      additionalWords: $("#zbSeatchT [name='additionalWords']").val(),
+      district: $("#zbSeatchT [name='district']").val()
+  }
+}
   // function queryBack (r) {
   // function queryBack (r) {
   $.post("/front/pcAjaxReq",param,function(r){
   $.post("/front/pcAjaxReq",param,function(r){
     heightWords = r.heightWords
     heightWords = r.heightWords
@@ -1269,20 +1346,46 @@ function showSearchTipForTimeRange (type) {
 	}
 	}
 	var tempStr = ''
 	var tempStr = ''
 	var defaultRange =  $("#zbSeatchT [name='publishtime']").val() || selectPublishtime
 	var defaultRange =  $("#zbSeatchT [name='publishtime']").val() || selectPublishtime
-	if (tipMap[defaultRange]) {
-		tempStr = tipMap[defaultRange]
-	} else {
-		var tempTimeList = defaultRange.split('_')
-		if (tempTimeList[0]) {
-			tempStr = new Date(tempTimeList[0] * 1000).pattern('yyyy/MM/dd')
-		}
-		if (tempTimeList[1]) {
-			if (tempStr.length) {
-				tempStr += '-'
-			}
-			tempStr += new Date(tempTimeList[1] * 1000).pattern('yyyy/MM/dd')
-		}
-	}
+  if (searchInnerVue.inBIPropertyiframe) {
+    defaultRange = searchInnerVue.apiFilterProperty.publishtimeValue
+    if (tipMap[defaultRange]) {
+      tempStr = tipMap[defaultRange]
+    } else {
+      var tempTimeList = defaultRange.split('_')
+      if (tempTimeList[0]) {
+        tempStr = new Date(tempTimeList[0] * 1000).pattern('yyyy/MM/dd')
+      }
+      if (tempTimeList[1]) {
+        if (tempStr.length) {
+          tempStr += '-'
+        }
+        tempStr += new Date(tempTimeList[1] * 1000).pattern('yyyy/MM/dd')
+      }
+    }
+    tempDom.find('span').text(tempStr)
+    if (type !== false) {
+      tempDom.show();
+    }
+  } else {
+    if (tipMap[defaultRange]) {
+      tempStr = tipMap[defaultRange]
+    } else {
+      var tempTimeList = defaultRange.split('_')
+      if (tempTimeList[0]) {
+        tempStr = new Date(tempTimeList[0] * 1000).pattern('yyyy/MM/dd')
+      }
+      if (tempTimeList[1]) {
+        if (tempStr.length) {
+          tempStr += '-'
+        }
+        tempStr += new Date(tempTimeList[1] * 1000).pattern('yyyy/MM/dd')
+      }
+    }
+    tempDom.find('span').text(tempStr)
+    if (type !== false) {
+      tempDom.show();
+    }
+  }
 	tempDom.find('span').text(tempStr)
 	tempDom.find('span').text(tempStr)
 	if (type !== false) {
 	if (type !== false) {
 		tempDom.show();
 		tempDom.show();
@@ -1705,25 +1808,62 @@ $('#right-employ').off('click').bind('click', function(e) {
         return
         return
       }
       }
     }
     }
-    const url = '/jyapi/crmApplication/employ/operate'
+    let url = '/jyapi/crmApplication/employ/operate'
     console.info(checkedId)
     console.info(checkedId)
-    const result = checkedId.map(obj => obj.bid)
-    const params = {
+    let result = checkedId.map(obj => obj.bid)
+    let params = {
       idArr: result.join(','),
       idArr: result.join(','),
       isEmploy: true,
       isEmploy: true,
       employType: 1
       employType: 1
     }
     }
+    if(searchInnerVue.inBIPropertyiframe) {
+      url = '/jyNewApi/property/information/batch/create'
+      result = checkedId.map(obj => obj.bid)
+      params = {
+        ids: result.join(',')
+      }
+    }
     $.ajax({
     $.ajax({
       type: "POST",
       type: "POST",
       url: url,
       url: url,
       contentType: 'application/json',
       contentType: 'application/json',
       data: JSON.stringify(params),
       data: JSON.stringify(params),
       success: function (res) {
       success: function (res) {
-        if (res.error_code === 0) {
-          if (res.data.status) {
+        if(searchInnerVue.inBIPropertyiframe) {
+          // 物业专版批量收录
+          if (res.code === 1) {
             checkedId.forEach((v, i) => {
             checkedId.forEach((v, i) => {
               $('.icon-shoulu[dataid="' + result[i] + '"]').removeClass('icon-a-Property1shoulu').addClass('icon-a-Property1yishoulu')
               $('.icon-shoulu[dataid="' + result[i] + '"]').removeClass('icon-a-Property1shoulu').addClass('icon-a-Property1yishoulu')
             })
             })
+          } else if(res.code === 2) {
+            if(res.data) {
+              if(res.data.indexOf(',') !== -1) {
+                const resArr = res.data.split(',')
+                resArr.forEach(r => {
+                  checkedId.forEach((v, i) => {
+                    if(r === v.bid) {
+                      $('.icon-shoulu[dataid="' + result[i] + '"]').removeClass('icon-a-Property1shoulu').addClass('icon-a-Property1yishoulu')
+                    }
+                  })
+                })
+              } else {
+                checkedId.forEach((v, i) => {
+                  if(res.data === v.bid) {
+                    $('.icon-shoulu[dataid="' + result[i] + '"]').removeClass('icon-a-Property1shoulu').addClass('icon-a-Property1yishoulu')
+                  }
+                })
+              }
+            }
+          }
+          toastFn(res.msg, 1000)
+        } else {
+          // 营销批量收录
+          if (res.error_code === 0) {
+            if (res.data.status) {
+              checkedId.forEach((v, i) => {
+                $('.icon-shoulu[dataid="' + result[i] + '"]').removeClass('icon-a-Property1shoulu').addClass('icon-a-Property1yishoulu')
+              })
+            }
           }
           }
         }
         }
       },
       },
@@ -1814,6 +1954,10 @@ function getEmployData () {
     data: JSON.stringify(params),
     data: JSON.stringify(params),
     success: function (res) {
     success: function (res) {
       if (res.error_code === 0) {
       if (res.error_code === 0) {
+        if(res.batchEmploy) {
+          $('#right-employ').show()
+          $('.shoulu-line').show()
+        }
         if(res.data && res.data.length > 0) {
         if(res.data && res.data.length > 0) {
           employList = res.data
           employList = res.data
           res.data.forEach(function (item, index) {
           res.data.forEach(function (item, index) {
@@ -1835,28 +1979,58 @@ function getEmployData () {
 // 收录操作
 // 收录操作
 $(document).on('click', '.icon-shoulu', function() {
 $(document).on('click', '.icon-shoulu', function() {
   const id = $(this).attr('dataid')
   const id = $(this).attr('dataid')
+  listData.forEach(v => {
+    if(v._id === id) {
+      localStorage.setItem('property-data', JSON.stringify(v))
+    }
+  })
   const isChecked = $(this).hasClass('icon-a-Property1yishoulu')
   const isChecked = $(this).hasClass('icon-a-Property1yishoulu')
-  const url = '/jyapi/crmApplication/employ/operate'
-  const params = {
+  let url = '/jyapi/crmApplication/employ/operate'
+  let params = {
     idArr: id,
     idArr: id,
     isEmploy: !isChecked,
     isEmploy: !isChecked,
     employType: 1
     employType: 1
   }
   }
+  // 取消收录添加参数
+  if(isChecked) {
+    params.from = 'jhfp'
+  }
+  if(!isChecked && searchInnerVue.inBIPropertyiframe) {
+    params = {
+      id: id
+    }
+    url = '/jyNewApi/property/information/exist'
+  }
   $.ajax({
   $.ajax({
     type: "POST",
     type: "POST",
     url: url,
     url: url,
     contentType: 'application/json',
     contentType: 'application/json',
     data: JSON.stringify(params),
     data: JSON.stringify(params),
     success: function (res) {
     success: function (res) {
-      if (res.error_code === 0) {
-        if (res.data.status) {
-          if(!isChecked) {
-            $('.icon-shoulu[dataid="' + id + '"]').removeClass('icon-a-Property1shoulu').addClass('icon-a-Property1yishoulu')
+      // 收录操作
+      if(!isChecked && searchInnerVue.inBIPropertyiframe) {
+        if (res.code === 2) {
+          // 已经创建情报信息,直接收录
+          $('.icon-shoulu[dataid="' + id + '"]').removeClass('icon-a-Property1shoulu').addClass('icon-a-Property1yishoulu')
+        } else if (res.code === 1) {
+          // 未创建情报信息,需要手动创建
+          searchInnerVue.showPropertyDialog = true
+          searchInnerVue.IframeSrc = `${location.origin}/succbi/crm_system/app/crm.app/%E9%80%9A%E7%94%A8%E5%88%9B%E5%BB%BA/create_intelligence.spg?t=${new Date().getTime()}`
+        } else {
+          toastFn(res.msg, 800)
+        }
+      } else {
+        // 取消收录操作
+        if (res.error_code === 0) {
+          if (res.data.status) {
+            if(!isChecked) {
+              $('.icon-shoulu[dataid="' + id + '"]').removeClass('icon-a-Property1shoulu').addClass('icon-a-Property1yishoulu')
+            } else {
+              $('.icon-shoulu[dataid="' + id + '"]').removeClass('icon-a-Property1yishoulu').addClass('icon-a-Property1shoulu')
+            }
           } else {
           } else {
-            $('.icon-shoulu[dataid="' + id + '"]').removeClass('icon-a-Property1yishoulu').addClass('icon-a-Property1shoulu')
+            toastFn(res.data.msg, 800)
           }
           }
-        } else {
-          toastFn(res.data.msg, 800)
         }
         }
       }
       }
     },
     },

+ 7 - 0
src/web/templates/pc/biddetail_rec.html

@@ -252,6 +252,10 @@
       line-height: 18px;
       line-height: 18px;
       cursor: pointer;
       cursor: pointer;
     }
     }
+    .property-employ-dialog {
+      width: 650px!important;
+      height: 720px;
+    }
   </style>
   </style>
 </head>
 </head>
 <body style="height: 100%">
 <body style="height: 100%">
@@ -657,6 +661,9 @@
               </div>
               </div>
             </div>
             </div>
           </div>
           </div>
+          <el-dialog custom-class="property-employ-dialog" :visible.sync="showPropertyDialog">
+            <iframe width="600" height="650" :src="IframeSrc" frameborder="0"></iframe>
+          </el-dialog>
           <div class="Iframe-dialog">
           <div class="Iframe-dialog">
             <el-dialog
             <el-dialog
               :visible.sync="dialogVisible"
               :visible.sync="dialogVisible"

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

@@ -20,13 +20,14 @@
   <link rel="stylesheet" type="text/css" href='{{Msg "seo" "cdn"}}/pccss/public-nav-1200.css?v={{Msg "seo" "version"}}' />
   <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 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>
   <script src='{{Msg "seo" "cdn"}}/js/jquery.cookie.js'></script>
-  <link href="//cdn-common.jianyu360.com/cdn/lib/element-ui/2.15.13-rc/lib/theme-chalk/index.css" rel="stylesheet" />
+  <link href="https://cdn-common.jianyu360.com/cdn/lib/element-ui/2.15.13-rc/lib/theme-chalk/index.css" rel="stylesheet" />
   <link rel="stylesheet" href='{{Msg "seo" "cdn"}}/css/selector/selector.css?v={{Msg "seo" "version"}}'>
   <link rel="stylesheet" href='{{Msg "seo" "cdn"}}/css/selector/selector.css?v={{Msg "seo" "version"}}'>
-  <link href="//cdn-common.jianyu360.com/cdn/assets/iconfont/pc/23.8.30/iconfont.css" rel="stylesheet" />
+  <link href="https://cdn-common.jianyu360.com/cdn/assets/iconfont/pc/23.8.30/iconfont.css" rel="stylesheet" />
   <link href='{{Msg "seo" "cdn"}}/css/collect-user-info.css?v={{Msg "seo" "version"}}' rel="stylesheet">
   <link href='{{Msg "seo" "cdn"}}/css/collect-user-info.css?v={{Msg "seo" "version"}}' rel="stylesheet">
   <link href='{{Msg "seo" "cdn"}}/css/ele-reset.css?v={{Msg "seo" "version"}}' rel="stylesheet">
   <link href='{{Msg "seo" "cdn"}}/css/ele-reset.css?v={{Msg "seo" "version"}}' rel="stylesheet">
   <link rel="stylesheet" href='{{Msg "seo" "cdn"}}/css/selector/selector.css?v={{Msg "seo" "version"}}'>
   <link rel="stylesheet" href='{{Msg "seo" "cdn"}}/css/selector/selector.css?v={{Msg "seo" "version"}}'>
-  <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/v-charts/1.19.0/style.min.css />
+  <link rel="stylesheet" href='{{Msg "seo" "cdn"}}/css/selector/select-card.css?v={{Msg "seo" "version"}}'>
+  <link rel="stylesheet" href=https://cdn-common.jianyu360.com/cdn/lib/v-charts/1.19.0/style.min.css />
   <!-- 原页面head内写的样式 移至superSearch-inside.css里 写到页面里打脸 -->
   <!-- 原页面head内写的样式 移至superSearch-inside.css里 写到页面里打脸 -->
   <link rel="stylesheet" href='{{Msg "seo" "cdn"}}/css/dev2/superSearch-inside.css?v={{Msg "seo" "version"}}'>
   <link rel="stylesheet" href='{{Msg "seo" "cdn"}}/css/dev2/superSearch-inside.css?v={{Msg "seo" "version"}}'>
   <link rel="stylesheet" href='{{Msg "seo" "cdn"}}/css/advanced/index.css?v={{Msg "seo" "version"}}'>
   <link rel="stylesheet" href='{{Msg "seo" "cdn"}}/css/advanced/index.css?v={{Msg "seo" "version"}}'>
@@ -161,9 +162,12 @@
     $(function(){
     $(function(){
 
 
       // console.log("是否有会员筛选权限 showVipScreen", {{.T.showVipScreen}})
       // console.log("是否有会员筛选权限 showVipScreen", {{.T.showVipScreen}})
-
-      var oInput=document.getElementById("searchinput");
-      moveEnd(oInput)
+      try {
+        var oInput=document.getElementById("searchinput");
+        moveEnd(oInput) 
+      } catch (error) {
+        
+      }
 
 
       $(".working").show();
       $(".working").show();
 
 
@@ -691,7 +695,7 @@
   <!--搜索头部 START-->
   <!--搜索头部 START-->
   <div class="searchHeader">
   <div class="searchHeader">
     <div class="w searchHeader-container">
     <div class="w searchHeader-container">
-      <div class="search-tabs">
+      <div class="search-tabs" v-if="!inBIPropertyiframe">
         <span class="search-tab-item search-tab-item-0 nologin-hide" :class="{'tab-active': searchTab === 0}" @click="onSearchTab(0)">全部</span>
         <span class="search-tab-item search-tab-item-0 nologin-hide" :class="{'tab-active': searchTab === 0}" @click="onSearchTab(0)">全部</span>
         <span class="search-tab-item search-tab-item-1" :class="{'tab-active': searchTab === 1}" @click="onSearchTab(1)">招标采购公告</span>
         <span class="search-tab-item search-tab-item-1" :class="{'tab-active': searchTab === 1}" @click="onSearchTab(1)">招标采购公告</span>
         <span class="search-tab-item badge-recommend nologin-hide" :class="{'tab-active': searchTab === 2}" @click="onSearchTab(2)">超前项目</span>
         <span class="search-tab-item badge-recommend nologin-hide" :class="{'tab-active': searchTab === 2}" @click="onSearchTab(2)">超前项目</span>
@@ -785,7 +789,7 @@
           </div>
           </div>
           <!--领域化页面不展示-->
           <!--领域化页面不展示-->
           {{if not .T.bidField}}
           {{if not .T.bidField}}
-          <el-badge value="限免" type="danger" class="publish-button" v-if="!inResourceBIiframe">
+          <el-badge value="限免" type="danger" class="publish-button" v-if="!inResourceBIiframe && !inBIPropertyiframe">
             <el-button type="primary" id="setInfoBtn" round @click="goToPublish">信息发布</el-button>
             <el-button type="primary" id="setInfoBtn" round @click="goToPublish">信息发布</el-button>
           </el-badge>
           </el-badge>
           {{end}}
           {{end}}
@@ -888,7 +892,7 @@
           <div class="f-h-label" :class="showFilter ? 'caret-up' : 'caret-down'" @click="toggleFilter">
           <div class="f-h-label" :class="showFilter ? 'caret-up' : 'caret-down'" @click="toggleFilter">
             <span>筛选条件</span>
             <span>筛选条件</span>
           </div>
           </div>
-          <div class="f-h-action nologin-hide">
+          <div class="f-h-action nologin-hide" v-if="!inBIPropertyiframe">
             <span class="action-item reset-item" @click="onResetFilter">重置筛选条件</span>
             <span class="action-item reset-item" @click="onResetFilter">重置筛选条件</span>
             <span class="action-item has-item" @click="onHasFilter">已存筛选条件 ${filterCounts}</span>
             <span class="action-item has-item" @click="onHasFilter">已存筛选条件 ${filterCounts}</span>
             <span class="action-item save-item" @click="onSaveFilter">保存筛选条件</span>
             <span class="action-item save-item" @click="onSaveFilter">保存筛选条件</span>
@@ -898,6 +902,7 @@
       <!-- slideUp、slideDown动画效果 -->
       <!-- slideUp、slideDown动画效果 -->
       <el-collapse-transition>
       <el-collapse-transition>
         <div class="filter-container" v-show="showFilter">
         <div class="filter-container" v-show="showFilter">
+          <div v-if="!inBIPropertyiframe">
           <!--发布时间-->
           <!--发布时间-->
           <!-- 没有登陆或者为VIP走旧的展示筛选项逻辑,登录的普通用户展示引导开通VIP的控件样式 -->
           <!-- 没有登陆或者为VIP走旧的展示筛选项逻辑,登录的普通用户展示引导开通VIP的控件样式 -->
           <div class="release-time clearfix" v-if = "vipState || !islogin">
           <div class="release-time clearfix" v-if = "vipState || !islogin">
@@ -1130,7 +1135,7 @@
           <!-- <div class="selector-card" style="border-bottom: 1px dashed #e0e0e0; ">
           <!-- <div class="selector-card" style="border-bottom: 1px dashed #e0e0e0; ">
             <div class="selector-card-header" style="padding:4px 15px 4px 0px;min-width: 94px;margin-right: 0;">项目地区:</div>
             <div class="selector-card-header" style="padding:4px 15px 4px 0px;min-width: 94px;margin-right: 0;">项目地区:</div>
             <div class="selector-card-content">
             <div class="selector-card-content">
-              <area-city-component ref="areaRefs" :show-selected-list="false" @change="areaCityChange" :before-city-selected="beforeCitySelected">
+              <area-city-component ref="areaRefs" :show-initial="false" :show-selected-list="false" @change="areaCityChange" :before-city-selected="beforeCitySelected">
                 <div slot="city-list-divide" style="display: inline-block;">市级:<img class="icon-vip" src="/images/biddingSearch/VIP.png" alt="" style="width:38px;height:18px;"></div>
                 <div slot="city-list-divide" style="display: inline-block;">市级:<img class="icon-vip" src="/images/biddingSearch/VIP.png" alt="" style="width:38px;height:18px;"></div>
               </area-city-component>
               </area-city-component>
             </div>
             </div>
@@ -1438,9 +1443,223 @@
             </div>
             </div>
             <keyword-tags-component onClick="if(!vipState) return openVipDialog();" class="notkey-component" :before-change="onNotBeforeChange" :disabled="!vipState" :list="notkeyTags" placeholder="请输入不希望包含的关键词" @change="onNotKeyChange"></keyword-tags-component>
             <keyword-tags-component onClick="if(!vipState) return openVipDialog();" class="notkey-component" :before-change="onNotBeforeChange" :disabled="!vipState" :list="notkeyTags" placeholder="请输入不希望包含的关键词" @change="onNotKeyChange"></keyword-tags-component>
           </div> -->
           </div> -->
+          </div>
+          <div class="property-filter" v-else>
+            <!--地区-->
+            <div class="selector-card property-card" style="border-bottom: 1px solid #e0e0e0; ">
+              <div class="selector-card-header" style="padding:4px 15px 4px 0px;min-width: 94px;margin-right: 0;">地区:</div>
+              <div class="selector-card-content" :class="{'area-card-content': showMoreAreaState}">
+                <area-city-component ref="areaRefs" :show-initial="false" :show-selected-list="false" @show="showMoreAreaState = false;$('.el-icon-arrow-down').css('transform', 'rotate(180deg)')" @change="areaCityChange" :before-city-selected="beforeCitySelected">
+                  <!-- <div slot="city-list-divide" style="display: inline-block;">市级:<img class="icon-vip" src="/images/biddingSearch/VIP.png" alt="" style="width:38px;height:18px;"></div> -->
+                </area-city-component>
+                <div class="area_more_btn" @click="showMoreArea" style="position: absolute;right: 0;top: 12px;cursor: pointer;">
+                  <span style="font-size: 12px;color: #686868;">更多</span>
+                  <i class="el-icon-arrow-down"></i>
+                </div>
+              </div>
+            </div>
+            <!-- 到期时间 -->
+            <div class="release-time clearfix flex-auto property-card" style="border-bottom: 1px solid #e0e0e0;">
+              <div class="leftTitle">
+                到期时间:
+              </div>
+              <div class="fl timer" style="margin-left: 6px;">
+                <ul>
+                  <li id="expireTimerAll" class="active" data-value="">全部</li>
+                  <li data-value="1">本月到期</li>
+                  <li data-value="1-3">1-3个月到期</li>
+                  <li data-value="3-6">3-6个月到期</li>
+                  <li data-value="6-12">6-12个月到期</li>
+                  <li data-value="12">12个月后到期</li>
+                </ul>
+              </div>
+              <div class="timerInput fl" style="margin-left: 12px;">
+                <input type="text"  onClick="WdatePicker({onclearing:function(){onclearing(this)},onpicked:function(dp){picked(dp,this)},onpicking:function(dp){onpicking(dp,this)},dateFmt:'yyyy年MM月dd日',maxDate:'#F{$dp.$D(\'endtime\')}'})" id="starttime" readonly="true" placeholder="" />
+                <span></span>
+                <input type="text" name="maxtime"  onClick="WdatePicker({onclearing:function(){onclearing(this)},onpicked:function(dp){picked(dp,this)},onpicking:function(dp){onpicking(dp,this)},dateFmt:'yyyy年MM月dd日',minDate:'#F{$dp.$D(\'starttime\')}'})" id="endtime" readonly="true" placeholder="" />
+                <button class="fl" id="timebut" style="display:none;">确定</button>
+              </div>
+            </div>
+            <!-- 业务类型、物业业态、合作周期、价格区间 -->
+            <!-- propertyListData -->
+            <div>
+              <div class="selector-card property-card" style="border-bottom: 1px solid #e0e0e0;" v-for="(item, index) in Object.keys(propertyListData)">
+                <div class="selector-card-header" style="padding:4px 16px 4px 0px;min-width: 94px;margin-right: 0;">${item}:</div>
+                <div class="selector-card-content">
+                  <el-checkbox-group class="j-checkbox-group" v-model="filterProperty[filterFiled[item]]" @change="onStateChange(item, filterProperty[filterFiled[item]])">
+                    <el-checkbox-button class="j-checkbox-button" :class="{ 'is-checked': filterProperty[filterFiled[item]].indexOf('全部') > -1 }" label="全部">全部</el-checkbox-button>
+                    <el-checkbox-button
+                      class="j-checkbox-button"
+                      v-for="state in propertyListData[item]"
+                      :key="state"
+                      :label="state.name">
+                    </el-checkbox-button>
+                  </el-checkbox-group>
+                </div>
+              </div>
+            </div>
+            <!-- 更多筛选条件 -->
+            <div class="other-filter clearfix" style="display: none; border-top: none;">
+              <div class="leftTitle lh-22">更多筛选:</div>
+              <div class="other-content" style="position: relative;margin-left: 6px;">
+                  <div class="one-filter clearfix">
+                    <!--领域化页面不展示-->
+                    <!-- 搜索范围 -->
+                    <div class="select-searchRange mr-16">
+                      <div id="selectArea_">
+                        <div class="valueBox"><span v-text="'搜索范围'"></span><span v-text="getSearchRangeLength" class="hightlight" v-show="getSearchRangeLength"></span><span v-show="getSearchRangeLength">个</span></div>
+                        <el-select ref="selectchoose" placeholder="" v-model="selectValue" class="select_common" popper-class="select_common_data">
+                          <div slot="empty">
+                            <el-checkbox-group class="search-checkbox" v-model="filterProperty.searchCheckList" @change="onSearchRangeChange()">
+                              <el-checkbox label="标题"></el-checkbox>
+                              <el-checkbox label="正文"></el-checkbox>
+                              <el-checkbox label="附件"></el-checkbox>
+                              <el-checkbox label="项目名称/标的物"></el-checkbox>
+                              <div style="display: flex;align-items: center;">
+                                <el-checkbox label="采购单位"></el-checkbox>
+                                <el-tooltip class="item" effect="dark" content="“采购单位”采购单位名称中包含输入关键词的会展示出来" placement="top">
+                                  <img src="{{Msg "seo" "cdn"}}/images/biddingSearch/info-icon1.png?v={{Msg "seo" "version"}}" alt="" class="desc-icon tooltip-help-btn">
+                                </el-tooltip>
+                              </div>
+                              <div style="display: flex;align-items: center;">
+                                <el-checkbox label="中标企业"></el-checkbox>
+                                <el-tooltip class="item" effect="dark" content="“中标企业”中标企业名称中包含输入关键词的会展示出来" placement="top">
+                                  <img src="{{Msg "seo" "cdn"}}/images/biddingSearch/info-icon1.png?v={{Msg "seo" "version"}}" alt="" class="desc-icon tooltip-help-btn">
+                                </el-tooltip>
+                              </div>
+                              <div style="display: flex;align-items: center;">
+                                <el-checkbox label="招标代理机构"></el-checkbox>
+                                <el-tooltip class="item" effect="dark" content="“招标代理机构”招标代理机构中包含输入关键词的会展示出来" placement="top">
+                                  <img src="{{Msg "seo" "cdn"}}/images/biddingSearch/info-icon1.png?v={{Msg "seo" "version"}}" alt="" class="desc-icon tooltip-help-btn">
+                                </el-tooltip>
+                              </div>
+                            </el-checkbox-group>
+                          </div>
+                        </el-select>
+                      </div>
+                    </div>
+                    <!-- 信息类型下拉筛选 -->
+                    <div class="select-industry mr-16">
+                      <select-areachoose ref='selectInfoType' :list-data="infoTypeDataProperty" :value-label="'信息类型'" left-tit="一级分类" right-tit="二级分类" :login="islogin" :type="'infoTypeProperty'" @datachange = "infoTypeChange">
+                      </select-areachoose>
+                    </div>
+                    <!-- 发布时间 -->
+                    <div class="selector-card file mr-16 property-placeholder" style="position: relative;">
+                      <div class="selector-card-content flex mini-select">
+                        <el-select v-model = "filterProperty.publishtimeValue" placeholder="发布时间" @change="changePublishtime" class="selefile" popper-class="select_common_data">
+                          <el-option
+                            v-for="item in publishtimeOptions"
+                            :key="item.value"
+                            :label="item.label"
+                            :disabled="item.disabled"
+                            :value="item.value">
+                            <div class="custom-property-time" @click="handleClick" v-if="item.label == '自定义'">
+                              <div style="font-size: 14px;color: #1D1D1D;">自定义</div>
+                              <img style="width: 16px;" src="/images/more_.png" alt="">
+                              <div class="date-select-property">
+                                <el-date-picker
+                                  v-model="datePropertyValue"
+                                  @focus="getFocus"
+                                  popper-class="propertyDatePicker"
+                                  @change="changePublishtimeCustom"
+                                  type="daterange"
+                                  range-separator="至"
+                                  start-placeholder="开始日期"
+                                  end-placeholder="结束日期">
+                                </el-date-picker>
+                              </div>
+                            </div>
+                          </el-option>
+                        </el-select>
+                      </div>
+                    </div>
+                    <!-- 换手率 -->
+                    <div class="selector-card file mr-16 property-placeholder">
+                      <div class="selector-card-content flex mini-select">
+                        <el-select v-model = "filterProperty.changehand" @change="onAttachClick_hsl" placeholder="换手率"  class="selefile" popper-class="select_common_data">
+                          <el-option
+                              label="不限"
+                              value="0">
+                          </el-option>
+                          <el-option
+                              label="到期换手率高"
+                              value="1">
+                          </el-option>
+                        </el-select>
+                      </div>
+                    </div>
+                    <div>
+                      <el-tooltip class="item" effect="dark" content="换手率说明:采购单位的历史物业项目中标单位更换频次统计。" placement="top">
+                        <img style="margin: 8px 8px 0 -8px;" src="{{Msg "seo" "cdn"}}/images/biddingSearch/info-icon1.png?v={{Msg "seo" "version"}}" alt="" class="desc-icon tooltip-help-btn">
+                      </el-tooltip>
+                    </div>
+                    <!-- 附件 -->
+                    <div class="selector-card file mr-16">
+                      <div class="selector-card-content flex mini-select">
+                        <el-select :value = "attachVal | filters_" @change="onAttachClick" placeholder="附件" @visible-change="handleExpand" class="selefile" popper-class="select_common_data">
+                          <el-option
+                              v-for="item in selectorlist"
+                              :key="item.value"
+                              :label="item.label"
+                              :value="item.value">
+                          </el-option>
+                        </el-select>
+                      </div>
+                    </div>
+                  </div>
+                  <div class="two-filter clearfix">
+                    <div class="selector-card file mr-16">
+                      <div class="selector-card-content flex mini-select">
+                        <el-select :value = "attachVal_cg | filters_cg" @change="onAttachClick_cg" placeholder="采购单位联系方式"  class="selefile" popper-class="select_common_data">
+                          <el-option
+                              label="不限"
+                              value="">
+                          </el-option>
+                          <el-option
+                              label="有采购单位联系方式"
+                              value="y">
+                          </el-option>
+                        </el-select>
+                      </div>
+                    </div>
+                    <div class="selector-card file mr-16">
+                      <div class="selector-card-content flex mini-select">
+                        <el-select :value = "attachVal_zb | filters_zb" @change="onAttachClick_zb" placeholder="中标企业联系方式"  class="selefile" popper-class="select_common_data">
+                          <el-option
+                          label="不限"
+                          value="">
+                      </el-option>
+                      <el-option
+                          label="有中标企业联系方式"
+                          value="y">
+                      </el-option>
+                        </el-select>
+                      </div>
+                    </div>
+                    <div class="selector-notkey">
+                      <div class="selectNotkey" id="selectArea_">
+                        <div class="valueBox">
+                          <span class="title">排除词  </span><span class="hightlight num_" >${notkeyTags.length || 0}</span><span class="value_ hightlight">/5</span>
+                        </div>
+                        <el-select ref="selectchoose" :placeholder="''" :value="''" :popper-append-to-body="false" class="select_common" popper-class="select_common_data select_Notkey">
+                          <div slot="empty" class="select_box notkeyBox">
+                            <div class="key_box clearfix">
+                              <keyword-tags-componentnew onClick="if(!vipState) return openVipDialog();" class="notkey-component" :before-change="onNotBeforeChange" :disabled="!vipState" :list="notkeyTags" placeholder="请输入不希望包含的关键词" @change="onNotKeyChange"></keyword-tags-componentnew>
+                            </div>
+                          </div>
+                        </el-select>
+                      </div>
+                    </div>
+                  </div>
+              </div>
+            </div>
+          </div>
         </div>
         </div>
       </el-collapse-transition>
       </el-collapse-transition>
     </div>
     </div>
+    <el-dialog custom-class="property-employ-dialog" :visible.sync="showPropertyDialog">
+      <iframe width="600" height="650" :src="IframeSrc" frameborder="0"></iframe>
+    </el-dialog>
     <!-- 展开收起 -->
     <!-- 展开收起 -->
     <div class="w" style="text-align: center;" v-show="showFilter">
     <div class="w" style="text-align: center;" v-show="showFilter">
       <!-- <div class="fold" id="fold">
       <!-- <div class="fold" id="fold">
@@ -1580,8 +1799,8 @@
             <div class="split-line line-distribute" style="display: none;"></div>
             <div class="split-line line-distribute" style="display: none;"></div>
             <button id="right-distribute" style="display: none;">分发</button>
             <button id="right-distribute" style="display: none;">分发</button>
             <template v-if="inResourceBIiframe">
             <template v-if="inResourceBIiframe">
-              <div class="split-line"></div>
-              <button id="right-employ">收录</button>
+              <div class="split-line shoulu-line" style="display: none;"></div>
+              <button id="right-employ" style="display: none;">收录</button>
             </template>
             </template>
           </div>
           </div>
         </div>
         </div>
@@ -1909,9 +2128,11 @@
 <script src='{{Msg "seo" "cdn"}}/common-module/selector/js/static-data.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Msg "seo" "cdn"}}/common-module/selector/js/static-data.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Msg "seo" "cdn"}}/common-module/collection/js/visited.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Msg "seo" "cdn"}}/common-module/collection/js/visited.js?v={{Msg "seo" "version"}}'></script>
 <script src="https://cdn-common.jianyu360.com/cdn/lib/vue/2.6.11/vue.min.js"></script>
 <script src="https://cdn-common.jianyu360.com/cdn/lib/vue/2.6.11/vue.min.js"></script>
-<script src="//cdn-common.jianyu360.com/cdn/lib/element-ui/2.15.13-rc/lib/index.js"></script>
+<script src="https://cdn-common.jianyu360.com/cdn/lib/element-ui/2.15.13-rc/lib/index.js"></script>
 <script src='{{Msg "seo" "cdn"}}/big-member/js/utils.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Msg "seo" "cdn"}}/big-member/js/utils.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Msg "seo" "cdn"}}/js/selector/area-city-pc.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Msg "seo" "cdn"}}/js/selector/area-city-pc.js?v={{Msg "seo" "version"}}'></script>
+<script src='{{Msg "seo" "cdn"}}/js/selector/select-card.js?v={{Msg "seo" "version"}}'></script>
+<script src='{{Msg "seo" "cdn"}}/js/selector/info-type-data.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Msg "seo" "cdn"}}/js/selector/keyword-tags.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Msg "seo" "cdn"}}/js/selector/keyword-tags.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Msg "seo" "cdn"}}/js/selector/keyword-tags-new.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Msg "seo" "cdn"}}/js/selector/keyword-tags-new.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Msg "seo" "cdn"}}/js/selector/area-city-data.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Msg "seo" "cdn"}}/js/selector/area-city-data.js?v={{Msg "seo" "version"}}'></script>
@@ -1920,9 +2141,10 @@
 <script src='{{Msg "seo" "cdn"}}/common-module/selector/js/buyerClass.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Msg "seo" "cdn"}}/common-module/selector/js/buyerClass.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Msg "seo" "cdn"}}/common-module/selector/js/province_city.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Msg "seo" "cdn"}}/common-module/selector/js/province_city.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Msg "seo" "cdn"}}/public-pc/js/workspace-desc.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Msg "seo" "cdn"}}/public-pc/js/workspace-desc.js?v={{Msg "seo" "version"}}'></script>
-<script src=//cdn-common.jianyu360.com/cdn/lib/echarts/4.8.0/echarts.min.js></script>
-<script src=//cdn-common.jianyu360.com/cdn/lib/v-charts/1.19.0/index.min.js></script>
-<script src=//cdn-common.jianyu360.com/cdn/lib/lodash/4.17.21/lodash.min.js></script>
+<script src='{{Msg "seo" "cdn"}}/common-module/selector/js/provinceMap.js?v={{Msg "seo" "version"}}'></script>
+<script src="https://cdn-common.jianyu360.com/cdn/lib/echarts/4.8.0/echarts.min.js"></script>
+<script src="https://cdn-common.jianyu360.com/cdn/lib/v-charts/1.19.0/index.min.js"></script>
+<script src="https://cdn-common.jianyu360.com/cdn/lib/lodash/4.17.21/lodash.min.js"></script>
 <script src='{{Msg "seo" "cdn"}}/common-module/chart-module/js/chart-common.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Msg "seo" "cdn"}}/common-module/chart-module/js/chart-common.js?v={{Msg "seo" "version"}}'></script>
 <script type="text/javascript">
 <script type="text/javascript">
   $(function(){
   $(function(){
@@ -2891,7 +3113,11 @@ function checkTagDisabled () {
       aHref += 'industry='+dataindustry;
       aHref += 'industry='+dataindustry;
     }
     }
     if (getParam('resource') === 'BI') {
     if (getParam('resource') === 'BI') {
-      aHref += aHref.indexOf('?') > -1 ? '&resource=BI' : '?resource=BI'
+      if(getParam('property') === 'BIProperty') {
+        aHref += aHref.indexOf('?') > -1 ? '&resource=BI&property=BIProperty' : '?resource=BI&property=BIProperty'
+      } else {
+        aHref += aHref.indexOf('?') > -1 ? '&resource=BI' : '?resource=BI'
+      }
     }
     }
 
 
     try {
     try {
@@ -2982,7 +3208,8 @@ function checkTagDisabled () {
     delimiters: ['${', '}'],
     delimiters: ['${', '}'],
     mixins: [workspaceDescMixin],
     mixins: [workspaceDescMixin],
     components: {
     components: {
-      // areaCityComponent: areaCityComponent,
+      selectCardComponent: selectCardComponent,
+      areaCityComponent: areaCityComponent,
       keywordTagsComponent: keywordTagsComponent,
       keywordTagsComponent: keywordTagsComponent,
       selectAreachoose:selectAreachoose,
       selectAreachoose:selectAreachoose,
       keywordTagsComponentnew:keywordTagsComponentnew,
       keywordTagsComponentnew:keywordTagsComponentnew,
@@ -2992,6 +3219,7 @@ function checkTagDisabled () {
       return {
       return {
         showPage: true,
         showPage: true,
         inResourceBIiframe: getParam('resource') === 'BI',
         inResourceBIiframe: getParam('resource') === 'BI',
+        inBIPropertyiframe: getParam('property') === 'BIProperty',  // 物业专版
         listState: {
         listState: {
           prevPageNum: 1,
           prevPageNum: 1,
           size: pageSize,
           size: pageSize,
@@ -3098,7 +3326,60 @@ function checkTagDisabled () {
         buyerclass_data:[],
         buyerclass_data:[],
         isOld:'',
         isOld:'',
         regionMap: {}, // 省市县区数据
         regionMap: {}, // 省市县区数据
-        initAreaMap: '' // 省市区组件回显
+        initAreaMap: '', // 省市区组件回显
+        filterFiled: {
+          '业务类型': 'subinformation',
+          '物业业态': 'propertyForm',
+          '合同周期': 'period',
+          '价格区间': 'scale',
+        },
+        filterProperty: {  // 物业专版筛选条件
+          expireTime: '', // 到期时间
+          subinformation: ['全部'], // 业务类型
+          propertyForm: ['全部'], // 物业业态
+          period: ['全部'], // 合同周期
+          scale: ['全部'], // 价格区间
+          searchCheckList: ['标题', '正文'], // 搜索范围
+          changehand: '', // 换手率
+          publishtimeValue: '', // 发布时间
+          subType: ''
+        },
+        apiFilterProperty: {
+          expireTime: '', // 到期时间
+          subinformation: [], // 业务类型
+          propertyForm: [], // 物业业态
+          period: [], // 合同周期
+          scale: [], // 价格区间
+          searchCheckList: ['title', 'content'], // 搜索范围
+          changehand: '', // 换手率
+          publishtimeValue: 'fiveyear',
+          subType: ''
+        },
+        selectValue: '',
+        publishtimeOptions: [{
+          value: 'lately-7',
+          label: '最近7天'
+        }, {
+          value: 'lately-30',
+          label: '最近30天'
+        }, {
+          value: 'thisyear',
+          label: '最近1年'
+        }, {
+          value: 'threeyear',
+          label: '最近3年'
+        }, {
+          value: 'fiveyear',
+          label: '最近5年'
+        }, {
+          value: 'custom',
+          label: '自定义'
+        }],
+        propertyListData: [],
+        showMoreAreaState: true,
+        datePropertyValue: '',
+        showPropertyDialog: false,
+        IframeSrc: '/succbi/crm_system/app/crm.app/%E9%80%9A%E7%94%A8%E5%88%9B%E5%BB%BA/create_intelligence.spg'
       }
       }
     },
     },
     computed: {
     computed: {
@@ -3183,11 +3464,19 @@ function checkTagDisabled () {
       },
       },
       canShowFixedTableHeader: function () {
       canShowFixedTableHeader: function () {
         return this.tableHeaderShow && this.tableFixedTop
         return this.tableHeaderShow && this.tableFixedTop
-      }
+      },
+      getSearchRangeLength: function () {
+        return this.filterProperty.searchCheckList.length
+      },
     },
     },
     watch: {
     watch: {
       'listState.allCount': function (val) {
       'listState.allCount': function (val) {
         this.bidTotalCount()
         this.bidTotalCount()
+      },
+      'filterProperty.searchCheckList': function (newval, oldval) {
+        if (newval.length === 0) {
+          this.filterProperty.searchCheckList = oldval
+        }
       }
       }
     },
     },
     created: function () {
     created: function () {
@@ -3210,6 +3499,28 @@ function checkTagDisabled () {
         window.addEventListener('scroll', this.watchScroll)
         window.addEventListener('scroll', this.watchScroll)
       })
       })
       this.getFilterList()
       this.getFilterList()
+      if(this.inBIPropertyiframe) {
+        // 物业专版筛选条件
+        this.getPropertyFilters()
+        const _this = this
+        window.addEventListener('storage', (event) => {
+          console.info(event.storageArea)
+          if (event.key === 'Op-upState') {
+            sessionStorage.removeItem('Op-upState', "0")
+            _this.showPropertyDialog = false
+          }
+          if(!_this.showPropertyDialog){
+            if(event.storageArea.return_status == '1') {
+              let propertyData = localStorage.getItem('property-data')
+              if(propertyData) {
+                propertyData = JSON.parse(propertyData)
+                $('.icon-shoulu[dataid="' + propertyData._id + '"]').removeClass('icon-a-Property1shoulu').addClass('icon-a-Property1yishoulu')
+              }
+              sessionStorage.removeItem('return_status')
+            }
+          }
+        })
+      }
     },
     },
     destroyed: function () {
     destroyed: function () {
       window.removeEventListener('scroll', this.watchScroll)
       window.removeEventListener('scroll', this.watchScroll)
@@ -3223,6 +3534,20 @@ function checkTagDisabled () {
         }
         }
 
 
       },
       },
+      filters_hsl: function(val){
+        if(val == ''){
+          return '换手率'
+        }else{
+          return val
+        }
+      },
+      filters_fbtime: function(val){
+        if(val == ''){
+          return '发布时间'
+        }else{
+          return val
+        }
+      },
       filters_cg: function(val){
       filters_cg: function(val){
         if(val == ''){
         if(val == ''){
           return '采购单位联系方式'
           return '采购单位联系方式'
@@ -3241,6 +3566,88 @@ function checkTagDisabled () {
       }
       }
     },
     },
     methods: {
     methods: {
+      handleClick (e) {
+        e.stopPropagation()
+        $('.el-date-editor').trigger('click')
+      },
+      // 物业-发布时间
+      changePublishtime (data) {
+        this.apiFilterProperty.publishtimeValue = data
+        this.filterProperty.publishtimeValue = data
+        doSearch()
+      },
+      // 物业-发布时间-自定义
+      changePublishtimeCustom(data) {
+        const start = new Date(data[0]).getTime()
+        const end = new Date(data[1]).getTime()
+        this.filterProperty.publishtimeValue = new Date(start).Format("yyyy年MM月dd日") + '-' + new Date(end).Format("yyyy年MM月dd日")
+        this.apiFilterProperty.publishtimeValue = (start / 1000) + '_' + (end / 1000)
+        doSearch()
+      },
+      getFocus () {},
+      // 物业-搜索范围
+      onSearchRangeChange () {
+        if(!this.filterProperty.searchCheckList.length) return
+        this.apiFilterProperty.searchCheckList = []
+        this.filterProperty.searchCheckList.forEach(v => {
+          let str = ''
+          switch (v) {
+            case '标题':
+              str = 'title'
+              break;
+            case '正文':
+              str = 'content'
+              break;
+            case '附件':
+              str = 'file'
+              break;
+            case '项目名称/标的物':
+              str = 'ppa'
+              break;
+            case '采购单位':
+              str = 'buyer'
+              break;
+            case '中标企业':
+              str = 'winner'
+              break;
+            case '招标代理机构':
+              str = 'agency'
+              break;
+            default:
+              break;
+          }
+          this.apiFilterProperty.searchCheckList.push(str)
+          this.apiFilterProperty.searchCheckList = [...new Set(this.apiFilterProperty.searchCheckList)]
+        })
+        doSearch()
+      },
+      // 获取物业筛选条件
+      getPropertyFilters: function () {
+        $.ajax({
+          url: '/jyapi/jybx/core/property/searchCriteria',
+          type: 'POST',
+          success: function (res) {
+            if(res.error_code === 0) {
+              let newData = {}
+              Object.keys(res.data).forEach(v => {
+                newData[v] = []
+                res.data[v].forEach(s => {
+                  let sArr = s.split('#')
+                  s = {
+                    name: sArr[0],
+                    value: sArr[1]
+                  }
+                  newData[v].push(s)
+                })
+              });
+              this.propertyListData = newData
+            }
+          }.bind(this),
+          error: function (err) {
+            console.log(err)
+          }
+        })
+      },
       // 引导文案点击事件
       // 引导文案点击事件
       guideGoWorkSpace: function () {
       guideGoWorkSpace: function () {
         if (!this.islogin) {
         if (!this.islogin) {
@@ -3470,6 +3877,18 @@ function checkTagDisabled () {
         $("#zbSeatchT [name='industry']").val(val.toString())
         $("#zbSeatchT [name='industry']").val(val.toString())
         beforeSubmit('filter-industry')
         beforeSubmit('filter-industry')
 
 
+      },200),
+      infoTypeChange:debounce(function(data){ // 信息类型提交搜索
+        let val
+        if(data.oneAndtwo.length>=data.alltwo.length){
+          val = ''
+        } else{
+          val = data.two_noall
+        }
+        this.filterProperty.subType = val.toString()
+        this.apiFilterProperty.subType = val.toString()
+        doSearch()
+
       },200),
       },200),
       buyerclassChange :debounce(function(data){ //采购单位提交搜索
       buyerclassChange :debounce(function(data){ //采购单位提交搜索
         let val
         let val
@@ -3771,6 +4190,41 @@ function checkTagDisabled () {
           return true
           return true
         }
         }
       },
       },
+      onStateChange (item, data) {
+        const _this = this
+        const isAllBtn = data.filter((item, i) => item === '全部' && i !== 0)
+        // propertyListData
+        // const filterKeys = ['area', 'build', 'civil', 'electromechanical', 'project_stage', 'ownerclass'];
+        const key = this.filterFiled[item]
+        if(isAllBtn.length > 0) {
+          this.filterProperty[key] = ['全部']
+          this.apiFilterProperty[key] = []
+        } else {
+          _this.apiFilterProperty[key] = []
+          data.forEach((v, i) => {
+            if(v === '全部') {
+              data.splice(i, 1)
+            }
+          });
+          data.forEach((v, i) => {
+            this.propertyListData[item].forEach(s => {
+              if(s.name === v) {
+                if(item === '合同周期') {
+                  this.filterProperty[key] = [s.name]
+                  _this.apiFilterProperty[key]= [s.value]
+                } else {
+                  _this.apiFilterProperty[key].push(s.value)
+                }
+              }
+            })
+          });
+          if (data.length === 0) {
+            this.filterProperty[key] = ['全部']
+            this.apiFilterProperty[key] = []
+          }
+        }
+        doSearch()
+      },
       areaCityChange: function (area) {
       areaCityChange: function (area) {
         var city = []
         var city = []
         var area_arr = []
         var area_arr = []
@@ -3785,6 +4239,16 @@ function checkTagDisabled () {
         $("#zbSeatchT [name='city']").val(city.toString())
         $("#zbSeatchT [name='city']").val(city.toString())
         beforeSubmit('filter-area');
         beforeSubmit('filter-area');
       },
       },
+      showMoreArea () {
+        this.showMoreAreaState = !this.showMoreAreaState
+        if(this.showMoreAreaState) {
+          $('.area_more_btn>span').text('更多')
+          $('.el-icon-arrow-down').css('transform', 'rotate(0)')
+        } else {
+          $('.area_more_btn>span').text('收起')
+          $('.el-icon-arrow-down').css('transform', 'rotate(180deg)')
+        }
+      },
       // 通过省 转换成{省:[市]}格式的数据
       // 通过省 转换成{省:[市]}格式的数据
       areaToObj: function(area) {
       areaToObj: function(area) {
         if (!area) return
         if (!area) return
@@ -4768,6 +5232,13 @@ function checkTagDisabled () {
         $("#zbSeatchT [name='fileExists']").val(item)
         $("#zbSeatchT [name='fileExists']").val(item)
         beforeSubmit('filter-file')
         beforeSubmit('filter-file')
       },
       },
+      onAttachClick_hsl: function (item) {
+        if(item == '0') {
+          this.filterProperty.changehand = ''
+        }
+        this.apiFilterProperty.changehand = item
+        doSearch()
+      },
       onAttachClick_cg: function (item) {
       onAttachClick_cg: function (item) {
         this.attachVal_cg = item
         this.attachVal_cg = item
         $("#zbSeatchT [name='buyertel']").val(item)
         $("#zbSeatchT [name='buyertel']").val(item)

Some files were not shown because too many files changed in this diff