Przeglądaj źródła

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

zhangsiya 1 rok temu
rodzic
commit
fb551d5f86

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

@@ -97,13 +97,13 @@ func initPrivatePublicKey() {
 }
 
 func ChanMonitor() {
-
 	var (
 		saveData []map[string]interface{}
 		upData   []map[string]interface{}
 		saveKey  = []string{"ip", "client", "os", "browse", "url", "guestUID", "mdescribe", "refer", "method", "creation_time"}
 		count    int
 	)
+	anonymousNumber := util.If(util.IntAll(config.Sysconfig["anonymousNumber"]) <= 0, 100, util.IntAll(config.Sysconfig["anonymousNumber"])).(int)
 	for {
 		select {
 		case data := <-saveChan:
@@ -114,8 +114,7 @@ func ChanMonitor() {
 				upData = append(upData, data)
 			}
 			// 处理 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
 				tm := time.Now()
 				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 (
 	"encoding/json"
 	"fmt"
+	"github.com/gogf/gf/v2/util/gconv"
 	"jy/src/jfw/config"
 	"jy/src/jfw/jyutil"
 	"log"
@@ -26,6 +27,7 @@ const (
 	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}}}]}}`
 	queryBoolMust           = `{"bool":{"must":[{"terms":{"s_subscopeclass":[%s]}}]}}`
+	queryBoolMustA          = `{"bool":{"must":[{"terms":{"%s":[%s]}}]}}`
 	queryBoolMustTerm       = `{"bool": {"must": [{ "term": {"isValidFile": %t }}]}}`
 	queryExists             = `{"constant_score":{"filter":{"exists":{"field":"%s"}}}}`
 	gte                     = `"gte": %s`
@@ -85,13 +87,32 @@ type SearchOptimize struct {
 	VipStatus           int           `json:"vipStatus"`
 	BigMemberStatus     int           `json:"bigMemberStatus"`
 	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  初始化
-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{
 		AppId:            "10000",
 		UserId:           userId,
@@ -117,7 +138,7 @@ func NewSearchOptimize(userId, phone, province, city, district, subtype, topType
 		AdditionalWords:  additionalWords,
 		ExclusionWords:   exclusionWords,
 		Platform:         platform,
-		IsPay:            userInfo.IsPayedUser(),
+		IsPay:            IsPay,
 		BidField:         territorialization,
 		SearchTypeSwitch: searchTypeSwitch,
 		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,
 		R:                r,
 		District:         district,
+		PropertyForm:     propertyForm,
+		ExpireTime:       expireTime,
+		Subinformation:   subinformation,
+		Period:           period,
+		Changehand:       changehand,
+		Scale:            scale,
+		Isfile:           isfile,
 	}
 	so.SearchParamsHandle()
 	return so
@@ -155,7 +183,7 @@ func (so *SearchOptimize) SearchParamsHandle() {
 		so.SearchGroup = 1
 	}
 	//信息类型
-	if so.Subtype == "" && so.TopType == "" {
+	if so.Subtype == "" && so.TopType == "" && so.BidField != "BIProperty" {
 		// 所有用户都可以搜索,判断是否能使用超前项目  老版超级订阅、大会员、商机管理有权限
 		if so.SearchGroup > 0 && len(DefaultTopTypes) >= so.SearchGroup {
 			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)
 		esIndex := util.If(so.UserId == "", INDEXOther, INDEX).(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{
 			Index:      esIndex,
 			IType:      esType,
 			Query:      so.GetSearchQuery(so.GetBidSearchQuery()),
 			FindFields: util.If(isCache, "title", "detail").(string),
 			Order:      BidSearchSort,
-			Fields:     util.If(so.BidField != "", BidSearchDomainField, fields).(string), //BidField ===医疗领域化数据
+			Fields:     Fields, //BidField ===医疗领域化数据
 			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条数据请求
 			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()
 		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)
 			//数据如果>最大数据结果量 total==count,否则count = 付费:5000;免费:500;
 			count = util.If(count > total, total, count).(int64)
@@ -421,9 +458,9 @@ func (so *SearchOptimize) GetSearchQuery(mustQuery string) (qstr string) {
 		} else {
 			wordsMusts = append(wordsMusts, keyWordsMusts...)
 		}
-	}
-	//附加词
-	if so.AdditionalWords != "" {
+		//附加词
+		if so.AdditionalWords != "" {
+		}
 		//多组附加词,每组间,号隔开。每组内如果关键词中间有空格,自动分词
 		var (
 			addWordsMusts []string
@@ -496,6 +533,58 @@ func (so *SearchOptimize) GetSearchQuery(mustQuery string) (qstr string) {
 	if so.Industry != "" && isLogin {
 		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 {
 		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
+
 	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))
 	}
 	qstr = fmt.Sprintf(query, strings.Join(musts, ","), strings.Join(mustNot, ","))
@@ -659,6 +760,50 @@ func (so *SearchOptimize) GetBidSearchQuery() string {
 		}
 		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
 	topType := util.If(so.TopType != "", strings.Split(so.TopType, ","), []string{}).([]string)
@@ -840,7 +985,7 @@ func (e *SearchByES) GetAllByNgramWithCount() (int64, *[]map[string]interface{})
 }
 
 // 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 {
 		//正文
 		if b {
@@ -918,6 +1063,63 @@ func SearchListFormat(industry string, repl []map[string]interface{}, b bool) (l
 				})
 			}
 			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
 		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 {
 		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")
 	industry := strings.TrimSpace(p.GetString("industry")) //选中的行业
 	area := p.GetString("area")                            //地区
@@ -406,9 +410,14 @@ func (p *Pcsearch) PcSearchIndex(module string) error {
 		if territorialization == "" {
 			territorialization = "0101"
 		}
+	case "BIProperty":
+		territorialization = territorialization
 	default:
 		territorialization = ""
 	}
+	if territorialization == "" {
+		territorialization = p.GetString("property")
+	}
 	userInfo := jy.GetVipState(p.Session(), *config.Middleground, userId)
 	queryItems := userInfo.GetQueryItems(selectType, util.Int64All(config.Sysconfig["bidSearchOldUserLimit"]))
 	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)
 	}
 	//医疗领域化信息 用户前提是大会员 超级订阅,才有领域化功能的权限
-	if territorialization != "" {
+	if territorialization != "" && territorialization != "BIProperty" {
 		isSearch = false
 		userInfo := jy.GetVipState(p.Session(), *config.Middleground, userId)
 		if userInfo.BigMember > 0 || userInfo.VipState > 0 {
@@ -511,7 +520,9 @@ func (p *Pcsearch) PcSearchIndex(module string) error {
 	isLimit := 1
 	if isSearch {
 		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 //主关键词和附加词合并,多组空格隔开,作为前端渲染高亮关键词使用
 		//关键词  行业 附加词
 		//放开用户不输入关键词可搜索 --P297需求

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

@@ -37,11 +37,11 @@ var (
 	bidSearch_field_file     = `,"filetext","isValidFile"`
 	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 剑鱼标讯推送三级页点赞暂弃 改成剑鱼标讯实验室点赞功能
@@ -84,6 +84,10 @@ func (m *Front) PcAjaxReq() {
 	tabularflag := m.GetString("tabularflag")
 	sessVal := m.Session().GetMultiple()
 	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"])
 	currentPage, _ := m.GetInteger("pageNumber")
 	pageSize, _ := m.GetInteger("pageSize")
@@ -97,7 +101,7 @@ func (m *Front) PcAjaxReq() {
 		tabularflag = ""
 	}
 	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)) {
 			m.ServeJson(map[string]interface{}{
 				"list": []map[string]interface{}{},
@@ -105,7 +109,6 @@ func (m *Front) PcAjaxReq() {
 			return
 		}
 	}
-
 	area := m.GetString("area")
 	district := m.GetString("district")
 	subtype := m.GetString("subtype")
@@ -116,7 +119,22 @@ func (m *Front) PcAjaxReq() {
 		selectType = "title,content"
 	}
 	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 == "" {
 		//未登录用户访问全部信息类型 需要过滤掉 拟建和采购意向
 		// p397 未登录用户收回查看拟建权限
@@ -134,7 +152,6 @@ func (m *Front) PcAjaxReq() {
 				subtype = "招标预告,招标公告,招标结果,招标信用信息"
 			}
 		}
-
 		//未登录用户搜索范围 标题和 正文
 		var selectTypeArr []string
 		selectTypeSplit := strings.Split(selectType, ",")
@@ -179,14 +196,12 @@ func (m *Front) PcAjaxReq() {
 		notkey = m.GetString("notkey")
 		city = m.GetString("city")
 	}
-
 	// p329  非反爬白名单用户不放开  需要处理通用词
 	onList, _ := jyutil.IsOnTheWhitelist(m.Session())
 	searchValueString := m.GetString("searchvalue")
 	if !onList && len(industry) == 0 {
 		searchValueString = jyutil.FilterGeneric(searchValueString)       // 关键词处理通用词
 		additionalWords = jyutil.AdditionalFilterGeneric(additionalWords) // 附加词处理通用词
-
 	}
 	b_word, a_word, s_word := jy.InterceptSearchKW(searchValueString, util.IntAllDef(config.Sysconfig["keywordsLimit"], 35), len(industry) == 0)
 	//放开用户不输入关键词可搜索 --P297需求
@@ -208,7 +223,7 @@ func (m *Front) PcAjaxReq() {
 		}
 		if isLimit == 1 {
 			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 {
 				log.Printf("查询参数超出范围,有可能是异常请求; 用户id:%s;用户手机号:%s \n", userId, phone)
 			} else {
@@ -219,7 +234,7 @@ func (m *Front) PcAjaxReq() {
 		}
 	} else {
 		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()
 
 	}

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

@@ -290,7 +290,7 @@ func FormatSize(size float64, unit string) string {
 // GuidelineAndInformation t:一级栏目 s二级栏目 (首页剑鱼攻略与行业资讯首页公用)
 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()}}
-	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 {
 		for _, v := range *data {
 			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()},
 		//"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 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) {
 				s_title, _ := (*res)[v]["s_title"].(string)
 				(*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",
   "attachmentResPower": ["bi_sj_sjqk","bi_sf_sjqd","bi_sj_yyszs"],
   "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"`
 	MsgMaxCount         int      `json:"msgMaxCount"`
 	AnalysisPDFPhone    string   `json:"analysisPDFPhone"`
+	PayUserCollLimit    int64    `json:"payUserCollLimit"`  //付费用户收藏数量最大限制
+	FreeUserCollLimit   int64    `json:"freeUserCollLimit"` //免费用户收藏数量最大限制
 }
 
 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"
 	"encoding/base64"
 	"fmt"
+	"github.com/gogf/gf/v2/util/gconv"
 	"jy/src/jfw/modules/subscribepay/src/config"
 	"jy/src/jfw/modules/subscribepay/src/entity"
 	"jy/src/jfw/modules/subscribepay/src/util"
@@ -33,6 +34,7 @@ type UserAccount struct {
 	*xweb.Action
 	getSimpleData      xweb.Mapper `xweb:"/user/getSimpleData"`             //客服接口-获取用户基本信息
 	getAccountInfo     xweb.Mapper `xweb:"/user/getAccountInfo"`            //我的页面-用户基本信息
+	accountShow        xweb.Mapper `xweb:"/user/account/show"`              //工作桌面-用户身份展示
 	authentication     xweb.Mapper `xweb:"/user/auth/(mail|phone)"`         //我的页面-身份验证 邮箱&手机号
 	phoneBind          xweb.Mapper `xweb:"/user/phone/bind"`                //我的页面-绑定手机号
 	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
 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': 'chuangjiankehu', 'icon-1': 'chuangjiankehu', class: 'custom', active: 0, msg: 0 }
       ],
-      pageType: '',
+      pageType: '', // 营销专版参数
+      porperty: '', // 物业专版参数
+      fromJhfp: '', // 判断是从机会复盘还是从招标搜索进
       employInfo: [], // 收录情况
       dialogVisible: false,
       IframeSrc: '',
-      getEntData: {}
+      getEntData: {},
+      showPropertyDialog: false
     }
   },
   created () {
@@ -25,6 +28,11 @@ var crmNode = new Vue({
     getList () {
       if (this.list[0].active === 0) {
         return this.list.slice(0, 1)
+      } else if (this.property === 'BIProperty') {
+        this.list = this.list.filter(v => {
+          return v.title !== '创建销售线索'
+        })
+        return this.list
       } else {
         return this.list
       }
@@ -43,17 +51,54 @@ var crmNode = new Vue({
       console.log(event.storageArea)
       if (event.storageArea === sessionStorage) {
         if (event.key === 'Op-upState') {
-          sessionStorage.setItem('Op-upState', "0")
+          sessionStorage.removeItem('Op-upState', "0")
           _this.dialogVisible = false
+          _this.showPropertyDialog = false
+          _this.getEmployData()
         }
       }
     });
   },
   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 () {
       const urlParams = new URLSearchParams(window.location.search)
       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-statusbar').hide()
         this.getEmployData()
@@ -71,7 +116,23 @@ var crmNode = new Vue({
       switch (data.class) {
         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
         case 'ignore':
           // 忽略
@@ -157,7 +218,8 @@ var crmNode = new Vue({
       const url = '/jyapi/crmApplication/employ/info'
       const params = {
         employType: 1,
-        idArr: id
+        idArr: id,
+        from: this.fromJhfp ? this.fromJhfp : ''
       }
       this.ajaxComponent(url, params).then((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) {
       const url = '/jyapi/crmApplication/employ/operate'

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

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

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

@@ -721,3 +721,35 @@ left: 252px;
   margin-left: 12px;
   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;
 
 }
+.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;
     align-items: center;
     justify-content: center;
-    margin: 6px 5px;
+    margin: 6px 4px;
     padding: 2px 6px;
     line-height: 20px;
     border-radius: 4px;
@@ -144,6 +144,10 @@
     margin-right: 4px;
 }
 
+.selector-card.property-placeholder .selector-card-content .el-select .el-input__inner::placeholder{
+  color: #1D1D1D!important;
+}
+
 .select-group-container {
     position: relative;
     display: flex;

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

@@ -29,8 +29,13 @@ var vm = new Vue({
   },
   methods: {
     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) {
@@ -109,6 +114,7 @@ var vm = new Vue({
     },
     tabClick(val) {
       this.tabsList.offset = 1
+      this.activeName = val.name
       this.getList(val.name)
     },
     onPageChange(page) {
@@ -176,7 +182,7 @@ var vm = new Vue({
         url: '/jyapi/messageCenter/ClearUnreadMsg',
         type: 'POST',
         success:function () {
-          this.activeName = '-1'
+          _this.activeName = '-1'
           _this.getList()
           if(message){
             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="">
             <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>
+            <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>

Plik diff jest za duży
+ 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
 // 是否在bi环境下(p364-crm营销功能)
 var inResourceBIiframe = getParam('resource') === 'BI'
+var inBIPropertyiframe = getParam('property') === 'BIProperty'
 
 if (!(tParams.isEntniche || tParams.isVip || tParams.isMember)) {
   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 buyerLink = '/swordfish/page_big_pc/free/loading/buyer/'
@@ -274,8 +278,9 @@ function getNewBiddings(num, size){
 	})
 }
 //
-
+var listData
 function appendDatas(datas,flag,isNew,onlyUpdateTable){
+  listData = datas
   // flag // 是否有输入
   let is_field=$("#zbSeatchT [name='bid_field']").val() //是否是领域化
   let selectContext=selectType.indexOf('content') > -1 //是否正文搜索
@@ -363,7 +368,7 @@ function appendDatas(datas,flag,isNew,onlyUpdateTable){
             // 分类标签、收藏
             listHtml += '<div class="bid-list-tags">'
                 +'<div class="bid-list-tags-left">'
-                if (datas[i].site == '剑鱼信息发布平台') {
+                if (datas[i].site == '剑鱼信息发布平台' && !searchInnerVue.inBIPropertyiframe) {
                   listHtml += '<span class="tags-item tags-publish">用户发布</span>'
                 }
                 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 {
                   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)
                 if (amount!="") {
                   /**
@@ -421,7 +454,11 @@ function appendDatas(datas,flag,isNew,onlyUpdateTable){
                   $('.line-common').show()
                 } 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()
                   $('#bid-collect').hide()
                   $('.line-common').hide()
@@ -988,6 +1025,11 @@ function beforeSubmit(from){
     }
   }
 
+  // 搜索清空已勾选
+  $('.custom-checkbox').prop('checked', false)
+  selectDataIds = []
+  $('#checkNum-bid').html(0)
+
   // 关键词不为空时 存sessionStorage值
   if (searchKeywords !== "") {
     sessionStorage.setItem('is-click-search', 1)
@@ -1196,9 +1238,11 @@ var LimitClass = {
 function searchOnsubmit(clickpaging){
 	var this_selectType = $("#zbSeatchT [name='selectType']").val();
 	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{
 		if(clickpaging&&LimitClass.limitFlag){
 			LimitClass.paging(currentPage);
@@ -1232,7 +1276,40 @@ function searchOnsubmit(clickpaging){
     additionalWords: $("#zbSeatchT [name='additionalWords']").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) {
   $.post("/front/pcAjaxReq",param,function(r){
     heightWords = r.heightWords
@@ -1269,20 +1346,46 @@ function showSearchTipForTimeRange (type) {
 	}
 	var tempStr = ''
 	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)
 	if (type !== false) {
 		tempDom.show();
@@ -1705,25 +1808,62 @@ $('#right-employ').off('click').bind('click', function(e) {
         return
       }
     }
-    const url = '/jyapi/crmApplication/employ/operate'
+    let url = '/jyapi/crmApplication/employ/operate'
     console.info(checkedId)
-    const result = checkedId.map(obj => obj.bid)
-    const params = {
+    let result = checkedId.map(obj => obj.bid)
+    let params = {
       idArr: result.join(','),
       isEmploy: true,
       employType: 1
     }
+    if(searchInnerVue.inBIPropertyiframe) {
+      url = '/jyNewApi/property/information/batch/create'
+      result = checkedId.map(obj => obj.bid)
+      params = {
+        ids: result.join(',')
+      }
+    }
     $.ajax({
       type: "POST",
       url: url,
       contentType: 'application/json',
       data: JSON.stringify(params),
       success: function (res) {
-        if (res.error_code === 0) {
-          if (res.data.status) {
+        if(searchInnerVue.inBIPropertyiframe) {
+          // 物业专版批量收录
+          if (res.code === 1) {
             checkedId.forEach((v, i) => {
               $('.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),
     success: function (res) {
       if (res.error_code === 0) {
+        if(res.batchEmploy) {
+          $('#right-employ').show()
+          $('.shoulu-line').show()
+        }
         if(res.data && res.data.length > 0) {
           employList = res.data
           res.data.forEach(function (item, index) {
@@ -1835,28 +1979,58 @@ function getEmployData () {
 // 收录操作
 $(document).on('click', '.icon-shoulu', function() {
   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 url = '/jyapi/crmApplication/employ/operate'
-  const params = {
+  let url = '/jyapi/crmApplication/employ/operate'
+  let params = {
     idArr: id,
     isEmploy: !isChecked,
     employType: 1
   }
+  // 取消收录添加参数
+  if(isChecked) {
+    params.from = 'jhfp'
+  }
+  if(!isChecked && searchInnerVue.inBIPropertyiframe) {
+    params = {
+      id: id
+    }
+    url = '/jyNewApi/property/information/exist'
+  }
   $.ajax({
     type: "POST",
     url: url,
     contentType: 'application/json',
     data: JSON.stringify(params),
     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 {
-            $('.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;
       cursor: pointer;
     }
+    .property-employ-dialog {
+      width: 650px!important;
+      height: 720px;
+    }
   </style>
 </head>
 <body style="height: 100%">
@@ -657,6 +661,9 @@
               </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">
             <el-dialog
               :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"}}' />
   <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>
-  <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 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/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=//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里 写到页面里打脸 -->
   <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"}}'>
@@ -161,9 +162,12 @@
     $(function(){
 
       // console.log("是否有会员筛选权限 showVipScreen", {{.T.showVipScreen}})
-
-      var oInput=document.getElementById("searchinput");
-      moveEnd(oInput)
+      try {
+        var oInput=document.getElementById("searchinput");
+        moveEnd(oInput) 
+      } catch (error) {
+        
+      }
 
       $(".working").show();
 
@@ -691,7 +695,7 @@
   <!--搜索头部 START-->
   <div class="searchHeader">
     <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-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>
@@ -785,7 +789,7 @@
           </div>
           <!--领域化页面不展示-->
           {{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-badge>
           {{end}}
@@ -888,7 +892,7 @@
           <div class="f-h-label" :class="showFilter ? 'caret-up' : 'caret-down'" @click="toggleFilter">
             <span>筛选条件</span>
           </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 has-item" @click="onHasFilter">已存筛选条件 ${filterCounts}</span>
             <span class="action-item save-item" @click="onSaveFilter">保存筛选条件</span>
@@ -898,6 +902,7 @@
       <!-- slideUp、slideDown动画效果 -->
       <el-collapse-transition>
         <div class="filter-container" v-show="showFilter">
+          <div v-if="!inBIPropertyiframe">
           <!--发布时间-->
           <!-- 没有登陆或者为VIP走旧的展示筛选项逻辑,登录的普通用户展示引导开通VIP的控件样式 -->
           <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-header" style="padding:4px 15px 4px 0px;min-width: 94px;margin-right: 0;">项目地区:</div>
             <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>
               </area-city-component>
             </div>
@@ -1438,9 +1443,223 @@
             </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>
           </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>
       </el-collapse-transition>
     </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="fold" id="fold">
@@ -1580,8 +1799,8 @@
             <div class="split-line line-distribute" style="display: none;"></div>
             <button id="right-distribute" style="display: none;">分发</button>
             <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>
           </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/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="//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"}}/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-new.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/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=//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 type="text/javascript">
   $(function(){
@@ -2891,7 +3113,11 @@ function checkTagDisabled () {
       aHref += 'industry='+dataindustry;
     }
     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 {
@@ -2982,7 +3208,8 @@ function checkTagDisabled () {
     delimiters: ['${', '}'],
     mixins: [workspaceDescMixin],
     components: {
-      // areaCityComponent: areaCityComponent,
+      selectCardComponent: selectCardComponent,
+      areaCityComponent: areaCityComponent,
       keywordTagsComponent: keywordTagsComponent,
       selectAreachoose:selectAreachoose,
       keywordTagsComponentnew:keywordTagsComponentnew,
@@ -2992,6 +3219,7 @@ function checkTagDisabled () {
       return {
         showPage: true,
         inResourceBIiframe: getParam('resource') === 'BI',
+        inBIPropertyiframe: getParam('property') === 'BIProperty',  // 物业专版
         listState: {
           prevPageNum: 1,
           size: pageSize,
@@ -3098,7 +3326,60 @@ function checkTagDisabled () {
         buyerclass_data:[],
         isOld:'',
         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: {
@@ -3183,11 +3464,19 @@ function checkTagDisabled () {
       },
       canShowFixedTableHeader: function () {
         return this.tableHeaderShow && this.tableFixedTop
-      }
+      },
+      getSearchRangeLength: function () {
+        return this.filterProperty.searchCheckList.length
+      },
     },
     watch: {
       'listState.allCount': function (val) {
         this.bidTotalCount()
+      },
+      'filterProperty.searchCheckList': function (newval, oldval) {
+        if (newval.length === 0) {
+          this.filterProperty.searchCheckList = oldval
+        }
       }
     },
     created: function () {
@@ -3210,6 +3499,28 @@ function checkTagDisabled () {
         window.addEventListener('scroll', this.watchScroll)
       })
       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 () {
       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){
         if(val == ''){
           return '采购单位联系方式'
@@ -3241,6 +3566,88 @@ function checkTagDisabled () {
       }
     },
     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 () {
         if (!this.islogin) {
@@ -3470,6 +3877,18 @@ function checkTagDisabled () {
         $("#zbSeatchT [name='industry']").val(val.toString())
         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),
       buyerclassChange :debounce(function(data){ //采购单位提交搜索
         let val
@@ -3771,6 +4190,41 @@ function checkTagDisabled () {
           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) {
         var city = []
         var area_arr = []
@@ -3785,6 +4239,16 @@ function checkTagDisabled () {
         $("#zbSeatchT [name='city']").val(city.toString())
         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) {
         if (!area) return
@@ -4768,6 +5232,13 @@ function checkTagDisabled () {
         $("#zbSeatchT [name='fileExists']").val(item)
         beforeSubmit('filter-file')
       },
+      onAttachClick_hsl: function (item) {
+        if(item == '0') {
+          this.filterProperty.changehand = ''
+        }
+        this.apiFilterProperty.changehand = item
+        doSearch()
+      },
       onAttachClick_cg: function (item) {
         this.attachVal_cg = item
         $("#zbSeatchT [name='buyertel']").val(item)

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików