Browse Source

分支合并

lianbingjie 1 year ago
parent
commit
8260b87b38
58 changed files with 1680 additions and 834 deletions
  1. 4 1
      src/config.json
  2. 5 0
      src/index.yaml
  3. 86 0
      src/jfw/front/classificationTag.go
  4. 3 3
      src/jfw/front/frontRouter.go
  5. 54 7
      src/jfw/front/index.go
  6. 367 160
      src/jfw/front/nzjProject.go
  7. 190 0
      src/jfw/front/recommendationProject.go
  8. 7 3
      src/jfw/front/searchOptimize.go
  9. 56 41
      src/jfw/front/shorturl.go
  10. 34 4
      src/jfw/modules/app/src/web/templates/frontRouter/partner/free/index.html
  11. 34 4
      src/jfw/modules/app/src/web/templates/frontRouter/partner/sess/index.html
  12. 1 1
      src/jfw/modules/publicapply/src/enterpriseSearch/entity/entQuery.go
  13. 4 0
      src/web/staticres/common-module/mainSearch/js/advanced-project-table.js
  14. 0 2
      src/web/staticres/common-module/nps-common/css/nps.css
  15. 77 0
      src/web/staticres/common-module/partner/css/append.css
  16. BIN
      src/web/staticres/common-module/partner/image/text.png
  17. 45 0
      src/web/staticres/common-module/partner/js/partner.js
  18. 16 12
      src/web/staticres/css/pc.css
  19. BIN
      src/web/staticres/frontRouter/pc/partner/image/title.png
  20. 1 1
      src/web/staticres/frontRouter/pc/seeBuyerHistory/css/index-pc.css
  21. 1 1
      src/web/staticres/frontRouter/pc/seeHistory/css/index-pc.css
  22. BIN
      src/web/staticres/images/pc/pc-cq-example.png
  23. BIN
      src/web/staticres/images/pc/pc-cq-mmt.png
  24. BIN
      src/web/staticres/images/pc/pc-nj-example.png
  25. BIN
      src/web/staticres/images/qr/qr-img-decorate.png
  26. 4 0
      src/web/staticres/js/biddingSearch.js
  27. 10 12
      src/web/staticres/js/ent-search-index-pc.js
  28. 1 1
      src/web/staticres/js/index/index_2023.12.js
  29. 14 17
      src/web/staticres/js/pur-search-index-pc.js
  30. 4 0
      src/web/staticres/pccss/index_pc.css
  31. 7 74
      src/web/staticres/pccss/pc-detail.css
  32. 3 0
      src/web/staticres/public-pc/css/header-nav-mini.css
  33. 1 1
      src/web/staticres/public-pc/css/pc-bottom.css
  34. 39 23
      src/web/staticres/public-pc/js/article-content.js
  35. 7 4
      src/web/staticres/public-pc/js/header-nav-mini.js
  36. 26 0
      src/web/staticres/public-pc/js/sub-page.js
  37. 21 0
      src/web/staticres/tags/css/no-login-detail.css
  38. BIN
      src/web/staticres/tags/images/nzj-noroot-bg.png
  39. BIN
      src/web/staticres/tags/images/nzj-noroot.png
  40. 5 0
      src/web/staticres/tags/js/no-login-detail.js
  41. 1 3
      src/web/templates/common/pc-header-nav-second.html
  42. 3 3
      src/web/templates/frontRouter/pc/fileHistory/sess/index.html
  43. 127 1
      src/web/templates/frontRouter/pc/partner/free/index.html
  44. 3 3
      src/web/templates/frontRouter/pc/seeBuyerHistory/sess/index.html
  45. 35 2
      src/web/templates/frontRouter/wx/partner/sess/index.html
  46. 231 208
      src/web/templates/pc/biddetail_rec.html
  47. 3 3
      src/web/templates/pc/entsearchindex.html
  48. 2 139
      src/web/templates/pc/index.html
  49. 8 9
      src/web/templates/pc/newIndex.html
  50. 4 4
      src/web/templates/pc/pursearchindex.html
  51. 11 16
      src/web/templates/pc/supsearch.html
  52. 44 6
      src/web/templates/pc/tags/detail.html
  53. 4 2
      src/web/templates/pc/tags/template/nijian-table.html
  54. 1 1
      src/web/templates/pc/template/index/banner-module-27.html
  55. 69 59
      src/web/templates/pc/template/index/index-bottom-float-ad.html
  56. 1 1
      src/web/templates/pc/template/index/partners-project-list.html
  57. 5 1
      src/web/templates/pc/template/index/project-card-list-container.html
  58. 1 1
      src/web/templates/pc/template/index/user-info-card.html

+ 4 - 1
src/config.json

@@ -457,5 +457,8 @@
     "times": 5,
     "second": 300,
     "limit": 36000
-  }
+  },
+  "nzjLimit": 100,
+  "nzjConstructionContent": "拟在建项目是指尚在规划、报批、立项、环评、设计等阶段的项目,一般由发改委和各部委提供,且项目规模和投资额都较大。剑鱼标讯一般会在项目正式招标前3-12个月就通知付费客户,让客户有足够的时间和空间和业主联系,做好前期准备工作。",
+  "nzjProgressRemark": "进展备注是剑鱼标讯通过一定渠道获得的项目进度计划,帮您提前把握商机!开通大会员即可享受此权益。"
 }

+ 5 - 0
src/index.yaml

@@ -21,6 +21,9 @@ topMenu:
         href: /list/stype/ZFCG.html
   - title: 项目专区
     child:
+      - name: 拟在建项目
+        href: /list/nzjxm/
+        class: red
       - name: 审批项目
         href: /list/spxm/
       - name: 推荐项目
@@ -88,6 +91,8 @@ topMenu:
       - name: 发布供需信息
         href: /swordfish/frontPage/InformationDistribution/free/index
         class: red
+      - name: 中标必听课
+        href: /jyxspc
   - title: 企业服务
     child:
       - name: 数字化营销

+ 86 - 0
src/jfw/front/classificationTag.go

@@ -208,6 +208,92 @@ func getWinnerSeoIdByName(winners ...string) (res []map[string]interface{}) {
 	return
 }
 
+// 根据企业名称获取seoid
+// query: company_name 根据名字匹配
+// query: _id 根据entid匹配
+func getWinnerSeoIdByNameNew(query string, fullData bool, winners ...string) (res []map[string]interface{}) {
+	if len(winners) == 0 {
+		return
+	}
+	var fields string = `"nseo_id","company_name","_id"`
+	if fullData {
+		fields = `"nseo_id","company_name","legal_person","capital","company_address","company_status"`
+	}
+	winnerMap := map[string]map[string]interface{}{}
+	winnerRes := elastic.GetNoLimit(qyxy, qyxy, fmt.Sprintf(`{"query":{"terms":{"%s":["%s"]}},"_source":[%s],"size":%d}`, query, strings.Join(winners, `","`), fields, len(winners)))
+	if winnerRes != nil && len(*winnerRes) > 0 {
+		for _, m := range *winnerRes {
+			name := gconv.String(m["company_name"])
+			sid := gconv.String(m["nseo_id"])
+			entId := gconv.String(m["_id"])
+			if name != "" && sid != "" && entId != "" {
+				row := map[string]interface{}{
+					"name":  name,
+					"seoId": sid,
+					"url":   fmt.Sprintf("/qy/%s.html", sid),
+				}
+				if fullData {
+					row["legal_person"] = m["legal_person"]
+					row["capital"] = m["capital"]
+					//if dataStamp := gconv.Int64(m["establish_date"]); dataStamp > 0 {
+					//	row["establish_date"] = gtime.New(dataStamp).Format("Y-m-d")
+					//}
+					//row["company_phone"] = m["company_phone"]
+					row["address"] = m["company_address"]
+					if state := gconv.String(m["company_status"]); state != "" {
+						row["company_status"] = strings.Split(state, "(")[0]
+					}
+				}
+				winnerMap[entId] = row
+			}
+		}
+	}
+	for _, winner := range winners {
+		if m := winnerMap[winner]; m != nil {
+			res = append(res, m)
+		}
+	}
+	return
+}
+
+// 根据采购单位名字获取seoid
+func getBuyerSeoIdByNameNew(fullData bool, buyers ...string) (res []map[string]interface{}) {
+	if len(buyers) == 0 {
+		return
+	}
+	var fields string = `"seo_id","name"`
+	if fullData {
+		fields = `"seo_id","name","province","city","buyerclass"`
+	}
+	buyerMap := map[string]map[string]interface{}{}
+	buyerRes := elastic.GetNoLimit("buyer", "buyer", fmt.Sprintf(`{"query":{"terms":{"buyer_name":["%s"]}},"_source":[%s],"size":%d}`, strings.Join(buyers, `","`), fields, len(buyers)))
+	if buyerRes != nil && len(*buyerRes) > 0 {
+		for _, m := range *buyerRes {
+			name := gconv.String(m["name"])
+			sid := gconv.String(m["seo_id"])
+			if name != "" && sid != "" {
+				row := map[string]interface{}{
+					"name":  name,
+					"seoId": sid,
+					"url":   fmt.Sprintf("/dw/%s.html", sid),
+				}
+				if fullData {
+					row["buyerclass"] = m["buyerclass"]
+					row["area"] = m["province"]
+					row["city"] = m["city"]
+				}
+				buyerMap[name] = row
+			}
+		}
+	}
+	for _, buyer := range buyers {
+		if m := buyerMap[buyer]; m != nil {
+			res = append(res, m)
+		}
+	}
+	return
+}
+
 // 根据采购单位名字获取seoid
 func getBuyerSeoIdByName(buyer ...string) (res []map[string]interface{}) {
 	if len(buyer) == 0 {

+ 3 - 3
src/jfw/front/frontRouter.go

@@ -230,7 +230,7 @@ func (this *CommonRouter) doPcBigPage(pageSign, types string) error {
 		if strings.Contains(pageSign, "ent_ser_portrait") || strings.Contains(pageSign, "ent_portrait") {
 			urlArr := strings.Split(pageSign, "_portrait/")
 			entId := encrypt.DecodeArticleId2ByCheck(urlArr[len(urlArr)-1])[0]
-			if seoId := esSeoId(true, entId); seoId != "" {
+			if seoId := EsSeoId(true, entId); seoId != "" {
 				return this.Redirect(fmt.Sprintf("/qy/%s.html", seoId))
 			}
 		} else if strings.Contains(pageSign, "unit_portrayal") {
@@ -239,7 +239,7 @@ func (this *CommonRouter) doPcBigPage(pageSign, types string) error {
 			// 解码 URL 编码的字符串
 			buyer, _ := url.QueryUnescape(urlArr[len(urlArr)-1])
 			//buyer := this.GetString("buyer")
-			if seoId := esSeoId(false, buyer); seoId != "" {
+			if seoId := EsSeoId(false, buyer); seoId != "" {
 				return this.Redirect(fmt.Sprintf("/dw/%s.html", seoId))
 			}
 		}
@@ -247,7 +247,7 @@ func (this *CommonRouter) doPcBigPage(pageSign, types string) error {
 	return this.Render(fmt.Sprintf("/frontRouter/pc/page_big_pc/sess/index.html"))
 }
 
-func esSeoId(isWinner bool, idName string) string {
+func EsSeoId(isWinner bool, idName string) string {
 	if idName == "" {
 		return idName
 	}

+ 54 - 7
src/jfw/front/index.go

@@ -36,11 +36,14 @@ var (
 		2:  "/list/stype/ZBJG.html",
 		5:  "/list/stype/CGYX.html",
 		6:  "/list/stype/XMFB.html",
+		10: "/list/spxm/",
+		11: "/list/tjxm/",
 		13: "/list/rmxm/",
 		14: "/list/xxxm/",
 		15: "/list/gjxm/",
 		16: "/list/sjxm/",
 		8:  "/list/stype/ZFCG.html",
+		20: "/list/nzjxm/",
 	}
 )
 
@@ -203,12 +206,12 @@ func (nIndex *NewIndex) NewIndex() error {
 			"url":      fmt.Sprintf("%s", BiddingTypeUrl[v]),
 		})
 	}
-	//政府采购
-	procure, procureName := GetIndexProjectListRedis(8, 10)
+	//采购意向
+	procure, procureName := GetIndexProjectListRedis(5, 10)
 	bidTrends = append(bidTrends, map[string]interface{}{
 		"listData": procure,
 		"types":    procureName,
-		"url":      fmt.Sprintf("%s", BiddingTypeUrl[8]),
+		"url":      fmt.Sprintf("%s", BiddingTypeUrl[5]),
 	})
 	//项目分包
 	projectPage, typesName := GetIndexProjectListRedis(6, 10)
@@ -219,16 +222,30 @@ func (nIndex *NewIndex) NewIndex() error {
 	})
 	nIndex.T["bidTrends"] = bidTrends
 	//项目专区
-	projectZoneType := []int{13, 14, 15, 16}
 	projectZone := []map[string]interface{}{}
+	//拟在建项目
+	nzjProject := IndexNzjProject(5)
+	projectZone = append(projectZone, map[string]interface{}{
+		"listData": nzjProject,
+		"types":    "拟在建项目",
+		"url":      fmt.Sprintf("%s", BiddingTypeUrl[20]),
+	})
+	projectZoneType := []int{10, 11}
 	for _, val := range projectZoneType {
-		listData, types := GetIndexProjectListRedis(val, 10)
+		listData, types := GetIndexRecommendProjectList(val, 5)
 		projectZone = append(projectZone, map[string]interface{}{
 			"listData": listData,
 			"types":    types,
 			"url":      fmt.Sprintf("%s", BiddingTypeUrl[val]),
 		})
 	}
+	//热门项目
+	listData, types := GetIndexProjectListRedis(13, 10)
+	projectZone = append(projectZone, map[string]interface{}{
+		"listData": listData,
+		"types":    types,
+		"url":      fmt.Sprintf("%s", BiddingTypeUrl[13]),
+	})
 	nIndex.T["projectZone"] = projectZone
 	//中标喜报
 	nIndex.T["winnerGlad"] = WinnerGladTidings(10)
@@ -312,7 +329,7 @@ func FillingBiddingBaseFields(ctx context.Context, res []map[string]interface{},
 			bidIdStrings = append(bidIdStrings, bidId)
 		}
 	}
-	bidRes, _ := g.DB().Query(ctx, fmt.Sprintf(`SELECT * FROM new_bidList WHERE toptype !='拟建' AND toptype !='采购意向' AND bid_id IN ('%s')`, strings.Join(bidIdStrings, "','")))
+	bidRes, _ := g.DB().Query(ctx, fmt.Sprintf(`SELECT * FROM new_bidList WHERE toptype !='拟建' AND bid_id IN ('%s')`, strings.Join(bidIdStrings, "','")))
 	if bidRes.IsEmpty() {
 		return nil
 	}
@@ -407,7 +424,37 @@ func GetIndexProjectListRedis(typ, pageSize int) (data []map[string]interface{},
 	}
 	data, _ = GetIndexProjectList(typ, pageSize, []map[string]interface{}{})
 	if data != nil && len(data) > 0 {
-		redis.Put(RedisNameNew, redidKey, data, 24*3600)
+		redis.Put(RedisNameNew, redidKey, data, 24*3600+rand.Intn(100))
+	}
+	return data, types
+}
+
+// GetIndexRecommendProjectList 审批项目、推荐项目
+func GetIndexRecommendProjectList(typ, pageSize int) (data []map[string]interface{}, types string) {
+	switch typ {
+	case 10:
+		types = "审批项目"
+	case 11:
+		types = "推荐项目"
+	}
+	redidKey := fmt.Sprintf("pcIndexProjectZone_%d", typ)
+	redisArr, _ := redis.Get(RedisNameNew, redidKey).([]interface{})
+	if len(redisArr) > 0 {
+		data = common.ObjArrToMapArr(redisArr)
+		return
+	}
+
+	res, err := g.DB().Query(gctx.New(), fmt.Sprintf(`SELECT bid_id,title,publish_time  FROM new_project_sign WHERE bitmapContains(sign, %d) ORDER BY publish_time DESC LIMIT 0, %d`, typ, pageSize))
+	if err != nil || res.IsEmpty() {
+		return nil, types
+	}
+	for _, v := range res.List() {
+		v["proposed_id"] = encrypt.SE2.Encode2Hex(common.ObjToString(v["bid_id"]))
+		v["publish_time"] = strings.Split(common.InterfaceToStr(v["publish_time"]), " ")[0]
+		data = append(data, v)
+	}
+	if data != nil && len(data) > 0 {
+		redis.Put(RedisNameNew, redidKey, data, 24*3600+rand.Intn(100))
 	}
 	return data, types
 }

+ 367 - 160
src/jfw/front/nzjProject.go

@@ -13,7 +13,7 @@ import (
 	"fmt"
 	"jy/src/jfw/config"
 	"math/rand"
-	"sort"
+	"strconv"
 	"strings"
 	"sync"
 	"time"
@@ -26,11 +26,13 @@ var (
 
 type ClaimProject struct {
 	*xweb.Action
-	nzjSearch        xweb.Mapper `xweb:"/project/nzj/search"`            //拟在建工作桌面外列表页
-	nzjDetails       xweb.Mapper `xweb:"/project/nzj/details"`           //拟在建工作桌面外详情页
+	nzjSearch     xweb.Mapper `xweb:"/front/project/nzj/search"`     //拟在建工作桌面外列表页
+	nzjDetails    xweb.Mapper `xweb:"/front/project/nzj/details"`    //拟在建工作桌面外详情页
+	nzjConditions xweb.Mapper `xweb:"/front/project/nzj/conditions"` //工作台引导说明
+
 	analyzeWord      xweb.Mapper `xweb:"/homePage/analyzeWord"`          //首页定制化分析报告词收集
 	analysisRegional xweb.Mapper `xweb:"/homePage/analysisRegional"`     //首页区域分析
-	specification    xweb.Mapper `xweb:"/front/bootstrap/specification"` //工作台引导说明
+	specification    xweb.Mapper `xweb:"/front/bootstrap/specification"` //拟在建工作桌面外搜索
 }
 
 func init() {
@@ -66,26 +68,118 @@ func (l *ClaimProject) AnalyzeWord() {
 	}
 }
 
+func (l *ClaimProject) NzjConditions() {
+	var (
+		data                           []map[string]interface{}
+		projectStageArr, ownerclassArr []string
+		areaArr                        = []string{"全国"}
+	)
+	redisKey := "nzj_search_criteria"
+	redisData := redis.Get(RedisNameNew, redisKey)
+	if redisData != nil {
+		rData, _ := redisData.([]interface{})
+		data = common.ObjArrToMapArr(rData)
+	} else {
+		area := public.GlobalCommonMysql.SelectBySql(`SELECT
+    name
+FROM
+	Jianyu_subjectdb.d_area_code where level = 1 and name != '其它'`)
+		if area != nil && len(*area) > 0 {
+			for _, m := range *area {
+				areaArr = append(areaArr, common.InterfaceToStr(m["name"]))
+			}
+		}
+		data = append(data, map[string]interface{}{"地区": areaArr})
+
+		categoryCode := public.GlobalCommonMysql.SelectBySql(`SELECT
+    name, code
+FROM
+    Jianyu_subjectdb.d_nzj_category_code WHERE name != '其它工程' and pcode = ""
+ ORDER BY id asc`)
+		if categoryCode != nil && len(*categoryCode) > 0 {
+			for _, m := range *categoryCode {
+				category := public.GlobalCommonMysql.SelectBySql(fmt.Sprintf(`SELECT
+    name
+FROM
+    Jianyu_subjectdb.d_nzj_category_code WHERE pcode = '%s'
+ ORDER BY id asc`, common.InterfaceToStr(m["code"])))
+				if category != nil && len(*category) > 0 {
+					var names []string
+					for _, m2 := range *category {
+						names = append(names, common.InterfaceToStr(m2["name"]))
+					}
+					data = append(data, map[string]interface{}{common.InterfaceToStr(m["name"]): names})
+				}
+			}
+		}
+
+		project_stage := public.GlobalCommonMysql.SelectBySql(`SELECT
+    name
+FROM
+    Jianyu_subjectdb.d_nzj_project_stage_code
+ ORDER BY id asc
+ `)
+		if project_stage != nil && len(*project_stage) > 0 {
+			for _, m := range *project_stage {
+				projectStageArr = append(projectStageArr, common.InterfaceToStr(m["name"]))
+			}
+		}
+		data = append(data, map[string]interface{}{"项目阶段": projectStageArr})
+
+		ownerclass := public.GlobalCommonMysql.SelectBySql(`SELECT
+    name
+FROM
+	Jianyu_subjectdb.d_nzj_ownerclass_code ORDER BY id asc`)
+		if area != nil && len(*area) > 0 {
+			for _, m := range *ownerclass {
+				ownerclassArr = append(ownerclassArr, common.InterfaceToStr(m["name"]))
+			}
+		}
+		data = append(data, map[string]interface{}{"业主类型": ownerclassArr})
+		redis.Put(RedisNameNew, redisKey, data, 3600*24*30)
+	}
+
+	l.ServeJson(map[string]interface{}{
+		"error_code": 0,
+		"error_msg":  nil,
+		"data":       data,
+	})
+}
+
 func (l *ClaimProject) NzjSearch() {
-	//userId, _ := l.GetSession("user_id").(string)
-	infoMap := map[string]interface{}{}
-	body := xweb.FilterXSS(string(l.Body()))
-	json.Unmarshal([]byte(body), &infoMap)
-	count, list := getNzjList(infoMap)
+	pageNum, _ := l.GetInt("pageNum")
+	pageSize, _ := l.GetInt("pageSize")
+	count, list := getNzjList(map[string]interface{}{
+		"keyWord":       l.GetString("keyWord"),
+		"area":          l.GetString("area"),
+		"category":      l.GetString("category"),
+		"project_stage": l.GetString("project_stage"),
+		"ownerclass":    l.GetString("ownerclass"),
+		"searchSort":    l.GetString("searchSort"),
+		"pageNum":       pageNum,
+		"pageSize":      pageSize,
+	})
 	l.ServeJson(map[string]interface{}{
 		"error_code": 0,
 		"error_msg":  nil,
-		"data": map[string]interface{}{
-			"list":  list,
-			"count": count,
-		},
+		"list":       list,
+		"count":      count,
 	})
 }
 
 func (l *ClaimProject) NzjDetails() {
 	equity := nzjEquity(l.Session())
 	pid := l.GetString("pid")
-	data := getDetail(pid, equity)
+	id := encrypt.SE2.Decode4Hex(pid)
+	if id == "" {
+		l.ServeJson(map[string]interface{}{
+			"error_code": -1,
+			"error_msg":  "错误id",
+			"data":       nil,
+		})
+		return
+	}
+	data := getDetail(id, equity)
 	l.ServeJson(map[string]interface{}{
 		"error_code": 0,
 		"error_msg":  nil,
@@ -99,37 +193,51 @@ type RemovalKey struct {
 }
 
 type ProjectConnection struct {
-	endName string
-	address string
-	data    []map[string]interface{}
+	EndName      string      `json:"endName"`
+	Address      string      `json:"address"`
+	IdentityType string      `json:"identityType"`
+	EndId        string      `json:"endId"`
+	Data         interface{} `json:"data"`
 }
 
 func getDetail(pid string, equity int) map[string]interface{} {
 	var codeContent string
 	detail := make(map[string]interface{})
+	if pid == "" {
+		return detail
+	}
 	if equity < 3 {
 		codeContent = common.If(equity == 1, "登陆后解锁会员查看", "(付费展示)").(string)
 	}
+	detail = BasicInfo(pid, codeContent, equity)
+	detail["follRecord"] = ProjectProgress(pid, equity)
+	detail["contact"] = EntConnection(pid, codeContent, equity)
+	return detail
+}
+
+// BasicInfo 基本信息
+func BasicInfo(pid, codeContent string, equity int) map[string]interface{} {
 	//基本信息
-	dataDetail := public.BaseMysql.SelectBySql(fmt.Sprintf(`SELECT
+	detail := make(map[string]interface{})
+	dataDetail := public.GlobalCommonMysql.SelectBySql(fmt.Sprintf(`SELECT
     a.projectname,
-    a.lasttime,
-    a.firsttime,
+    DATE_FORMAT(a.lasttime, '%s') AS lasttime,
+    DATE_FORMAT(a.firsttime, '%s') AS firsttime,
     a.proposed_number,
-    CONCAT('进展', a.follow_num) AS follow,
+    (SELECT COUNT(*) FROM Jianyu_subjectdb.dwd_f_nzj_follw_record WHERE proposed_id = '%s') AS follow,
     b.name AS project_stage,
+    g.name AS area,
     c.name AS nature,
     d.name AS category,
     a.owner,
     e.name AS ownerclass,
     f.name AS industry,
     a.total_investment,
-    a.project_startdate,
-    a.project_completedate,
+    DATE_FORMAT(a.project_startdate, '%s') AS project_startdate,
+    DATE_FORMAT(a.project_completedate, '%s') AS project_completedate,
     a.construction_area,
     a.floor_area,
     a.project_scale,
-    a.createtime,
     a.projectaddr
 FROM
 	Jianyu_subjectdb.dwd_f_nzj_baseinfo a
@@ -138,134 +246,136 @@ FROM
 	LEFT JOIN Jianyu_subjectdb.d_nzj_category_code d on a.category_code = d.code
 	LEFT JOIN Jianyu_subjectdb.d_nzj_ownerclass_code e on a.ownerclass_code = e.code
     LEFT JOIN Jianyu_subjectdb.d_topsubtype_code f on a.industry_code = f.code
+    LEFT JOIN Jianyu_subjectdb.d_area_code g ON a.area_code = g.CODE
 WHERE
-	proposed_id = '%s'`, pid))
+	proposed_id = '%s'`, "%Y-%m-%d", "%Y-%m-%d", pid, "%Y-%m-%d", "%Y-%m-%d", pid))
+	if dataDetail == nil || len(*dataDetail) == 0 {
+		//tidi缺失 查询es
+		dataDetail = elastic.GetById(proposed, proposed, pid)
+		if dataDetail != nil && len(*dataDetail) > 0 {
+			if lasttime := common.Int64All((*dataDetail)[0]["lasttime"]); lasttime > 0 {
+				// 格式化日期
+				formattedDate := time.UnixMilli(lasttime).Format("2006-01-02")
+				(*dataDetail)[0]["lasttime"] = formattedDate
+			}
+		}
+	}
 	if dataDetail != nil && len(*dataDetail) > 0 {
 		detail = (*dataDetail)[0]
+		if follow := common.IntAll(detail["follow"]); follow > 100 {
+			detail["follow"] = fmt.Sprintf("进展%d", 100)
+		} else {
+			detail["follow"] = fmt.Sprintf("进展%d", follow)
+		}
+		detail["total_investment"] = removeTrailingZeros(common.Float64All(detail["total_investment"]))
 		//拼接项目概况
-		if equity < 3 {
+		if equity < 3 { //非会员打码
 			projectname := common.InterfaceToStr(detail["projectname"])
-			detail["generalSituation"] = fmt.Sprintf("项目概况:%s项目是剑鱼标讯网站%s发布的%s行业项目信息,该项目投资总额%f万元,建设周期为%s至%s,且目前处于%s阶段。我们将持续跟踪并发布%s进展信息,感兴趣的用户开通大会员查看项目详情。",
-				projectname, timeFmt(common.InterfaceToStr(detail["createtime"])), common.InterfaceToStr(detail["industry"]), common.Float64All(detail["total_investment"]),
-				timeFmt(common.InterfaceToStr(detail["project_startdate"])), timeFmt(common.InterfaceToStr(detail["project_completedate"])), common.InterfaceToStr(detail["project_stage"]), projectname)
-
+			detail["generalSituation"] = fmt.Sprintf("%s项目是剑鱼标讯网站%s发布的%s行业项目信息,该项目投资总额%s万元,建设周期为%s至%s,且目前处于%s阶段。我们将持续跟踪并发布%s进展信息,感兴趣的用户开通大会员查看项目详情。",
+				projectname, common.InterfaceToStr(detail["firsttime"]), common.InterfaceToStr(detail["industry"]), common.If(common.Float64All(detail["total_investment"]) > 0, common.InterfaceToStr(detail["total_investment"]), "-"),
+				common.InterfaceToStr(detail["project_startdate"]), common.InterfaceToStr(detail["project_completedate"]), common.InterfaceToStr(detail["project_stage"]), projectname)
 			if detail["owner"] != nil && detail["owner"] != "" {
 				detail["owner"] = codeContent
 			}
-			detail["project_scale"] = config.Seoconfig["nzjConstructionContent"]
+			// 拟在建项目是指尚在规划、报批、立项、环评、设计等阶段的项目,一般由发改委和各部委提供,且项目规模和投资额都较大。剑鱼标讯一般会在项目正式招标前3-12个月就通知付费客户,让客户有足够的时间和空间和业主联系,做好前期准备工作。
+			detail["project_scale"] = config.Sysconfig["nzjConstructionContent"]
 		}
-		//项目进展
-		follRecord := public.BaseMysql.SelectBySql(fmt.Sprintf(`SELECT a.publishtime,CONCAT('进展', a.follow_num) AS follow,CONCAT(a.title,'-',b.name)  as remark,a.jybxhref FROM Jianyu_subjectdb.dwd_f_nzj_follw_record a
-LEFT JOIN Jianyu_subjectdb.d_nzj_project_stage_code b on a.project_stage_code =  b.code WHERE proposed_id = '%s'
-ORDER BY publishtime DESC `, pid))
-		if follRecord != nil && len(*follRecord) > 0 {
+	}
+
+	return detail
+}
+
+func removeTrailingZeros(f float64) string {
+	if f == 0 {
+		return ""
+	}
+	str := strconv.FormatFloat(f, 'f', -1, 64)
+	return str
+}
+
+func ProjectProgress(pid string, equity int) *[]map[string]interface{} {
+	//项目进展
+	follRecord := public.GlobalCommonMysql.SelectBySql(fmt.Sprintf(`SELECT DATE_FORMAT(a.publishtime, '%s') as publishtime,b.name as project_stage,a.title,a.jybxhref FROM Jianyu_subjectdb.dwd_f_nzj_follw_record a
+LEFT JOIN Jianyu_subjectdb.d_nzj_project_stage_code b on a.project_stage_code =  b.code WHERE a.proposed_id = '%s'
+ORDER BY a.publishtime DESC,b.id DESC LIMIT 100`, "%Y-%m-%d", pid))
+	if follRecord != nil && len(*follRecord) > 0 {
+		for k, v := range *follRecord {
+			//CONCAT('进展', ROW_NUMBER() OVER (ORDER BY a.publishtime DESC)) AS follow,
+			v["follow"] = fmt.Sprintf("进展%d", len(*follRecord)-k)
 			if equity < 3 {
-				for _, v := range *follRecord {
-					v["remark"] = config.Seoconfig["nzjProgressRemark"]
-					delete(v, "jybxhref")
-				}
+				// 进展备注是剑鱼标讯通过一定渠道获得的项目进度计划,帮您提前把握商机!开通大会员即可享受此权益。
+				v["title"] = config.Sysconfig["nzjProgressRemark"]
+				delete(v, "jybxhref")
 			}
-			detail["follRecord"] = follRecord
 		}
+	}
+	return follRecord
+}
 
-		//获取企业主题id
-		entId := public.BaseMysql.SelectBySql(fmt.Sprintf(`SELECT name_id,name,address FROM Jianyu_subjectdb.dwd_f_nzj_ent WHERE proposed_id = '%s' ORDER BY identity_type DESC , createtime ASC`, pid))
-		if entId != nil && len(*entId) > 0 {
-			pool := make(chan bool, 10)
-			wait := &sync.WaitGroup{}
-			var lock sync.Mutex
-			var contact []ProjectConnection
-			for _, nameMap := range *entId {
-				pool <- true
-				wait.Add(1)
-				go func(nameId map[string]interface{}) {
-					defer func() {
-						wait.Done()
-						<-pool
-					}()
-					connection := make(map[RemovalKey]map[string]interface{})
-					var data []map[string]interface{}
-					person := ProjectConnection{
-						endName: common.InterfaceToStr(nameId["name"]),
-						address: common.InterfaceToStr(nameId["address"]),
-					}
-					nzjContact := public.BaseMysql.SelectBySql(fmt.Sprintf(`SELECT * FROM Jianyu_subjectdb.dwd_f_nzj_contact WHERE name_id ='%s' ORDER BY createtime DESC `, nameId))
-					if nzjContact != nil && len(*nzjContact) > 0 {
-						for _, v := range *nzjContact {
-							v["lasttime"] = v["createtime"]
-							var key RemovalKey
-							key.person = common.InterfaceToStr(v["contact_name"])
-							key.phone = common.InterfaceToStr(v["contact_tel"])
-							connection[key] = v
-						}
+func EntConnection(pid, codeContent string, equity int) []ProjectConnection {
+	//获取企业主题id
+	entId := public.GlobalCommonMysql.SelectBySql(fmt.Sprintf(`SELECT ent.name_id, ent.name, ent.address, ent.identity_type
+FROM Jianyu_subjectdb.dwd_f_nzj_ent AS ent
+JOIN (
+    SELECT MAX(id) AS max_id FROM Jianyu_subjectdb.dwd_f_nzj_ent WHERE proposed_id = '%s' and name_id is not null GROUP BY name_id
+) AS sub ON ent.id = sub.max_id
+ORDER BY ent.identity_type DESC, ent.createtime ASC;`, pid))
+	if entId != nil && len(*entId) > 0 {
+		pool := make(chan bool, 10)
+		wait := &sync.WaitGroup{}
+		var (
+			lock    sync.Mutex
+			contact = make([]ProjectConnection, len(*entId))
+		)
+		for k, nameMap := range *entId {
+			pool <- true
+			wait.Add(1)
+			go func(nameMaps map[string]interface{}, ks int) {
+				defer func() {
+					wait.Done()
+					<-pool
+				}()
+				nameId := common.InterfaceToStr(nameMaps["name_id"])
+				person := ProjectConnection{
+					EndName:      common.InterfaceToStr(nameMaps["name"]),
+					Address:      common.InterfaceToStr(nameMaps["address"]),
+					IdentityType: common.InterfaceToStr(nameMaps["identity_type"]),
+				}
+
+				data := make(map[string]interface{})
+				if equity != 3 {
+					person.EndName = codeContent
+					dataArr := public.GlobalCommonMysql.SelectBySql(fmt.Sprintf(`SELECT contact_name, contact_tel, 1 AS source_type, createtime AS lasttime FROM Jianyu_subjectdb.dwd_f_nzj_contact WHERE proposed_id = '%s' and name_id = '%s' and contact_tel != "" ORDER BY lasttime DESC LIMIT 1`, pid, nameId))
+					if dataArr != nil && len(*dataArr) > 0 {
+						data = (*dataArr)[0]
 					}
-					if equity > 3 {
-						//企业联系人
-						entContact := public.GlobalCommonMysql.SelectBySql(fmt.Sprintf(`SELECT * FROM dws_f_ent_contact WHERE name_id ='%s'`, nameId))
-						if entContact != nil && len(*entContact) > 0 {
-							for _, v := range *entContact {
-								v["lasttime"] = v["createtime"]
-								if common.InterfaceToStr(v["createtime"]) < common.InterfaceToStr(v["updatetime"]) {
-									v["lasttime"] = v["updatetime"]
-								}
-								var key RemovalKey
-								key.person = common.InterfaceToStr(v["contact_name"])
-								key.phone = common.InterfaceToStr(v["contact_tel"])
-								connection[key] = v
-							}
-						}
-						for _, m := range connection {
-							data = append(data, m)
-						}
-						//私有联系人用户
-						userContact := public.BaseMysql.SelectBySql(fmt.Sprintf(`SELECT * FROM Jianyu_subjectdb.dwd_f_user_contact_record WHERE name_id = '%s' `, nameId))
-						if userContact != nil && len(*userContact) > 0 {
-							for _, m := range *userContact {
-								data = append(data, m)
-							}
-						}
-
-					} else {
-						person.endName = codeContent
-						for _, m := range connection {
-							data = append(data, m)
-						}
+				} else {
+					dataArr := public.GlobalCommonMysql.SelectBySql(fmt.Sprintf(`SELECT * FROM (( SELECT contact_name, contact_tel, 1 AS source_type, createtime AS lasttime FROM Jianyu_subjectdb.dwd_f_nzj_contact WHERE proposed_id = '%s' and name_id = '%s' and contact_tel != "" ORDER BY lasttime DESC LIMIT 1) UNION ALL
+	( SELECT contact_name, contact_tel, source_type, CASE WHEN updatetime IS NOT NULL THEN updatetime ELSE createtime END AS lasttime FROM dws_f_ent_contact WHERE name_id = '%s' and contact_tel != "" ORDER BY source_type ASC,lasttime DESC LIMIT 1) UNION ALL
+( SELECT person AS contact_name, phone AS contact_tel, 0 AS source_type, lasttime FROM Jianyu_subjectdb.dwd_f_user_contact_record WHERE name_id = '%s' and person != "" and phone != "" ORDER BY lasttime DESC LIMIT 1)) a
+ORDER BY
+	a.source_type ASC,
+	a.lasttime DESC
+	LIMIT 1`, pid, nameId, nameId, nameId))
+					if dataArr != nil && len(*dataArr) > 0 {
+						data = (*dataArr)[0]
 					}
-					// 自定义排序函数
-					sort.Slice(data, func(i, j int) bool {
-						sourceTypeA := data[i]["source_type"].(string)
-						sourceTypeB := data[j]["source_type"].(string)
-						if sourceTypeA == sourceTypeB {
-							lastTimeA := data[i]["lasttime"].(int)
-							lastTimeB := data[j]["lasttime"].(int)
-							return lastTimeA > lastTimeB // 降序排序
-						}
-						return sourceTypeA < sourceTypeB // 升序排序
-					})
-					person.data = data
-					lock.Lock()
-					contact = append(contact, person)
-					lock.Unlock()
-				}(nameMap)
-			}
-			wait.Wait()
-			detail["contact"] = contact
+				}
+				person.Data = data
+				lock.Lock()
+				contact[ks] = person
+				lock.Unlock()
+			}(nameMap, k)
 		}
+		wait.Wait()
+		return contact
 	}
-	return detail
-}
-
-func timeFmt(tm string) string {
-	tms := strings.Split(tm, " ")
-	if len(tms) == 2 {
-		return tms[0]
-	}
-	return "-"
+	return nil
 }
 
 func getNzjList(infoMap map[string]interface{}) (count int64, list *[]map[string]interface{}) {
 	pageNum := common.If(common.IntAll(infoMap["pageNum"]) <= 0, 1, common.IntAll(infoMap["pageNum"])).(int)
-	pageSize := common.IntAll(infoMap["pageSize"])
+	pageSize := common.If(common.IntAll(infoMap["pageSize"]) <= 0, 50, common.IntAll(infoMap["pageSize"])).(int)
 	if pageNum*pageSize > common.IntAll(config.Sysconfig["nzjLimit"]) { //工作台外 默认只能搜索搜索100
 		pageNum = 1
 		pageSize = 50
@@ -274,109 +384,185 @@ func getNzjList(infoMap map[string]interface{}) (count int64, list *[]map[string
 		return nzjEmptySearch(pageNum, pageSize)
 	}
 
+	categoryCodeArr := public.GlobalCommonMysql.SelectBySql(fmt.Sprintf(`SELECT category_code FROM Jianyu_subjectdb.dwd_f_nzj_category_rule WHERE stage_info = '%s'`, common.InterfaceToStr(infoMap["keyWord"])))
+	if categoryCodeArr != nil && len(*categoryCodeArr) > 0 {
+		var codes []string
+		for _, code := range *categoryCodeArr {
+			codes = append(codes, fmt.Sprintf(`"%s"`, common.InterfaceToStr(code["category_code"])))
+		}
+		infoMap["keyCode"] = codes
+	}
 	musts := esQuery(infoMap)
 	if pageNum == 1 {
-		count = elastic.Count(proposed, proposed, fmt.Sprintf(`{"query": {"bool": {"must": [%s]}}`, strings.Join(musts, ",")))
+		count = elastic.Count(proposed, proposed, fmt.Sprintf(`{"query": {"bool": {"must": [%s]}}}`, strings.Join(musts, ",")))
+		if count == 0 {
+			return count, nil
+		}
 		if count > common.Int64All(config.Sysconfig["nzjLimit"]) {
 			count = common.Int64All(config.Sysconfig["nzjLimit"])
 		}
 	}
-	list = elastic.Get(proposed, proposed, fmt.Sprintf(`{"query": {"bool": {"must": [%s]}},"_source":["projectname","area_city","lasttime","project_stage","ownerclass","proposed_id","category","project_stage"],"sort":[{"lasttime":{"order":"desc"}}],"from":%d,"size":%d`, strings.Join(musts, ","), (pageNum-1)*pageSize, pageSize))
+
+	list = elastic.Get(proposed, proposed, fmt.Sprintf(`{"query": {"bool": {"must": [%s]}},"_source":["projectname","area","area_city","lasttime","project_stage","ownerclass","proposed_id","category","project_stage"],"sort":[{"lasttime":{"order":"desc"}}],"from":%d,"size":%d}`, strings.Join(musts, ","), (pageNum-1)*pageSize, pageSize))
+	if list != nil && len(*list) > 0 {
+		for _, v := range *list {
+			v["proposed_id"] = encrypt.SE2.Encode2Hex(common.InterfaceToStr(v["proposed_id"]))
+			//v["lasttime"] = MillisecondsToStr(common.Int64All(v["lasttime"]))
+			if v["area_city"] == nil || v["area_city"] == "" {
+				v["area_city"] = v["area"]
+			}
+		}
+	}
 	return
 }
 
+func MillisecondsToStr(ms int64) int64 {
+	timestampStr := strconv.FormatInt(ms, 10)
+	if len(timestampStr) == 13 {
+		return ms / 1000
+	} else if len(timestampStr) == 10 {
+		return ms
+	}
+	return 0
+}
+
 func esQuery(infoMap map[string]interface{}) []string {
 	var (
-		terms []string
+		musts []string
 	)
-
-	if infoMap["area"] != nil || infoMap["area"] != "" {
+	name := common.If(common.IntAll(infoMap["searchSort"]) == 0, "projectname", "owner").(string)
+	if infoMap["area"] != nil && infoMap["area"] != "" {
 		area := common.InterfaceToStr(infoMap["area"])
 		var areas []string
 		for _, v := range strings.Split(area, ",") {
 			areas = append(areas, fmt.Sprintf(`"%s"`, v))
 		}
-		terms = append(terms, fmt.Sprintf(`{
+		musts = append(musts, fmt.Sprintf(`{
           "terms": {
             "area": [%s]
           }
         }`, strings.Join(areas, ",")))
 
 	}
-	if infoMap["category"] != nil || infoMap["category"] != "" {
+	if infoMap["category"] != nil && infoMap["category"] != "" {
 		category := common.InterfaceToStr(infoMap["category"])
 		var categorys []string
 		for _, v := range strings.Split(category, ",") {
 			categorys = append(categorys, fmt.Sprintf(`"%s"`, v))
 		}
-		terms = append(terms, fmt.Sprintf(`{
+		musts = append(musts, fmt.Sprintf(`{
           "terms": {
             "category": [%s]
           }
         }`, strings.Join(categorys, ",")))
 	}
-	if infoMap["project_stage"] != nil || infoMap["project_stage"] != "" {
+	if infoMap["project_stage"] != nil && infoMap["project_stage"] != "" {
 		projectStage := common.InterfaceToStr(infoMap["project_stage"])
 		var projectStages []string
 		for _, v := range strings.Split(projectStage, ",") {
 			projectStages = append(projectStages, fmt.Sprintf(`"%s"`, v))
 		}
-		terms = append(terms, fmt.Sprintf(`{
+		musts = append(musts, fmt.Sprintf(`{
           "terms": {
             "project_stage": [%s]
           }
         }`, strings.Join(projectStages, ",")))
 
 	}
-	if infoMap["ownerclass"] != nil || infoMap["ownerclass"] != "" {
+	if infoMap["ownerclass"] != nil && infoMap["ownerclass"] != "" {
 		ownerclass := common.InterfaceToStr(infoMap["ownerclass"])
 		var ownerclasss []string
 		for _, v := range strings.Split(ownerclass, ",") {
 			ownerclasss = append(ownerclasss, fmt.Sprintf(`"%s"`, v))
 		}
-		terms = append(terms, fmt.Sprintf(`{
+		musts = append(musts, fmt.Sprintf(`{
           "terms": {
             "ownerclass": [%s]
           }
         }`, strings.Join(ownerclasss, ",")))
 	}
-
-	if infoMap["keyWord"] != nil || infoMap["keyWord"] != "" {
+	var (
+		keyWordsMusts []string
+		wordsShould   []string
+	)
+	if infoMap["keyWord"] != "" && infoMap["keyWord"] != nil {
 		keyWord := common.InterfaceToStr(infoMap["keyWord"])
-		keyWords := strings.Split(keyWord, " ")
-		var words []string
-		for _, vv := range keyWords {
-			words = append(words, vv)
+		for _, v := range strings.Split(keyWord, " ") {
+			keyWordsMusts = append(keyWordsMusts, fmt.Sprintf(`{"multi_match": {"query": "%s","type": "phrase","fields": ["%s"]}}`, v, name))
 		}
-		terms = append(terms, fmt.Sprintf(`{
-          "multi_match": {
-            "query": "%s",
-            "fields": ["projectname"]
+	}
+
+	if len(keyWordsMusts) > 0 {
+		keyCode, _ := infoMap["keyCode"].([]string)
+		if keyCode != nil && len(keyCode) > 0 { //查询关键词匹配到的code
+			wordsShould = append(wordsShould, fmt.Sprintf(elastic.NgramMust, strings.Join(keyWordsMusts, ",")))
+			wordsShould = append(wordsShould, fmt.Sprintf(`{
+          "terms": {
+            "category_code": [%s]
           }
-        },`, strings.Join(words, ",")))
+        }`, strings.Join(keyCode, ",")))
+			musts = append(musts, fmt.Sprintf(queryBoolShould, strings.Join(wordsShould, ",")))
+		} else {
+			musts = append(musts, fmt.Sprintf(elastic.NgramMust, strings.Join(keyWordsMusts, ",")))
+		}
 	}
-	return terms
+
+	return musts
 }
 
 func nzjEmptySearch(pageNum, pageSize int) (int64, *[]map[string]interface{}) {
-	var ds []map[string]interface{}
+	var (
+		ds    []map[string]interface{}
+		count int64
+	)
 	data, _ := redis.Get("newother", nzjRedisKey).([]interface{})
 	if len(data) > 0 {
+		count = int64(len(data))
 		ds = common.ObjArrToMapArr(data)[(pageNum-1)*pageSize : pageNum*pageSize]
 	} else {
-		dataArr := public.BaseMysql.SelectBySql(fmt.Sprintf(`SELECT * FROM Jianyu_subjectdb.dwd_f_nzj_baseinfo ORDER BY lasttime DESC LIMIT %v`, config.Sysconfig["nzjLimit"]))
+		dataArr := public.GlobalCommonMysql.SelectBySql(fmt.Sprintf(`SELECT
+    a.proposed_id,
+	a.projectname,
+	a.lasttime,
+	b.NAME AS project_stage,
+	COALESCE(c.NAME, f.NAME) AS area_city,
+	d.NAME AS category,
+	e.NAME AS ownerclass,
+	a.total_investment
+FROM
+	Jianyu_subjectdb.dwd_f_nzj_baseinfo a
+	LEFT JOIN Jianyu_subjectdb.d_nzj_project_stage_code b ON a.project_stage_code = b.CODE
+	LEFT JOIN Jianyu_subjectdb.d_nzj_category_code d ON a.category_code = d.CODE
+	LEFT JOIN Jianyu_subjectdb.d_area_code c ON a.city_code = c.CODE
+	LEFT JOIN Jianyu_subjectdb.d_area_code f ON a.area_code = f.CODE
+	LEFT JOIN Jianyu_subjectdb.d_nzj_ownerclass_code e ON a.ownerclass_code = e.CODE
+	ORDER BY a.lasttime DESC
+	LIMIT %d`, common.IntAll(config.Sysconfig["nzjLimit"])))
 		if dataArr != nil && len(*dataArr) > 0 {
-			redis.Put("newother", nzjRedisKey, *dataArr, 3600*24)
+			count = int64(len(data))
+			for _, m := range *dataArr {
+				m["proposed_id"] = encrypt.SE2.Encode2Hex(common.InterfaceToStr(m["proposed_id"]))
+				lasttime := common.InterfaceToStr(m["lasttime"])
+				if lasttime != "" { //日期转时间戳
+					layout := "2006-01-02 15:04:05" // 输入字符串的时间格式
+					t, err := time.Parse(layout, lasttime)
+					if err != nil {
+						continue
+					}
+					m["lasttime"] = t.UnixMilli()
+				}
+			}
+			redis.Put("newother", nzjRedisKey, *dataArr, 3600*12)
 			ds = (*dataArr)[(pageNum-1)*pageSize : pageNum*pageSize]
 		}
 	}
-	return common.Int64All(len(ds)), &ds
+	return count, &ds
 
 }
 
 func isEmpty(infoMap map[string]interface{}) bool {
 	for k, v := range infoMap {
-		if k == "pageNum" || k == "pageSize" {
+		if k == "pageNum" || k == "pageSize" || k == "searchSort" {
 			continue
 		}
 		if v != nil && v != "" {
@@ -634,6 +820,27 @@ func GetEsWinner(number int) (data []map[string]interface{}) {
 	return
 }
 
+func IndexNzjProject(number int) (data []map[string]interface{}) {
+	redisKey := "pcIndexNzjProject"
+	if dataBy := redis.Get(RedisNameNew, redisKey); dataBy != nil {
+		dataArr, _ := dataBy.([]interface{})
+		data = common.ObjArrToMapArr(dataArr)
+		return
+	}
+	sql := fmt.Sprintf(`SELECT a.proposed_id,a.projectname,a.lasttime FROM Jianyu_subjectdb.dwd_f_nzj_baseinfo a ORDER BY a.lasttime DESC LIMIT %d`, number)
+	res := public.GlobalCommonMysql.SelectBySql(sql)
+	if res != nil && len(*res) > 0 {
+		for _, v := range *res {
+			data = append(data, map[string]interface{}{
+				"title":        common.ObjToString(v["projectname"]),
+				"publish_time": strings.Split(common.ObjToString(v["lasttime"]), " ")[0],
+				"proposed_id":  encrypt.SE2.Encode2Hex(common.InterfaceToStr(v["proposed_id"])),
+			})
+		}
+	}
+	return data
+}
+
 func getEsEntBid(names, sta, end string) map[string]interface{} {
 	sTime, err := time.Parse("2006-01-02 15:04:05", sta)
 	if err != nil {

+ 190 - 0
src/jfw/front/recommendationProject.go

@@ -0,0 +1,190 @@
+package front
+
+import (
+	"app.yhyue.com/moapp/jybase/common"
+	elastic "app.yhyue.com/moapp/jybase/es"
+	"app.yhyue.com/moapp/jybase/go-xweb/xweb"
+	"app.yhyue.com/moapp/jybase/redis"
+	"fmt"
+	"github.com/gogf/gf/v2/util/gconv"
+	"jy/src/jfw/config"
+	"math/rand"
+	"strings"
+	"time"
+)
+
+const (
+	NewMustSearch             = `{"query":{"bool":{"must":[%s],"must_not":[{"terms":{"toptype":["采购意向","拟建"]}}]}}%s}`
+	biddingIndex, biddingType = "bidding", "bidding"
+	projectSet                = "projectset"
+	qyxy                      = "qyxy"
+)
+
+var (
+	WinnerRecommend, BuyerRecommend []map[string]interface{}
+)
+
+type RecommendationProject struct {
+	*xweb.Action
+	portraitRecommendation xweb.Mapper `xweb:"/front/bootstrap/specification"` //画像登录右侧推荐
+}
+
+func init() {
+	xweb.AddAction(&RecommendationProject{})
+	InitEnterprises()
+}
+
+func (l *RecommendationProject) PortraitRecommendation() {
+	l.GetString("isWinner")
+	l.ServeJson(map[string]interface{}{
+		"error_code": 0,
+		"error_msg":  nil,
+		"data":       config.Sysconfig["bootstrap_specification"],
+	})
+}
+
+func InitEnterprises() {
+	winnerConfig := strings.Split(common.InterfaceToStr(config.Sysconfig["winner"]), ",")
+	WinnerRecommend = getWinnerSeoIdByNameNew("company_name", false, winnerConfig...)
+	buyerConfig := strings.Split(common.InterfaceToStr(config.Sysconfig["buyer"]), ",")
+	BuyerRecommend = getBuyerSeoIdByNameNew(false, buyerConfig...)
+}
+
+// RelevanceData 关联单位
+func RelevanceData(name string, isWinner bool) (randomMaps []map[string]interface{}) {
+	if name == "" {
+		return nil
+	}
+	redisKey := fmt.Sprintf("portrait_relevance_%v_%s", isWinner, name)
+	getFullArr, fromCache := func() (data []map[string]interface{}, fromCache bool) {
+		gVal := redis.Get(RedisNameNew, redisKey)
+		if gVal != nil {
+			redisData := gVal.([]interface{})
+			randomMaps = common.ObjArrToMapArr(redisData)
+			fromCache = true
+			return
+		}
+		data = []map[string]interface{}{}
+		querySql := `{"query": {"bool": {"must": [%s]}},"_source":["buyer","s_winner","entidlist"],"size": 200}`
+		var mustSql string
+		if isWinner {
+			mustSql = fmt.Sprintf(`{"terms": {"entidlist": ["%s"]}},{"exists": {"field": "buyer"}}`, name)
+		} else {
+			mustSql = fmt.Sprintf(`{"match": {"buyer": "%s"}},{"exists": {"field": "s_winner"}},{"exists": {"field": "entidlist"}}`, name)
+		}
+		getData := elastic.Get(biddingIndex, biddingType, fmt.Sprintf(querySql, mustSql))
+		if getData != nil && len(*getData) > 0 {
+			queryMap := make(map[string]bool)
+			if !isWinner { //采购关联企业 校验正确性
+				var queryArr []string
+				for _, v := range *getData {
+					for _, entId := range gconv.Strings(v["entidlist"]) {
+						if queryMap[entId] {
+							continue
+						}
+						queryArr = append(queryArr, entId)
+						queryMap[entId] = true
+					}
+				}
+				data = getWinnerSeoIdByNameNew("_id", false, queryArr...)
+			} else {
+				var queryArr []string
+				for _, v := range *getData {
+					buyerName := gconv.String(v["buyer"])
+					if queryMap[buyerName] {
+						continue
+					}
+					queryArr = append(queryArr, buyerName)
+					queryMap[buyerName] = true
+				}
+				data = getBuyerSeoIdByNameNew(false, queryArr...)
+			}
+		}
+		return
+	}()
+	if !fromCache {
+		redis.Put(RedisNameNew, redisKey, getFullArr, 60*60*24)
+	}
+	randomMaps = getFullArr
+	if len(getFullArr) > 10 { //大于10 随机取10个
+		rand.Seed(time.Now().UnixNano())
+		start := rand.Intn(len(getFullArr) - 10)
+		randomMaps = getFullArr[start : start+10]
+	}
+	return
+}
+
+// RecommendedData 其他推荐
+// name 名称 province 省份 isWinner 来源是否中标企业画像 false 来源企业画像
+func RecommendedData(name, province string, isWinner bool) (rData []map[string]interface{}) {
+	redisKey := fmt.Sprintf("jyseo_portrait_recommended_%v_%s", isWinner, province)
+	getFullArr, formCache := func() (data []map[string]interface{}, formCache bool) {
+		if name == "" || province == "" || province == "全国" {
+			return
+		}
+		data = []map[string]interface{}{}
+		gVal := redis.Get(RedisNameNew, redisKey)
+		if gVal != nil {
+			redisData := gVal.([]interface{})
+			data = common.ObjArrToMapArr(redisData)
+			formCache = true
+			return
+		}
+
+		sql := fmt.Sprintf(`{"query":{"bool":{"must":[{"term":{"area":"%s"}},%s]}},"sort":[{"lasttime":"desc"}],"_source":["entidlist","buyer"],"from":0,"size":200}`, province, "%s")
+		if isWinner {
+			sql = fmt.Sprintf(sql, `{"exists": {"field": "s_winner"}},{"exists": {"field": "entidlist"}}`)
+		} else {
+			sql = fmt.Sprintf(sql, `{"exists": {"field": "buyer"}}`)
+		}
+
+		getData := elastic.Get(projectSet, projectSet, sql)
+		if getData != nil && len(*getData) > 0 {
+			queryMap := make(map[string]bool)
+			if isWinner { //采购关联企业 校验正确性
+				var queryArr []string
+				for _, v := range *getData {
+					for _, entId := range gconv.Strings(v["entidlist"]) {
+						if queryMap[entId] {
+							continue
+						}
+						queryArr = append(queryArr, entId)
+						queryMap[entId] = true
+					}
+				}
+				data = getWinnerSeoIdByNameNew("_id", false, queryArr...)
+			} else {
+				var queryArr []string
+				for _, v := range *getData {
+					buyerName := gconv.String(v["buyer"])
+					if queryMap[buyerName] {
+						continue
+					}
+					queryArr = append(queryArr, buyerName)
+					queryMap[buyerName] = true
+				}
+				data = getBuyerSeoIdByNameNew(false, queryArr...)
+			}
+		}
+		return
+	}()
+	if !formCache {
+		redis.Put(RedisNameNew, redisKey, getFullArr, 60*60*24)
+	}
+
+	finalArr := getFullArr
+	if len(finalArr) == 0 {
+		if isWinner {
+			finalArr = WinnerRecommend
+		} else {
+			finalArr = BuyerRecommend
+		}
+	}
+
+	if len(finalArr) > 10 {
+		rand.Seed(time.Now().UnixNano())
+		start := rand.Intn(len(finalArr) - 10)
+		return finalArr[start : start+10]
+	}
+	return finalArr
+}

+ 7 - 3
src/jfw/front/searchOptimize.go

@@ -208,8 +208,8 @@ func (so *SearchOptimize) SearchParamsHandle() {
 		so.WinnerTel = ""
 		so.ExclusionWords = ""
 		so.City = ""
-		so.SearchGroup = util.If(so.SearchGroup > 1, 1, so.SearchGroup).(int) //搜索分组:默认0:全部;1:招标采购公告;2:超前项目
-		so.ExclusionWords = ""                                                //排除词
+		//so.SearchGroup = util.If(so.SearchGroup > 1, 1, so.SearchGroup).(int) //搜索分组:默认0:全部;1:招标采购公告;2:超前项目
+		so.ExclusionWords = "" //排除词
 	}
 	//判断是否有关键词
 	if so.KeyWords != "" {
@@ -776,7 +776,11 @@ func (so *SearchOptimize) GetBidSearchListByCache() (list []*map[string]interfac
 	if len(l) > 0 {
 		total = t
 		count = c
-		list = l[(so.PageNum-1)*so.PageSize : so.PageNum*so.PageSize]
+		if len(l) < so.PageNum*so.PageSize {
+			list = l[(so.PageNum-1)*so.PageSize:]
+		} else {
+			list = l[(so.PageNum-1)*so.PageSize : so.PageNum*so.PageSize]
+		}
 	}
 	return
 }

+ 56 - 41
src/jfw/front/shorturl.go

@@ -145,16 +145,18 @@ func (s *Short) LoginCommon(sess map[string]interface{}, stype, id string, bm bo
 		//工作桌面内嵌 快照页
 		//老地址(地址不包含aside)且非工作桌面地址
 		if !strings.Contains(s.Request.URL.String(), "aside") && !strings.Contains(s.Request.URL.String(), "page_workDesktop") {
-			paramSuffix := ".html?aside=0"
-			replaceStr := ".html"
-			if strings.Contains(s.Request.URL.String(), "?") {
-				replaceStr = ".html?"
-				paramSuffix = ".html?aside=0&"
-			}
-			//p415 首页改版 三级页登录跳转第一版修改
-			return s.Redirect(fmt.Sprintf("%s%s%s", config.Sysconfig["workDesktopUrl"].(string), config.Sysconfig["webdomain"].(string), url.QueryEscape(strings.Replace(s.Request.URL.String(), replaceStr, paramSuffix, 1))))
-			//urlStr := strings.ReplaceAll(s.Request.URL.String(), "nologin", "article")
-			//return s.Redirect(strings.Replace(urlStr, replaceStr, paramSuffix, 1), 302)
+			tg := &Tags{} //415 第二版 添加右侧推荐 工作台外登录 不在重定向跳转
+			s.T["newBidInfoList"] = tg.GetNewBidInfo()
+			s.T["industryInfoList"] = tg.GetConsult()
+			s.T["hotLabelList"] = tg.GetHotLabel(30)
+			//paramSuffix := ".html?aside=0"
+			//replaceStr := ".html"
+			//if strings.Contains(s.Request.URL.String(), "?") {
+			//	replaceStr = ".html?"
+			//	paramSuffix = ".html?aside=0&"
+			//}
+			////p415 首页改版 三级页登录跳转第一版修改
+			//return s.Redirect(fmt.Sprintf("%s%s%s", config.Sysconfig["workDesktopUrl"].(string), config.Sysconfig["webdomain"].(string), url.QueryEscape(strings.Replace(s.Request.URL.String(), replaceStr, paramSuffix, 1))))
 		}
 	}
 	userId, _ := sess["userId"].(string)
@@ -533,7 +535,6 @@ func (s *Short) LoginCommon(sess map[string]interface{}, stype, id string, bm bo
 			}
 		}()
 		catchKey := fmt.Sprintf("jypcdetail_%s_%s_%s", detailKey, stype, sid)
-		log.Println(catchKey, "-缓存-", userId)
 		if res := redis.Get(redisLimitation, catchKey); res == nil || res == "" {
 			redisTimeOut := util.If((isVip && isOldVip) || isMember || isEntniche || newCanRead, detailRedisByPayTimeOut, detailRedisByFreeTimeOut).(int)
 			industry := s.GetString("industry")
@@ -813,6 +814,7 @@ func FieldProcessing(obj map[string]interface{}, ssOpenid interface{}, industry,
 	if href != "" && userId != "" {
 		obj["originalShow"] = true
 	}
+	obj["buyerSeoId"] = EsSeoId(false, util.InterfaceToStr(obj["buyer"]))
 	//大会员中标企业跳转至画像
 	if obj["entidlist"] != nil {
 		if s_winner := util.ObjToString(obj["s_winner"]); s_winner != "" {
@@ -824,11 +826,11 @@ func FieldProcessing(obj map[string]interface{}, ssOpenid interface{}, industry,
 				for _, v := range swinnerArr {
 					winnerMap[v] = ""
 					//临时更改为企业名称查询企业id
-					rData := elastic.Get("qyxy", "qyxy", fmt.Sprintf(`{"query":{"bool":{"should":[{"term":{"company_name":"%s"}},{"term":{"hname":"%s"}}],"minimum_should_match":1}},"_source":["name","_id","capital","company_phone"],"size":1}`, v, v))
+					rData := elastic.Get("qyxy", "qyxy", fmt.Sprintf(`{"query":{"bool":{"should":[{"term":{"company_name":"%s"}},{"term":{"hname":"%s"}}],"minimum_should_match":1}},"_source":["name","_id","nseo_id","capital","company_phone"],"size":1}`, v, v))
 					if rData != nil && len(*rData) == 1 {
 						if entId := util.ObjToString((*rData)[0]["_id"]); entId != "" {
 							entIdArr = append(entIdArr, encrypt.EncodeArticleId2ByCheck(util.ObjToString((*rData)[0]["_id"])))
-							winnerMap[v] = encrypt.EncodeArticleId2ByCheck(util.ObjToString((*rData)[0]["_id"]))
+							winnerMap[v] = (*rData)[0]["nseo_id"]
 						}
 					}
 				}
@@ -838,7 +840,8 @@ func FieldProcessing(obj map[string]interface{}, ssOpenid interface{}, industry,
 					if vstr == "-" {
 						continue
 					}
-					winnerMap[swinnerArr[k]] = encrypt.EncodeArticleId2ByCheck(vstr)
+					entIdArr = append(entIdArr, encrypt.EncodeArticleId2ByCheck(util.ObjToString(k)))
+					winnerMap[swinnerArr[k]] = EsSeoId(true, vstr)
 				}
 			}
 			obj["entId"] = entIdArr
@@ -1013,6 +1016,7 @@ func isInStringArr(arr []string, key string) bool {
 	}
 	return false
 }
+
 func ReplaceStringByRegex(str, rule, replace string) (string, error) {
 	reg, err := regexp.Compile(rule)
 	if reg == nil || err != nil {
@@ -1215,13 +1219,16 @@ func (s *Short) NologinArticle(stype, id string) error {
 		s.Redirect("/notin/page", 302)
 		return nil
 	}
+	if detailNeedMosaic == nil {
+		detailNeedMosaic, _ = config.Sysconfig["detailNeedMosaic"].(map[string]interface{})
+	}
+	//urlStr := strings.ReplaceAll(s.Request.URL.String(), "nologin", "article")
+	//return s.Redirect(urlStr, 301)
 
 	if userId != "" { //已登录用户直接跳转至正常三级页
 		return s.LoginCommon(sess, stype, id, mobileReg.MatchString(s.Header("User-Agent"))) //是否是移动端
 	}
-	if detailNeedMosaic == nil {
-		detailNeedMosaic, _ = config.Sysconfig["detailNeedMosaic"].(map[string]interface{})
-	}
+
 	return s.NologinCommon(userId, stype, id, sids[0])
 }
 
@@ -1232,14 +1239,14 @@ func (s *Short) NologinCommon(userId, stype, id, sid string) error {
 	if len(ips) > 0 {
 		ipTrue = config.IpList.Match(ips[0])
 	}
-	isLogin := util.If(userId != "", true, false).(bool)
-	catchKey := fmt.Sprintf("jypcdetail_nologin_%s_%s_%v_%v", stype, sid, ipTrue, isLogin)
+	catchKey := fmt.Sprintf("jypcdetail_nologin_%s_%s_%v", stype, sid, ipTrue)
 	if res := redis.Get(redisLimitation, catchKey); res == nil || res == "" {
 		industry := s.GetString("industry")
 		var shareid = s.GetString("id")
 		if len(shareid) == 0 {
 			shareid = "10"
 		}
+		s.T["canRead"] = true
 		s.T["logid"] = config.Seoconfig["jysskzy"].(string)
 		s.T["shareid"] = se.EncodeString(shareid)
 		//s.T["keywords"] = s.GetString("kds")
@@ -1247,9 +1254,36 @@ func (s *Short) NologinCommon(userId, stype, id, sid string) error {
 		po, bo, wo, obj := pcVRT(sid, industry, stype, false, false)
 		if obj != nil && len(obj) > 0 {
 			// p397 未登录不能查看拟建项目
-			//if !ipTrue && (obj["subtype"] == "采购意向" || obj["subtype"] == "拟建") { //未登录不能访问采购意向
-			//	return s.Redirect(fmt.Sprintf("/notin/page?backTo=%s", s.Request.URL), 302)
-			//}
+			if !ipTrue && (obj["subtype"] == "采购意向" || obj["subtype"] == "拟建") { //未登录拟建 采购意向 遮罩
+				obj = map[string]interface{}{
+					"winnerTitle":      obj["winner"],
+					"buyerTitle":       obj["buyer"],
+					"projectnameTitle": obj["projectname"],
+					"projectcodeTitle": obj["projectcode"],
+					"title":            obj["title"],
+					"_id":              obj["_id"],
+					"subtype":          obj["subtype"],
+					"stypeadd":         obj["stypeadd"],
+					"originalShow":     false,
+				}
+				s.T["canRead"] = false
+			} else {
+				FieldProcessing(obj, "", industry, id, "", userId, stype, false)
+				if userId == "" {
+					obj["winnerTitle"] = obj["winner"]
+					obj["buyerTitle"] = obj["buyer"]
+					obj["projectnameTitle"] = obj["projectname"]
+					obj["projectcodeTitle"] = obj["projectcode"]
+					if !ipTrue { //非白名单用户
+						obj = Filter(obj)
+					}
+					//obj["description"] = fmt.Sprintf("%s,%s。", obj["title"], baseInfo(obj))
+				}
+				obj["agency"] = ""
+				if obj["publishtime"] != nil {
+					obj["publishtimeShorDate"] = time.Unix(util.Int64All(obj["publishtime"]), 0).Format(date.Date_Short_Layout)
+				}
+			}
 			if len(po) > 0 {
 				s.T["projectOther"] = po
 			}
@@ -1259,28 +1293,9 @@ func (s *Short) NologinCommon(userId, stype, id, sid string) error {
 			if len(wo) > 0 {
 				s.T["winnerOther"] = wo
 			}
-			FieldProcessing(obj, "", industry, id, "", userId, stype, false)
 			obj["urlpath"] = s.Uri()
 			obj["industry"] = industry
 
-			if userId == "" {
-				obj["winnerTitle"] = obj["winner"]
-				obj["buyerTitle"] = obj["buyer"]
-				obj["projectnameTitle"] = obj["projectname"]
-				obj["projectcodeTitle"] = obj["projectcode"]
-				if !ipTrue { //非白名单用户
-					if obj["subtype"] == "拟建" {
-						otherFilter(obj, false)
-					} else {
-						obj = Filter(obj)
-					}
-				}
-				//obj["description"] = fmt.Sprintf("%s,%s。", obj["title"], baseInfo(obj))
-			}
-			obj["agency"] = ""
-			if obj["publishtime"] != nil {
-				obj["publishtimeShorDate"] = time.Unix(util.Int64All(obj["publishtime"]), 0).Format(date.Date_Short_Layout)
-			}
 			obj["keywords"] = KeyWordHandle(obj)
 			obj["description"] = DescriptionHandle("nologin", obj)
 			s.T["obj"] = obj

+ 34 - 4
src/jfw/modules/app/src/web/templates/frontRouter/partner/free/index.html

@@ -17,6 +17,7 @@
   <link rel="stylesheet" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/structuredata/css/weui.min.css?v={{Msg "seo" "version"}}">
 	<link rel="stylesheet" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/structuredata/iconfont/iconfont.css?v={{Msg "seo" "version"}}">
 	<link rel="stylesheet" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/partner/css/partner.css?v={{Msg "seo" "version"}}">
+	<link rel="stylesheet" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/partner/css/append.css?v={{Msg "seo" "version"}}">
   <style>
     .app-layout-header{
       border-bottom: 0px!important;
@@ -54,12 +55,40 @@
 			<div class="dowhat">
 				<img src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/partner/image/B_01.jpg' alt="">
 			</div>
-			<div class="module buy-discount">
-				<img src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/partner/image/B_02.jpg' alt="">
+			<div class="module buy-discount b_red">
+				<!-- <img src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/partner/image/B_02.jpg' alt=""> -->
+				<img class="img-title" src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/partner/image/text.png' alt="">
+			</div>
+			<div class="data_content b_red">
+				<div class="data_item">
+					<div class="data_item_title"><span class="data_item_l" data-update-text="push-total">140</span> <span class="data_item_s" data-update-text="push-unit">亿+</span></div>
+					<div class="data_item_name">推送招标信息</div>
+					<div class="data_item_desc"><span class="data_item_n">剑鱼标讯已为用户<br>成功推送<span class="data_item_b"><span data-update-text="push-total">140</span><span data-update-text="push-unit">亿+</span></span>条信息</span></div>
+				</div>
+				<div class="data_item">
+					<div class="data_item_title"><span class="data_item_l" data-update-text="bid-total">7700</span> <span class="data_item_s" data-update-text="bid-unit">万+</span></div>
+					<div class="data_item_name">招标信息</div>
+					<div class="data_item_desc"><span class="data_item_n">剑鱼标讯已累计收录<br><span class="data_item_b"><span data-update-text="bid-total">7700</span><span data-update-text="bid-unit">万+</span></span>条招标信息</span></div>
+				</div>
+				<div class="data_item">
+					<div class="data_item_title"><span class="data_item_l" data-update-text="project-total">4680</span> <span class="data_item_s" data-update-text="project-unit">万+</span></div>
+					<div class="data_item_name">招标采购项目</div>
+					<div class="data_item_desc"><span class="data_item_n">覆盖全国<br><span class="data_item_b"><span data-update-text="project-total">4680</span><span data-update-text="project-unit">万+</span></span>招标采购项目</span></div>
+				</div>
+				<div class="data_item">
+					<div class="data_item_title"><span class="data_item_l" data-update-text="ent-total">4670</span> <span class="data_item_s" data-update-text="ent-unit">万+</span></div>
+					<div class="data_item_name">企业数据库</div>
+					<div class="data_item_desc"><span class="data_item_n">剑鱼标讯拥有全国<br><span class="data_item_b"><span data-update-text="ent-total">4670</span><span data-update-text="ent-unit">万+</span></span>企业数据库</span></div>
+				</div>
+				<div class="data_item">
+					<div class="data_item_title"><span class="data_item_l" data-update-text="buyer-total">200</span> <span data-update-text="buyer-unit" class="data_item_s">万+</span></div>
+					<div class="data_item_name">采购单位库</div>
+					<div class="data_item_desc"><span class="data_item_n">剑鱼标讯已累计收录<br><span class="data_item_b" ><span data-update-text="buyer-total">200</span><span data-update-text="buyer-unit">万+</span></span>采购单位库</span></div>
+				</div>
 			</div>
 			<div>
-        <img src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/partner/image/B_03.jpg' alt="">
-        <img src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/partner/image/B_04.jpg' alt="">
+        <!-- <img src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/partner/image/B_03.jpg' alt="">
+        <img src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/partner/image/B_04.jpg' alt=""> -->
         <img src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/partner/image/B_05.jpg' alt="">
 			</div>
 		</div>
@@ -72,6 +101,7 @@
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/structuredata/js/jquery.min.js'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/structuredata/js/weui.min.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/structuredata/js/imageViewer.min.js'></script>
+<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/partner/js/partner.js?v={{Msg "seo" "version"}}'></script>
 {{include "/common/js.html"}}
 <script>
   var loginFlag = {{if .T.loginFlag}}{{.T.loginFlag}}{{else}}false{{end}}

+ 34 - 4
src/jfw/modules/app/src/web/templates/frontRouter/partner/sess/index.html

@@ -17,6 +17,7 @@
   <link rel="stylesheet" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/structuredata/css/weui.min.css?v={{Msg "seo" "version"}}">
 	<link rel="stylesheet" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/structuredata/iconfont/iconfont.css?v={{Msg "seo" "version"}}">
 	<link rel="stylesheet" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/partner/css/partner.css?v={{Msg "seo" "version"}}">
+	<link rel="stylesheet" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/partner/css/append.css?v={{Msg "seo" "version"}}">
   <style>
     .app-layout-header{
       border-bottom: 0px!important;
@@ -54,12 +55,40 @@
 			<div class="dowhat">
 				<img src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/partner/image/B_01.jpg' alt="">
 			</div>
-			<div class="module buy-discount">
-				<img src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/partner/image/B_02.jpg' alt="">
+			<div class="module buy-discount b_red">
+				<!-- <img src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/partner/image/B_02.jpg' alt=""> -->
+				<img class="img-title" src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/partner/image/text.png' alt="">
+			</div>
+			<div class="data_content b_red">
+				<div class="data_item">
+					<div class="data_item_title"><span class="data_item_l" data-update-text="push-total">140</span> <span class="data_item_s" data-update-text="push-unit">亿+</span></div>
+					<div class="data_item_name">推送招标信息</div>
+					<div class="data_item_desc"><span class="data_item_n">剑鱼标讯已为用户<br>成功推送<span class="data_item_b"><span data-update-text="push-total">140</span><span data-update-text="push-unit">亿+</span></span>条信息</span></div>
+				</div>
+				<div class="data_item">
+					<div class="data_item_title"><span class="data_item_l" data-update-text="bid-total">7700</span> <span class="data_item_s" data-update-text="bid-unit">万+</span></div>
+					<div class="data_item_name">招标信息</div>
+					<div class="data_item_desc"><span class="data_item_n">剑鱼标讯已累计收录<br><span class="data_item_b"><span data-update-text="bid-total">7700</span><span data-update-text="bid-unit">万+</span></span>条招标信息</span></div>
+				</div>
+				<div class="data_item">
+					<div class="data_item_title"><span class="data_item_l" data-update-text="project-total">4680</span> <span class="data_item_s" data-update-text="project-unit">万+</span></div>
+					<div class="data_item_name">招标采购项目</div>
+					<div class="data_item_desc"><span class="data_item_n">覆盖全国<br><span class="data_item_b"><span data-update-text="project-total">4680</span><span data-update-text="project-unit">万+</span></span>招标采购项目</span></div>
+				</div>
+				<div class="data_item">
+					<div class="data_item_title"><span class="data_item_l" data-update-text="ent-total">4670</span> <span class="data_item_s" data-update-text="ent-unit">万+</span></div>
+					<div class="data_item_name">企业数据库</div>
+					<div class="data_item_desc"><span class="data_item_n">剑鱼标讯拥有全国<br><span class="data_item_b"><span data-update-text="ent-total">4670</span><span data-update-text="ent-unit">万+</span></span>企业数据库</span></div>
+				</div>
+				<div class="data_item">
+					<div class="data_item_title"><span class="data_item_l" data-update-text="buyer-total">200</span> <span data-update-text="buyer-unit" class="data_item_s">万+</span></div>
+					<div class="data_item_name">采购单位库</div>
+					<div class="data_item_desc"><span class="data_item_n">剑鱼标讯已累计收录<br><span class="data_item_b" ><span data-update-text="buyer-total">200</span><span data-update-text="buyer-unit">万+</span></span>采购单位库</span></div>
+				</div>
 			</div>
 			<div>
-        <img src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/partner/image/B_03.jpg' alt="">
-        <img src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/partner/image/B_04.jpg' alt="">
+        <!-- <img src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/partner/image/B_03.jpg' alt="">
+        <img src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/partner/image/B_04.jpg' alt=""> -->
         <img src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/partner/image/B_05.jpg' alt="">
 			</div>
 		</div>
@@ -72,6 +101,7 @@
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/structuredata/js/jquery.min.js'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/structuredata/js/weui.min.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/structuredata/js/imageViewer.min.js'></script>
+<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/partner/js/partner.js?v={{Msg "seo" "version"}}'></script>
 {{include "/common/js.html"}}
 <script>
 	// 监听页面滚动

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

@@ -40,7 +40,7 @@ const (
 	entSearchCacheKey = "entSearchIndexCache_%v"
 
 	index, itype  = "qyxy", "qyxy"
-	entQuery      = `{"query":{"bool":{"must":[%s],"must_not":[%s]}},"_source":["_id","company_name","company_status","legal_person","capital","company_address","company_shortname","company_phone","establish_date"],"sort":[{"capital":{"order":"desc"}}]}`
+	entQuery      = `{"query":{"bool":{"must":[%s],"must_not":[%s]}},"_source":["_id","company_name","company_status","legal_person","capital","company_address","company_shortname","company_phone","establish_date","nseo_id"],"sort":[{"capital":{"order":"desc"}}]}`
 	entQueryCount = `{"query":{"bool":{"must":[%s],"must_not":[%s]}}}`
 )
 

+ 4 - 0
src/web/staticres/common-module/mainSearch/js/advanced-project-table.js

@@ -25,6 +25,8 @@ var advanceProjectTable = new Vue({
                 approvetime: '', // 审批时间
                 approvestatus: '', // 审批结果
                 project_scale: '', // 建设内容
+
+                buyerSeoId: '', // seoId
             }
         }
     },
@@ -93,6 +95,8 @@ var advanceProjectTable = new Vue({
             this.tableInfo.approvetime = content.approvetime || ''
             this.tableInfo.approvestatus = content.approvestatus || ''
             this.tableInfo.project_scale = content.project_scale || ''
+
+            this.tableInfo.buyerSeoId = content.buyerSeoId
         },
         // 初始化采购单位画像事件
         initBuyerEvents: function () {},

+ 0 - 2
src/web/staticres/common-module/nps-common/css/nps.css

@@ -94,10 +94,8 @@
 /* pc端样式 */
 #npsMain.npsPc{
   margin: 0 auto;
-  width: 1200px;
 }
 #npsMain.npsPc .nps-content{
-  width: 980px;
   height: auto;
   padding: 32px 0;
   background: url('../image/pc_bg.png') no-repeat;

+ 77 - 0
src/web/staticres/common-module/partner/css/append.css

@@ -0,0 +1,77 @@
+.img-title{
+  width: 6.46rem;
+  display: block;
+  margin: auto;
+}
+.b_red{
+  background-color: #E6451F;
+}
+.data_content{
+  padding: 0 0.32rem;
+  overflow: hidden;
+}
+.data_content .data_item{
+  min-height: 4.52rem;
+  /* background: linear-gradient(334.53deg, #FFFFFF 0%, rgba(255, 255, 255, 0) 100%); */
+background: linear-gradient(150deg, #FFFFFF 0%,rgba(255, 253, 248, 0.8) 50% ,rgba(255, 253, 248, 0.9) 100%);
+border-radius: 0.24rem;
+margin-bottom: 0.32rem;
+box-sizing: border-box;
+padding-top: 0.56rem;
+
+}
+.data_content .data_item .data_item_title{
+  text-align: center;
+}
+.data_content .data_item .data_item_l{
+font-size: 1.28rem;
+font-weight: 400;
+line-height: 1.28rem;
+letter-spacing: 0em;
+background-image: linear-gradient(180deg, #E2360A 0%, #FFB69B 100%);
+-webkit-background-clip: text;
+-webkit-text-fill-color: transparent;
+text-align: center;
+
+}
+.data_content .data_item .data_item_s{
+  font-size: 0.4rem;
+  font-weight: 400;
+  line-height: 0.56rem;
+  letter-spacing: 0em;
+  background-image: linear-gradient(180deg, #E2360A 0%, #FFB69B 100%);
+-webkit-background-clip: text;
+-webkit-text-fill-color: transparent;
+text-align: center;
+  
+  }
+.data_item .data_item_name{
+font-size: 0.48rem;
+font-weight: 400;
+line-height: 0.68rem;
+letter-spacing: 0em;
+text-align: center;
+color: #E0340E;
+margin-top: 0.16rem;
+}
+.data_item .data_item_desc{
+  margin-top: 0.16rem;
+  text-align: center;
+
+}
+.data_item .data_item_desc .data_item_b{
+font-size: 0.4rem;
+font-weight: 400;
+line-height: 0.6rem;
+letter-spacing: 0em;
+text-align: center;
+color: #686868;
+}
+.data_item .data_item_desc .data_item_n{
+  font-size: 0.32rem;
+font-weight: 400;
+line-height: 0.48rem;
+letter-spacing: 0em;
+text-align: center;
+color: #686868;
+}

BIN
src/web/staticres/common-module/partner/image/text.png


+ 45 - 0
src/web/staticres/common-module/partner/js/partner.js

@@ -0,0 +1,45 @@
+function updateSiteCoreNumbers () {
+  function updateDomText (key, value) {
+    $('*[data-update-text="'+key+'"]').text(value)
+  }
+
+  /**
+   * 获取网站数据
+   * @api https://yapi.jydev.jianyu360.com/project/63/interface/api/1427
+   */
+  function ajaxGetUpdateInfo () {
+    $.ajax({
+      type: 'POST',
+      url: '/jyapi/jybx/base/included',
+      success: function (res) {
+        if (!res.error_msg && res.data) {
+          /**
+           * 接口数据转换Keys
+           * 招标信息的数值, 招标采购项目的数值, 企业数据库的数值, 采购单位库的数值, 每日更新招标信息的数值, 招标信息数据字段的数值, 数据字段准确率的数值, 推送招标信息的数值
+           */
+          var transformKeys = ['bid', 'project', 'ent', 'buyer', 'bidDayUpdate', 'bidField', 'fieldAccuracy', 'push']
+          // 转换数据结构
+          var waitUpdateInfo = {
+            day: res.data.year + '年' + res.data.month + '月'
+          }
+          transformKeys.forEach(function (k) {
+            waitUpdateInfo[k] = {
+              number: res.data[k],
+              unit: res.data[k + 'Unit'] + res.data[k + 'UnitAppend']
+            }
+          })
+          for (var waitUpdateInfoKey in waitUpdateInfo) {
+            if (waitUpdateInfoKey === 'day') {
+              updateDomText(waitUpdateInfoKey, waitUpdateInfo[waitUpdateInfoKey])
+            } else if (waitUpdateInfo[waitUpdateInfoKey] && waitUpdateInfo[waitUpdateInfoKey].number) {
+              updateDomText(waitUpdateInfoKey + '-total', waitUpdateInfo[waitUpdateInfoKey].number)
+              updateDomText(waitUpdateInfoKey + '-unit', ' ' + waitUpdateInfo[waitUpdateInfoKey].unit)
+            }
+          }
+        }
+      }
+    })
+  }
+  ajaxGetUpdateInfo()
+}
+updateSiteCoreNumbers()

+ 16 - 12
src/web/staticres/css/pc.css

@@ -1418,9 +1418,12 @@ form{
 	display: none;
 }
 /*****************招标详情页*************************/
+.biddetail-content-container {
+	width: 892px;
+	transition: width 0.1s ease;
+}
 .biddetail-content{
 /*	margin: 0px auto;*/
-    width: 940px;
 	background-color: #fff;
 	padding: 42px 40px;
 	margin-left: 0px;
@@ -1692,8 +1695,7 @@ form{
 	margin-left: -20px;
 }
 .otherinfo{
-	margin: 20px left;
-	width: 980px;
+	margin: 20px 0;
 	font-size: 16px;
 }
 .otherinfo ul{
@@ -1734,7 +1736,7 @@ form{
 	margin-right: 10px;
 }
 .otherinfo li .com-title{
-	width: 560px;
+	width: 500px;
 	overflow: hidden;
 	white-space: nowrap;
 	text-overflow: ellipsis;
@@ -4346,6 +4348,7 @@ h6 {
 }*/
 /**dev2.1纠错**/
 .recoveryhead{
+	display: flex;
 	background-color: #FFF;
 /*    height: 50px;*/
 /*    border: 1px solid #ebebeb;*/
@@ -4364,6 +4367,7 @@ h6 {
     font-size: 16px;
     width: 240px;
 	line-height: 45px;
+	flex-shrink: 0;
 }
 .recoveryhead .active{
 	background: #fff;
@@ -4375,7 +4379,7 @@ h6 {
 	position:fixed;
 	top: 0px;
     margin-top: 0px !important;
-    width: 980px;
+    width: 892px;
 	z-index: 99;
 }
 #tab2{
@@ -4508,14 +4512,14 @@ h6 {
     padding-right: 0px !important;
 }
 .cd-type{
-	width: 300px;
+	width: 260px;
     border-right: 1px solid #EBEBEB;
     padding: 10px;
     background-color: #F4F4F9;
     color: #686868;
 }
 .cd-cont{
-	width: 300px;
+	width: 260px;
 	border-right: 1px solid #EBEBEB;
     padding: 10px;
     font-size: 16px;
@@ -4537,19 +4541,19 @@ h6 {
 }
 .subpck .cont-cont{
 	padding-right: 40px;
-    width: 210px !important;
+    width: 190px !important;
 }
 .bidpck .cont-cont{
 	padding-right: 40px;
-    width: 240px !important;
+    width: 210px !important;
 }
 .winpck .cont-cont{
 	padding-right: 40px;
-    width: 444px !important;
+    width: 344px !important;
 }
 .amountpck .cont-cont{
 	padding-right: 40px;
-    width: 180px !important;
+    width: 150px !important;
 }
 .rec-null{
 	position: absolute;
@@ -4633,7 +4637,7 @@ h6 {
     margin-right: -40px;
 }
 .tab3{
-	width: 500px;
+	flex: 1;
     height: 45px;
     border-bottom: 1px solid #ebebeb;
     float: left;

BIN
src/web/staticres/frontRouter/pc/partner/image/title.png


+ 1 - 1
src/web/staticres/frontRouter/pc/seeBuyerHistory/css/index-pc.css

@@ -45,7 +45,7 @@
     padding-bottom: 70px;
     min-height: calc(100vh - 364px);
 }
-.see-header {
+.see-container .see-header {
     flex-direction: initial;
     justify-content: space-between;
     margin: 48px auto 28px auto;

+ 1 - 1
src/web/staticres/frontRouter/pc/seeHistory/css/index-pc.css

@@ -7,7 +7,7 @@
     padding-bottom: 70px;
     min-height: calc(100vh - 364px);
 }
-.see-header {
+.see-container .see-header {
     flex-direction: initial;
     justify-content: space-between;
     margin: 48px auto 28px auto;

BIN
src/web/staticres/images/pc/pc-cq-example.png


BIN
src/web/staticres/images/pc/pc-cq-mmt.png


BIN
src/web/staticres/images/pc/pc-nj-example.png


BIN
src/web/staticres/images/qr/qr-img-decorate.png


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

@@ -166,6 +166,8 @@ $(function() {
         if (inInjectBI) {
           $(".bi-mark.parent-node").addClass('active')
         } else {
+          $content.children().not($(this)).removeClass("active secondActice");
+          $('.show-nj-cg').children().removeClass("active")
           $induAll.addClass("active");
         }
 			}
@@ -174,6 +176,7 @@ $(function() {
 		$induAll.on("click", function() {
 			$(this).addClass("active");
 			$content.children().not($(this)).removeClass("active secondActice");
+      $('.show-nj-cg').children().removeClass("active")
 			beforeSubmit('filter-industry');
 		})
 	};
@@ -248,6 +251,7 @@ $(function() {
 		$induAll.on("click", function() {
 			$(this).addClass("active");
 			$content.children().not($(this)).removeClass("active secondActice");
+      $('.show-nj-cg').children().removeClass("active")
 			beforeSubmit('filter-industry');
 		})
 	};

+ 10 - 12
src/web/staticres/js/ent-search-index-pc.js

@@ -351,7 +351,7 @@ var entSearch = new Vue({
          * 初始化页面搜索框与工作台顶部搜索联动事件函数,详情见对应函数 common.js
          * 需要在 dom 初始化后调用来监听事件,Vue中需要额外在 input 对应事件额外手动触发事件
          */
-        // if (goTemplateData.inIframe) {
+        // if (this.inIframe) {
         //   this._$SearchEvent = initSearchPageEvent({
         //     type: 'company',
         //     el: '.search-header-top .input-container',
@@ -365,21 +365,12 @@ var entSearch = new Vue({
     methods: {
         goBack () {
           var back = function () {
-            // 判断是否在iframe,如果在iframe,则用父级返回
-            if (goTemplateData.inIframe) {
-              window.parent.history.back()
-            } else {
-              history.back()
-            }
+            window.top.history.back()
           }
 
           var goHome = function () {
             // 判断是否在iframe,如果在iframe,则用父级返回
-            if (goTemplateData.inIframe) {
-              window.parent.location.href = '/'
-            } else {
-              window.location.href = '/'
-            }
+            window.top.location.href = '/'
           }
         
           var referer = document.referer
@@ -1079,12 +1070,14 @@ var entSearch = new Vue({
         },
         toDetail: function (item) {
             var id = item.id || item.entId
+            var seoId = item.nseo_id
             let BIPage = ''
             if (this.getBIParams) {
               BIPage = '?resource=BI'
             } else {
               BIPage = ''
             }
+            var seoUrl = '/qy/' + seoId + '.html' + BIPage
             // 去超级订阅画像
             var svipLink = '/swordfish/page_big_pc/svip/ent_ser_portrait/' + id + BIPage
             // 大会员画像
@@ -1093,6 +1086,11 @@ var entSearch = new Vue({
             if(cooperateCode) {
               openLoginDig(null, svipLink)
               return
+            } else {
+                if (!this.inIframe) {
+                    // 工作桌面外跳转seo画像
+                    return window.open(seoUrl)
+                }
             }
             try {
                 item.visited = true

+ 1 - 1
src/web/staticres/js/index/index_2023.12.js

@@ -230,7 +230,7 @@ var _page = {
         var url = conf.target
         if (dataId == 'zb') {
           // /jylab/supsearch/index.html?keywords=&searchvalue=&selectType=title%2Ccontent
-          targetUrl = url + '?keywords=' + searchValue + '&selectType=title'
+          targetUrl = url + '?keywords=' + searchValue + '&selectType=title&searchGroup=1'
         } else if (dataId == 'qy') {
           targetUrl = url + '?searchvalue=' + searchValue
         } else if (dataId == 'cg') {

+ 14 - 17
src/web/staticres/js/pur-search-index-pc.js

@@ -234,7 +234,7 @@ var vm = new Vue({
          * 初始化页面搜索框与工作台顶部搜索联动事件函数,详情见对应函数 common.js
          * 需要在 dom 初始化后调用来监听事件,Vue中需要额外在 input 对应事件额外手动触发事件
          */
-        // if (goTemplateData.inIframe) {
+        // if (this.inIframe) {
         //   this._$SearchEvent = initSearchPageEvent({
         //     type: 'buyer',
         //     el: '.search-header-top .input-container',
@@ -248,21 +248,11 @@ var vm = new Vue({
     methods: {
         goBack () {
           var back = function () {
-            // 判断是否在iframe,如果在iframe,则用父级返回
-            if (goTemplateData.inIframe) {
-              window.parent.history.back()
-            } else {
-              history.back()
-            }
+            window.top.history.back()
           }
 
           var goHome = function () {
-            // 判断是否在iframe,如果在iframe,则用父级返回
-            if (goTemplateData.inIframe) {
-              window.parent.location.href = '/'
-            } else {
-              window.location.href = '/'
-            }
+            window.top.location.href = '/'
           }
         
           var referer = document.referer
@@ -484,7 +474,7 @@ var vm = new Vue({
             }
         },
         yeFan: function() {
-          if (goTemplateData.inIframe) {
+          if (this.inIframe) {
             window.$BRACE.methods.open({
               route: {
                 link: '/jylab/purScopebusniess/index.html'
@@ -822,9 +812,12 @@ var vm = new Vue({
 	          document.body.scrollTop = oTop
             this.getList()
         },
-        goTitle: function(name) {
-          // 是渠道合作页面需要登录后重定向
+        goTitle: function(item) {
+            var name = item.buyer
+            var seoId = item.seo_id
+            // 是渠道合作页面需要登录后重定向
             const BIPge = this.getBIParams ? '?resource=BI' : ''
+            var seoUrl = '/dw/' + seoId + '.html' + BIPge
             var url = '/swordfish/page_big_pc/unit_portrayal/' + name
             if (this.isNewEntNiche) {
               url = '/entpc/unit_portrayal/' + name + BIPge
@@ -835,7 +828,11 @@ var vm = new Vue({
               openLoginDig(null, url)
               return
             }
-            window.open(url)
+            if (this.inIframe) {
+              window.open(url)
+            } else {
+              window.open(seoUrl)
+            }
         },
         // 全选
         allChange: function() {

+ 4 - 0
src/web/staticres/pccss/index_pc.css

@@ -22,6 +22,10 @@
     padding-right: 20px;
 }
 
+.in-iframe .w {
+    width: 1200px!important;
+}
+
 .banner-remark {
     position: relative;
 }

File diff suppressed because it is too large
+ 7 - 74
src/web/staticres/pccss/pc-detail.css


+ 3 - 0
src/web/staticres/public-pc/css/header-nav-mini.css

@@ -340,6 +340,9 @@ a.j-s-button:hover {
 }
 
 body .menu-vip-button {
+    display: flex;
+    align-items: center;
+    justify-content: center;
     padding: 2px 8px;
     height: 26px;
     color: #6F3D03;

+ 1 - 1
src/web/staticres/public-pc/css/pc-bottom.css

@@ -154,7 +154,7 @@
   border: none;
   box-sizing: border-box;
   position: fixed;
-  z-index: 100;
+  z-index: 2002;
   /* min-width: 56px; */
   width: 80px;
   bottom: 108px;

+ 39 - 23
src/web/staticres/public-pc/js/article-content.js

@@ -1048,6 +1048,16 @@ function jumpTab(n){
   return false;
 }
 $(function(){
+  if (goTemplateData.inIframe) {
+    $('.page-detail').addClass('in-iframe-style')
+    $('.in-iframe-dom-show').show()
+    $('.in-iframe-dom-hide').hide()
+    $('.recoveryfat').css({ width: $('.biddetail-content').width() })
+  } else {
+    $('.in-outside-dom-show').show()
+    $('.in-outside-dom-hide').hide()
+    $('.page-detail').addClass('in-outside-style')
+  }
   if ($("#trwidth").find(".preb-exam").length>0){
     $("#exaapprove").show();
   }
@@ -1570,6 +1580,11 @@ $(function(){
     if(!winnerMap){
       return;
     }
+    var winnerId = winnerMap[$(this).text()]
+    if (!winnerId) {
+      return
+    }
+    return window.open('/qy/' + winnerId + '.html')
   	var memberLink = "/swordfish/page_big_pc/ent_portrait/" + winnerMap[$(this).text()]
     var vipLink = "/swordfish/page_big_pc/svip/ent_ser_portrait/" + winnerMap[$(this).text()]
     if (resource === "BI") {
@@ -2906,21 +2921,19 @@ var detailActionRight = new Vue({
     },
     goBack: function () {
       var back = function () {
-        // 判断是否在iframe,如果在iframe,则用父级返回
-        if (goTemplateData.inIframe) {
-          window.parent.history.back()
-        } else {
-          history.back()
-        }
+        window.top.history.back()
       }
-
       var goHome = function () {
-        // 判断是否在iframe,如果在iframe,则用父级返回
-        if (goTemplateData.inIframe) {
-          window.parent.location.href = '/'
-        } else {
-          window.location.href = '/'
-        }
+        window.top.location.href = '/'
+      }
+      var checkIsNewWindowOpen = function () {
+        // 1.window.open可以通过判断window.opener
+        // 2.a target='_black'可以通过判断history.length
+        var opener = window.opener && window.opener !== window
+        var target_blank = history.length <= 1
+        // 是否新窗口打开
+        var isNewWindow = opener || target_blank
+        return isNewWindow
       }
     
       var referer = document.referer
@@ -2928,19 +2941,13 @@ var detailActionRight = new Vue({
         var inJianyuWebSite = referer.indexOf('jianyu360.cn') > 0
         if (inJianyuWebSite) {
           // 本站的,判断是否是新窗口打开的页面
-          // 1.window.open可以通过判断window.opener
-          // 2.a target='_black'可以通过判断history.length
-          var opener = window.opener && window.opener !== window
-          var target_blank = history.length <= 1
-          // 是否新窗口打开
-          var isNewWindow = opener || target_blank
+          var isNewWindow = checkIsNewWindowOpen()
           if (isNewWindow) {
             try {
-              window.parent && window.parent.close()
+              window.top.close()
             } catch (error) {
-              window.close()
+              back()
             }
-            back()
           } else {
             back()
           }
@@ -2948,7 +2955,16 @@ var detailActionRight = new Vue({
           goHome()
         }
       } else {
-        goHome()
+        var isNewWindow = checkIsNewWindowOpen()
+        if (isNewWindow) {
+          try {
+            window.top.close()
+          } catch (error) {
+            goHome()
+          }
+        } else {
+          goHome()
+        }
       }
     },
   }

+ 7 - 4
src/web/staticres/public-pc/js/header-nav-mini.js

@@ -9,15 +9,21 @@ var headerNavMini = {
   // (这个地方需要注意:这里写的值是第二个头部的真实显示高度。但是在未登陆下,第二个头部其实是不会显示的(高度为0),但是这个变量仍然是72。)
   _headerNavSecondHeight: 72,
   init: function () {
+    this.initStyle()
     this.initEvents()
   },
   initStyle: function () {
+    var _this = this
     if (this.inIframe) {
       this.headerNav.hide()
       this.headerNavContainer.hide()
     } else {
       this.headerNav.show()
     }
+    // 加个延迟让二级导航的slideDown看起来不那么突兀
+    setTimeout(function () {
+      _this.secondHeaderShow()
+    }, 300)
   },
   headerFixed: function (f) {
     if (f) {
@@ -34,10 +40,9 @@ var headerNavMini = {
     // 头部占位
     this.headerNavPlaceholder.height(this._headerNavFixedHeight)
   },
-  // 登陆前不展示。登陆后工作台外的页面顶部统一展示(除了首页)
+  // 工作台外的页面顶部统一展示(除了首页)
   secondHeaderShow: function (login) {
     if (this.inIframe) return
-    if (!login) return
     // exclude中的页面不会显示第二个头部
     var pathname = location.pathname
     var excludeReg = [
@@ -134,9 +139,7 @@ var headerNavMini = {
       $('.login-register-button').show()
       $('.go-to-workspace').hide()
     }
-    this.initStyle()
     this.changeHeaderPlaceholder()
-    this.secondHeaderShow(login)
   },
   changeMenuActive: function (name) {
     this.headerNav.find('[name='+name+']').addClass('active')

+ 26 - 0
src/web/staticres/public-pc/js/sub-page.js

@@ -85,6 +85,32 @@ function openWorkBenchLink (options) {
   }
 }
 
+/**
+ * 工作桌面内打开某个url
+ * inWorkspace: 当前是否在工作桌面内打开某个url
+ * conf.url: 将要打开的url
+ * conf.newTab: 是否新窗口打开
+ */
+function openLinkInWorkspace (inWorkspace, conf) {
+  var url = conf.url
+  var newTab = conf.newTab
+  var withoutDomain = url.indexOf('http://') === -1 && url.indexOf('https://') === -1
+  var targetLink = ''
+  if (withoutDomain) {
+    targetLink = location.origin + url
+  }
+  if (inWorkspace) {
+    targetLink = '/page_workDesktop/work-bench/page?link=' + encodeURIComponent(targetLink)
+  } else {
+    targetLink = url
+  }
+  if (newTab) {
+    window.open(targetLink)
+  } else {
+    location.href = targetLink
+  }
+}
+
 /**
  * 注入全局事件链接跳转
  */

+ 21 - 0
src/web/staticres/tags/css/no-login-detail.css

@@ -163,6 +163,27 @@
   background: #fff;
 }
 
+.no-login-detail .bid-content.login-node {
+  height: 640px;
+}
+.no-login-detail .bid-content.login-node .tip-box {
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+  padding: 20px 24px;
+  background: #FFFFFF;
+  box-shadow: 0px 0px 28px 1px rgba(0, 0, 0, 0.07999999821186066);
+  border-radius: 8px 8px 8px 8px;
+  border: 1px solid #ECECEC;
+}
+.no-login-detail .bid-content.login-node .tip-text {
+  font-size: 16px;
+  font-family: Microsoft YaHei-Regular, Microsoft YaHei,sans-serif;
+  font-weight: 400;
+  color: #1D1D1D;
+  line-height: 24px;
+}
 .no-login-detail .info-table {
   border-collapse:collapse;
 }

BIN
src/web/staticres/tags/images/nzj-noroot-bg.png


BIN
src/web/staticres/tags/images/nzj-noroot.png


+ 5 - 0
src/web/staticres/tags/js/no-login-detail.js

@@ -1010,6 +1010,11 @@ $(function(){
     if(!winnerMap){
       return;
     }
+    var winnerId = winnerMap[$(this).text()]
+    if (!winnerId) {
+      return
+    }
+    return window.open('/qy/' + winnerId + '.html')
   	var memberLink = "/swordfish/page_big_pc/ent_portrait/" + winnerMap[$(this).text()]
     var vipLink = "/swordfish/page_big_pc/svip/ent_ser_portrait/" + winnerMap[$(this).text()]
     if (isMember) {

+ 1 - 3
src/web/templates/common/pc-header-nav-second.html

@@ -1,6 +1,4 @@
-{{$userId :=(session "userId")}}
-{{$noLogin :=(or (Eq $userId "") (Eq $userId nil))}}
-{{if and (not $noLogin) (not (Eq .Request.URL "/"))}}
+{{if not (Eq .Request.URL "/")}}
 <link rel="stylesheet" href='{{Msg "seo" "cdn"}}/public-pc/css/pc-header-nav-second.css?v={{Msg "seo" "version"}}' />
 <section id="pc-header-nav-second" class="pc-header-nav-second" style="display: none;">
  <div class="pc-header-nav-second-head">

+ 3 - 3
src/web/templates/frontRouter/pc/fileHistory/sess/index.html

@@ -84,7 +84,7 @@
   {{include "/common/pchead.html"}}
   <div id="vue-collect-user-info"></div>
   <section class="see-container" v-cloak>
-    <div class="see-header flex w">
+    <div class="see-header flex">
       <div class="w1080">
        <div class="header-hd">
           <h3 class="tab-header-title">附件下载</h3>
@@ -164,7 +164,7 @@
         </div>
       </div>
     </div>
-    <div class="see-header flex w w1080" style=" margin-bottom: 30px;">
+    <div class="see-header flex w1080" style=" margin-bottom: 30px;">
       <div class="l-tabs flex">
         <h3 class="tab-title">使用记录(当月已使用{seeList.total || 0}个)</h3>
       </div>
@@ -176,7 +176,7 @@
         <i class="el-icon-arrow-down r-icons" ></i>
       </div>
     </div>
-    <div class="see-content w w1080" v-show="seeList.list.length !== 0 && empty">
+    <div class="see-content w1080" v-show="seeList.list.length !== 0 && empty">
       <el-table
               :data="seeList.list"
               @cell-click="cellClick"

+ 127 - 1
src/web/templates/frontRouter/pc/partner/free/index.html

@@ -93,6 +93,59 @@
         color: #ffffff;
         cursor: pointer;
     }
+    .section-part-content{
+        display: flex;
+        margin-top: 50px;
+    }
+    .section-part-content .section-part-item{
+        width: 240px;
+    }
+    .section-part-content .section-part-item .section-part-num{
+        
+     font-weight: 700;
+     line-height: 64px;
+     font-size: 64px;
+     letter-spacing: 0em;
+     text-align: center;
+     background-image: linear-gradient(180deg, #E2360A 0%, #FFB69B 100%);
+    -webkit-background-clip: text;
+    -webkit-text-fill-color: transparent;
+    }
+    .section-part-tit{
+        text-align: center;
+    }
+    .section-part-content .section-part-item .section-part-unit{
+        font-weight: 700;
+        letter-spacing: 0em;
+        /* text-align: center; */
+        background-image: linear-gradient(180deg, #E2360A 0%, #FFB69B 100%);
+       -webkit-background-clip: text;
+       -webkit-text-fill-color: transparent;
+       font-size: 20px;
+       line-height: 26px;
+       }
+    .section-part-name{
+        color:  #E0340E;
+        font-size: 24px;
+        line-height: 24px;
+        margin-top: 23px;
+        text-align: center;
+        font-weight: 700;
+       }
+    .section-part-desc{
+        color: #686868;
+        font-size: 16px;
+        line-height: 24px;
+        text-align: center;
+        margin-top: 14px;
+    }
+    .section-part-descnum{
+        line-height: 28px;
+        font-size: 18px;
+        color: #686868;
+        font-weight: 700;
+        /* text-align: center; */
+    }
 </style>
 <body class="indexpage">
 {{include "/common/pchead.html"}}
@@ -114,7 +167,35 @@
         <div class="come-partner">申请加入</div>
     </div>
     <div class="section-part part-4">
-        <img src='{{Msg "seo" "cdn"}}/frontRouter/pc/partner/image/part4.png' style="width: 1200px" alt="">
+        <!-- <img src='{{Msg "seo" "cdn"}}/frontRouter/pc/partner/image/part4.png' style="width: 1200px" alt=""> -->
+        <img src='{{Msg "seo" "cdn"}}/frontRouter/pc/partner/image/title.png' style="width: 1084px" alt="">
+        <div class="section-part-content">
+          <div class="section-part-item">
+            <p class="section-part-tit"><span class="section-part-num" data-update-text="push-total">140</span> <span data-update-text="push-unit" class="section-part-unit">亿+</span></p>
+            <p class="section-part-name">推送招标信息</p>
+            <p class="section-part-desc">剑鱼标讯已为用户<br>成功推送<span class="section-part-descnum"><span data-update-text="push-total">140</span><span data-update-text="push-unit">亿+</span></span>条信息</p>
+          </div>
+          <div class="section-part-item">
+            <p class="section-part-tit"><span class="section-part-num" data-update-text="bid-total">7700</span> <span data-update-text="bid-unit" class="section-part-unit">万+</span></p>
+            <p class="section-part-name">招标信息</p>
+            <p class="section-part-desc">剑鱼标讯已累计收录<br><span class="section-part-descnum"><span data-update-text="bid-total">7700</span><span data-update-text="bid-unit" >万+</span></span>条招标信息</p>
+          </div>
+          <div class="section-part-item">
+            <p class="section-part-tit"><span class="section-part-num" data-update-text="project-total">4680</span> <span data-update-text="project-unit" class="section-part-unit">万+</span></p>
+            <p class="section-part-name">招标采购项目</p>
+            <p class="section-part-desc">覆盖全国<br><span class="section-part-descnum"><span data-update-text="project-total">4680</span><span data-update-text="project-unit">万+</span></span>招标采购项目</p>
+          </div>
+          <div class="section-part-item">
+            <p class="section-part-tit"><span data-update-text="ent-total" class="section-part-num">3.4</span> <span data-update-text="ent-unit" class="section-part-unit">亿+</span></p>
+            <p class="section-part-name">企业数据库</p>
+            <p class="section-part-desc">剑鱼标讯拥有全国<br><span class="section-part-descnum"><span data-update-text="ent-total">3.4</span><span data-update-text="ent-unit">亿+</span></span>企业数据库</p>
+          </div>
+          <div class="section-part-item">
+            <p class="section-part-tit"><span data-update-text="buyer-total" class="section-part-num">200</span> <span data-update-text="buyer-unit" class="section-part-unit">亿+</span></p>
+            <p class="section-part-name">采购单位库</p>
+            <p class="section-part-desc">剑鱼标讯已累计收录<br><span class="section-part-descnum"><span data-update-text="buyer-total">200</span><span data-update-text="buyer-unit">万+</span></span>采购单位库</p>
+          </div>
+        </div>
         <div class="come-partner">申请加入</div>
     </div>
 </div>
@@ -124,6 +205,51 @@
 <script src='{{Msg "seo" "cdn"}}/common-module/pc-dialog/js/leave-info-dialog.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Msg "seo" "cdn"}}/js/pc-collect-partner-info.js?v={{Msg "seo" "version"}}'></script>
 <script>
+      function updateSiteCoreNumbers () {
+    function updateDomText (key, value) {
+      $('*[data-update-text="'+key+'"]').text(value)
+    }
+
+    /**
+     * 获取网站数据
+     * @api https://yapi.jydev.jianyu360.com/project/63/interface/api/1427
+     */
+    function ajaxGetUpdateInfo () {
+      $.ajax({
+        type: 'POST',
+        url: '/jyapi/jybx/base/included',
+        success: function (res) {
+          if (!res.error_msg && res.data) {
+            /**
+             * 接口数据转换Keys
+             * 招标信息的数值, 招标采购项目的数值, 企业数据库的数值, 采购单位库的数值, 每日更新招标信息的数值, 招标信息数据字段的数值, 数据字段准确率的数值, 推送招标信息的数值
+             */
+            var transformKeys = ['bid', 'project', 'ent', 'buyer', 'bidDayUpdate', 'bidField', 'fieldAccuracy', 'push']
+            // 转换数据结构
+            var waitUpdateInfo = {
+              day: res.data.year + '年' + res.data.month + '月'
+            }
+            transformKeys.forEach(function (k) {
+              waitUpdateInfo[k] = {
+                number: res.data[k],
+                unit: res.data[k + 'Unit'] + res.data[k + 'UnitAppend']
+              }
+            })
+            for (var waitUpdateInfoKey in waitUpdateInfo) {
+              if (waitUpdateInfoKey === 'day') {
+                updateDomText(waitUpdateInfoKey, waitUpdateInfo[waitUpdateInfoKey])
+              } else if (waitUpdateInfo[waitUpdateInfoKey] && waitUpdateInfo[waitUpdateInfoKey].number) {
+                updateDomText(waitUpdateInfoKey + '-total', waitUpdateInfo[waitUpdateInfoKey].number)
+                updateDomText(waitUpdateInfoKey + '-unit', ' ' + waitUpdateInfo[waitUpdateInfoKey].unit)
+              }
+            }
+          }
+        }
+      })
+    }
+    ajaxGetUpdateInfo()
+  }
+  updateSiteCoreNumbers()
     $(function () {
         haslogin({{.T.logid}});
         $('.come-partner, .joinIn').on('click', function() {

+ 3 - 3
src/web/templates/frontRouter/pc/seeBuyerHistory/sess/index.html

@@ -135,7 +135,7 @@
   {{include "/common/pchead.html"}}
 
   <section class="see-container" v-cloak>
-    <div class="see-header flex w">
+    <div class="see-header flex">
       <div class="w1080">
         <h3 class="tab-title">采购单位画像记录</h3>
         <div class="show-total-info-group">
@@ -148,7 +148,7 @@
         </div>
       </div>
     </div>
-    <div class="see-header flex w w1080" style=" margin-bottom: 30px;">
+    <div class="see-header flex w1080" style=" margin-bottom: 30px;">
       <div class="l-tabs flex">
         <h3 class="tab-title">使用记录(当月已使用{seeList.total?seeList.total:0}个)</h3>
       </div>
@@ -160,7 +160,7 @@
         <i class="el-icon-arrow-down r-icons" ></i>
       </div>
     </div>
-    <div class="see-content w w1080" v-show="seeList.list.length !== 0 && empty">
+    <div class="see-content w1080" v-show="seeList.list.length !== 0 && empty">
       <div class="lists flex" v-for="item in seeList.list" :key="item._id">
         <div class="r-conts flex">
           <h3 class="flex" @click="detailed(item.name)">{item.name}<span v-show="item.status >= 0"

+ 35 - 2
src/web/templates/frontRouter/wx/partner/sess/index.html

@@ -25,6 +25,7 @@
   <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/icon/local.css />
   <link rel="stylesheet" href='{{Msg "seo" "cdn"}}/common-module/bidedoc/css/public.css?v={{Msg "seo" "version"}}' />
   <link rel="stylesheet" href='{{Msg "seo" "cdn"}}/common-module/bidedoc/css/index.css?v={{Msg "seo" "version"}}' />
+  <link rel="stylesheet" href="{{Msg "seo" "cdn"}}/common-module/partner/css/append.css?v={{Msg "seo" "version"}}">
   </head>
 <body>
   <div class="j-container">
@@ -37,9 +38,39 @@
           <img src='{{Msg "seo" "cdn"}}/common-module/partner/image/A_04.jpg?v={{Msg "seo" "version"}}' alt="">
           <img src='{{Msg "seo" "cdn"}}/common-module/partner/image/A_05.jpg?v={{Msg "seo" "version"}}' @touchstart="getMsg" alt="">
           <img src='{{Msg "seo" "cdn"}}/common-module/partner/image/B_01.jpg?v={{Msg "seo" "version"}}' alt="">
-          <img src='{{Msg "seo" "cdn"}}/common-module/partner/image/B_02.jpg?v={{Msg "seo" "version"}}' alt="">
+          <!-- <img src='{{Msg "seo" "cdn"}}/common-module/partner/image/B_02.jpg?v={{Msg "seo" "version"}}' alt="">
           <img src='{{Msg "seo" "cdn"}}/common-module/partner/image/B_03.jpg?v={{Msg "seo" "version"}}' alt="">
-          <img src='{{Msg "seo" "cdn"}}/common-module/partner/image/B_04.jpg?v={{Msg "seo" "version"}}' alt="">
+          <img src='{{Msg "seo" "cdn"}}/common-module/partner/image/B_04.jpg?v={{Msg "seo" "version"}}' alt=""> -->
+          <div class="module buy-discount b_red">
+            <img class="img-title" src='{{Msg "seo" "cdn"}}/common-module/partner/image/text.png' alt="">
+          </div>
+          <div class="data_content b_red">
+            <div class="data_item">
+              <div class="data_item_title"><span class="data_item_l" data-update-text="push-total">140</span> <span class="data_item_s" data-update-text="push-unit">亿+</span></div>
+              <div class="data_item_name">推送招标信息</div>
+              <div class="data_item_desc"><span class="data_item_n">剑鱼标讯已为用户<br>成功推送<span class="data_item_b"><span data-update-text="push-total">140</span><span data-update-text="push-unit">亿+</span></span>条信息</span></div>
+            </div>
+            <div class="data_item">
+              <div class="data_item_title"><span class="data_item_l" data-update-text="bid-total">7700</span> <span class="data_item_s" data-update-text="bid-unit">万+</span></div>
+              <div class="data_item_name">招标信息</div>
+              <div class="data_item_desc"><span class="data_item_n">剑鱼标讯已累计收录<br><span class="data_item_b"><span data-update-text="bid-total">7700</span><span data-update-text="bid-unit">万+</span></span>条招标信息</span></div>
+            </div>
+            <div class="data_item">
+              <div class="data_item_title"><span class="data_item_l" data-update-text="project-total">4680</span> <span class="data_item_s" data-update-text="project-unit">万+</span></div>
+              <div class="data_item_name">招标采购项目</div>
+              <div class="data_item_desc"><span class="data_item_n">覆盖全国<br><span class="data_item_b"><span data-update-text="project-total">4680</span><span data-update-text="project-unit">万+</span></span>招标采购项目</span></div>
+            </div>
+            <div class="data_item">
+              <div class="data_item_title"><span class="data_item_l" data-update-text="ent-total">4670</span> <span class="data_item_s" data-update-text="ent-unit">万+</span></div>
+              <div class="data_item_name">企业数据库</div>
+              <div class="data_item_desc"><span class="data_item_n">剑鱼标讯拥有全国<br><span class="data_item_b"><span data-update-text="ent-total">4670</span><span data-update-text="ent-unit">万+</span></span>企业数据库</span></div>
+            </div>
+            <div class="data_item">
+              <div class="data_item_title"><span class="data_item_l" data-update-text="buyer-total">200</span> <span data-update-text="buyer-unit" class="data_item_s">万+</span></div>
+              <div class="data_item_name">采购单位库</div>
+              <div class="data_item_desc"><span class="data_item_n">剑鱼标讯已累计收录<br><span class="data_item_b" ><span data-update-text="buyer-total">200</span><span data-update-text="buyer-unit">万+</span></span>采购单位库</span></div>
+            </div>
+          </div>
           <img src='{{Msg "seo" "cdn"}}/common-module/partner/image/B_05.jpg?v={{Msg "seo" "version"}}' alt="">
           <div class="btns-tips">
             <div class="btns">
@@ -54,9 +85,11 @@
   <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/vant/2.12.24/lib/vant.min.js></script>
   <script src=//cdn-common.jianyu360.com/cdn/lib/jquery/3.6.0/jquery.min.js></script>
+  <script src='{{Msg "seo" "cdn"}}/common-module/partner/js/partner.js?v={{Msg "seo" "version"}}'></script>
   <!--E-当前页面的资源-->
   {{include "/big-member/commonjs.html"}}
   <script>
+    
     var vm = new Vue({
       el: '#partner',
       delimiters: ['{', '}'],

+ 231 - 208
src/web/templates/pc/biddetail_rec.html

@@ -358,15 +358,19 @@
     <!-- 用户留资 -->
     <div id="vue-collect-user-info"></div>
     <div id="vue-collect-bid-info"></div>
+    <section class="w breadcrumb-nav in-outside-dom-show" style="display: none;">
+      <span><a style="color: #686868;" href="/">剑鱼标讯</a></span><span> > </span><span><a style="color: #686868;" {{if eq  .T.obj.stypeadd "NJXM"}} href="javascript:volid(0);" {{else if eq  .T.obj.stypeadd "ZBCGYX" }} href="/list/stype/CGYX.html" {{else}} href="/list/stype/{{.T.obj.stypeadd}}.html" {{end}}>{{if .T.obj.subtype}}{{.T.obj.subtype}}{{else}}{{.T.obj.toptype}}{{end}}项目</a></span><span> > </span><span class="active">{{.T.obj.title}}</span>
+    </section>
     <div class="main-content" style="width: 1200px; position: relative; margin: 0 auto">
-        <div class="biddetail-content" style="width:980px; margin-left:0px;">
+      <div class="biddetail-content-container">
+        <div class="biddetail-content">
             {{if .T.obj.site}}
             {{if eq .T.obj.site "剑鱼信息发布平台"}}
             <div class="yhfb">用户发布</div>
             {{end}}
             {{end}}
             <div class="biddetail-action-top-right" id="biddetail-action-top-right" v-cloak>
-              <div class="biddetail-action-top-right-content" v-show="isLogin">
+              <div class="biddetail-action-top-right-content" v-show="isLogin && !inIframe">
                 <button class="page-back-btn" @click="goBack">返回</button>
                 <div class="into-work-space" @click="goWorkSpace">
                   <span>进入工作台&nbsp;</span>
@@ -840,23 +844,25 @@
                 <img src='{{Msg "seo" "cdn"}}/images/pc/caigouyixiang-guide.png?v={{Msg "seo" "version"}}' alt="guideBanner" />
               </a>
             </div> -->
-            <div class="cutline"></div>
             <div class="com-prebuilt hidden" style="position:relative;">
-                <div class="mask-zz hidden" style="position:absolute; top:0;width: 900px;padding:0;height: 408px;background-color:white;z-index: 1;">
-                    <img style="width: 100%;height: 100%" src="/images/pc/pc_mh.png">
-                    <div class="mask-zz" style="position:absolute; left: 50%; top: 50%; margin-top: -110px;margin-left: -250px;width: 500px;height: 220px;background-color: white;z-index: 100;border-radius: 10px">
+                <div class="mask-zz hidden" style="position:absolute; top:0;width: 100%;padding:0;height: 408px;background-color:white;z-index: 1;">
+                    <img style="width: 100%;height: 100%;margin-top: 27px;" src="/images/pc/pc_mh.png">
+                    <div class="mask-zz" style="position:absolute; left: 50%; top: 50%; margin-top: -184px;margin-left: -320px;width: 650px;height: 220px;background-color: white;z-index: 100;border-radius: 10px">
                         <div style="position: relative">
-                            <img style="width: 100%;height: 100px;" src='{{Msg "seo" "cdn"}}/images/pc/pc_zzt.png?v={{Msg "seo" "version"}}'>
-                            <div id="tip-title" style="position: absolute;top: 50%;left: 50%; margin-top: -13px;transform: translateX(-50%);height: 26px;color: antiquewhite;font-size: 18px;">拟建项目抢先获知</div>
+                            <img style="width: 100%;height: 128px;" src='{{Msg "seo" "cdn"}}/images/pc/pc-cq-mmt.png?v={{Msg "seo" "version"}}'>
+                            <div id="tip-title" style="position: absolute;top: 50%;left: 50%; margin-top: -38px;transform: translateX(-50%);height: 26px;color: antiquewhite;font-size: 14px;">拟建项目抢先获知</div>
                         </div>
                         <div class="tip-box">
+                            <div class="tip-box-example" style="width: 602px;margin-top: -88px;z-index: 9;">
+                              <img style="width: 100%;height: 100%;" src="{{Msg "seo" "cdn"}}/images/pc/pc-cq-example.png?v={{Msg "seo" "version"}}" alt="">
+                            </div>
                             <div class="tip-text" style="margin-top: 12px">提前获取正在审批中的新项目,比招标信息更超前!</div>
                             <div class="tip-text">助您提前了解项目信息,把握重要商机!</div>
                             <button class="detail-nj-btn" style="background: #2CB7CA;color: white;border:none;width: 132px;height: 36px;border-radius: 6px;margin-bottom: 20px;margin-top: 24px">免费体验</button>
                         </div>
                     </div>
                 </div>
-                <div class="mask-zzz hidden" style="position:absolute; top:0;width: 900px;padding:0;height: 408px;background-color:white;z-index: 1;">
+                <div class="mask-zzz hidden" style="position:absolute; top:0;padding:0;height: 408px;background-color:white;z-index: 1;">
                     <img style="width: 100%;height: 100%" src="/images/pc/pc_mh.png">
                     <div class="mask-zzz" style="position:absolute; left: 50%; top: 50%; transform: translate3d(-50%, -50%, 0);width: 500px;background-color: white;z-index: 100;border-radius: 10px">
                         <div style="position: relative">
@@ -870,7 +876,7 @@
                         </div>
                     </div>
                 </div>
-                <div class="mask-zzz hidden free-equity-mask" style="position:absolute; top:0;width: 900px;padding:0;height: 587px;background-color:white;z-index: 1;">
+                <div class="mask-zzz hidden free-equity-mask" style="position:absolute; top:0;padding:0;height: 587px;background-color:white;z-index: 1;">
                     <img style="width: 100%;height: 100%" src="/images/pc/pc_mh.png">
                     <div class="mask-zzz" style="position:absolute; left: 50%; top: 50%; transform: translate3d(-50%, -50%, 0);width: 632px;background-color: white;z-index: 100;border-radius: 10px">
                         <div style="position: relative">
@@ -1113,9 +1119,12 @@
                                     {{if or (or .T.isMember .T.isVip) .T.isEntniche }}
                                     {{if .T.isEntnicheNew}}
                                     <!-- 新商机管理用户跳商机管理采购单位画像 -->
-                                    <div class="cont-cont portrait_img" href-data="/entpc/unit_portrayal/{{.T.obj.buyer}}" tip-data="查看采购单位画像">{{.T.obj.buyer}} </div>
+                                    <!-- <div class="cont-cont portrait_img" href-data="/entpc/unit_portrayal/{{.T.obj.buyer}}" tip-data="查看采购单位画像">{{.T.obj.buyer}} </div> -->
+                                    <!-- 没有seoId不展示href-data属性和tip-data属性 -->
+                                    <div class="cont-cont portrait_img" {{if .T.obj.buyerSeoId }}href-data="/dw/{{.T.obj.buyerSeoId}}.html" tip-data="查看采购单位画像"{{end}}>{{.T.obj.buyer}} </div>
                                     {{else}}
-                                    <div class="cont-cont portrait_img" href-data="/swordfish/page_big_pc/unit_portrayal/{{.T.obj.buyer}}" tip-data="查看采购单位画像">{{.T.obj.buyer}} </div>
+                                    <!-- <div class="cont-cont portrait_img" href-data="/swordfish/page_big_pc/unit_portrayal/{{.T.obj.buyerSeoId}}" tip-data="查看采购单位画像">{{.T.obj.buyer}} </div> -->
+                                    <div class="cont-cont portrait_img" {{if .T.obj.buyerSeoId }}href-data="/dw/{{.T.obj.buyerSeoId}}.html" tip-data="查看采购单位画像"{{end}}>{{.T.obj.buyer}} </div>
                                     {{end}}
                                     <div class="cont-recy" onclick="recoveryerr(this,'buyer','')">纠错</div>
                                     {{if or .T.isEntnicheNew .T.isEntService}}
@@ -1193,7 +1202,11 @@
                                                         </div>
                                                     </div>
                                                     <div class="bidfoot">
+                                                        {{if .T.obj.buyerSeoId}}
+                                                        <div class="bid_button_cancel bid_btn" @click="window.open('/dw/{{.T.obj.buyerSeoId}}.html')">查看详情</div>
+                                                        {{else}}
                                                         <div class="bid_button_cancel bid_btn" @click="window.open('/swordfish/page_big_pc/unit_portrayal/{{.T.obj.buyer}}')">查看详情</div>
+                                                        {{end}}
                                                         <!-- <div class="bid_button_confirm bid_btn" @click="goCollect('article_buyer_portrait')">一键开通</div> -->
                                                         <div class="bid_button_confirm bid_btn" @click="location.href= '/swordfish/page_big_pc/free/svip/buy'">一键开通</div>
                                                     </div>
@@ -1250,9 +1263,9 @@
                                     <div>
                                         {{ range $index, $value := .T.obj.winnerMap }}
                                         <span style='position: relative;'>
-                    <span class="cont-cont portrait_img winners" {{if  $value}} tip-data="查看企业画像"{{end}}>{{$index}}</span>
-                    <span class="winner-point">、</span>
-                    </span>
+                                          <span class="cont-cont portrait_img winners" {{if  $value}} tip-data="查看企业画像"{{end}}>{{$index}}</span>
+                                          <span class="winner-point">、</span>
+                                          </span>
                                         {{ end }}
                                         <div class="cont-recy" onclick="recoveryerr(this,'winner','')">纠错</div>
                                         <div style="display:none;"></div>
@@ -1453,138 +1466,29 @@
                 </center>
                 {{if .T.obj.urltop}}<a class="trs" style="color:white"> </a>{{end}}
             </div>
-            <div class="exposure-content-right--group">
-                <div onclick="adv_statistics(this)" adv_name="PC快照页-右部" class="exposure-content-right" id="B1" style="cursor: default;">
-                    <!--通过下方脚本注入-->
-                </div>
-                <div onclick="adv_statistics(this)" adv_name="PC快照页-右部" class="exposure-content-right" id="B1-Medical">
-                    <!--通过下方脚本注入-->
-                </div>
-                <script>
-                  /**
-                   * @date 2022-10-15
-                   * 原有右侧曝光广告位区域,业务逻辑已无从确认
-                   * 从代码逻辑上包含排除非启用状态广告(新版已通过Ad 函数支持无需前端判断)、随机展示一个广告
-                   */
-                  {{$s:=(Ad "jy-pccontent-right" -1 .Host)}}
-                  var ADList={{$s}};
-                  var ExcludeList = ""
-                  if (ADList.length>0){
-                    for (var i=0;i<ADList.length;i++ ){
-                      if (ExcludeList!=""&&ExcludeList.split("-").length==ADList.length){
-                        break;
-                      }
-                      var random=Math.floor(Math.random()*ADList.length);
-                      if (ExcludeList.indexOf(random)>-1){
-                        continue;
-                      }
-                      var AD=ADList[random];
-                      if (AD.o_extend != undefined) {
-                        var nowTime = new Date().getTime();
-                        if (AD.o_extend.startTime!=undefined){
-                          var stArr = AD.o_extend.startTime.split("-");
-                          if (stArr.length==6){
-                            var stStr = stArr[0]+"-"+stArr[1]+"-"+stArr[2]+" "+stArr[3]+":"+stArr[4]+":"+stArr[5]
-                            var stTime = new Date(stStr.replace(/-/g, '/')).getTime();
-                            //未开始
-                            if (stTime>nowTime){
-                              if (ExcludeList!=""){
-                                ExcludeList +="-"
-                              }
-                              ExcludeList = ExcludeList+ random
-                              continue
-                            }
-                          }
-                        }
-                        if (AD.o_extend.endTime!=undefined){
-                          var etArr = AD.o_extend.endTime.split("-");
-                          if (etArr.length==6){
-                            var etStr = etArr[0]+"-"+etArr[1]+"-"+etArr[2]+" "+etArr[3]+":"+etArr[4]+":"+etArr[5]
-                            var etTime = new Date(etStr.replace(/-/g, '/')).getTime();
-                            //已结束
-                            if (etTime<nowTime){
-                              if (ExcludeList!=""){
-                                ExcludeList +="-"
-                              }
-                              ExcludeList = ExcludeList+ random
-                              continue
-                            }
-                          }
-                        }
-                      }
-                      var ADHtml = "";
-                      if(AD.s_pic){
-                        if(AD.s_link){
-                          ADHtml += "<a dataHref='"+AD.s_link+"' target='_blank'>";
-                        }
-                        ADHtml += "<img id='pc-article-content-right' src='"+AD.s_pic+"'>";
-                        if(AD.s_link){
-                          ADHtml += "</a>";
-                        }
-                      }else {
-                        ADHtml += AD.s_script;
-                      }
-                      $("#B1").html(ADHtml);
-                      break;
-                    }
-                  }
-                  /**
-                   * @date 2022-10-15
-                   * 医疗卫生标签额外新增右侧曝光广告位区域
-                   */
-
-                  function addIndustryExclusive () {
-                    {{$s_medical:=(Ad "jy-pccontent-right--medical" -1 .Host)}}
-                    var ADListOfMedical = {{$s_medical}} || []
-                    var waitAppendHtml = ''
 
-                    /**
-                     * ADListOfMedical.forEach(function (item) {
-                     *         waitAppendHtml += `
-                     *         <div onclick="adv_statistics(this)" adv_name="${item.s_remark}" class="exposure-content-right" data-has-link="${Boolean(item.s_link)}">
-                     *             <a dataHref="${item.s_link}"> <img src="${item.s_pic}"> </a>
-                     *             <img src="${item.s_pic}">
-                     *         </div>
-                     *       `
-                     *  })
-                     */
-                    ADListOfMedical.forEach(function (item) {
-                      waitAppendHtml += "\n        <div onclick=\"adv_statistics(this)\" adv_name=\"".concat(item.s_remark, "\" class=\"exposure-content-right\" data-has-link=\"").concat(Boolean(item.s_link), "\">\n            <a dataHref=\"").concat(item.s_link, "\"> <img src=\"").concat(item.s_pic, "\"> </a>\n            <img src=\"").concat(item.s_pic, "\">\n        </div>\n      ");
-                    });
-
-                    $('#B1').after(waitAppendHtml)
-                  }
-
-                  try {
-                    if (goTemplateData.params.obj.indadd === 'YLWS' || goTemplateData.params.obj.industry === '医疗卫生') {
-                      addIndustryExclusive()
-                    }
-                  } catch (e) {}
-                </script>
-                <div class="_29p15mchdsg" style="margin-top: 12px"></div>
-
-            </div>
             <!--去掉一键报告排版问题-->
-            <!--<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
-        <div class="modal-dialog" style="width: 458px">
-            <div class="modal-content" style="width: 458px;margin: auto;height: 300px;">
-                <div class="modal-header">
-                    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
-                    <h4 class="modal-title" id="myModalLabel" style="font-size:14px;">请描述排版存在的问题(非必填)</h4>
-                </div>
-                <div class="modal-body" style="height: 181px;">
-                    <textarea class="form-control noresize" id="onekey-value" rows="6" maxlength="200"></textarea>
-                </div>
-                <div class="modal-footer">
-                    <button type="button" class="btn" id="onekey">提交</button>
+              <!--<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
+                <div class="modal-dialog" style="width: 458px">
+                    <div class="modal-content" style="width: 458px;margin: auto;height: 300px;">
+                        <div class="modal-header">
+                            <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+                            <h4 class="modal-title" id="myModalLabel" style="font-size:14px;">请描述排版存在的问题(非必填)</h4>
+                        </div>
+                        <div class="modal-body" style="height: 181px;">
+                            <textarea class="form-control noresize" id="onekey-value" rows="6" maxlength="200"></textarea>
+                        </div>
+                        <div class="modal-footer">
+                            <button type="button" class="btn" id="onekey">提交</button>
+                        </div>
+                    </div>
                 </div>
-            </div>
-        </div>
-    </div>-->
-            <!--S-- NPS评分 --S-->
-            <div id="nps-container"></div>
-            <!--E-- NPS评分 --E-->
-            <div class="otherinfo">
+              </div>-->
+              <!--S-- NPS评分 --S-->
+              <div id="nps-container"></div>
+              <!--E-- NPS评分 --E-->
+
+              <div class="otherinfo">
                 <!--同一个项目的其他招标信息-->
                 {{if .T.projectOther}}
                 <div class="com-title">
@@ -1594,7 +1498,7 @@
                     {{range $k,$v := .T.projectOther}}
                     <li>
                         <div class="com-index">{{$v.index}}.</div>
-                        <div class="com-title"><a href="/article/content/{{$v._id}}.html{{if $v.industry}}?industry={{$v.industry}}{{end}}" target="_blank">{{$v.title}}</a></div>
+                        <div class="com-title"><a href="/article/content/{{$v._id}}.html{{if $v.industry}}?industry={{$v.industry}}{{end}}" target="_blank" title="{{$v.title}}">{{$v.title}}</a></div>
                         <div class="com-status">
                             {{if $v.area}}<span class="com-area"><a href="/list/area/{{$v.areaadd}}.html">{{$v.area}}</a></span>{{end}}
                             {{if or (eq  $v.type "拟建") ( eq  $v.type "采购意向")}}
@@ -1616,7 +1520,7 @@
                     {{range $k,$v := .T.buyerOther}}
                     <li>
                         <div class="com-index">{{$v.index}}.</div>
-                        <div class="com-title"><a href="/article/content/{{$v._id}}.html{{if $v.industry}}?industry={{$v.industry}}{{end}}" target="_blank">{{$v.title}}</a></div>
+                        <div class="com-title"><a href="/article/content/{{$v._id}}.html{{if $v.industry}}?industry={{$v.industry}}{{end}}" target="_blank" title="{{$v.title}}">{{$v.title}}</a></div>
                         <div class="com-status">
                             {{if $v.area}}<span class="com-area"><a href="/list/area/{{$v.areaadd}}.html">{{$v.area}}</a></span>{{end}}
                             {{if or (eq  $v.type "拟建") ( eq  $v.type "采购意向")}}
@@ -1638,7 +1542,7 @@
                     {{range $k,$v := .T.winnerOther}}
                     <li>
                         <div class="com-index">{{$v.index}}.</div>
-                        <div class="com-title"><a href="/article/content/{{$v._id}}.html{{if $v.industry}}?industry={{$v.industry}}{{end}}" target="_blank">{{$v.title}}</a></div>
+                        <div class="com-title"><a href="/article/content/{{$v._id}}.html{{if $v.industry}}?industry={{$v.industry}}{{end}}" target="_blank" title="{{$v.title}}">{{$v.title}}</a></div>
                         <div class="com-status">
                             {{if $v.area}}<span class="com-area"><a href="/list/area/{{$v.areaadd}}.html">{{$v.area}}</a></span>{{end}}
                             {{if or (eq  $v.type "拟建") ( eq  $v.type "采购意向")}}
@@ -1653,73 +1557,190 @@
                     {{end}}
                 </ul>
                 {{end}}
-            </div>
-        </div>
-        <div   onclick="adv_statistics(this)" adv_name="PC快照页-底部"  class="adv-pccontent-bottom" id="B2" style="cursor:default;">
-            <script>
-              {{$s:=(Ad "jy-pccontent-bottom" -1 .Host)}}
-              var ADList={{$s}};
-              var ExcludeList = ""
-              if (ADList.length>0){
-                for (var i=0;i<ADList.length;i++ ){
-                  if (ExcludeList!=""&&ExcludeList.split("-").length==ADList.length){
-                    break;
-                  }
-                  var random=Math.floor(Math.random()*ADList.length);
-                  if (ExcludeList.indexOf(random)>-1){
-                    continue;
-                  }
-                  var AD=ADList[random];
-                  if (AD.o_extend != undefined) {
-                    var nowTime = new Date().getTime();
-                    if (AD.o_extend.startTime!=undefined){
-                      var stArr = AD.o_extend.startTime.split("-");
-                      if (stArr.length==6){
-                        var stStr = stArr[0]+"-"+stArr[1]+"-"+stArr[2]+" "+stArr[3]+":"+stArr[4]+":"+stArr[5]
-                        var stTime = new Date(stStr.replace(/-/g, '/')).getTime();
-                        //未开始
-                        if (stTime>nowTime){
-                          if (ExcludeList!=""){
-                            ExcludeList +="-"
+              </div>
+
+              <div onclick="adv_statistics(this)" adv_name="PC快照页-底部"  class="adv-pccontent-bottom" id="B2" style="cursor:default;">
+                <script>
+                  {{$s:=(Ad "jy-pccontent-bottom" -1 .Host)}}
+                  var ADList={{$s}};
+                  var ExcludeList = ""
+                  if (ADList.length>0){
+                    for (var i=0;i<ADList.length;i++ ){
+                      if (ExcludeList!=""&&ExcludeList.split("-").length==ADList.length){
+                        break;
+                      }
+                      var random=Math.floor(Math.random()*ADList.length);
+                      if (ExcludeList.indexOf(random)>-1){
+                        continue;
+                      }
+                      var AD=ADList[random];
+                      if (AD.o_extend != undefined) {
+                        var nowTime = new Date().getTime();
+                        if (AD.o_extend.startTime!=undefined){
+                          var stArr = AD.o_extend.startTime.split("-");
+                          if (stArr.length==6){
+                            var stStr = stArr[0]+"-"+stArr[1]+"-"+stArr[2]+" "+stArr[3]+":"+stArr[4]+":"+stArr[5]
+                            var stTime = new Date(stStr.replace(/-/g, '/')).getTime();
+                            //未开始
+                            if (stTime>nowTime){
+                              if (ExcludeList!=""){
+                                ExcludeList +="-"
+                              }
+                              ExcludeList = ExcludeList+ random
+                              continue
+                            }
                           }
-                          ExcludeList = ExcludeList+ random
-                          continue
                         }
-                      }
-                    }
-                    if (AD.o_extend.endTime!=undefined){
-                      var etArr = AD.o_extend.endTime.split("-");
-                      if (etArr.length==6){
-                        var etStr = etArr[0]+"-"+etArr[1]+"-"+etArr[2]+" "+etArr[3]+":"+etArr[4]+":"+etArr[5]
-                        var etTime = new Date(etStr.replace(/-/g, '/')).getTime();
-                        //已结束
-                        if (etTime<nowTime){
-                          if (ExcludeList!=""){
-                            ExcludeList +="-"
+                        if (AD.o_extend.endTime!=undefined){
+                          var etArr = AD.o_extend.endTime.split("-");
+                          if (etArr.length==6){
+                            var etStr = etArr[0]+"-"+etArr[1]+"-"+etArr[2]+" "+etArr[3]+":"+etArr[4]+":"+etArr[5]
+                            var etTime = new Date(etStr.replace(/-/g, '/')).getTime();
+                            //已结束
+                            if (etTime<nowTime){
+                              if (ExcludeList!=""){
+                                ExcludeList +="-"
+                              }
+                              ExcludeList = ExcludeList+ random
+                              continue
+                            }
                           }
-                          ExcludeList = ExcludeList+ random
-                          continue
                         }
                       }
+                      var ADHtml = "";
+                      if(AD.s_pic){
+                        if(AD.s_link){
+                          ADHtml += "<a dataHref='"+AD.s_link+"' target='_blank'>";
+                        }
+                        ADHtml += "<img id='pc-article-content-bottom' src='"+AD.s_pic+"'>";
+                        if(AD.s_link){
+                          ADHtml += "</a>";
+                        }
+                      }else {
+                        ADHtml += AD.s_script;
+                      }
+                      $("#B2").html(ADHtml);
+                      break;
                     }
                   }
-                  var ADHtml = "";
-                  if(AD.s_pic){
-                    if(AD.s_link){
-                      ADHtml += "<a dataHref='"+AD.s_link+"' target='_blank'>";
+                </script>
+              </div>
+          </div>
+            <div class="exposure-content-right--group">
+                <!-- 广告位 -->
+                <section class="banner-right-container old-banner">
+                  <div onclick="adv_statistics(this)" adv_name="PC快照页-右部" class="exposure-content-right" id="B1" style="cursor: default;">
+                      <!--通过下方脚本注入-->
+                  </div>
+                  <div onclick="adv_statistics(this)" adv_name="PC快照页-右部" class="exposure-content-right" id="B1-Medical">
+                      <!--通过下方脚本注入-->
+                  </div>
+                  <script>
+                    /**
+                     * @date 2022-10-15
+                     * 原有右侧曝光广告位区域,业务逻辑已无从确认
+                     * 从代码逻辑上包含排除非启用状态广告(新版已通过Ad 函数支持无需前端判断)、随机展示一个广告
+                     */
+                    {{$s:=(Ad "jy-pccontent-right" -1 .Host)}}
+                    var ADList={{$s}};
+                    var ExcludeList = ""
+                    if (ADList.length>0){
+                      for (var i=0;i<ADList.length;i++ ){
+                        if (ExcludeList!=""&&ExcludeList.split("-").length==ADList.length){
+                          break;
+                        }
+                        var random=Math.floor(Math.random()*ADList.length);
+                        if (ExcludeList.indexOf(random)>-1){
+                          continue;
+                        }
+                        var AD=ADList[random];
+                        if (AD.o_extend != undefined) {
+                          var nowTime = new Date().getTime();
+                          if (AD.o_extend.startTime!=undefined){
+                            var stArr = AD.o_extend.startTime.split("-");
+                            if (stArr.length==6){
+                              var stStr = stArr[0]+"-"+stArr[1]+"-"+stArr[2]+" "+stArr[3]+":"+stArr[4]+":"+stArr[5]
+                              var stTime = new Date(stStr.replace(/-/g, '/')).getTime();
+                              //未开始
+                              if (stTime>nowTime){
+                                if (ExcludeList!=""){
+                                  ExcludeList +="-"
+                                }
+                                ExcludeList = ExcludeList+ random
+                                continue
+                              }
+                            }
+                          }
+                          if (AD.o_extend.endTime!=undefined){
+                            var etArr = AD.o_extend.endTime.split("-");
+                            if (etArr.length==6){
+                              var etStr = etArr[0]+"-"+etArr[1]+"-"+etArr[2]+" "+etArr[3]+":"+etArr[4]+":"+etArr[5]
+                              var etTime = new Date(etStr.replace(/-/g, '/')).getTime();
+                              //已结束
+                              if (etTime<nowTime){
+                                if (ExcludeList!=""){
+                                  ExcludeList +="-"
+                                }
+                                ExcludeList = ExcludeList+ random
+                                continue
+                              }
+                            }
+                          }
+                        }
+                        var ADHtml = "";
+                        if(AD.s_pic){
+                          if(AD.s_link){
+                            ADHtml += "<a dataHref='"+AD.s_link+"' target='_blank'>";
+                          }
+                          ADHtml += "<img id='pc-article-content-right' src='"+AD.s_pic+"'>";
+                          if(AD.s_link){
+                            ADHtml += "</a>";
+                          }
+                        }else {
+                          ADHtml += AD.s_script;
+                        }
+                        $("#B1").html(ADHtml);
+                        break;
+                      }
                     }
-                    ADHtml += "<img id='pc-article-content-bottom' src='"+AD.s_pic+"'>";
-                    if(AD.s_link){
-                      ADHtml += "</a>";
+                    /**
+                     * @date 2022-10-15
+                     * 医疗卫生标签额外新增右侧曝光广告位区域
+                     */
+
+                    function addIndustryExclusive () {
+                      {{$s_medical:=(Ad "jy-pccontent-right--medical" -1 .Host)}}
+                      var ADListOfMedical = {{$s_medical}} || []
+                      var waitAppendHtml = ''
+
+                      /**
+                       * ADListOfMedical.forEach(function (item) {
+                       *         waitAppendHtml += `
+                       *         <div onclick="adv_statistics(this)" adv_name="${item.s_remark}" class="exposure-content-right" data-has-link="${Boolean(item.s_link)}">
+                       *             <a dataHref="${item.s_link}"> <img src="${item.s_pic}"> </a>
+                       *             <img src="${item.s_pic}">
+                       *         </div>
+                       *       `
+                       *  })
+                       */
+                      ADListOfMedical.forEach(function (item) {
+                        waitAppendHtml += "\n        <div onclick=\"adv_statistics(this)\" adv_name=\"".concat(item.s_remark, "\" class=\"exposure-content-right\" data-has-link=\"").concat(Boolean(item.s_link), "\">\n            <a dataHref=\"").concat(item.s_link, "\"> <img src=\"").concat(item.s_pic, "\"> </a>\n            <img src=\"").concat(item.s_pic, "\">\n        </div>\n      ");
+                      });
+
+                      $('#B1').after(waitAppendHtml)
                     }
-                  }else {
-                    ADHtml += AD.s_script;
-                  }
-                  $("#B2").html(ADHtml);
-                  break;
-                }
-              }
-            </script>
+
+                    try {
+                      if (goTemplateData.params.obj.indadd === 'YLWS' || goTemplateData.params.obj.industry === '医疗卫生') {
+                        addIndustryExclusive()
+                      }
+                    } catch (e) {}
+                  </script>
+                </section>
+                <section class="banner-right-container seo-banner">
+                    {{include "/pc/tags/template/aside-news-cards.html"}}
+                </section>
+            </div>
         </div>
         <!-- 商机管理认领-自定义标签弹框 -->
         <div class="tags-box" id="entNicheTags">
@@ -1922,12 +1943,16 @@ var ucbs_source="pc_rec",ucbsId="{{.T.obj.ucbsId}}";
           $(".tip-box .tip-text").eq(0).text('提前1-3个月获取项目信息,及早介入准备更充分')
           $(".tip-box .tip-text").eq(1).text('')
           $(".detail-nj-btn").text("点击进入")
+          $('.tip-box-example img').attr('src', '{{Msg "seo" "cdn"}}/images/pc/pc-cq-example.png?v={{Msg "seo" "version"}}')
+          $('.tip-box-example').css('height', '324px')
           // $('.caigouyixiang-guide').removeClass('hidden')
         }
         if(subType == "拟建") {
           $('#tip-title').text('超前项目抢先知,中标更容易')
           $(".tip-box .tip-text").eq(0).text('提前3-12个月获取审批中的新项目,超前项目抢先介入,商机提前掌控。')
           $(".tip-box .tip-text").eq(1).text('')
+          $('.tip-box-example img').attr('src', '{{Msg "seo" "cdn"}}/images/pc/pc-nj-example.png?v={{Msg "seo" "version"}}')
+          $('.tip-box-example').css('height', '357px')
           $(".detail-nj-btn").text("点击进入")
         }
 
@@ -1936,13 +1961,11 @@ var ucbs_source="pc_rec",ucbsId="{{.T.obj.ucbsId}}";
           $(".com-prebuilt").removeClass("hidden");
           if (subType === '拟建' || subType === '采购意向') {
             $(".mask-zz:not(.free-equity-mask)").removeClass("hidden");
-            $(".com-prebuilt").css('height', '408px')
           } else {
-            $(".com-prebuilt").css('height', '587px')
             $(".free-equity-mask").removeClass("hidden");
             $('.reward').hide()
           }
-
+          $(".com-prebuilt").css('height', '587px')
           $('.original-text').hide()
           $(".tabfat").remove()
           $(".recoveryfat").remove()

+ 3 - 3
src/web/templates/pc/entsearchindex.html

@@ -150,12 +150,12 @@
         <div class="w vue-search-container" v-cloak>
             <div class="search-header">
                 <div class="search-header-tab">
-                    <span class="tab-item" v-show="!inIframe" @click="location.replace('/jylab/supsearch/index.html')">招标采购公告</span>
+                    <span class="tab-item" v-show="!inIframe" @click="location.replace('/jylab/supsearch/index.html?searchGroup=1')">招标采购公告</span>
                     <span class="tab-item tab-active">企业搜索</span> <!-- @click="location.replace('/jylab/entSearch/index.html')" -->
                     <span class="tab-item" v-show="!inIframe" @click="location.replace('/jylab/purSearch/index.html')">采购单位搜索</span>
                     <span class="tab-item" v-show="!inIframe" @click="location.replace('/swordfish/page_web_pc/search/issued')">供应搜索</span>
-                    <span class="tab-item" v-show="!inIframe && isLogin" @click="location.replace('/jylab/supsearch/index.html?tab=2')">超前项目查询</span>
-                    <!-- <span class="tab-item" v-show="!isLogin && !inIframe" @click="location.replace('/swordfish/page_web_pc/search/issued')">拟在建项目查询</span> -->
+                    <span class="tab-item" v-show="!inIframe" @click="location.replace('/jylab/supsearch/index.html?tab=2&searchGroup=2')">超前项目查询</span>
+                    <span class="tab-item" v-show="!inIframe" @click="location.replace('/swordfish/page_web_pc/search/construction')">拟在建项目查询</span>
                     <div class="search-tab-right" v-show="isLogin && !inIframe">
                       <button class="page-back-btn" @click="goBack">返回</button>
                       <div class="into-work-space" @click="goWorkSpace">

+ 2 - 139
src/web/templates/pc/index.html

@@ -450,145 +450,8 @@
       </div>
 
       <!-- 合作伙伴 -->
-      <div class="jy-index-partners CfadeInUp">
-          <h3 class="module-title">合作伙伴</h3>
-          <div class="partners-container swiper-container">
-            <div class="swiper-wrapper">
-              <div class="swiper-slide">
-                <div class="img-box">
-                  <img src='{{Msg "seo" "cdn"}}/images/index/huawei.png?v={{Msg "seo" "version"}}'>
-                </div>
-                <div class="img-box">
-                  <img src='{{Msg "seo" "cdn"}}/images/index/xinyu.png?v={{Msg "seo" "version"}}'>
-                </div>
-                <div class="img-box">
-                  <img src='{{Msg "seo" "cdn"}}/images/index/duopuduo.png?v={{Msg "seo" "version"}}'>
-                </div>
-              </div>
-              <div class="swiper-slide">
-                <div class="img-box">
-                  <img src='{{Msg "seo" "cdn"}}/images/index/baidu.png?v={{Msg "seo" "version"}}'>
-                </div>
-                <div class="img-box">
-                  <img src='{{Msg "seo" "cdn"}}/images/index/ruijie.png?v={{Msg "seo" "version"}}'>
-                </div>
-                <div class="img-box">
-                  <img src='{{Msg "seo" "cdn"}}/images/index/haikang.png?v={{Msg "seo" "version"}}'>
-                </div>
-              </div>
-              <div class="swiper-slide">
-                <div class="img-box">
-                  <img src='{{Msg "seo" "cdn"}}/images/index/taipingyang.png?v={{Msg "seo" "version"}}'>
-                </div>
-                <div class="img-box">
-                  <img src='{{Msg "seo" "cdn"}}/images/index/yitu.png?v={{Msg "seo" "version"}}'>
-                </div>
-                <div class="img-box">
-                  <img src='{{Msg "seo" "cdn"}}/images/index/hanhe.png?v={{Msg "seo" "version"}}'>
-                </div>
-              </div>
-              <div class="swiper-slide">
-                <div class="img-box">
-                  <img src='{{Msg "seo" "cdn"}}/images/index/guangda.png?v={{Msg "seo" "version"}}'>
-                </div>
-                <div class="img-box">
-                  <img src='{{Msg "seo" "cdn"}}/images/index/dekey.png?v={{Msg "seo" "version"}}'>
-                </div>
-                <div class="img-box">
-                  <img src='{{Msg "seo" "cdn"}}/images/index/jida.png?v={{Msg "seo" "version"}}'>
-                </div>
-              </div>
-              <div class="swiper-slide">
-                <div class="img-box">
-                  <img src='{{Msg "seo" "cdn"}}/images/index/ali.png?v ={{Msg "seo" "version"}}'>
-                </div>
-                <div class="img-box">
-                  <img src='{{Msg "seo" "cdn"}}/images/index/zhonghui.png?v={{Msg "seo" "version"}}'>
-                </div>
-                <div class="img-box">
-                  <img src='{{Msg "seo" "cdn"}}/images/index/lianruan.png?v={{Msg "seo" "version"}}'>
-                </div>
-              </div>
-              <div class="swiper-slide">
-                <div class="img-box">
-                  <img src='{{Msg "seo" "cdn"}}/images/index/minsheng.png?v={{Msg "seo" "version"}}'>
-                </div>
-                <div class="img-box">
-                  <img src='{{Msg "seo" "cdn"}}/images/index/lehe.png?v={{Msg "seo" "version"}}'>
-                </div>
-                <div class="img-box">
-                  <img src='{{Msg "seo" "cdn"}}/images/index/meinian.png?v={{Msg "seo" "version"}}'>
-                </div>
-              </div>
-              <div class="swiper-slide">
-                <div class="img-box">
-                  <img src='{{Msg "seo" "cdn"}}/images/index/dianxin.png?v={{Msg "seo" "version"}}'>
-                </div>
-                <div class="img-box">
-                  <img src='{{Msg "seo" "cdn"}}/images/index/jingyi.png?v={{Msg "seo" "version"}}'>
-                </div>
-                <div class="img-box">
-                  <img src='{{Msg "seo" "cdn"}}/images/index/siem.png?v={{Msg "seo" "version"}}'>
-                </div>
-              </div>
-              <div class="swiper-slide">
-                <div class="img-box">
-                  <img src='{{Msg "seo" "cdn"}}/images/index/shenxin.png?v={{Msg "seo" "version"}}'>
-                </div>
-                <div class="img-box">
-                  <img src='{{Msg "seo" "cdn"}}/images/index/bot.png?v={{Msg "seo" "version"}}'>
-                </div>
-                <div class="img-box">
-                  <img src='{{Msg "seo" "cdn"}}/images/index/yidong.png?v={{Msg "seo" "version"}}'>
-                </div>
-              </div>
-              <div class="swiper-slide">
-                <div class="img-box">
-                  <img src='{{Msg "seo" "cdn"}}/images/index/wandong.png?v={{Msg "seo" "version"}}'>
-                </div>
-                <div class="img-box">
-                  <img src='{{Msg "seo" "cdn"}}/images/index/aite.png?v={{Msg "seo" "version"}}'>
-                </div>
-                <div class="img-box">
-                  <img src='{{Msg "seo" "cdn"}}/images/index/yushi.png?v={{Msg "seo" "version"}}'>
-                </div>
-              </div>
-              <div class="swiper-slide">
-                <div class="img-box">
-                  <img src='{{Msg "seo" "cdn"}}/images/index/wanfu.png?v={{Msg "seo" "version"}}'>
-                </div>
-                <div class="img-box">
-                  <img src='{{Msg "seo" "cdn"}}/images/index/lianying.png?v={{Msg "seo" "version"}}'>
-                </div>
-                <div class="img-box">
-                  <img src='{{Msg "seo" "cdn"}}/images/index/ruiwode.png?v={{Msg "seo" "version"}}'>
-                </div>
-              </div>
-              <div class="swiper-slide">
-                <div class="img-box">
-                  <img src='{{Msg "seo" "cdn"}}/images/index/drager.png?v={{Msg "seo" "version"}}'>
-                </div>
-                <div class="img-box">
-                  <img src='{{Msg "seo" "cdn"}}/images/index/stryker.png?v={{Msg "seo" "version"}}'>
-                </div>
-                <div class="img-box">
-                  <img src='{{Msg "seo" "cdn"}}/images/index/mindray.png?v={{Msg "seo" "version"}}'>
-                </div>
-              </div>
-              <div class="swiper-slide">
-                <div class="img-box">
-                  <img src='{{Msg "seo" "cdn"}}/images/index/zhongtongfu.png?v={{Msg "seo" "version"}}'>
-                </div>
-                <div class="img-box">
-                  <img src='{{Msg "seo" "cdn"}}/images/index/braun.png?v={{Msg "seo" "version"}}'>
-                </div>
-                <div class="img-box">
-                  <img src='{{Msg "seo" "cdn"}}/images/index/neusoft.png?v={{Msg "seo" "version"}}'>
-                </div>
-              </div>
-            </div>
-          </div>
-      </div>
+      {{include "/pc/template/index/banner-partners.html"}}
+      
       <!-- 预约-留资 -->
       <div class="jy-index-yuyue">
         <div class="w1200 yuyue-container">

+ 8 - 9
src/web/templates/pc/newIndex.html

@@ -47,7 +47,7 @@
           <div class="banner-swiper swiper-container" id="new-pc-index-top-carousel">
             <div class="swiper-wrapper">
               {{range $ad := $ad_1}}
-              <a class="swiper-slide" target="_blank" href="{{$ad.S_link}}">
+              <a class="swiper-slide" target="_blank" {{if $ad.S_link}}href="{{$ad.S_link}}"{{end}}>
                 <img class="img-banner" src='{{$ad.S_pic}}' alt="{{$ad.S_picalt}}">
               </a>
               {{end}}
@@ -72,7 +72,7 @@
                 <div class="banner-swiper swiper-container" id="new-pc-index-carousel">
                   <div class="swiper-wrapper">
                     {{range $ad := $ad_2}}
-                    <a class="swiper-slide" target="_blank" href="{{$ad.S_link}}">
+                    <a class="swiper-slide" target="_blank" {{if $ad.S_link}}href="{{$ad.S_link}}"{{end}}>
                       <img class="img-banner" src='{{$ad.S_pic}}' alt="{{$ad.S_picalt}}">
                     </a>
                     {{end}}
@@ -97,7 +97,7 @@
               <div class="banner-swiper swiper-container" id="new-pc-index-middle-carousel">
                 <div class="swiper-wrapper">
                   {{range $ad := $ad_3}}
-                  <a class="swiper-slide banner-remark" target="_blank" href="{{$ad.S_link}}">
+                  <a class="swiper-slide banner-remark" target="_blank" {{if $ad.S_link}}href="{{$ad.S_link}}"{{end}}>
                     <img class="img-banner" src='{{$ad.S_pic}}' alt="{{$ad.S_picalt}}">
                   </a>
                   {{end}}
@@ -118,7 +118,7 @@
                 <div class="banner-swiper swiper-container" id="new-pc-index-twenty-three-left">
                   <div class="swiper-wrapper">
                     {{range $ad := $ad_4}}
-                    <a class="swiper-slide banner-remark" target="_blank" href="{{$ad.S_link}}">
+                    <a class="swiper-slide banner-remark" target="_blank" {{if $ad.S_link}}href="{{$ad.S_link}}"{{end}}>
                       <img class="img-banner" src='{{$ad.S_pic}}' alt="{{$ad.S_picalt}}">
                     </a>
                     {{end}}
@@ -133,7 +133,7 @@
                 <div class="banner-swiper swiper-container" id="new-pc-index-twenty-three-right">
                   <div class="swiper-wrapper">
                     {{range $ad := $ad_5}}
-                    <a class="swiper-slide banner-remark" target="_blank" href="{{$ad.S_link}}">
+                    <a class="swiper-slide banner-remark" target="_blank" {{if $ad.S_link}}href="{{$ad.S_link}}"{{end}}>
                       <img class="img-banner" src='{{$ad.S_pic}}' alt="{{$ad.S_picalt}}">
                     </a>
                     {{end}}
@@ -208,7 +208,6 @@
       {{include "/common/pcbottom.html"}}
     </div>
   </section>
-
   <script src="//cdn-common.jianyu360.com/cdn/lib/vue/2.7.14/vue.min.js"></script>
   <script src=//cdn-common.jianyu360.com/cdn/lib/svga-web/svga.min.js></script>
   <script src="//cdn-common.jianyu360.com/cdn/lib/element-ui/2.15.7/lib/index.js"></script>
@@ -224,12 +223,12 @@
   {{include "/pc/template/index/index-bottom-float-ad.html"}}
   <!-- 新用户弹窗 -->
   <!-- include "/common/pc_ad_dialog.html" -->
-  <script type="text/javascript" src='{{Msg "seo" "cdn"}}/js/index/index_2023.12.js?v={{Msg "seo" "version"}}'></script>
-  <script defer src=//cdn-common.jianyu360.com/cdn/lib/echarts/4.8.0/echarts.min.js></script>
-  <script defer type="text/javascript" src='{{Msg "seo" "cdn"}}/js/index/index_charts.js?v={{Msg "seo" "version"}}'></script>
   <script>
     haslogin('10')
   </script>
+  <script type="text/javascript" src='{{Msg "seo" "cdn"}}/js/index/index_2023.12.js?v={{Msg "seo" "version"}}'></script>
+  <script defer src=//cdn-common.jianyu360.com/cdn/lib/echarts/4.8.0/echarts.min.js></script>
+  <script defer type="text/javascript" src='{{Msg "seo" "cdn"}}/js/index/index_charts.js?v={{Msg "seo" "version"}}'></script>
 </body>
 
 </html>

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

@@ -99,12 +99,12 @@
         <div class="w vue-search-container" id="pur-search-container" v-cloak>
             <div class="search-header">
                 <div class="search-header-tab">
-                  <span class="tab-item" v-show="!inIframe" @click="location.replace('/jylab/supsearch/index.html')">招标采购公告</span>
+                  <span class="tab-item" v-show="!inIframe" @click="location.replace('/jylab/supsearch/index.html?searchGroup=1')">招标采购公告</span>
                   <span class="tab-item" v-show="!inIframe" @click="location.replace('/jylab/entSearch/index.html')">企业搜索</span>
                   <span class="tab-item tab-active">采购单位搜索</span> <!-- @click="location.replace('/jylab/purSearch/index.html')" -->
                   <span class="tab-item" v-show="!inIframe" @click="location.replace('/swordfish/page_web_pc/search/issued')">供应搜索</span>
-                  <span class="tab-item" v-show="!inIframe && isLogin" @click="location.replace('/jylab/supsearch/index.html?tab=2')">超前项目查询</span>
-                  <!-- <span class="tab-item" v-show="!inIframe" @click="location.replace('/jylab/entSearch/index.html')">拟在建项目查询</span> -->
+                  <span class="tab-item" v-show="!inIframe" @click="location.replace('/jylab/supsearch/index.html?tab=2&searchGroup=2')">超前项目查询</span>
+                  <span class="tab-item" v-show="!inIframe" @click="location.replace('/swordfish/page_web_pc/search/construction')">拟在建项目查询</span>
                   <div class="search-tab-right" v-show="isLogin && !inIframe">
                     <button class="page-back-btn" @click="goBack">返回</button>
                     <div class="into-work-space" @click="goWorkSpace">
@@ -303,7 +303,7 @@
                             <div class="list-item-left">
                               <div class="list-logo" :class="item.randomBgc">${item.buyerShortName ? item.buyerShortName.slice(0,4) : item.buyer.slice(0,4)}</div>
                               <div class="list-info">
-                                <div class="info-name" @click="goTitle(item.buyer)">${item.buyer}</div>
+                                <div class="info-name" @click="goTitle(item)">${item.buyer}</div>
                                 <div class="info-detail  flex-between">
                                   <div class="flex">
                                     <div class="info-item">

+ 11 - 16
src/web/templates/pc/supsearch.html

@@ -698,8 +698,8 @@
         <span class="search-tab-item tab-item-ent-search" style="display: none;"  @click="location.replace('/jylab/entSearch/index.html')">企业搜索</span>
         <span class="search-tab-item tab-item-buyer-search" style="display: none;"  @click="location.replace('/jylab/purSearch/index.html')">采购单位搜索</span>
         <span class="search-tab-item tab-item-supply-search" style="display: none;"  @click="location.replace('/swordfish/page_web_pc/search/issued')">供应搜索</span>
-        <span class="search-tab-item tab-item-recommend-search" style="display: none;" :class="{'tab-active': searchTab === 2}"  @click="location.replace('/jylab/supsearch/index.html?tab=2')">超前项目查询</span>
-        <!-- <span class="search-tab-item tab-item-nzj-search" style="display: none;"  @click="location.replace('/swordfish/page_web_pc/search/issued')">拟在建项目查询</span> -->
+        <span class="search-tab-item tab-item-recommend-search" style="display: none;" :class="{'tab-active': searchTab === 2}"  @click="location.replace('/jylab/supsearch/index.html?tab=2&searchGroup=2')">超前项目查询</span>
+        <span class="search-tab-item tab-item-nzj-search" style="display: none;"  @click="location.replace('/swordfish/page_web_pc/search/construction')">拟在建项目查询</span>
         <div class="search-tab-right">
           <button class="page-back-btn" @click="goBack">返回</button>
           <div class="into-work-space" @click="goWorkSpace">
@@ -1979,7 +1979,7 @@
         '.tab-item-ent-search',
         '.tab-item-buyer-search',
         '.tab-item-supply-search',
-        // '.tab-item-recommend-search',
+        '.tab-item-recommend-search',
         '.tab-item-nzj-search'
       ]
       for (let i = 0; i < searchDoms.length; i++) {
@@ -2009,6 +2009,7 @@
       $('#go-customer-4').removeClass('hide')
       if(!goTemplateData.inIframe) {
         $('.nologin-hide').addClass('hide')
+        $('.tab-detail-list').removeClass('hide')
         $('.search-tab-right').show()
         $('.badge-recommend').hide()
         $('.search-tab-item-0').hide()
@@ -2049,9 +2050,6 @@
           $('.search-tab-item-0').show()
         }
       }
-      if (searchInnerVue.islogin && !goTemplateData.inIframe) {
-        $('.tab-item-recommend-search').show()
-      }
       /**
        * @date 2022/12/15 山川环境嵌入搜索
        */
@@ -2896,16 +2894,13 @@ function checkTagDisabled () {
     if(loginflag){
       checkVisited()
       // aHref += aHref.indexOf('?') > -1 ? '&aside=0' : '?aside=0'
-      var targetLink = '/article/content/' + thisId + aHref
+      var prefix = goTemplateData.inIframe ? '/article/content/' : '/nologin/content/'
+      var targetLink = prefix + thisId + aHref
       // 在iframe里,往工作桌面跳转。不在iframe里,正常跳转
-      // if(goTemplateData.inIframe){
-      //   var workspaceTargetLink = location.origin + targetLink
-      //   var wordspcePage = '/page_workDesktop/work-bench/page?link=' + encodeURIComponent(workspaceTargetLink)
-      //   window.open(wordspcePage)
-      // } else {
-      //   window.open(targetLink)
-      // }
-      window.open(targetLink)
+      openLinkInWorkspace(goTemplateData.inIframe, {
+        url: targetLink,
+        newTab: true,
+      })
     }else{//没有登录跳转新的详情
       checkVisited('nologin')
       // 渠道合作页,未登录跳转需要弹出登录,重置到已登录后的详情页
@@ -5081,7 +5076,7 @@ function checkTagDisabled () {
         // 优化-点击当前tab不刷新
         if (!goTemplateData.inIframe) {
           if(item === 1) {
-            location.replace('/jylab/supsearch/index.html')
+            location.replace('/jylab/supsearch/index.html?searchGroup=1')
           }
         }
         this.searchTab = item

+ 44 - 6
src/web/templates/pc/tags/detail.html

@@ -18,6 +18,8 @@
   <script type="text/javascript" src='{{Msg "seo" "cdn"}}/js/public-nav.js?v={{Msg "seo" "version"}}'></script>
   <script>
 		var id = {{.T.obj._id}}
+    var canRead = {{.T.canRead}}
+    console.info(canRead, 'canRead')
 	</script>
 </head>
 <body style="height: 100%">
@@ -64,7 +66,7 @@
   <div class="no-login-detail">
     <div class="w1200">
       <div class="bread-nav">
-        <span><a style="color: #686868;" href="/">剑鱼标讯</a></span><span> > </span><span><a style="color: #686868;" {{if eq  .T.obj.stypeadd "NJXM"}} href="javascript:volid(0);" {{else if eq  .T.obj.stypeadd "ZBCGYX" }} href="javascript:volid(0);" {{else}} href="/list/stype/{{.T.obj.stypeadd}}.html" {{end}}>{{if .T.obj.subtype}}{{.T.obj.subtype}}{{else}}{{.T.obj.toptype}}{{end}}项目</a></span><span> > </span><span class="active">{{.T.obj.title}}</span>
+        <span><a style="color: #686868;" href="/">剑鱼标讯</a></span><span> > </span><span><a style="color: #686868;" {{if eq  .T.obj.stypeadd "NJXM"}} href="javascript:volid(0);" {{else if eq  .T.obj.stypeadd "ZBCGYX" }} href="/list/stype/CGYX.html" {{else}} href="/list/stype/{{.T.obj.stypeadd}}.html" {{end}}>{{if .T.obj.subtype}}{{.T.obj.subtype}}{{else}}{{.T.obj.toptype}}{{end}}项目</a></span><span> > </span><span class="active">{{.T.obj.title}}</span>
       </div>
       <div class="page-content">
         <!-- 正文内容 -->
@@ -79,8 +81,10 @@
             <div class="bid-handle">
               <div class="com-statusbar" id="statusbar"></div>
               <div>
+                {{if .T.canRead}}
                 <span class="login-node wx-share">微信分享</span>
                 <span class="login-node bx-follow">关注项目</span>
+                {{end}}
                 <span class="login-node bx-collect">标讯收藏</span>
               </div>
             </div>
@@ -88,6 +92,7 @@
           <div class="bid-banner">
             <img id="login-banner-btn" class="login-node" src='{{Msg "seo" "cdn"}}/tags/images/login-banner.png?v={{Msg "seo" "version"}}' alt="loginBanner" />
           </div>
+          {{if .T.canRead}}
           <div class="bid-content">
             <!-- 非<拟建项目>、<采购意向>基本信息表格 -->
             <div id="tab2" style="display:none;margin-top: 0;">
@@ -117,8 +122,9 @@
                     <td class="t-text t-text-buyer">
                       <span>{{.T.obj.buyer}}</span>
                       {{if .T.obj.buyer}}
-                        {{if ne  .T.obj.buyer ""}}
-                        <a href="/swordfish/page_big_pc/unit_portrayal/{{.T.obj.buyer}}" target="_blank" class="go-detail" rel="nofollow">立即查看</a>
+                        <!-- <a href="/swordfish/page_big_pc/unit_portrayal/{{.T.obj.buyer}}" target="_blank" class="go-detail" rel="nofollow">立即查看</a> -->
+                        {{if .T.obj.buyerSeoId }}
+                        <a href="/dw/{{.T.obj.buyerSeoId}}.html" target="_blank" class="go-detail">立即查看</a>
                         {{end}}
                       {{end}}
                     </td>
@@ -203,6 +209,26 @@
            <!--未登录展示的引导广告-->
           <div class="reg-service login-node"></div>
           </div>
+          {{else}}
+            <div class="bid-content login-node" style="position: relative;">
+              <div class="mask-zz" style="position:absolute; top:0;width: 828px;padding:0;height: 408px;background-color:white;z-index: 1;">
+                <img style="width: 100%;height: 100%;margin-top: 27px;" src="/images/pc/pc_mh.png">
+                <div class="mask-zz" style="position:absolute; left: 50%; top: 50%; margin-top: -184px;margin-left: -320px;width: 650px;height: 220px;background-color: white;z-index: 100;border-radius: 10px">
+                    <div style="position: relative">
+                        <img style="width: 100%;height: 128px;" src='{{Msg "seo" "cdn"}}/images/pc/pc-cq-mmt.png?v={{Msg "seo" "version"}}'>
+                        <div id="tip-title" style="position: absolute;top: 50%;left: 50%; margin-top: -38px;transform: translateX(-50%);height: 26px;color: antiquewhite;font-size: 14px;"></div>
+                    </div>
+                    <div class="tip-box" style="position: absolute;">
+                        <div class="tip-box-example" style="width: 602px;margin-top: -88px;z-index: 9;">
+                          <img style="width: 100%;height: 100%;" src="{{Msg "seo" "cdn"}}/images/pc/pc-cq-example.png?v={{Msg "seo" "version"}}" alt="">
+                        </div>
+                        <div class="tip-text" style="margin-top: 12px"></div>
+                        <button class="detail-nj-btn" style="background: #2CB7CA;color: white;border:none;padding: 6px 18px; border-radius: 6px;margin-bottom: 20px;margin-top: 24px">登陆后解锁会员查看</button>
+                    </div>
+                </div>
+              </div>
+            </div>
+            {{end}}
           <div class="bid-footer">
             <div class="otherinfo">
               <!--同一个项目的其他招标信息-->
@@ -214,7 +240,7 @@
                 {{range $k,$v := .T.projectOther}}
                 <li>
                   <div class="com-index">{{$v.index}}.</div>
-                  <div class="com-title"><a href="/nologin/content/{{$v._id}}.html{{if $v.industry}}?industry={{$v.industry}}{{end}}" target="_blank">{{$v.title}}</a></div>
+                  <div class="com-title"><a href="/nologin/content/{{$v._id}}.html{{if $v.industry}}?industry={{$v.industry}}{{end}}" target="_blank" title="{{$v.title}}">{{$v.title}}</a></div>
                   <div class="com-status">
                     {{if $v.area}}<span class="com-area"><a href="/list/area/{{$v.areaadd}}.html">{{$v.area}}</a></span>{{end}}
                     {{if $v.type}}
@@ -240,7 +266,7 @@
                 {{range $k,$v := .T.buyerOther}}
                 <li>
                   <div class="com-index">{{$v.index}}.</div>
-                  <div class="com-title"><a href="/nologin/content/{{$v._id}}.html{{if $v.industry}}?industry={{$v.industry}}{{end}}" target="_blank">{{$v.title}}</a></div>
+                  <div class="com-title"><a href="/nologin/content/{{$v._id}}.html{{if $v.industry}}?industry={{$v.industry}}{{end}}" target="_blank" title="{{$v.title}}">{{$v.title}}</a></div>
                   <div class="com-status">
                     {{if $v.area}}<span class="com-area"><a href="/list/area/{{$v.areaadd}}.html">{{$v.area}}</a></span>{{end}}
                     {{if $v.type}}
@@ -266,7 +292,7 @@
                 {{range $k,$v := .T.winnerOther}}
                 <li>
                   <div class="com-index">{{$v.index}}.</div>
-                  <div class="com-title"><a href="/nologin/content/{{$v._id}}.html{{if $v.industry}}?industry={{$v.industry}}{{end}}" target="_blank">{{$v.title}}</a></div>
+                  <div class="com-title"><a href="/nologin/content/{{$v._id}}.html{{if $v.industry}}?industry={{$v.industry}}{{end}}" target="_blank" title="{{$v.title}}">{{$v.title}}</a></div>
                   <div class="com-status">
                     {{if $v.area}}<span class="com-area"><a href="/list/area/{{$v.areaadd}}.html">{{$v.area}}</a></span>{{end}}
                     {{if $v.type}}
@@ -334,6 +360,18 @@
   {{include "/common/baiducc.html"}}
   <!--百度统计end-->
   <script>
+    var subtype = {{.T.obj.subtype}}
+    if(subtype == '拟建') {
+      $('.bid-content #tip-title').text('超前项目抢先知,中标更容易')
+      $('.bid-content .tip-text').text('提前3-12个月获取审批中的新项目,超前项目抢先介入,商机提前掌控。')
+      $('.tip-box-example img').attr('src', '{{Msg "seo" "cdn"}}/images/pc/pc-nj-example.png?v={{Msg "seo" "version"}}')
+      $('.tip-box-example').css('height', '357px')
+    } else if (subtype == '采购意向') {
+      $('.bid-content #tip-title').text('项目提前介入,中标更轻松')
+      $('.bid-content .tip-text').text('提前1-3个月获取项目信息,及早介入准备更充分')
+      $('.tip-box-example img').attr('src', '{{Msg "seo" "cdn"}}/images/pc/pc-cq-example.png?v={{Msg "seo" "version"}}')
+      $('.tip-box-example').css('height', '324px')
+    }
     var loginTimer = null
     $('.reg-node').click(function(){
       location.href = '/phone/register'

+ 4 - 2
src/web/templates/pc/tags/template/nijian-table.html

@@ -13,18 +13,20 @@
             <td class="t-label">业主单位</td>
             <td class="t-text tab-cont table-content-wrapper owner">
                 <template v-if="isEntnicheNew || isEntService">
+                    <!-- :href-data="'/entpc/unit_portrayal/' + tableInfo.owner" -->
                     <div
                             v-show="ownerEnable"
-                            :href-data="'/entpc/unit_portrayal/' + tableInfo.owner"
+                            :href-data="'/dw/' + tableInfo.buyerSeoId + '.html'"
                             v-html="tableInfo.owner"
                             tip-data="查看业主单位画像"
                             class="cont-cont portrait_img fl"></div>
                     <div class="claim claim-no fr" v-if="ownerEnable">认领</div>
                 </template>
                 <template v-else>
+                    <!-- :href-data="'/swordfish/page_big_pc/unit_portrayal/' + tableInfo.owner" -->
                     <div
                             v-show="ownerEnable"
-                            :href-data="'/swordfish/page_big_pc/unit_portrayal/' + tableInfo.owner"
+                            :href-data="'/dw/' + tableInfo.buyerSeoId + '.html'"
                             v-html="tableInfo.owner"
                             tip-data="查看业主单位画像"
                             class="cont-cont portrait_img fl"></div>

+ 1 - 1
src/web/templates/pc/template/index/banner-module-27.html

@@ -5,7 +5,7 @@
   <ul class="banner-module-list-27 clearfix">
     {{range $ad := $ad_27}}
     <li class="banner-module-item-27 banner-remark">
-      <a href="{{$ad.S_link}}" target="_blank">
+      <a {{if $ad.S_link}}href="{{$ad.S_link}}"{{end}} target="_blank">
         <img src='{{$ad.S_pic}}' alt="{{$ad.S_picalt}}">
       </a>
     </li>

+ 69 - 59
src/web/templates/pc/template/index/index-bottom-float-ad.html

@@ -1,63 +1,73 @@
-<div class="pc-index-bottom" style="display: none;">
-  <img class="bottom-member-ad" adv_name="PC首页广告位-底部" src="" alt="底部广告位">
-</div>
-
-<script>
-  $(function () {
-    // 首页底部广告位
-    {{$bottom:=(Ad "jy_pc_index_bottom" -1 .Host)}}
-    var bottom_img = ({{$bottom}})
-
-    // 首页底部样式调整,适配广告位
-    function fixBottomADHeight (type) {
-      var adHeight = $('.pc-index-bottom').height()
-      if (type) {
-        $(".jy_renzheng").css('padding-bottom', adHeight)
-        $(".j-bottom").attr('data-padding-bottom', Number($(".j-bottom").css('padding-bottom').replace('px', '')))
-        $(".j-bottom").css('padding-bottom', Number($(".j-bottom").css('padding-bottom').replace('px', '')) + adHeight)
-      } else {
-        $(".jy_renzheng").css('padding-bottom', 0)
-        $(".j-bottom").css('padding-bottom', Number($(".j-bottom").attr('data-padding-bottom')))
-      }
-    }
-    $('.pc-index-bottom .bottom-member-ad').on('load', function () {
-      fixBottomADHeight(true)
-    })
-    $('.pc-index-bottom .bottom-member-ad').attr('src', bottom_img[0].s_pic)
-    $('.pc-index-bottom .bottom-member-ad').unbind('click').click(function () {
-      window.open(bottom_img[0].s_link)
-    })
-
-
-    clearInterval(memberTimer)
-    var memberTimer = setInterval(function () {
-      if (window.memberStatus >= 0) {
-        clearInterval(memberTimer)
-      }
-      adBottomFn()
-    }, 2000)
-    function adBottomFn () {
-      if (window.memberStatus > 0) {
-        $('.pc-index-bottom').hide()
-        fixBottomADHeight(false)
-      } else {
-        var top1 = 0;
-        var top2 = 0;
-        var timer = null; 
-        $('.pc-index-bottom').fadeIn()
-        $(document).scroll(function(){
-          clearTimeout(timer)
-          timer = setTimeout(isScrollEnd, 1000);
-          top1 = document.documentElement.scrollTop || document.body.scrollTop;
-          $('.pc-index-bottom').fadeOut()
+{{$bottom:=(Ad "jy_pc_index_bottom" -1 .Host)}}
+{{if $bottom}}
+  {{if gt (len $bottom) 0}}
+    <div class="pc-index-bottom" style="display: none;">
+      <img class="bottom-member-ad" adv_name="PC首页广告位-底部" src="" alt="底部广告位">
+    </div>
+    
+    <script>
+      $(function () {
+        // 首页底部广告位
+        var bottom_img = ({{$bottom}})
+        // 首页底部样式调整,适配广告位
+        function fixBottomADHeight (type) {
+          var adHeight = $('.pc-index-bottom').height()
+          if (type) {
+            $(".jy_renzheng").css('padding-bottom', adHeight)
+            $(".j-bottom").attr('data-padding-bottom', Number($(".j-bottom").css('padding-bottom').replace('px', '')))
+            $(".j-bottom").css('padding-bottom', Number($(".j-bottom").css('padding-bottom').replace('px', '')) + adHeight)
+          } else {
+            $(".jy_renzheng").css('padding-bottom', 0)
+            $(".j-bottom").css('padding-bottom', Number($(".j-bottom").attr('data-padding-bottom')))
+          }
+        }
+        $('.pc-index-bottom .bottom-member-ad').on('load', function () {
+          fixBottomADHeight(true)
         })
-        function isScrollEnd() {
-          top2 = document.documentElement.scrollTop || document.body.scrollTop;
-          if(top1 == top2 && (window.memberStatus <= 0 || !window.memberStatus)){
+        if ($.isArray(bottom_img)) {
+          if (bottom_img[0]) {
+            if (bottom_img[0].s_pic) {
+              $('.pc-index-bottom .bottom-member-ad').attr('src', bottom_img[0].s_pic)
+            }
+            if (bottom_img[0].s_link) {
+              $('.pc-index-bottom .bottom-member-ad').unbind('click').click(function () {
+                window.open(bottom_img[0].s_link)
+              })
+            }
+          }
+        }
+    
+        clearInterval(memberTimer)
+        var memberTimer = setInterval(function () {
+          if (window.memberStatus >= 0) {
+            clearInterval(memberTimer)
+          }
+          adBottomFn()
+        }, 2000)
+        function adBottomFn () {
+          if (window.memberStatus > 0) {
+            $('.pc-index-bottom').hide()
+            fixBottomADHeight(false)
+          } else {
+            var top1 = 0;
+            var top2 = 0;
+            var timer = null; 
             $('.pc-index-bottom').fadeIn()
+            $(document).scroll(function(){
+              clearTimeout(timer)
+              timer = setTimeout(isScrollEnd, 1000);
+              top1 = document.documentElement.scrollTop || document.body.scrollTop;
+              $('.pc-index-bottom').fadeOut()
+            })
+            function isScrollEnd() {
+              top2 = document.documentElement.scrollTop || document.body.scrollTop;
+              if(top1 == top2 && (window.memberStatus <= 0 || !window.memberStatus)){
+                $('.pc-index-bottom').fadeIn()
+              }
+            }
           }
         }
-      }
-    }
-  })
-</script>
+      })
+    </script>
+  {{end}}
+{{end}}

+ 1 - 1
src/web/templates/pc/template/index/partners-project-list.html

@@ -5,7 +5,7 @@
   <ul class="partners-project-list clearfix">
     {{range $ad := $ad_5}}
     <li class="partners-project-item">
-      <a href="{{$ad.S_link}}">
+      <a {{if $ad.S_link}}href="{{$ad.S_link}}"{{end}} target="_blank">
         <img src="{{$ad.S_pic}}" alt="{{$ad.S_picalt}}">
       </a>
     </li>

+ 5 - 1
src/web/templates/pc/template/index/project-card-list-container.html

@@ -4,7 +4,7 @@
     <h3 class="module-card-title">项目专区</h3>
   </header>
   <main class="module-card-content">
-    {{range $v := .T.projectZone}}
+    {{range $k,$v := .T.projectZone}}
     <section class="cms-card">
       <header class="cms-card-header">
         <h3 class="cms-card-title">{{$v.types}}</h3>
@@ -17,7 +17,11 @@
           {{range $kk,$vv := $v.listData}}
           {{if lt $kk 5}}
           <li class="cms-card-list-item">
+            {{if lt $k 3}}
+            <a class="cms-card-list-item-left cms-link ellipsis" target="_blank" title="{{$vv.title}}" href="/swordfish/page_web_pc/proposed/detail?pid={{$vv.proposed_id}}" target="_blank">{{$vv.title}}</a>
+            {{else}}
             <a class="cms-card-list-item-left cms-link ellipsis" target="_blank" title="{{$vv.title}}" href="/nologin/content/{{$vv._id}}.html" target="_blank">{{$vv.title}}</a>
+            {{end}}
             <span class="cms-card-list-item-right">{{$vv.publish_time}}</span>
           </li>
           {{end}}

+ 1 - 1
src/web/templates/pc/template/index/user-info-card.html

@@ -43,7 +43,7 @@
     <ul class="user-power-list clearfix">
       {{range $ad := $ad_menu}}
         <li class="user-power-item pointer">
-          <a class="user-power-item-link" href="{{$ad.S_link}}">
+          <a class="user-power-item-link" {{if $ad.S_link}}href="{{$ad.S_link}}"{{end}}>
             <span class="user-power-item-icon">
               <img src="{{$ad.S_pic}}" alt="{{$ad.S_picalt}}">
             </span>

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