浏览代码

Merge branch 'dev/v4.8.47_fuwencai' of https://jygit.jydev.jianyu360.cn/qmx/jy into dev/v4.8.47_fuwencai

fuwencai 2 年之前
父节点
当前提交
89243712e7

+ 44 - 11
src/jfw/modules/app/src/app/front/tags.go

@@ -4,6 +4,7 @@ import (
 	qu "app.yhyue.com/moapp/jybase/common"
 	"app.yhyue.com/moapp/jybase/go-xweb/xweb"
 	"app.yhyue.com/moapp/jybase/redis"
+	"app.yhyue.com/moapp/jypkg/common/src/qfw/util/bidsearch"
 	"fmt"
 	"jy/src/jfw/modules/app/src/jfw/config"
 	"strconv"
@@ -25,15 +26,30 @@ func init() {
 	if config.Seoconfig["mobileSeoAd"] != nil {
 		adCode = config.Seoconfig["mobileSeoAd"].(string)
 	}
+
+	do := qu.IntAll(config.Seoconfig["executionNum"])
+	wait := qu.IntAll(config.Seoconfig["awaitNum"])
+	//创建执行池 等待池
+	doPool := make(chan struct{}, do)
+	for i := 0; i < do; i++ {
+		doPool <- struct{}{}
+	}
+	waitPool := make(chan struct{}, wait)
+	for i := 0; i < wait; i++ {
+		waitPool <- struct{}{}
+	}
+	reqLimitInit = &reqLimit{
+		doPool:   doPool,
+		waitPool: waitPool,
+	}
 }
 
 func (tg *Tags) TagsIndex(types, name string) error {
 	defer qu.Catch()
 	tagsMobileKey := fmt.Sprintf("tags_mobile_key_%s_%s", types, name)
-	if res := redis.Get("seoCache", tagsMobileKey); res == nil || res == "" {
+	if res := redis.Get("seoCache", tagsMobileKey); true || res == nil || res == "" {
 		var (
-			pageNum         = 1                      //当前页码
-			pageSize        = 25                     //每页数据量
+			pageNum         int
 			areaList        []map[string][]*AreaInfo //地区
 			currentLocation []*AreaInfo
 			areaToCode      = map[string]*AreaInfo{}
@@ -42,7 +58,9 @@ func (tg *Tags) TagsIndex(types, name string) error {
 			infoTypeList    []map[string]interface{} //信息类型
 			topMap          = map[string]*AreaInfo{}
 			biddingInfo     = BiddingInfo{
-				Total: total,
+				Total:    total,
+				PageSize: 25, //每页数据量
+				PageNum:  1,  //当前页码
 			}
 		)
 		industryData, industryNav := GetIndustry("/jyapp/tags/indu/%d_%d_1.html")
@@ -63,42 +81,57 @@ func (tg *Tags) TagsIndex(types, name string) error {
 				}
 			}
 			biddingInfo.Total = 8
+			biddingInfo.PageSize = 8
 		case label["infoType"]: //信息类型
 			if codes := strings.Split(name, "_"); len(codes) > 1 {
-				if topMap != nil {
-					biddingInfo.TopType = topMap[codes[0]].name
+				if topMap != nil && topMap[codes[0]] != nil {
+					biddingInfo.TopType = bidsearch.TopType[topMap[codes[0]].name]
 					currentLocation = append(currentLocation, topMap[codes[0]])
 				}
 				pageNum, _ = strconv.Atoi(codes[1])
 			}
 		case label["industry"]: //行业
 			if codes := strings.Split(name, "_"); len(codes) > 2 {
-				indu2, _, _ := GetInsturyKeywords(codes[1]) // 获取标的物的名称
+				indu2, class1, class2 := GetIndustryKeywords(codes[1]) // 获取标的物的名称
 				// 位置导航
 				currentLocation = append(currentLocation, &AreaInfo{
 					name: fmt.Sprintf("%s招标导航", indu2),
 				})
+				pageNum, _ = strconv.Atoi(codes[2])
+				biddingInfo.Industry = fmt.Sprintf("%s_%s", class1, class2)
 			}
-
 		case label["buyer"]: //采购单位
+			pageNum, _ = strconv.Atoi(name)
 			biddingInfo.IsBuyer = true
 			currentLocation = append(currentLocation, &AreaInfo{
 				name: "采购单位",
 			})
 		case label["winner"]: //中标单位
+			pageNum, _ = strconv.Atoi(name)
 			biddingInfo.IsWinner = true
 			currentLocation = append(currentLocation, &AreaInfo{
 				name: "中标企业",
 			})
+		default:
+			biddingInfo.Total = 8
+			biddingInfo.PageSize = 8
 		}
+		if pageNum > 0 && pageNum <= biddingInfo.Total/biddingInfo.PageSize {
+			biddingInfo.PageNum = pageNum
+		}
+		//biddingInfo.Keys = "信息"
+		//biddingInfo.Area = "湖北"
+		//biddingInfo.City = "武汉市"
+		//biddingInfo.Industry = "信息技术_运维服务"
+
 		//信息类型
 		tg.T["infoTypeList"] = infoTypeList //tg.GetInfoType()
 		tg.T["areaList"] = areaList
 		tg.T["currentLocation"] = currentLocation
 		tg.T["adList"] = tg.GetAdInfo()
-		tg.T["biddingList"] = ""
-		tg.T["pageNum"] = pageNum
-		tg.T["pageSize"] = pageSize
+		tg.T["biddingList"] = biddingInfo.GetBiddingInfo(types, name, currentLocation)
+		tg.T["totalPage"] = (biddingInfo.Total-1)/biddingInfo.PageSize + 1
+		tg.T["pageNum"] = biddingInfo.PageNum
 		tg.T["hotArea"] = tg.GetHotArea()
 		tg.T["industryData"] = industryData // 行业标的物全部
 		tg.T["industryNav"] = industryNav   // 标的物小于5个字的

+ 300 - 21
src/jfw/modules/app/src/app/front/ws.go

@@ -3,24 +3,31 @@ package front
 import (
 	qu "app.yhyue.com/moapp/jybase/common"
 	"app.yhyue.com/moapp/jybase/encrypt"
+	elastic "app.yhyue.com/moapp/jybase/es"
 	"app.yhyue.com/moapp/jybase/redis"
+	"app.yhyue.com/moapp/jypkg/common/src/qfw/util/bidsearch"
 	"app.yhyue.com/moapp/jypkg/public"
+	"context"
+	"encoding/json"
 	"fmt"
 	"github.com/pkg/errors"
 	"jy/src/jfw/modules/app/src/app/jyutil"
 	"log"
+	"reflect"
 	"strconv"
 	"strings"
 	"sync"
+	"time"
 )
 
 // 最后与tags合并后 删除
 var (
-	cacheTime            = 1200 // * 60 * 60
+	cacheTime            = 12 * 60 //* 60
 	mobileHref           = "/jyapp/tags/%s/%s"
 	infoTypeRedisKey     = "mobile_seo_infoType_home"
 	areaRedisKey         = "mobile_seo_area_home"
 	hotAreaRedisKey      = "mobile_seo_hot_area"
+	biddingListKey       = "mobile_seo_list_%s_%s_%d"
 	industryRedisKey     = "mobile_seo_industry"
 	industryLessRedisKey = "mobile_seo_industry_less"
 	buyerListRedisKey    = "mobile_seo_buyer_list_%d"
@@ -28,9 +35,8 @@ var (
 	buyerListLimit       = 5000
 	winnerListLimit      = 5000
 	listPageSize         = 25
-
-	hotArea = "北京,山东,陕西,河南,广东"
-	label   = map[string]string{
+	hotArea              = "北京,山东,陕西,河南,广东"
+	label                = map[string]string{
 		"area":     "area",
 		"infoType": "it",
 		"industry": "indu",
@@ -143,9 +149,16 @@ var (
 	adCode       = "mobile_seo_ad"
 	areaLock     = sync.Mutex{}
 	infoTypeLock = sync.Mutex{}
+	infoListLock = sync.Mutex{}
 	total        = 5000
+	reqLimitInit *reqLimit
 )
 
+type reqLimit struct {
+	doPool   chan struct{}
+	waitPool chan struct{}
+}
+
 // 获取广告位
 func (tg *Tags) GetAdInfo() (adInfo []jyutil.AdInfo) {
 	obj := redis.Get("seoCache", "ad_"+adCode)
@@ -182,8 +195,8 @@ func (tg *Tags) GetInfoType() (list []map[string]interface{}, topMap map[string]
 	if data != nil && len(data) > 0 {
 		infoTypeLock.Lock()
 		defer infoTypeLock.Unlock()
+		topMap = map[string]*AreaInfo{}
 		for _, v := range data {
-			topMap = map[string]*AreaInfo{}
 			list = append(list, map[string]interface{}{
 				"name": qu.ObjToString(v["name"]),
 				"url:": fmt.Sprintf(mobileHref, label["infoType"], combine(2, qu.Int64All(v["id"]), 1, 0)),
@@ -230,8 +243,9 @@ func combine(num int, pid, id, pageNum int64) string {
 }
 
 type AreaInfo struct {
-	name string
-	url  string
+	name     string
+	url      string
+	nickname string
 }
 
 // 获取所有地区信息
@@ -297,17 +311,6 @@ func (tg *Tags) GetAllArea() (areaList []map[string][]*AreaInfo, areaToCode map[
 	return
 }
 
-type BiddingInfo struct {
-	Area     string
-	City     string
-	TopType  string
-	Industry string
-	Keys     string
-	IsBuyer  bool
-	IsWinner bool
-	Total    int
-}
-
 // GetIndustry 获取行业和行业下标的物
 func GetIndustry(industryHref string) (interface{}, interface{}) {
 	rediskey := fmt.Sprintf(industryRedisKey)
@@ -374,7 +377,7 @@ func IsInArr(arr []string, s string) bool {
 }
 
 // 获取行业分类下的标签
-func GetInsturyKeywords(idstr string) (name, class_1, class_2 string) {
+func GetIndustryKeywords(idstr string) (name, class_1, class_2 string) {
 	id, _ := strconv.Atoi(idstr)
 	data := public.BaseMysql.SelectBySql(`select id,class_1,class_2,name from seo_words.seo_industry where id =?`, id)
 	if data != nil && len(*data) > 0 {
@@ -382,10 +385,286 @@ func GetInsturyKeywords(idstr string) (name, class_1, class_2 string) {
 			class_1 = qu.ObjToString(v["class_1"])
 			name = qu.ObjToString(v["name"])
 			class_2 = qu.ObjToString(v["class_2"])
-			return name, class_1, class_2
+			return
+		}
+	}
+	return
+}
+
+type BiddingInfo struct {
+	Area     string
+	City     string
+	TopType  string
+	Industry string
+	Keys     string
+	IsBuyer  bool
+	IsWinner bool
+	Total    int
+	PageNum  int
+	PageSize int
+}
+
+var (
+	biddingType = []*AreaInfo{
+		{
+			name: "招标预告",
+			url:  fmt.Sprintf(mobileHref, label["infoType"], combine(2, 2, 1, 0)),
+		},
+		{
+			name: "招标公告",
+			url:  fmt.Sprintf(mobileHref, label["infoType"], combine(2, 3, 1, 0)),
+		},
+		{
+			name: "招标结果",
+			url:  fmt.Sprintf(mobileHref, label["infoType"], combine(2, 4, 1, 0)),
+		},
+		{
+			name: "招标信用信息",
+			url:  fmt.Sprintf(mobileHref, label["infoType"], combine(2, 5, 1, 0)),
+		},
+		{
+			name:     "拟建项目",
+			nickname: "拟建",
+			url:      fmt.Sprintf(mobileHref, label["infoType"], combine(2, 1, 1, 0)),
+		},
+	}
+)
+
+func (b *BiddingInfo) GetSearchSql() string {
+	var (
+		field                                     = `"_id","title","publishtime","toptype","subtype","area","s_subscopeclass","buyerclass","budget","bidamount","isValidFile","spidercode","site"`
+		query                                     = `{"query":{"bool":{"filter":[%s],"should": [%s],"minimum_should_match": %d}},"_source":[%s],"sort":[{"publishtime":"desc"}],"size":%d}`
+		keywords                                  = `{"multi_match": {"query": "%s","type": "phrase", "fields": ["title","purchasing"]}}`
+		filterBool                                = `{"bool":{"must":[%s],"should":[%s],"minimum_should_match": %d}}`
+		filterMusts, filterShould, should, filter []string
+		filterRange                               = `{"range":{"publishtime":{"gte":%d,"lte":%d}}}`
+		now                                       = time.Now()
+	)
+	filter = append(filter, fmt.Sprintf(filterRange, now.AddDate(-5, 0, 0).Unix(), now.Unix()))
+	if b.Area != "" || b.City != "" {
+		if b.Area != "" {
+			filterShould = append(filterShould, fmt.Sprintf(`{"terms":{"area":["%s"]}}`, b.Area))
+		}
+		if b.City != "" {
+			filterShould = append(filterShould, fmt.Sprintf(`{"terms":{"city":["%s"]}}`, b.City))
+		}
+	}
+	//信息类型
+	if b.TopType != "" {
+		filterMusts = append(filterMusts, fmt.Sprintf(`{"terms":{"toptype":["%s"]}}`, b.TopType))
+	}
+	//行业
+	if b.Industry != "" {
+		filterMusts = append(filterMusts, fmt.Sprintf(`{"terms":{"s_subscopeclass":["%s"]}}`, b.Industry))
+	}
+	if len(filterMusts) > 0 || len(filterShould) > 0 {
+		shouldMatch := 0
+		if len(filterShould) > 0 {
+			shouldMatch = 1
+		}
+		filter = append(filter, fmt.Sprintf(filterBool, strings.Join(filterMusts, ","), strings.Join(filterShould, ","), shouldMatch))
+	}
+	//标的物
+	if b.Keys != "" {
+		should = append(should, fmt.Sprintf(keywords, b.Keys))
+	}
+	queryShouldMatch := 0
+	if len(should) > 0 {
+		queryShouldMatch = 1
+	}
+	qStr := fmt.Sprintf(query, strings.Join(filter, ","), strings.Join(should, ","), queryShouldMatch, field, b.Total)
+	return qStr
+}
+
+type BiddingInfoRes struct {
+	Name string
+	Url  string
+	List []*BiddingList
+}
+type BiddingList struct {
+	Title      string
+	Id         string
+	Area       string
+	Industry   string
+	Subtype    string
+	FileExists bool
+	Site       string
+	Price      string
+}
+
+func (b *BiddingInfo) GetBiddingInfo(types, name string, currentLocation []*AreaInfo) (birt []*BiddingInfoRes) {
+	infoListLock.Lock()
+	defer infoListLock.Unlock()
+	if n := strings.Split(name, "_"); len(n) > 0 {
+		name = strings.Join(n[:len(n)-1], "_")
+	}
+	redisKey := fmt.Sprintf(biddingListKey, types, name, b.PageNum)
+	if b, err := redis.GetBytes("seoCache", redisKey); err == nil && len(*b) > 0 {
+		if err = json.Unmarshal(*b, &birt); err != nil {
+			log.Fatal(err)
+		}
+	}
+	if len(birt) == 0 {
+		if flag := reqLimitInit.Limit(context.Background()); flag == 1 {
+			defer reqLimitInit.Release()
+		} else {
+			if flag == -2 {
+				log.Println("等待队列已满")
+			} else if flag == -1 {
+				log.Println("等待超时")
+			}
+			return nil
+		}
+		if b.Total == b.PageSize {
+			for _, bidType := range biddingType {
+				if bidsearch.TopType[bidType.name] != "" {
+					b.TopType = bidsearch.TopType[bidType.name]
+				} else {
+					b.TopType = bidType.nickname
+				}
+				biddingInfoRes := &BiddingInfoRes{
+					Name: bidType.name,
+					Url:  bidType.url,
+				}
+				_, data := elastic.GetWithCount("bidding", "bidding", "", b.GetSearchSql())
+				if data != nil {
+					biddingInfoRes.List = b.DataFormat(*data)
+					birt = append(birt, biddingInfoRes)
+				}
+			}
+			b, err := json.Marshal(birt)
+			if err == nil && len(b) > 0 {
+				if err := redis.PutBytes("seoCache", redisKey, &b, cacheTime); err != nil {
+					log.Fatal(err)
+				}
+			}
+		} else {
+			if len(currentLocation) > 0 {
+				count, data := elastic.GetWithCount("bidding", "bidding", "", b.GetSearchSql())
+				if count > 0 && data != nil {
+					if b.Total > int(count) {
+						b.Total = int(count)
+					}
+					formatData := b.DataFormat(*data)
+					for i := 0; i < (b.Total+b.PageSize-1)/b.PageSize; i++ {
+						var (
+							bir   []*BiddingInfoRes
+							start = i * b.PageSize
+							end   = (i + 1) * b.PageSize
+						)
+						if end > int(count) {
+							end = int(count)
+						}
+						bir = []*BiddingInfoRes{
+							{
+								Name: currentLocation[0].name,
+								Url:  "", //currentLocation[0].url
+								List: formatData[start:end],
+							},
+						}
+						if i == b.PageNum-1 {
+							birt = bir
+						}
+						if len(bir) == 1 {
+							b, err := json.Marshal(bir)
+							if err == nil && len(b) > 0 {
+								if err = redis.PutBytes("seoCache", fmt.Sprintf(biddingListKey, types, name, i+1), &b, cacheTime); err != nil {
+									log.Fatal(err)
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+	return
+}
+
+func (b *BiddingInfo) DataFormat(data []map[string]interface{}) (bList []*BiddingList) {
+	if len(data) > 0 {
+		for _, v := range data {
+			bl := &BiddingList{
+				Title:   qu.ObjToString(v["title"]),
+				Id:      encrypt.CommonEncodeArticle("content", qu.ObjToString(v["_id"])),
+				Area:    qu.ObjToString(v["area"]),
+				Subtype: qu.ObjToString(v["subtype"]),
+				Site:    qu.ObjToString(v["site"]),
+			}
+			if subs := qu.InterfaceToStr(v["s_subscopeclass"]); subs != "" {
+				bl.Industry = strings.Split(strings.Split(subs, ",")[0], "_")[0]
+			}
+			if isValidFile, _ := v["isValidFile"].(bool); isValidFile {
+				bl.FileExists = true
+			}
+			if v["budget"] != nil {
+				bl.Price = ConversionMoney(v["budget"])
+			} else if v["bidamount"] != nil {
+				bl.Price = ConversionMoney(v["bidamount"])
+			}
+			bList = append(bList, bl)
+		}
+	}
+	return
+}
+
+// 金额转化   金额:0-万元以下单位为元  ,万元以上至亿元以下单位为万元 ,亿元以上单位为亿元。保留 小数点后 2 位,不进行四舍五入。
+func ConversionMoney(i_money interface{}) string {
+	m := ""
+	if reflect.TypeOf(i_money).Name() == "float64" {
+		m = strconv.FormatFloat(qu.Float64All(i_money), 'f', -1, 64)
+	} else {
+		m = qu.ObjToString(i_money)
+	}
+	if m == "" {
+		return m
+	}
+	m_arr := strings.Split(m, ".")
+	m_1 := m_arr[0]
+	len_m1 := len([]rune(m_1))
+	if len_m1 >= 9 {
+		m = m_1[0:len_m1-8] + "." + m_1[len_m1-8:len_m1-6] + "亿元"
+	} else if len_m1 >= 5 {
+		m = m_1[0:len_m1-4] + "." + m_1[len_m1-4:len_m1-2] + "万元"
+	} else {
+		if len(m_arr) == 1 {
+			return m + ".00元"
+		}
+		m_2 := m_arr[1]
+		if len([]rune(m_2)) > 1 {
+			m_2 = m_2[0:2]
+		} else {
+			m_2 = m_2[0:1] + "0"
+		}
+		m = m_1 + "." + m_2 + "元"
+	}
+	return m
+}
+
+// -2 等待池已满
+// -1 超时
+// 1:可以执行查询
+func (r *reqLimit) Limit(ctx context.Context) int {
+	ctx, cancel := context.WithTimeout(ctx, 3*time.Second)
+	defer cancel()
+	select {
+	case <-r.waitPool:
+		defer func() {
+			r.waitPool <- struct{}{}
+		}()
+		select {
+		case <-r.doPool:
+			return 1
+		case <-ctx.Done(): //超时
+			return -1
 		}
+	default:
+		return -2
 	}
-	return "", "", ""
+}
+
+func (r *reqLimit) Release() {
+	r.doPool <- struct{}{}
 }
 
 // PutListCache

+ 2 - 2
src/jfw/modules/app/src/db.json

@@ -31,8 +31,8 @@
 	},
 	"elasticsearch": {
 		"main": {
-			"address": "http://192.168.3.206:9800",
-	    	"size": 2,
+			"address": "http://192.168.3.241:9205,http://192.168.3.149:9200",
+      "size": 5,
 			"version": "v7",
 			"userName": "",
 			"password": ""

+ 1 - 1
src/jfw/modules/app/src/go.mod

@@ -3,7 +3,7 @@ module jy/src/jfw/modules/app/src
 go 1.18
 
 require (
-	app.yhyue.com/moapp/jybase v0.0.0-20230718012114-37013054344b
+	app.yhyue.com/moapp/jybase v0.0.0-20230727083622-4dfc804ea6cf
 	app.yhyue.com/moapp/jylog v0.0.0-20230522075550-05d7230ca545
 	app.yhyue.com/moapp/jypkg v0.0.0-20230802005656-6379ddc03ee0
 	bp.jydev.jianyu360.cn/BaseService/userCenter v1.2.13

+ 4 - 4
src/jfw/modules/app/src/go.sum

@@ -5,12 +5,12 @@ app.yhyue.com/moapp/jyMarketing v0.0.2-0.20230304035551-21bb1eedf547/go.mod h1:J
 app.yhyue.com/moapp/jyPoints v1.1.1/go.mod h1:SvP8p5L3jGrejHiH2LXfgCg/NPlFiKBC5Yd0gsI12FU=
 app.yhyue.com/moapp/jybase v0.0.0-20220427020729-974c1a148186/go.mod h1:qNRA0sHuYqcLoYoP8irpaWnW9YsXixe6obBIkwaXpD0=
 app.yhyue.com/moapp/jybase v0.0.0-20230117032034-ad7c00ffe11a/go.mod h1:zB47XTeJvpcbtBRYgkQuxOICWNexiZfbUO+7aUf6mNs=
-app.yhyue.com/moapp/jybase v0.0.0-20230718012114-37013054344b h1:Wtytm2QqQWtBV+see7t8ZTxnsCJaz5PGRqJXzwR6f7s=
-app.yhyue.com/moapp/jybase v0.0.0-20230718012114-37013054344b/go.mod h1:D40Ae0rQilH8Hc5o2Vtt04Tjh/DNEFpcS3/WkJMPJb8=
+app.yhyue.com/moapp/jybase v0.0.0-20230727083622-4dfc804ea6cf h1:/Tk5haITmGc5c3/y6VxyycIy/LBWO7aYlxTiHKxmzv0=
+app.yhyue.com/moapp/jybase v0.0.0-20230727083622-4dfc804ea6cf/go.mod h1:D40Ae0rQilH8Hc5o2Vtt04Tjh/DNEFpcS3/WkJMPJb8=
 app.yhyue.com/moapp/jylog v0.0.0-20230522075550-05d7230ca545 h1:+Lak4m1zgsigQloOsvp8AJ+0XeX/+PGp9QP550xlbBQ=
 app.yhyue.com/moapp/jylog v0.0.0-20230522075550-05d7230ca545/go.mod h1:uFrsdUBFbETiJlEmr4PtJWPsZlUpPj2bHQRhryu6ggk=
-app.yhyue.com/moapp/jypkg v0.0.0-20230731064332-8e42fae281a1 h1:9nFmngu21ai/4i/YvOevLQAAJVNk/65E7vbayuyHqBI=
-app.yhyue.com/moapp/jypkg v0.0.0-20230731064332-8e42fae281a1/go.mod h1:VaHDi3twSg4G84k2+UFOe7ZCw5EqUZVAkW2N2dHeMbU=
+app.yhyue.com/moapp/jypkg v0.0.0-20230802005656-6379ddc03ee0 h1:EC5n/8wE9PnSSZxTTuAjDngI9YC41MPsRShbI8Z8v8Y=
+app.yhyue.com/moapp/jypkg v0.0.0-20230802005656-6379ddc03ee0/go.mod h1:VaHDi3twSg4G84k2+UFOe7ZCw5EqUZVAkW2N2dHeMbU=
 app.yhyue.com/moapp/message v0.0.0-20221223100203-6402e389d9ae h1:6rDDaz6yxvE8viTSzEBwKYOFWq14TMfuBivSazUZMz4=
 app.yhyue.com/moapp/message v0.0.0-20221223100203-6402e389d9ae/go.mod h1:b0zZHev3gmJao1Fo+2Z2KPVjsuLOJVvVxf+kCnu9WkA=
 bp.jydev.jianyu360.cn/BaseService/entManageApplication v0.0.0-20230214091519-89a98c01ab0e h1:h+VEI3o1qC0jeCzkFGTrLI4f27cfa/W/y+0sXokWMgE=

+ 3 - 1
src/jfw/modules/app/src/seo.json

@@ -102,5 +102,7 @@
 	"distance":"0",
 	"wxDomain":"http://web1-jydev-zxl.jianyu360.cn",
   "jyadd": "https://web2-qmxtest.jydev.jianyu360.com/",
-  "hotArea": "北京,山东,陕西,河南,广东"
+  "hotArea": "北京,山东,陕西,河南,广东",
+  "executionNum": 4,
+  "awaitNum": 4
 }

+ 4 - 2
src/jfw/modules/app/src/web/templates/tags/index.html

@@ -2,9 +2,11 @@
 <html lang="en">
 <head>
   <meta charset="UTF-8">
-  <title>Title</title>
+  <title>{{.T.pageNum}}/{{.T.totalPage}}</title>
 </head>
 <body>
-{{.T.infoTypeList}}
+{{.T.industryData}}
+<br>
+{{.T.industryNav}}
 </body>
 </html>