瀏覽代碼

feat:更新

wangshan 2 年之前
父節點
當前提交
82efaf2802

+ 28 - 19
jyBXCore/api/bxcore.api

@@ -9,25 +9,34 @@ info (
 
 type (
 	searchReq {
-		AppId          string `header:"appId,optional"`
-		PageNum        int64  `json:"pageNum"`
-		PageSize       int64  `json:"pageSize"`
-		KeyWords       string `json:"keyWords,optional"`
-		Province       string `json:"province,optional"`
-		City           string `json:"city,optional"`
-		Subtype        string `json:"subtype,optional"`
-		Toptype        string `json:"toptype,optional"`
-		PublishTime    string `json:"publishTime,optional"`
-		SelectType     string `json:"selectType,optional"`
-		Price          string `json:"price,optional"`
-		Industry       string `json:"industry,optional"`
-		BuyerClass     string `json:"buyerClass,optional"`
-		BuyerTel       string `json:"buyerTel,optional"`
-		WinnerTel      string `json:"winnerTel,optional"`
-		ExclusionWords string `json:"exclusionWords,optional"`
-		FileExists     string `json:"fileExists,optional"`
-		UserType       string `path:"userType,optional"`
-		SplitKeywords  string `json:"splitKeywords,optional"`
+		UserType        string `path:"userType,optional"`
+		AppId           string `header:"appId,optional"`
+		UserId          string `header:"userId,optional"`
+		Phone           string `header:"phone,optional"`
+		NewUserId       string `header:"newUserId,optional"`
+		EntId           int64  `header:"entId,optional"`
+		EntUserId       int64  `header:"entUserId,optional"`
+		PageNum         int64  `json:"pageNum"`
+		PageSize        int64  `json:"pageSize"`
+		Province        string `json:"province,optional"`
+		City            string `json:"city,optional"`
+		Subtype         string `json:"subtype,optional"`
+		TopType         string `json:"toptype,optional"`
+		PublishTime     string `json:"publishTime,optional"`
+		SelectType      string `json:"selectType,optional"`
+		Price           string `json:"price,optional"`
+		Industry        string `json:"industry,optional"`
+		BuyerClass      string `json:"buyerClass,optional"`
+		BuyerTel        string `json:"buyerTel,optional"`
+		WinnerTel       string `json:"winnerTel,optional"`
+		FileExists      string `json:"fileExists,optional"`
+		SearchGroup     int64  `json:"searchGroup,optional"`
+		SearchMode      int64  `json:"searchMode,optional"`
+		WordsMode       int64  `json:"wordsMode,optional"`
+		KeyWords        string `json:"keyWords,optional"`
+		AdditionalWords string `json:"additionalWords,optional"`
+		ExclusionWords  string `json:"exclusionWords,optional"`
+		SplitKeywords   string `json:"splitKeywords,optional"`
 	}
 	//
 	commonResp {

+ 28 - 22
jyBXCore/api/internal/logic/searchListLogic.go

@@ -31,28 +31,34 @@ func NewSearchListLogic(ctx context.Context, svcCtx *svc.ServiceContext, r *http
 func (l *SearchListLogic) SearchList(req *types.SearchReq) (resp *types.CommonResp, err error) {
 	t := time.Now()
 	res, err := l.svcCtx.BxCore.GetSearchList(l.ctx, &bxcore.SearchReq{
-		PageNum:        req.PageNum,
-		PageSize:       req.PageSize,
-		PublishTime:    req.PublishTime,
-		Province:       req.Province,
-		City:           req.City,
-		Industry:       req.Industry,
-		BuyerClass:     req.BuyerClass,
-		KeyWords:       req.KeyWords,
-		Subtype:        req.Subtype,
-		SelectType:     req.SelectType,
-		Price:          req.Price,
-		FileExists:     req.FileExists,
-		BuyerTel:       req.BuyerTel,
-		WinnerTel:      req.WinnerTel,
-		ExclusionWords: req.ExclusionWords,
-		AppId:          req.AppId,
-		UserType:       req.UserType,
-		SplitKeywords:  req.SplitKeywords,
-		UserId:         l.r.Header.Get("userId"),
-		EntId:          l.r.Header.Get("entId"),
-		Platform:       util.CheckPlatform(l.r),
-		Toptype:        req.Toptype,
+		AppId:           req.AppId,
+		UserId:          req.UserId,
+		Phone:           req.Phone,
+		NewUserId:       req.NewUserId,
+		EntId:           req.EntId,
+		EntUserId:       req.EntUserId,
+		PageNum:         req.PageNum,
+		PageSize:        req.PageSize,
+		Province:        req.Province,
+		City:            req.City,
+		Subtype:         req.Subtype,
+		TopType:         req.TopType,
+		PublishTime:     req.PublishTime,
+		SelectType:      req.SelectType,
+		Price:           req.Price,
+		Industry:        req.Industry,
+		BuyerClass:      req.BuyerClass,
+		BuyerTel:        req.BuyerTel,
+		WinnerTel:       req.WinnerTel,
+		FileExists:      req.FileExists,
+		SearchGroup:     req.SearchGroup,
+		SearchMode:      req.SearchMode,
+		WordsMode:       req.WordsMode,
+		KeyWords:        req.KeyWords,
+		AdditionalWords: req.AdditionalWords,
+		ExclusionWords:  req.ExclusionWords,
+		UserType:        req.UserType,
+		Platform:        util.CheckPlatform(l.r),
 	})
 	log.Println("请求接口耗时:", time.Since(t).Seconds())
 	if err != nil {

+ 28 - 19
jyBXCore/api/internal/types/types.go

@@ -2,25 +2,34 @@
 package types
 
 type SearchReq struct {
-	AppId          string `header:"appId,optional"`
-	PageNum        int64  `json:"pageNum"`
-	PageSize       int64  `json:"pageSize"`
-	KeyWords       string `json:"keyWords,optional"`
-	Province       string `json:"province,optional"`
-	City           string `json:"city,optional"`
-	Subtype        string `json:"subtype,optional"`
-	Toptype        string `json:"toptype,optional"`
-	PublishTime    string `json:"publishTime,optional"`
-	SelectType     string `json:"selectType,optional"`
-	Price          string `json:"price,optional"`
-	Industry       string `json:"industry,optional"`
-	BuyerClass     string `json:"buyerClass,optional"`
-	BuyerTel       string `json:"buyerTel,optional"`
-	WinnerTel      string `json:"winnerTel,optional"`
-	ExclusionWords string `json:"exclusionWords,optional"`
-	FileExists     string `json:"fileExists,optional"`
-	UserType       string `path:"userType,optional"`
-	SplitKeywords  string `json:"splitKeywords,optional"`
+	UserType        string `path:"userType,optional"`
+	AppId           string `header:"appId,optional"`
+	UserId          string `header:"userId,optional"`
+	Phone           string `header:"phone,optional"`
+	NewUserId       string `header:"newUserId,optional"`
+	EntId           int64  `header:"entId,optional"`
+	EntUserId       int64  `header:"entUserId,optional"`
+	PageNum         int64  `json:"pageNum"`
+	PageSize        int64  `json:"pageSize"`
+	Province        string `json:"province,optional"`
+	City            string `json:"city,optional"`
+	Subtype         string `json:"subtype,optional"`
+	TopType         string `json:"toptype,optional"`
+	PublishTime     string `json:"publishTime,optional"`
+	SelectType      string `json:"selectType,optional"`
+	Price           string `json:"price,optional"`
+	Industry        string `json:"industry,optional"`
+	BuyerClass      string `json:"buyerClass,optional"`
+	BuyerTel        string `json:"buyerTel,optional"`
+	WinnerTel       string `json:"winnerTel,optional"`
+	FileExists      string `json:"fileExists,optional"`
+	SearchGroup     int64  `json:"searchGroup,optional"`
+	SearchMode      int64  `json:"searchMode,optional"`
+	WordsMode       int64  `json:"wordsMode,optional"`
+	KeyWords        string `json:"keyWords,optional"`
+	AdditionalWords string `json:"additionalWords,optional"`
+	ExclusionWords  string `json:"exclusionWords,optional"`
+	SplitKeywords   string `json:"splitKeywords,optional"`
 }
 
 type CommonResp struct {

+ 76 - 61
jyBXCore/rpc/bxcore.proto

@@ -1,31 +1,37 @@
 syntax = "proto3";
 
 package bxcore;
-option go_package="./bxcore";
+option go_package = "./bxcore";
 
 message SearchReq {
   string appId = 1;//剑鱼默认10000
-  int64  pageNum = 2;//当前页码
-  int64  pageSize = 3;//每页数量
-  string  keyWords = 4;//关键词
-  string  province = 5;//省份
-  string  city = 6;//城市
-  string  subtype = 7;//信息类型-二级
-  string  publishTime = 8;//发布时间
-  string selectType = 9;//搜索范围:标题;正文等
-  string  price = 10;//价格
-  string industry = 11;//行业
-  string buyerClass = 12;//采购单位类型
-  string buyerTel = 13;//采购单位联系方式
-  string winnerTel = 14;//中标单位联系方式
-  string exclusionWords = 15;//排除词
-  string fileExists = 16;//是否有附件
-  string  userId = 17;
-  string  entId = 18;
-  string  userType = 19;//用户状态 fType:免费用户	pType:付费用户	vType:超级订阅用户	mType:大会员用户	eType:商机管理用户
-  string  splitKeywords = 20;//分词结果
-  string  platform = 21;//请求平台
-  string  toptype = 22;//信息类型-一级分类
+  string  userId = 2;//用户id
+  string  phone = 3;//手机号
+  string  newUserId = 4;//base_user_id 新用户id
+  int64  entId = 5;//企业id 没有企业 企业id=0
+  int64  entUserId = 6;//企业用户id  当前企业下的员工id 没有企业默认0
+  int64  pageNum = 7;//当前页码
+  int64  pageSize = 8;//每页数量
+  string  province = 9;//省份
+  string  city = 10;//城市
+  string  subtype = 11;//信息类型-二级
+  string  topType = 12;//信息类型-一级分类
+  string  publishTime = 13;//发布时间
+  string selectType = 14;//搜索范围:标题;正文等
+  string  price = 15;//价格
+  string industry = 16;//行业
+  string buyerClass = 17;//采购单位类型
+  string buyerTel = 18;//采购单位联系方式
+  string winnerTel = 19;//中标单位联系方式
+  string fileExists = 20;//是否有附件
+  int64 searchGroup = 21;//搜索分组:默认0:全部;1:招标采购公告;2:超前项目
+  int64 searchMode = 22;//搜索模式:0:精准搜索;1:模糊搜索
+  int64 wordsMode = 23;//搜索关键词模式;默认0:包含所有,1:包含任意
+  string keyWords = 24;//关键词:多个空格隔开(主)
+  string additionalWords = 25;//关键词:附加关键词(副:五组,每组最多15个字符)
+  string exclusionWords = 26;//关键词:排除词(副:五组,每组最多15个字符)
+  string  userType = 27;//用户状态 fType:免费用户;pType:付费用户;vType:超级订阅用户;mType:大会员用户;eType:商机管理用户
+  string  platform = 28;//请求平台
 }
 
 message SearchResp {
@@ -34,46 +40,55 @@ message SearchResp {
   SearchData data = 3;
 }
 message SearchData {
-  int64 count = 1;
-  string keyWords = 2;
-  int64  isLimit = 3;
-  repeated string historyKeys = 4;
-  repeated SearchList list = 5;
-  int64  totalPage = 6;
-  string interceptWord = 7;
-  int64  interceptLimit = 8;
-  string  interceptKeywords= 9;
+  int64 count = 1;//返回数据量
+  string keyWords = 2;//关键词
+  int64  isLimit = 3;//全文检索限制//限制正文、附件查询 //return 1 正常 //return -1 抱歉!由于系统繁忙暂时无法进行搜索,请1分钟后再试! //return -2 抱歉!由于系统繁忙暂时无法进行搜索,请稍后再试!
+  repeated string historyKeys = 4;//历史搜索关键词
+  repeated SearchList list = 5;//搜索列表
+  string numberMsg = 6;//查询总结果数量
+  string remark = 7;//备注
+  int64 interceptLimit = 8;//关键词截取长度
+  string interceptKeyWords= 9;//关键词截取结果
 }
 
 message  SearchList {
-  string  id = 1;
-  string  area = 2;
-  string  areaUrl = 3;
-  string  buyerClass = 4;
-  string  city = 5;
-  string  detail = 6;
-  string  industry = 7;
-  string  industryUrl = 8;
-  int64  publishTime = 9;
-  string  subtype = 10;
-  string  subtypeUrl = 11;
-  bool fileExists = 12;
-  string  title = 13;
-  bool isCollected = 14;
-  int64 bidamount = 15;//中标金额
-  int64  budget = 16;//预算
-  string projectName = 17;//项目名称
-  string  buyer = 18;//采购单位
-  string winner = 19;//中标企业
-  int64 bidopenTime = 20;//开标时间
-  PInfo projectInfo = 21;//拟建项目信息
-  string projectCode = 22;//项目代码
-  string  site = 23;//网站名称
-  string spiderCode = 24;//网站代码
+  string id = 1;//信息id
+  string area = 2;//地区
+  string areaUrl = 3;//地区标签地址
+  string buyerClass = 4;//采购单位类型
+  string city = 5;//城市
+  string detail = 6;//正文搜索内容
+  string industry = 7;//行业标签
+  string industryUrl = 8;//行业标签地址
+  int64  publishTime = 9;//发布时间
+  bool   fileExists = 10;//是否有附件
+  string subtype = 11;//信息类型
+  string subtypeUrl = 12;//信息类型标签地址
+  string title = 13;//标题
+  bool   isCollected = 14;//信息是否被收藏
+  string projectName = 15;//项目名称
+  string projectCode = 16;//项目代码
+  int64  budget = 17;//预算
+  int64  bidAmount = 18;//中标金额
+  string buyer = 19;//采购单位
+  string buyerTel = 20;//采购单位联系电话
+  string buyerPerson = 21;//采购单位联系人
+  string agency = 22;//代理机构
+  string agencyPerson = 23;//代理机构联系人
+  string agencyTel = 24;//代理机构联系电话
+  string winner = 25;//中标企业
+  string winnerPerson = 26;//中标企业联系人
+  string winnerTel = 27;//中标企业联系电话
+  string bidOpenTime = 28;//开标时间
+  string signEndTime = 29;//报名截止时间
+  string bidEndTime = 30;//投标截止时间
+  string site = 31;//网站名称
+  string spiderCode = 32;//网站代码
+  PInfo  projectInfo = 33;//拟建项目信息
 }
 //
 message PInfo {
-  string approveCode =1;//项目代码
+  string approveCode = 1;//项目代码
   string approveContent = 2;//项目内容
   string approveDept = 3;//审批部门
   string approveStatus = 4 ;//审批状态
@@ -84,12 +99,12 @@ message PInfo {
 //
 message SearchLimitReq {
   string appid = 1;
-  int64 timeOut = 2;
-  int64 count = 3;
-  int64 flag = 4;
+  int64  timeOut = 2;
+  int64  count = 3;
+  int64  flag = 4;
   int64  percentage = 5;
-  string  userId = 6;
-  string  searchType = 7;
+  string userId = 6;
+  string searchType = 7;
 }
 //
 message SearchLimitResp {

+ 153 - 0
jyBXCore/rpc/entity/search.go

@@ -0,0 +1,153 @@
+package entity
+
+import (
+	MC "app.yhyue.com/moapp/jybase/common"
+	"app.yhyue.com/moapp/jybase/redis"
+	"fmt"
+	"github.com/zeromicro/go-zero/core/logx"
+	"jyBXCore/rpc/bxcore"
+	"jyBXCore/rpc/util"
+	"strings"
+)
+
+type KeyWordsSearch struct {
+	AppId           string ` json:"appId,omitempty"`          //剑鱼默认10000
+	UserId          string `json:"userId,omitempty"`          //用户id
+	Phone           string ` json:"phone,omitempty"`          //手机号
+	NewUserId       string `json:"newUserId,omitempty"`       //base_user_id 新用户id
+	EntId           int64  `json:"entId,omitempty"`           //企业id 没有企业 企业id=0
+	EntUserId       int64  `json:"entUserId,omitempty"`       //企业用户id  当前企业下的员工id 没有企业默认0
+	PageNum         int64  `json:"pageNum,omitempty"`         //当前页码
+	PageSize        int64  `json:"pageSize,omitempty"`        //每页数量
+	Province        string `json:"province,omitempty"`        //省份
+	City            string `json:"city,omitempty"`            //城市
+	Subtype         string `json:"subtype,omitempty"`         //信息类型-二级
+	TopType         string `json:"topType,omitempty"`         //信息类型-一级分类
+	PublishTime     string `json:"publishTime,omitempty"`     //发布时间
+	SelectType      string `json:"selectType,omitempty"`      //搜索范围:标题;正文等
+	Price           string `json:"price,omitempty"`           //价格
+	Industry        string `json:"industry,omitempty"`        //行业
+	BuyerClass      string `json:"buyerClass,omitempty"`      //采购单位类型
+	BuyerTel        string `json:"buyerTel,omitempty"`        //采购单位联系方式
+	WinnerTel       string `json:"winnerTel,omitempty"`       //中标单位联系方式
+	FileExists      string `json:"fileExists,omitempty"`      //是否有附件
+	SearchGroup     int64  `json:"searchGroup,omitempty"`     //搜索分组:默认0:全部;1:招标采购公告;2:超前项目
+	SearchMode      int64  `json:"searchMode,omitempty"`      //搜索模式:0:精准搜索;1:模糊搜索
+	WordsMode       int64  `json:"wordsMode,omitempty"`       //搜索关键词模式;默认0:包含所有,1:包含任意
+	KeyWords        string `json:"keyWords,omitempty"`        //关键词:多个空格隔开(主)
+	AdditionalWords string `json:"additionalWords,omitempty"` //关键词:附加关键词(副:五组,每组最多15个字符)
+	ExclusionWords  string `json:"exclusionWords,omitempty"`  //关键词:排除词(副:五组,每组最多15个字符)
+	UserType        string `json:"userType,omitempty"`        //用户状态 fType:免费用户;pType:付费用户;vType:超级订阅用户;mType:大会员用户;eType:商机管理用户
+	Platform        string `json:"platform,omitempty"`        //请求平台
+}
+
+func NewKeyWordsSearch(in *bxcore.SearchReq) *KeyWordsSearch {
+	return &KeyWordsSearch{
+		AppId:           in.AppId,
+		UserId:          in.UserId,
+		Phone:           in.Phone,
+		NewUserId:       in.NewUserId,
+		EntId:           in.EntId,
+		EntUserId:       in.EntUserId,
+		PageNum:         in.PageNum,
+		PageSize:        in.PageSize,
+		Province:        in.Province,
+		City:            in.City,
+		Subtype:         in.Subtype,
+		TopType:         in.TopType,
+		PublishTime:     in.PublishTime,
+		SelectType:      in.SelectType,
+		Price:           in.Price,
+		Industry:        in.Industry,
+		BuyerClass:      in.BuyerClass,
+		BuyerTel:        in.BuyerTel,
+		WinnerTel:       in.WinnerTel,
+		FileExists:      in.FileExists,
+		SearchGroup:     in.SearchGroup,
+		SearchMode:      in.SearchMode,
+		WordsMode:       in.WordsMode,
+		KeyWords:        in.KeyWords,
+		AdditionalWords: in.AdditionalWords,
+		ExclusionWords:  in.ExclusionWords,
+		UserType:        in.UserType,
+		Platform:        in.Platform,
+	}
+}
+
+// IsEmptySearch  是否是空搜索,如果是空搜索查缓存数据
+func (kws *KeyWordsSearch) IsEmptySearch() bool {
+	//有主关键词 或 选择了行业,都不是空搜索
+	if kws.KeyWords != "" || kws.Industry != "" {
+		return false
+	}
+	return true
+}
+
+// GetBidListByCache  查询缓存数据
+func (kws *KeyWordsSearch) GetBidListByCache() (list []*bxcore.SearchList, count int64) {
+	//缓存数据: kws.Platform-平台;kws.PageNum-当前页
+	redisDataKey := fmt.Sprintf(util.SearchCacheKey, kws.Platform, kws.PageNum)
+	sCache, err := redis.GetNewBytes(util.RedisName, redisDataKey)
+	if err == nil {
+		redisCountKey := fmt.Sprintf("PC_SearchCountCache_%s", kws.Platform)
+		count = int64(redis.GetInt(util.RedisName, redisCountKey))
+		if sCache != nil && len(*sCache) > 0 {
+			err = json.Unmarshal(*sCache, &list)
+			if err != nil {
+				//return &bxcore.SearchResp{
+				//	ErrCode: -1,
+				//	ErrMsg:  "缓存数据序列化异常:" + err.Error(),
+				//}, nil
+			}
+		} else {
+			pcstime := IC.C.PCSTime * 60 * 60
+			//缓存数据
+			_in := &bxcore.SearchReq{
+				PageNum:  kws.PageNum,
+				PageSize: kws.PageSize,
+			}
+			count, list = util.SearchCahcheData(_in)
+			limitCount := int64(util.SearchPageSize * util.SearchMaxPageNum)
+			if count > limitCount {
+				count = limitCount
+			}
+			if len(list) > 0 {
+				redis.Put(util.RedisName, redisCountKey, count, pcstime)
+				b, err := json.Marshal(list)
+				if err == nil {
+					redis.PutBytes(util.RedisName, redisDataKey, &b, pcstime)
+				} else {
+					//return &bxcore.SearchResp{
+					//	ErrCode: -1,
+					//	ErrMsg:  "缓存数据 转化异常:" + err.Error(),
+					//}, nil
+				}
+			}
+		}
+		//是否收藏
+		util.MakeCollection(kws.UserId, list)
+		res.TotalPage = MC.If(kws.PageNum == 1, (count+int64(util.SearchPageSize)-1)/int64(util.SearchPageSize), res.TotalPage).(int64)
+		res.Count = count
+		res.List = list
+	} else {
+		//return &bxcore.SearchResp{
+		//	ErrCode: -1,
+		//	ErrMsg:  "查询redis缓存异常:" + err.Error(),
+		//}, nil
+	}
+	return
+}
+
+//保存历史记录
+func (kws *KeyWordsSearch) SaveKeyWordsToHistory() {
+	if kws.KeyWords != "" {
+		//历史记录
+		history := redis.GetStr("other", "s_"+kws.UserId)
+		keys := util.SearchHistory(history, kws.KeyWords)
+		if len(keys) > 0 {
+			if b := redis.Put("other", "s_"+kws.UserId, strings.Join(keys, ","), -1); !b {
+				logx.Info("保存搜索记录异常,用户id:", kws.UserId)
+			}
+		}
+	}
+}

+ 1 - 0
jyBXCore/rpc/etc/bxcore.yaml

@@ -32,3 +32,4 @@ PaySearchLimit:
   PageNum: 1
   PageSize: 20
 KeywordsLimit: 35
+DefaultBidInfoNum: 超过1.8亿

+ 2 - 1
jyBXCore/rpc/internal/config/config.go

@@ -34,7 +34,8 @@ type Config struct {
 		PageNum  int64
 		PageSize int64
 	}
-	KeywordsLimit int
+	KeywordsLimit     int
+	DefaultBidInfoNum string
 }
 
 type Db struct {

+ 25 - 63
jyBXCore/rpc/internal/logic/getsearchlistlogic.go

@@ -2,10 +2,9 @@ package logic
 
 import (
 	MC "app.yhyue.com/moapp/jybase/common"
-	"app.yhyue.com/moapp/jybase/redis"
 	"context"
-	"encoding/json"
 	"fmt"
+	"jyBXCore/rpc/entity"
 	IC "jyBXCore/rpc/init"
 	"jyBXCore/rpc/util"
 	"strings"
@@ -34,22 +33,35 @@ func NewGetSearchListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Get
 // 标讯搜索结果列表数据
 func (l *GetSearchListLogic) GetSearchList(in *bxcore.SearchReq) (*bxcore.SearchResp, error) {
 	defer MC.Catch()
-	t := time.Now()
+	//用户身份 是否登录
+	if in.UserId == "" {
+		return &bxcore.SearchResp{
+			ErrCode: -1,
+			ErrMsg:  "用户信息异常",
+		}, nil
+	}
 	res := &bxcore.SearchData{
 		Count:          0,
 		List:           []*bxcore.SearchList{},
 		InterceptLimit: int64(MC.IntAllDef(IC.C.KeywordsLimit, 35)),
+		NumberMsg:      IC.C.DefaultBidInfoNum,
 	}
-	if in.UserId != "" {
-		//历史记录
-		history_str := redis.GetStr("other", "s_"+in.UserId)
-		arrs := util.SearchHistory(history_str, in.KeyWords)
-		//redis.Del("other", "s_"+in.UserId)
-		if len(arrs) > 0 {
-			redis.Put("other", "s_"+in.UserId, strings.Join(arrs, ","), -1)
-			//res.HistoryKeys = arrs
-		}
+	//初始化搜索对象
+	ks := entity.NewKeyWordsSearch(in)
+	//判断是否是空搜索,如果是空搜索,查缓存数据
+	if ks.IsEmptySearch() {
+		res.List, res.Count = ks.GetBidListByCache()
+		return &bxcore.SearchResp{
+			Data:    res,
+			ErrMsg:  "",
+			ErrCode: 0,
+		}, nil
 	}
+	//更新关键词搜索历史记录
+	go ks.SaveKeyWordsToHistory()
+	//判断搜索是否有查询条件
+	//判断用户身份
+	t := time.Now()
 	//
 	if in.SelectType == "" {
 		in.SelectType = "title,content"
@@ -165,57 +177,7 @@ func (l *GetSearchListLogic) GetSearchList(in *bxcore.SearchReq) (*bxcore.Search
 		}
 		logx.Info("关键词 -0- 查询耗时:", time.Since(t).Seconds())
 	} else if in.Platform == "PC" {
-		var count int64 = 0
-		var list = []*bxcore.SearchList{}
-		redisDataKey := fmt.Sprintf("PC_SearchDataCache_%s_%d", in.Platform, in.PageNum)
-		sCache, err := redis.GetNewBytes(util.RedisName, redisDataKey)
-		if err == nil {
-			redisCountKey := fmt.Sprintf("PC_SearchCountCache_%s", in.Platform)
-			count = int64(redis.GetInt(util.RedisName, redisCountKey))
-			if sCache != nil && len(*sCache) > 0 {
-				err = json.Unmarshal(*sCache, &list)
-				if err != nil {
-					return &bxcore.SearchResp{
-						ErrCode: -1,
-						ErrMsg:  "缓存数据序列化异常:" + err.Error(),
-					}, nil
-				}
-			} else {
-				pcstime := IC.C.PCSTime * 60 * 60
-				//缓存数据
-				_in := &bxcore.SearchReq{
-					PageNum:  in.PageNum,
-					PageSize: in.PageSize,
-				}
-				count, list = util.SearchCahcheData(_in)
-				limitCount := int64(util.SearchPageSize * util.SearchMaxPageNum)
-				if count > limitCount {
-					count = limitCount
-				}
-				if len(list) > 0 {
-					redis.Put(util.RedisName, redisCountKey, count, pcstime)
-					b, err := json.Marshal(list)
-					if err == nil {
-						redis.PutBytes(util.RedisName, redisDataKey, &b, pcstime)
-					} else {
-						return &bxcore.SearchResp{
-							ErrCode: -1,
-							ErrMsg:  "缓存数据 转化异常:" + err.Error(),
-						}, nil
-					}
-				}
-			}
-			//是否收藏
-			util.MakeCollection(in.UserId, list)
-			res.TotalPage = MC.If(in.PageNum == 1, (count+int64(util.SearchPageSize)-1)/int64(util.SearchPageSize), res.TotalPage).(int64)
-			res.Count = count
-			res.List = list
-		} else {
-			return &bxcore.SearchResp{
-				ErrCode: -1,
-				ErrMsg:  "查询redis缓存异常:" + err.Error(),
-			}, nil
-		}
+
 	}
 	logx.Info("关键词 -全部- 查询耗时:", time.Since(t).Seconds())
 	return &bxcore.SearchResp{

+ 1 - 0
jyBXCore/rpc/service/search.go

@@ -0,0 +1 @@
+package service

+ 409 - 261
jyBXCore/rpc/type/bxcore/bxcore.pb.go

@@ -25,28 +25,34 @@ type SearchReq struct {
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	AppId          string `protobuf:"bytes,1,opt,name=appId,proto3" json:"appId,omitempty"`                    //剑鱼默认10000
-	PageNum        int64  `protobuf:"varint,2,opt,name=pageNum,proto3" json:"pageNum,omitempty"`               //当前页码
-	PageSize       int64  `protobuf:"varint,3,opt,name=pageSize,proto3" json:"pageSize,omitempty"`             //每页数量
-	KeyWords       string `protobuf:"bytes,4,opt,name=keyWords,proto3" json:"keyWords,omitempty"`              //关键词
-	Province       string `protobuf:"bytes,5,opt,name=province,proto3" json:"province,omitempty"`              //省份
-	City           string `protobuf:"bytes,6,opt,name=city,proto3" json:"city,omitempty"`                      //城市
-	Subtype        string `protobuf:"bytes,7,opt,name=subtype,proto3" json:"subtype,omitempty"`                //信息类型-二级
-	PublishTime    string `protobuf:"bytes,8,opt,name=publishTime,proto3" json:"publishTime,omitempty"`        //发布时间
-	SelectType     string `protobuf:"bytes,9,opt,name=selectType,proto3" json:"selectType,omitempty"`          //搜索范围:标题;正文等
-	Price          string `protobuf:"bytes,10,opt,name=price,proto3" json:"price,omitempty"`                   //价格
-	Industry       string `protobuf:"bytes,11,opt,name=industry,proto3" json:"industry,omitempty"`             //行业
-	BuyerClass     string `protobuf:"bytes,12,opt,name=buyerClass,proto3" json:"buyerClass,omitempty"`         //采购单位类型
-	BuyerTel       string `protobuf:"bytes,13,opt,name=buyerTel,proto3" json:"buyerTel,omitempty"`             //采购单位联系方式
-	WinnerTel      string `protobuf:"bytes,14,opt,name=winnerTel,proto3" json:"winnerTel,omitempty"`           //中标单位联系方式
-	ExclusionWords string `protobuf:"bytes,15,opt,name=exclusionWords,proto3" json:"exclusionWords,omitempty"` //排除词
-	FileExists     string `protobuf:"bytes,16,opt,name=fileExists,proto3" json:"fileExists,omitempty"`         //是否有附件
-	UserId         string `protobuf:"bytes,17,opt,name=userId,proto3" json:"userId,omitempty"`
-	EntId          string `protobuf:"bytes,18,opt,name=entId,proto3" json:"entId,omitempty"`
-	UserType       string `protobuf:"bytes,19,opt,name=userType,proto3" json:"userType,omitempty"`           //用户状态 fType:免费用户	pType:付费用户	vType:超级订阅用户	mType:大会员用户	eType:商机管理用户
-	SplitKeywords  string `protobuf:"bytes,20,opt,name=splitKeywords,proto3" json:"splitKeywords,omitempty"` //分词结果
-	Platform       string `protobuf:"bytes,21,opt,name=platform,proto3" json:"platform,omitempty"`           //请求平台
-	Toptype        string `protobuf:"bytes,22,opt,name=toptype,proto3" json:"toptype,omitempty"`             //信息类型-一级分类
+	AppId           string `protobuf:"bytes,1,opt,name=appId,proto3" json:"appId,omitempty"`                      //剑鱼默认10000
+	UserId          string `protobuf:"bytes,2,opt,name=userId,proto3" json:"userId,omitempty"`                    //用户id
+	Phone           string `protobuf:"bytes,3,opt,name=phone,proto3" json:"phone,omitempty"`                      //手机号
+	NewUserId       string `protobuf:"bytes,4,opt,name=newUserId,proto3" json:"newUserId,omitempty"`              //base_user_id 新用户id
+	EntId           int64  `protobuf:"varint,5,opt,name=entId,proto3" json:"entId,omitempty"`                     //企业id 没有企业 企业id=0
+	EntUserId       int64  `protobuf:"varint,6,opt,name=entUserId,proto3" json:"entUserId,omitempty"`             //企业用户id  当前企业下的员工id 没有企业默认0
+	PageNum         int64  `protobuf:"varint,7,opt,name=pageNum,proto3" json:"pageNum,omitempty"`                 //当前页码
+	PageSize        int64  `protobuf:"varint,8,opt,name=pageSize,proto3" json:"pageSize,omitempty"`               //每页数量
+	Province        string `protobuf:"bytes,9,opt,name=province,proto3" json:"province,omitempty"`                //省份
+	City            string `protobuf:"bytes,10,opt,name=city,proto3" json:"city,omitempty"`                       //城市
+	Subtype         string `protobuf:"bytes,11,opt,name=subtype,proto3" json:"subtype,omitempty"`                 //信息类型-二级
+	TopType         string `protobuf:"bytes,12,opt,name=topType,proto3" json:"topType,omitempty"`                 //信息类型-一级分类
+	PublishTime     string `protobuf:"bytes,13,opt,name=publishTime,proto3" json:"publishTime,omitempty"`         //发布时间
+	SelectType      string `protobuf:"bytes,14,opt,name=selectType,proto3" json:"selectType,omitempty"`           //搜索范围:标题;正文等
+	Price           string `protobuf:"bytes,15,opt,name=price,proto3" json:"price,omitempty"`                     //价格
+	Industry        string `protobuf:"bytes,16,opt,name=industry,proto3" json:"industry,omitempty"`               //行业
+	BuyerClass      string `protobuf:"bytes,17,opt,name=buyerClass,proto3" json:"buyerClass,omitempty"`           //采购单位类型
+	BuyerTel        string `protobuf:"bytes,18,opt,name=buyerTel,proto3" json:"buyerTel,omitempty"`               //采购单位联系方式
+	WinnerTel       string `protobuf:"bytes,19,opt,name=winnerTel,proto3" json:"winnerTel,omitempty"`             //中标单位联系方式
+	FileExists      string `protobuf:"bytes,20,opt,name=fileExists,proto3" json:"fileExists,omitempty"`           //是否有附件
+	SearchGroup     int64  `protobuf:"varint,21,opt,name=searchGroup,proto3" json:"searchGroup,omitempty"`        //搜索分组:默认0:全部;1:招标采购公告;2:超前项目
+	SearchMode      int64  `protobuf:"varint,22,opt,name=searchMode,proto3" json:"searchMode,omitempty"`          //搜索模式:0:精准搜索;1:模糊搜索
+	WordsMode       int64  `protobuf:"varint,23,opt,name=wordsMode,proto3" json:"wordsMode,omitempty"`            //搜索关键词模式;默认0:包含所有,1:包含任意
+	KeyWords        string `protobuf:"bytes,24,opt,name=keyWords,proto3" json:"keyWords,omitempty"`               //关键词:多个空格隔开(主)
+	AdditionalWords string `protobuf:"bytes,25,opt,name=additionalWords,proto3" json:"additionalWords,omitempty"` //关键词:附加关键词(副:五组,每组最多15个字符)
+	ExclusionWords  string `protobuf:"bytes,26,opt,name=exclusionWords,proto3" json:"exclusionWords,omitempty"`   //关键词:排除词(副:五组,每组最多15个字符)
+	UserType        string `protobuf:"bytes,27,opt,name=userType,proto3" json:"userType,omitempty"`               //用户状态 fType:免费用户;pType:付费用户;vType:超级订阅用户;mType:大会员用户;eType:商机管理用户
+	Platform        string `protobuf:"bytes,28,opt,name=platform,proto3" json:"platform,omitempty"`               //请求平台
 }
 
 func (x *SearchReq) Reset() {
@@ -88,25 +94,53 @@ func (x *SearchReq) GetAppId() string {
 	return ""
 }
 
-func (x *SearchReq) GetPageNum() int64 {
+func (x *SearchReq) GetUserId() string {
 	if x != nil {
-		return x.PageNum
+		return x.UserId
+	}
+	return ""
+}
+
+func (x *SearchReq) GetPhone() string {
+	if x != nil {
+		return x.Phone
+	}
+	return ""
+}
+
+func (x *SearchReq) GetNewUserId() string {
+	if x != nil {
+		return x.NewUserId
+	}
+	return ""
+}
+
+func (x *SearchReq) GetEntId() int64 {
+	if x != nil {
+		return x.EntId
 	}
 	return 0
 }
 
-func (x *SearchReq) GetPageSize() int64 {
+func (x *SearchReq) GetEntUserId() int64 {
 	if x != nil {
-		return x.PageSize
+		return x.EntUserId
 	}
 	return 0
 }
 
-func (x *SearchReq) GetKeyWords() string {
+func (x *SearchReq) GetPageNum() int64 {
 	if x != nil {
-		return x.KeyWords
+		return x.PageNum
 	}
-	return ""
+	return 0
+}
+
+func (x *SearchReq) GetPageSize() int64 {
+	if x != nil {
+		return x.PageSize
+	}
+	return 0
 }
 
 func (x *SearchReq) GetProvince() string {
@@ -130,6 +164,13 @@ func (x *SearchReq) GetSubtype() string {
 	return ""
 }
 
+func (x *SearchReq) GetTopType() string {
+	if x != nil {
+		return x.TopType
+	}
+	return ""
+}
+
 func (x *SearchReq) GetPublishTime() string {
 	if x != nil {
 		return x.PublishTime
@@ -179,58 +220,65 @@ func (x *SearchReq) GetWinnerTel() string {
 	return ""
 }
 
-func (x *SearchReq) GetExclusionWords() string {
+func (x *SearchReq) GetFileExists() string {
 	if x != nil {
-		return x.ExclusionWords
+		return x.FileExists
 	}
 	return ""
 }
 
-func (x *SearchReq) GetFileExists() string {
+func (x *SearchReq) GetSearchGroup() int64 {
 	if x != nil {
-		return x.FileExists
+		return x.SearchGroup
 	}
-	return ""
+	return 0
 }
 
-func (x *SearchReq) GetUserId() string {
+func (x *SearchReq) GetSearchMode() int64 {
 	if x != nil {
-		return x.UserId
+		return x.SearchMode
 	}
-	return ""
+	return 0
 }
 
-func (x *SearchReq) GetEntId() string {
+func (x *SearchReq) GetWordsMode() int64 {
 	if x != nil {
-		return x.EntId
+		return x.WordsMode
+	}
+	return 0
+}
+
+func (x *SearchReq) GetKeyWords() string {
+	if x != nil {
+		return x.KeyWords
 	}
 	return ""
 }
 
-func (x *SearchReq) GetUserType() string {
+func (x *SearchReq) GetAdditionalWords() string {
 	if x != nil {
-		return x.UserType
+		return x.AdditionalWords
 	}
 	return ""
 }
 
-func (x *SearchReq) GetSplitKeywords() string {
+func (x *SearchReq) GetExclusionWords() string {
 	if x != nil {
-		return x.SplitKeywords
+		return x.ExclusionWords
 	}
 	return ""
 }
 
-func (x *SearchReq) GetPlatform() string {
+func (x *SearchReq) GetUserType() string {
 	if x != nil {
-		return x.Platform
+		return x.UserType
 	}
 	return ""
 }
 
-func (x *SearchReq) GetToptype() string {
+func (x *SearchReq) GetPlatform() string {
 	if x != nil {
-		return x.Toptype
+		return x.Platform
 	}
 	return ""
 }
@@ -303,15 +351,15 @@ type SearchData struct {
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	Count             int64         `protobuf:"varint,1,opt,name=count,proto3" json:"count,omitempty"`
-	KeyWords          string        `protobuf:"bytes,2,opt,name=keyWords,proto3" json:"keyWords,omitempty"`
-	IsLimit           int64         `protobuf:"varint,3,opt,name=isLimit,proto3" json:"isLimit,omitempty"`
-	HistoryKeys       []string      `protobuf:"bytes,4,rep,name=historyKeys,proto3" json:"historyKeys,omitempty"`
-	List              []*SearchList `protobuf:"bytes,5,rep,name=list,proto3" json:"list,omitempty"`
-	TotalPage         int64         `protobuf:"varint,6,opt,name=totalPage,proto3" json:"totalPage,omitempty"`
-	InterceptWord     string        `protobuf:"bytes,7,opt,name=interceptWord,proto3" json:"interceptWord,omitempty"`
-	InterceptLimit    int64         `protobuf:"varint,8,opt,name=interceptLimit,proto3" json:"interceptLimit,omitempty"`
-	InterceptKeywords string        `protobuf:"bytes,9,opt,name=interceptKeywords,proto3" json:"interceptKeywords,omitempty"`
+	Count             int64         `protobuf:"varint,1,opt,name=count,proto3" json:"count,omitempty"`                        //返回数据量
+	KeyWords          string        `protobuf:"bytes,2,opt,name=keyWords,proto3" json:"keyWords,omitempty"`                   //关键词
+	IsLimit           int64         `protobuf:"varint,3,opt,name=isLimit,proto3" json:"isLimit,omitempty"`                    //全文检索限制//限制正文、附件查询 //return 1 正常 //return -1 抱歉!由于系统繁忙暂时无法进行搜索,请1分钟后再试! //return -2 抱歉!由于系统繁忙暂时无法进行搜索,请稍后再试!
+	HistoryKeys       []string      `protobuf:"bytes,4,rep,name=historyKeys,proto3" json:"historyKeys,omitempty"`             //历史搜索关键词
+	List              []*SearchList `protobuf:"bytes,5,rep,name=list,proto3" json:"list,omitempty"`                           //搜索列表
+	NumberMsg         string        `protobuf:"bytes,6,opt,name=numberMsg,proto3" json:"numberMsg,omitempty"`                 //查询总结果数量
+	Remark            string        `protobuf:"bytes,7,opt,name=remark,proto3" json:"remark,omitempty"`                       //备注
+	InterceptLimit    int64         `protobuf:"varint,8,opt,name=interceptLimit,proto3" json:"interceptLimit,omitempty"`      //关键词截取长度
+	InterceptKeyWords string        `protobuf:"bytes,9,opt,name=interceptKeyWords,proto3" json:"interceptKeyWords,omitempty"` //关键词截取结果
 }
 
 func (x *SearchData) Reset() {
@@ -381,16 +429,16 @@ func (x *SearchData) GetList() []*SearchList {
 	return nil
 }
 
-func (x *SearchData) GetTotalPage() int64 {
+func (x *SearchData) GetNumberMsg() string {
 	if x != nil {
-		return x.TotalPage
+		return x.NumberMsg
 	}
-	return 0
+	return ""
 }
 
-func (x *SearchData) GetInterceptWord() string {
+func (x *SearchData) GetRemark() string {
 	if x != nil {
-		return x.InterceptWord
+		return x.Remark
 	}
 	return ""
 }
@@ -402,9 +450,9 @@ func (x *SearchData) GetInterceptLimit() int64 {
 	return 0
 }
 
-func (x *SearchData) GetInterceptKeywords() string {
+func (x *SearchData) GetInterceptKeyWords() string {
 	if x != nil {
-		return x.InterceptKeywords
+		return x.InterceptKeyWords
 	}
 	return ""
 }
@@ -414,30 +462,39 @@ type SearchList struct {
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	Id          string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
-	Area        string `protobuf:"bytes,2,opt,name=area,proto3" json:"area,omitempty"`
-	AreaUrl     string `protobuf:"bytes,3,opt,name=areaUrl,proto3" json:"areaUrl,omitempty"`
-	BuyerClass  string `protobuf:"bytes,4,opt,name=buyerClass,proto3" json:"buyerClass,omitempty"`
-	City        string `protobuf:"bytes,5,opt,name=city,proto3" json:"city,omitempty"`
-	Detail      string `protobuf:"bytes,6,opt,name=detail,proto3" json:"detail,omitempty"`
-	Industry    string `protobuf:"bytes,7,opt,name=industry,proto3" json:"industry,omitempty"`
-	IndustryUrl string `protobuf:"bytes,8,opt,name=industryUrl,proto3" json:"industryUrl,omitempty"`
-	PublishTime int64  `protobuf:"varint,9,opt,name=publishTime,proto3" json:"publishTime,omitempty"`
-	Subtype     string `protobuf:"bytes,10,opt,name=subtype,proto3" json:"subtype,omitempty"`
-	SubtypeUrl  string `protobuf:"bytes,11,opt,name=subtypeUrl,proto3" json:"subtypeUrl,omitempty"`
-	FileExists  bool   `protobuf:"varint,12,opt,name=fileExists,proto3" json:"fileExists,omitempty"`
-	Title       string `protobuf:"bytes,13,opt,name=title,proto3" json:"title,omitempty"`
-	IsCollected bool   `protobuf:"varint,14,opt,name=isCollected,proto3" json:"isCollected,omitempty"`
-	Bidamount   int64  `protobuf:"varint,15,opt,name=bidamount,proto3" json:"bidamount,omitempty"`     //中标金额
-	Budget      int64  `protobuf:"varint,16,opt,name=budget,proto3" json:"budget,omitempty"`           //预算
-	ProjectName string `protobuf:"bytes,17,opt,name=projectName,proto3" json:"projectName,omitempty"`  //项目名称
-	Buyer       string `protobuf:"bytes,18,opt,name=buyer,proto3" json:"buyer,omitempty"`              //采购单位
-	Winner      string `protobuf:"bytes,19,opt,name=winner,proto3" json:"winner,omitempty"`            //中标企业
-	BidopenTime int64  `protobuf:"varint,20,opt,name=bidopenTime,proto3" json:"bidopenTime,omitempty"` //开标时间
-	ProjectInfo *PInfo `protobuf:"bytes,21,opt,name=projectInfo,proto3" json:"projectInfo,omitempty"`  //拟建项目信息
-	ProjectCode string `protobuf:"bytes,22,opt,name=projectCode,proto3" json:"projectCode,omitempty"`  //项目代码
-	Site        string `protobuf:"bytes,23,opt,name=site,proto3" json:"site,omitempty"`                //网站名称
-	SpiderCode  string `protobuf:"bytes,24,opt,name=spiderCode,proto3" json:"spiderCode,omitempty"`    //网站代码
+	Id           string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`                      //信息id
+	Area         string `protobuf:"bytes,2,opt,name=area,proto3" json:"area,omitempty"`                  //地区
+	AreaUrl      string `protobuf:"bytes,3,opt,name=areaUrl,proto3" json:"areaUrl,omitempty"`            //地区标签地址
+	BuyerClass   string `protobuf:"bytes,4,opt,name=buyerClass,proto3" json:"buyerClass,omitempty"`      //采购单位类型
+	City         string `protobuf:"bytes,5,opt,name=city,proto3" json:"city,omitempty"`                  //城市
+	Detail       string `protobuf:"bytes,6,opt,name=detail,proto3" json:"detail,omitempty"`              //正文搜索内容
+	Industry     string `protobuf:"bytes,7,opt,name=industry,proto3" json:"industry,omitempty"`          //行业标签
+	IndustryUrl  string `protobuf:"bytes,8,opt,name=industryUrl,proto3" json:"industryUrl,omitempty"`    //行业标签地址
+	PublishTime  int64  `protobuf:"varint,9,opt,name=publishTime,proto3" json:"publishTime,omitempty"`   //发布时间
+	FileExists   bool   `protobuf:"varint,10,opt,name=fileExists,proto3" json:"fileExists,omitempty"`    //是否有附件
+	Subtype      string `protobuf:"bytes,11,opt,name=subtype,proto3" json:"subtype,omitempty"`           //信息类型
+	SubtypeUrl   string `protobuf:"bytes,12,opt,name=subtypeUrl,proto3" json:"subtypeUrl,omitempty"`     //信息类型标签地址
+	Title        string `protobuf:"bytes,13,opt,name=title,proto3" json:"title,omitempty"`               //标题
+	IsCollected  bool   `protobuf:"varint,14,opt,name=isCollected,proto3" json:"isCollected,omitempty"`  //信息是否被收藏
+	ProjectName  string `protobuf:"bytes,15,opt,name=projectName,proto3" json:"projectName,omitempty"`   //项目名称
+	ProjectCode  string `protobuf:"bytes,16,opt,name=projectCode,proto3" json:"projectCode,omitempty"`   //项目代码
+	Budget       int64  `protobuf:"varint,17,opt,name=budget,proto3" json:"budget,omitempty"`            //预算
+	BidAmount    int64  `protobuf:"varint,18,opt,name=bidAmount,proto3" json:"bidAmount,omitempty"`      //中标金额
+	Buyer        string `protobuf:"bytes,19,opt,name=buyer,proto3" json:"buyer,omitempty"`               //采购单位
+	BuyerTel     string `protobuf:"bytes,20,opt,name=buyerTel,proto3" json:"buyerTel,omitempty"`         //采购单位联系电话
+	BuyerPerson  string `protobuf:"bytes,21,opt,name=buyerPerson,proto3" json:"buyerPerson,omitempty"`   //采购单位联系人
+	Agency       string `protobuf:"bytes,22,opt,name=agency,proto3" json:"agency,omitempty"`             //代理机构
+	AgencyPerson string `protobuf:"bytes,23,opt,name=agencyPerson,proto3" json:"agencyPerson,omitempty"` //代理机构联系人
+	AgencyTel    string `protobuf:"bytes,24,opt,name=agencyTel,proto3" json:"agencyTel,omitempty"`       //代理机构联系电话
+	Winner       string `protobuf:"bytes,25,opt,name=winner,proto3" json:"winner,omitempty"`             //中标企业
+	WinnerPerson string `protobuf:"bytes,26,opt,name=winnerPerson,proto3" json:"winnerPerson,omitempty"` //中标企业联系人
+	WinnerTel    string `protobuf:"bytes,27,opt,name=winnerTel,proto3" json:"winnerTel,omitempty"`       //中标企业联系电话
+	BidOpenTime  string `protobuf:"bytes,28,opt,name=bidOpenTime,proto3" json:"bidOpenTime,omitempty"`   //开标时间
+	SignEndTime  string `protobuf:"bytes,29,opt,name=signEndTime,proto3" json:"signEndTime,omitempty"`   //报名截止时间
+	BidEndTime   string `protobuf:"bytes,30,opt,name=bidEndTime,proto3" json:"bidEndTime,omitempty"`     //投标截止时间
+	Site         string `protobuf:"bytes,31,opt,name=site,proto3" json:"site,omitempty"`                 //网站名称
+	SpiderCode   string `protobuf:"bytes,32,opt,name=spiderCode,proto3" json:"spiderCode,omitempty"`     //网站代码
+	ProjectInfo  *PInfo `protobuf:"bytes,33,opt,name=projectInfo,proto3" json:"projectInfo,omitempty"`   //拟建项目信息
 }
 
 func (x *SearchList) Reset() {
@@ -535,6 +592,13 @@ func (x *SearchList) GetPublishTime() int64 {
 	return 0
 }
 
+func (x *SearchList) GetFileExists() bool {
+	if x != nil {
+		return x.FileExists
+	}
+	return false
+}
+
 func (x *SearchList) GetSubtype() string {
 	if x != nil {
 		return x.Subtype
@@ -549,13 +613,6 @@ func (x *SearchList) GetSubtypeUrl() string {
 	return ""
 }
 
-func (x *SearchList) GetFileExists() bool {
-	if x != nil {
-		return x.FileExists
-	}
-	return false
-}
-
 func (x *SearchList) GetTitle() string {
 	if x != nil {
 		return x.Title
@@ -570,11 +627,18 @@ func (x *SearchList) GetIsCollected() bool {
 	return false
 }
 
-func (x *SearchList) GetBidamount() int64 {
+func (x *SearchList) GetProjectName() string {
 	if x != nil {
-		return x.Bidamount
+		return x.ProjectName
 	}
-	return 0
+	return ""
+}
+
+func (x *SearchList) GetProjectCode() string {
+	if x != nil {
+		return x.ProjectCode
+	}
+	return ""
 }
 
 func (x *SearchList) GetBudget() int64 {
@@ -584,11 +648,11 @@ func (x *SearchList) GetBudget() int64 {
 	return 0
 }
 
-func (x *SearchList) GetProjectName() string {
+func (x *SearchList) GetBidAmount() int64 {
 	if x != nil {
-		return x.ProjectName
+		return x.BidAmount
 	}
-	return ""
+	return 0
 }
 
 func (x *SearchList) GetBuyer() string {
@@ -598,6 +662,41 @@ func (x *SearchList) GetBuyer() string {
 	return ""
 }
 
+func (x *SearchList) GetBuyerTel() string {
+	if x != nil {
+		return x.BuyerTel
+	}
+	return ""
+}
+
+func (x *SearchList) GetBuyerPerson() string {
+	if x != nil {
+		return x.BuyerPerson
+	}
+	return ""
+}
+
+func (x *SearchList) GetAgency() string {
+	if x != nil {
+		return x.Agency
+	}
+	return ""
+}
+
+func (x *SearchList) GetAgencyPerson() string {
+	if x != nil {
+		return x.AgencyPerson
+	}
+	return ""
+}
+
+func (x *SearchList) GetAgencyTel() string {
+	if x != nil {
+		return x.AgencyTel
+	}
+	return ""
+}
+
 func (x *SearchList) GetWinner() string {
 	if x != nil {
 		return x.Winner
@@ -605,23 +704,37 @@ func (x *SearchList) GetWinner() string {
 	return ""
 }
 
-func (x *SearchList) GetBidopenTime() int64 {
+func (x *SearchList) GetWinnerPerson() string {
 	if x != nil {
-		return x.BidopenTime
+		return x.WinnerPerson
 	}
-	return 0
+	return ""
 }
 
-func (x *SearchList) GetProjectInfo() *PInfo {
+func (x *SearchList) GetWinnerTel() string {
 	if x != nil {
-		return x.ProjectInfo
+		return x.WinnerTel
 	}
-	return nil
+	return ""
 }
 
-func (x *SearchList) GetProjectCode() string {
+func (x *SearchList) GetBidOpenTime() string {
 	if x != nil {
-		return x.ProjectCode
+		return x.BidOpenTime
+	}
+	return ""
+}
+
+func (x *SearchList) GetSignEndTime() string {
+	if x != nil {
+		return x.SignEndTime
+	}
+	return ""
+}
+
+func (x *SearchList) GetBidEndTime() string {
+	if x != nil {
+		return x.BidEndTime
 	}
 	return ""
 }
@@ -640,6 +753,13 @@ func (x *SearchList) GetSpiderCode() string {
 	return ""
 }
 
+func (x *SearchList) GetProjectInfo() *PInfo {
+	if x != nil {
+		return x.ProjectInfo
+	}
+	return nil
+}
+
 //
 type PInfo struct {
 	state         protoimpl.MessageState
@@ -900,161 +1020,189 @@ var File_bxcore_proto protoreflect.FileDescriptor
 
 var file_bxcore_proto_rawDesc = []byte{
 	0x0a, 0x0c, 0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06,
-	0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x22, 0xf9, 0x04, 0x0a, 0x09, 0x53, 0x65, 0x61, 0x72, 0x63,
+	0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x22, 0xaf, 0x06, 0x0a, 0x09, 0x53, 0x65, 0x61, 0x72, 0x63,
 	0x68, 0x52, 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x18, 0x01, 0x20,
-	0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61,
-	0x67, 0x65, 0x4e, 0x75, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x70, 0x61, 0x67,
+	0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73,
+	0x65, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72,
+	0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x65, 0x77, 0x55,
+	0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x65, 0x77,
+	0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18,
+	0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09,
+	0x65, 0x6e, 0x74, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52,
+	0x09, 0x65, 0x6e, 0x74, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61,
+	0x67, 0x65, 0x4e, 0x75, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x70, 0x61, 0x67,
 	0x65, 0x4e, 0x75, 0x6d, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65,
-	0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65,
-	0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x57, 0x6f, 0x72, 0x64, 0x73, 0x18, 0x04, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x57, 0x6f, 0x72, 0x64, 0x73, 0x12, 0x1a, 0x0a, 0x08,
-	0x70, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08,
-	0x70, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x69, 0x74, 0x79,
-	0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x69, 0x74, 0x79, 0x12, 0x18, 0x0a, 0x07,
-	0x73, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73,
-	0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73,
-	0x68, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x75, 0x62,
-	0x6c, 0x69, 0x73, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x65, 0x6c, 0x65,
-	0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65,
-	0x6c, 0x65, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x72, 0x69, 0x63,
-	0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x12, 0x1a,
-	0x0a, 0x08, 0x69, 0x6e, 0x64, 0x75, 0x73, 0x74, 0x72, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x08, 0x69, 0x6e, 0x64, 0x75, 0x73, 0x74, 0x72, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x62, 0x75,
-	0x79, 0x65, 0x72, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a,
-	0x62, 0x75, 0x79, 0x65, 0x72, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x75,
-	0x79, 0x65, 0x72, 0x54, 0x65, 0x6c, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x75,
-	0x79, 0x65, 0x72, 0x54, 0x65, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x77, 0x69, 0x6e, 0x6e, 0x65, 0x72,
-	0x54, 0x65, 0x6c, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x77, 0x69, 0x6e, 0x6e, 0x65,
-	0x72, 0x54, 0x65, 0x6c, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f,
-	0x6e, 0x57, 0x6f, 0x72, 0x64, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x65, 0x78,
-	0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x64, 0x73, 0x12, 0x1e, 0x0a, 0x0a,
-	0x66, 0x69, 0x6c, 0x65, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06,
-	0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73,
-	0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x12, 0x20,
-	0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73,
-	0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73,
-	0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x4b,
-	0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73,
-	0x70, 0x6c, 0x69, 0x74, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x12, 0x1a, 0x0a, 0x08,
-	0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08,
-	0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x6f, 0x70, 0x74,
-	0x79, 0x70, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6f, 0x70, 0x74, 0x79,
-	0x70, 0x65, 0x22, 0x68, 0x0a, 0x0a, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70,
-	0x12, 0x19, 0x0a, 0x08, 0x65, 0x72, 0x72, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01,
-	0x28, 0x03, 0x52, 0x07, 0x65, 0x72, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x65,
-	0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72,
-	0x72, 0x4d, 0x73, 0x67, 0x12, 0x26, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01,
-	0x28, 0x0b, 0x32, 0x12, 0x2e, 0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x53, 0x65, 0x61, 0x72,
-	0x63, 0x68, 0x44, 0x61, 0x74, 0x61, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xbc, 0x02, 0x0a,
-	0x0a, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x63,
-	0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e,
-	0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x57, 0x6f, 0x72, 0x64, 0x73, 0x18, 0x02, 0x20,
-	0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x57, 0x6f, 0x72, 0x64, 0x73, 0x12, 0x18, 0x0a,
-	0x07, 0x69, 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07,
-	0x69, 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x68, 0x69, 0x73, 0x74, 0x6f,
-	0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x68, 0x69,
-	0x73, 0x74, 0x6f, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x26, 0x0a, 0x04, 0x6c, 0x69, 0x73,
-	0x74, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x62, 0x78, 0x63, 0x6f, 0x72, 0x65,
-	0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x04, 0x6c, 0x69, 0x73,
-	0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x50, 0x61, 0x67, 0x65, 0x18, 0x06,
-	0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x50, 0x61, 0x67, 0x65, 0x12,
-	0x24, 0x0a, 0x0d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x63, 0x65, 0x70, 0x74, 0x57, 0x6f, 0x72, 0x64,
-	0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x63, 0x65, 0x70,
-	0x74, 0x57, 0x6f, 0x72, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x63, 0x65,
-	0x70, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x69,
-	0x6e, 0x74, 0x65, 0x72, 0x63, 0x65, 0x70, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x2c, 0x0a,
-	0x11, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x63, 0x65, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72,
-	0x64, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x63,
-	0x65, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x22, 0xb7, 0x05, 0x0a, 0x0a,
-	0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64,
-	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x72,
-	0x65, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x72, 0x65, 0x61, 0x12, 0x18,
-	0x0a, 0x07, 0x61, 0x72, 0x65, 0x61, 0x55, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x07, 0x61, 0x72, 0x65, 0x61, 0x55, 0x72, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x62, 0x75, 0x79, 0x65,
-	0x72, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75,
-	0x79, 0x65, 0x72, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x69, 0x74, 0x79,
-	0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06,
-	0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x65,
-	0x74, 0x61, 0x69, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x6e, 0x64, 0x75, 0x73, 0x74, 0x72, 0x79,
-	0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x6e, 0x64, 0x75, 0x73, 0x74, 0x72, 0x79,
-	0x12, 0x20, 0x0a, 0x0b, 0x69, 0x6e, 0x64, 0x75, 0x73, 0x74, 0x72, 0x79, 0x55, 0x72, 0x6c, 0x18,
-	0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x6e, 0x64, 0x75, 0x73, 0x74, 0x72, 0x79, 0x55,
-	0x72, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x54, 0x69, 0x6d,
-	0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68,
-	0x54, 0x69, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x18,
-	0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1e,
-	0x0a, 0x0a, 0x73, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x55, 0x72, 0x6c, 0x18, 0x0b, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x0a, 0x73, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x1e,
-	0x0a, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x18, 0x0c, 0x20, 0x01,
-	0x28, 0x08, 0x52, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x12, 0x14,
-	0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74,
-	0x69, 0x74, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x73, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63,
-	0x74, 0x65, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x43, 0x6f, 0x6c,
-	0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x62, 0x69, 0x64, 0x61, 0x6d, 0x6f,
-	0x75, 0x6e, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x62, 0x69, 0x64, 0x61, 0x6d,
-	0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x18, 0x10,
-	0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x12, 0x20, 0x0a, 0x0b,
-	0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28,
-	0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14,
-	0x0a, 0x05, 0x62, 0x75, 0x79, 0x65, 0x72, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x62,
-	0x75, 0x79, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x77, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x18, 0x13,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x77, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b,
-	0x62, 0x69, 0x64, 0x6f, 0x70, 0x65, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28,
-	0x03, 0x52, 0x0b, 0x62, 0x69, 0x64, 0x6f, 0x70, 0x65, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x2f,
-	0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x15, 0x20,
-	0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x49, 0x6e,
-	0x66, 0x6f, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12,
-	0x20, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x16,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x64,
-	0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x74, 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x04, 0x73, 0x69, 0x74, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x70, 0x69, 0x64, 0x65, 0x72, 0x43,
-	0x6f, 0x64, 0x65, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x70, 0x69, 0x64, 0x65,
-	0x72, 0x43, 0x6f, 0x64, 0x65, 0x22, 0x83, 0x02, 0x0a, 0x05, 0x50, 0x49, 0x6e, 0x66, 0x6f, 0x12,
-	0x20, 0x0a, 0x0b, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x01,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x64,
-	0x65, 0x12, 0x26, 0x0a, 0x0e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x74,
-	0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x61, 0x70, 0x70, 0x72, 0x6f,
-	0x76, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x70, 0x70,
-	0x72, 0x6f, 0x76, 0x65, 0x44, 0x65, 0x70, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b,
-	0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x44, 0x65, 0x70, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x61,
-	0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x0d, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75,
-	0x73, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65,
-	0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x54,
-	0x69, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x79,
-	0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63,
-	0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65,
-	0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x70,
-	0x70, 0x72, 0x6f, 0x76, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0xc2, 0x01, 0x0a, 0x0e,
-	0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x12, 0x14,
-	0x0a, 0x05, 0x61, 0x70, 0x70, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61,
-	0x70, 0x70, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x4f, 0x75, 0x74, 0x18,
-	0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x4f, 0x75, 0x74, 0x12, 0x14,
-	0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x63,
-	0x6f, 0x75, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x6c, 0x61, 0x67, 0x18, 0x04, 0x20, 0x01,
-	0x28, 0x03, 0x52, 0x04, 0x66, 0x6c, 0x61, 0x67, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x63,
-	0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x70, 0x65,
-	0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72,
-	0x49, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64,
-	0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x18, 0x07,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65,
-	0x22, 0x59, 0x0a, 0x0f, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52,
-	0x65, 0x73, 0x70, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x72, 0x72, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18,
-	0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x65, 0x72, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x17,
-	0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18,
-	0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0x80, 0x01, 0x0a, 0x06,
-	0x42, 0x78, 0x43, 0x6f, 0x72, 0x65, 0x12, 0x36, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x53, 0x65, 0x61,
-	0x72, 0x63, 0x68, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x11, 0x2e, 0x62, 0x78, 0x63, 0x6f, 0x72, 0x65,
-	0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x62, 0x78, 0x63,
-	0x6f, 0x72, 0x65, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x12, 0x3e,
-	0x0a, 0x0b, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x2e,
-	0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4c, 0x69, 0x6d,
-	0x69, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x53,
-	0x65, 0x61, 0x72, 0x63, 0x68, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x42, 0x0a,
-	0x5a, 0x08, 0x2e, 0x2f, 0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,
-	0x6f, 0x33,
+	0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65,
+	0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x18, 0x09, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04,
+	0x63, 0x69, 0x74, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x69, 0x74, 0x79,
+	0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x07, 0x73, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x6f,
+	0x70, 0x54, 0x79, 0x70, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6f, 0x70,
+	0x54, 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x54,
+	0x69, 0x6d, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x75, 0x62, 0x6c, 0x69,
+	0x73, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74,
+	0x54, 0x79, 0x70, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x6c, 0x65,
+	0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18,
+	0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08,
+	0x69, 0x6e, 0x64, 0x75, 0x73, 0x74, 0x72, 0x79, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08,
+	0x69, 0x6e, 0x64, 0x75, 0x73, 0x74, 0x72, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x62, 0x75, 0x79, 0x65,
+	0x72, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75,
+	0x79, 0x65, 0x72, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x75, 0x79, 0x65,
+	0x72, 0x54, 0x65, 0x6c, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x75, 0x79, 0x65,
+	0x72, 0x54, 0x65, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x77, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x54, 0x65,
+	0x6c, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x77, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x54,
+	0x65, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73,
+	0x18, 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x45, 0x78, 0x69, 0x73,
+	0x74, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75,
+	0x70, 0x18, 0x15, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x47,
+	0x72, 0x6f, 0x75, 0x70, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, 0x6f,
+	0x64, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68,
+	0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x4d, 0x6f, 0x64,
+	0x65, 0x18, 0x17, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x4d, 0x6f,
+	0x64, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x57, 0x6f, 0x72, 0x64, 0x73, 0x18, 0x18,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x57, 0x6f, 0x72, 0x64, 0x73, 0x12, 0x28,
+	0x0a, 0x0f, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x64,
+	0x73, 0x18, 0x19, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f,
+	0x6e, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x64, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c,
+	0x75, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x64, 0x73, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x64, 0x73,
+	0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x18, 0x1b, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08,
+	0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08,
+	0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x22, 0x68, 0x0a, 0x0a, 0x53, 0x65, 0x61, 0x72,
+	0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x72, 0x72, 0x5f, 0x63, 0x6f,
+	0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x65, 0x72, 0x72, 0x43, 0x6f, 0x64,
+	0x65, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x26, 0x0a, 0x04, 0x64, 0x61,
+	0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x62, 0x78, 0x63, 0x6f, 0x72,
+	0x65, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x61, 0x74, 0x61, 0x52, 0x04, 0x64, 0x61,
+	0x74, 0x61, 0x22, 0xae, 0x02, 0x0a, 0x0a, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x61, 0x74,
+	0x61, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03,
+	0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x57, 0x6f,
+	0x72, 0x64, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x57, 0x6f,
+	0x72, 0x64, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x69, 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03,
+	0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x69, 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x20, 0x0a,
+	0x0b, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x04, 0x20, 0x03,
+	0x28, 0x09, 0x52, 0x0b, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x12,
+	0x26, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e,
+	0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4c, 0x69, 0x73,
+	0x74, 0x52, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x75, 0x6d, 0x62, 0x65,
+	0x72, 0x4d, 0x73, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x75, 0x6d, 0x62,
+	0x65, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x18,
+	0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x26, 0x0a,
+	0x0e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x63, 0x65, 0x70, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18,
+	0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x63, 0x65, 0x70, 0x74,
+	0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x2c, 0x0a, 0x11, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x63, 0x65,
+	0x70, 0x74, 0x4b, 0x65, 0x79, 0x57, 0x6f, 0x72, 0x64, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x11, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x63, 0x65, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x57, 0x6f,
+	0x72, 0x64, 0x73, 0x22, 0xd3, 0x07, 0x0a, 0x0a, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4c, 0x69,
+	0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02,
+	0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x72, 0x65, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x04, 0x61, 0x72, 0x65, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x72, 0x65, 0x61, 0x55, 0x72,
+	0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x72, 0x65, 0x61, 0x55, 0x72, 0x6c,
+	0x12, 0x1e, 0x0a, 0x0a, 0x62, 0x75, 0x79, 0x65, 0x72, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x04,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x79, 0x65, 0x72, 0x43, 0x6c, 0x61, 0x73, 0x73,
+	0x12, 0x12, 0x0a, 0x04, 0x63, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
+	0x63, 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x06,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x1a, 0x0a, 0x08,
+	0x69, 0x6e, 0x64, 0x75, 0x73, 0x74, 0x72, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08,
+	0x69, 0x6e, 0x64, 0x75, 0x73, 0x74, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x6e, 0x64, 0x75,
+	0x73, 0x74, 0x72, 0x79, 0x55, 0x72, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69,
+	0x6e, 0x64, 0x75, 0x73, 0x74, 0x72, 0x79, 0x55, 0x72, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x75,
+	0x62, 0x6c, 0x69, 0x73, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52,
+	0x0b, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a,
+	0x66, 0x69, 0x6c, 0x65, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08,
+	0x52, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07,
+	0x73, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73,
+	0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x75, 0x62, 0x74, 0x79, 0x70,
+	0x65, 0x55, 0x72, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x75, 0x62, 0x74,
+	0x79, 0x70, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18,
+	0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b,
+	0x69, 0x73, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28,
+	0x08, 0x52, 0x0b, 0x69, 0x73, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x20,
+	0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x0f, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65,
+	0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x18,
+	0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x6f,
+	0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x18, 0x11, 0x20, 0x01,
+	0x28, 0x03, 0x52, 0x06, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x62, 0x69,
+	0x64, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x12, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x62,
+	0x69, 0x64, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x75, 0x79, 0x65,
+	0x72, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x62, 0x75, 0x79, 0x65, 0x72, 0x12, 0x1a,
+	0x0a, 0x08, 0x62, 0x75, 0x79, 0x65, 0x72, 0x54, 0x65, 0x6c, 0x18, 0x14, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x08, 0x62, 0x75, 0x79, 0x65, 0x72, 0x54, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x62, 0x75,
+	0x79, 0x65, 0x72, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x0b, 0x62, 0x75, 0x79, 0x65, 0x72, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06,
+	0x61, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x67,
+	0x65, 0x6e, 0x63, 0x79, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x50, 0x65,
+	0x72, 0x73, 0x6f, 0x6e, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x67, 0x65, 0x6e,
+	0x63, 0x79, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x67, 0x65, 0x6e,
+	0x63, 0x79, 0x54, 0x65, 0x6c, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x67, 0x65,
+	0x6e, 0x63, 0x79, 0x54, 0x65, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x77, 0x69, 0x6e, 0x6e, 0x65, 0x72,
+	0x18, 0x19, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x77, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x12, 0x22,
+	0x0a, 0x0c, 0x77, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x18, 0x1a,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x50, 0x65, 0x72, 0x73,
+	0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x77, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x54, 0x65, 0x6c, 0x18,
+	0x1b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x77, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x54, 0x65, 0x6c,
+	0x12, 0x20, 0x0a, 0x0b, 0x62, 0x69, 0x64, 0x4f, 0x70, 0x65, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x18,
+	0x1c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x62, 0x69, 0x64, 0x4f, 0x70, 0x65, 0x6e, 0x54, 0x69,
+	0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x69, 0x67, 0x6e, 0x45, 0x6e, 0x64, 0x54, 0x69, 0x6d,
+	0x65, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x69, 0x67, 0x6e, 0x45, 0x6e, 0x64,
+	0x54, 0x69, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x62, 0x69, 0x64, 0x45, 0x6e, 0x64, 0x54, 0x69,
+	0x6d, 0x65, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x69, 0x64, 0x45, 0x6e, 0x64,
+	0x54, 0x69, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x74, 0x65, 0x18, 0x1f, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x04, 0x73, 0x69, 0x74, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x70, 0x69, 0x64,
+	0x65, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x20, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x70,
+	0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x2f, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x6a,
+	0x65, 0x63, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x21, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e,
+	0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x70, 0x72,
+	0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x83, 0x02, 0x0a, 0x05, 0x50, 0x49,
+	0x6e, 0x66, 0x6f, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x43, 0x6f,
+	0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76,
+	0x65, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65,
+	0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x61,
+	0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x0a,
+	0x0b, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x44, 0x65, 0x70, 0x74, 0x18, 0x03, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x0b, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x44, 0x65, 0x70, 0x74, 0x12,
+	0x24, 0x0a, 0x0d, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
+	0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53,
+	0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65,
+	0x54, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x70, 0x70, 0x72,
+	0x6f, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65,
+	0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72,
+	0x6f, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x70, 0x70,
+	0x72, 0x6f, 0x76, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x0d, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22,
+	0xc2, 0x01, 0x0a, 0x0e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52,
+	0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x70, 0x70, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x05, 0x61, 0x70, 0x70, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65,
+	0x4f, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x4f,
+	0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28,
+	0x03, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x6c, 0x61, 0x67,
+	0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x66, 0x6c, 0x61, 0x67, 0x12, 0x1e, 0x0a, 0x0a,
+	0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03,
+	0x52, 0x0a, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06,
+	0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73,
+	0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x79,
+	0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68,
+	0x54, 0x79, 0x70, 0x65, 0x22, 0x59, 0x0a, 0x0f, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4c, 0x69,
+	0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x72, 0x72, 0x5f, 0x63,
+	0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x65, 0x72, 0x72, 0x43, 0x6f,
+	0x64, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x64,
+	0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32,
+	0x80, 0x01, 0x0a, 0x06, 0x42, 0x78, 0x43, 0x6f, 0x72, 0x65, 0x12, 0x36, 0x0a, 0x0d, 0x47, 0x65,
+	0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x11, 0x2e, 0x62, 0x78,
+	0x63, 0x6f, 0x72, 0x65, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x1a, 0x12,
+	0x2e, 0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65,
+	0x73, 0x70, 0x12, 0x3e, 0x0a, 0x0b, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4c, 0x69, 0x6d, 0x69,
+	0x74, 0x12, 0x16, 0x2e, 0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63,
+	0x68, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x62, 0x78, 0x63, 0x6f,
+	0x72, 0x65, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x65,
+	0x73, 0x70, 0x42, 0x0a, 0x5a, 0x08, 0x2e, 0x2f, 0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x62, 0x06,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (

+ 15 - 12
jyBXCore/rpc/util/search.go

@@ -23,14 +23,17 @@ import (
 	"unicode"
 )
 
-var ClearHtml = regexp.MustCompile("<[^>]*>")
-var MatchSpace = regexp.MustCompile("\\s+")
-var filterReg_3 = regexp.MustCompile("(项目|公告|公示)$")
-var filterReg_2 = regexp.MustCompile("^[)\\)>》】\\]}}〕,,;;::'\"“”。.\\??、/+=\\_—*&……\\^%$¥@!!`~·(\\(<《【\\[{{〔]+$")
-var filterReg_1 = regexp.MustCompile("^([0-9]{1,3}|[零一二三四五六七八九十]{1,2}|联系人?|电话|地址|编号|采购|政府采购|成交|更正|招标|中标|变更|结果)$")
-var filterReg = regexp.MustCompile("^[的人号时元万公告项目地址电话邮编日期联系招标中结果成交项目项目采购采购项目政府采购公告更正公告]+$")
-var PhoneReg = regexp.MustCompile("^[1][3-9][0-9]{9}$")
-var EmailPattern = regexp.MustCompile("^([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$")
+var (
+	ClearHtml      = regexp.MustCompile("<[^>]*>")
+	MatchSpace     = regexp.MustCompile("\\s+")
+	filterReg_3    = regexp.MustCompile("(项目|公告|公示)$")
+	filterReg_2    = regexp.MustCompile("^[)\\)>》】\\]}}〕,,;;::'\"“”。.\\??、/+=\\_—*&……\\^%$¥@!!`~·(\\(<《【\\[{{〔]+$")
+	filterReg_1    = regexp.MustCompile("^([0-9]{1,3}|[零一二三四五六七八九十]{1,2}|联系人?|电话|地址|编号|采购|政府采购|成交|更正|招标|中标|变更|结果)$")
+	filterReg      = regexp.MustCompile("^[的人号时元万公告项目地址电话邮编日期联系招标中结果成交项目项目采购采购项目政府采购公告更正公告]+$")
+	PhoneReg       = regexp.MustCompile("^[1][3-9][0-9]{9}$")
+	EmailPattern   = regexp.MustCompile("^([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$")
+	SearchCacheKey = "searchDataCache_%s_%d"
+)
 
 func SearchHistory(history, searchvalue string) (arrs []string) {
 	if searchvalue != "" {
@@ -281,14 +284,14 @@ func GetBidSearchQuery(in *bxcore.SearchReq) string {
 	}
 	//信息类型-二级
 	subtype := in.Subtype
-	toptype := MC.If(in.Toptype != "", strings.Split(in.Toptype, ","), []string{}).([]string)
+	toptype := MC.If(in.TopType != "", strings.Split(in.TopType, ","), []string{}).([]string)
 	alltype := ``
 	//二级分类
 	if subtype != "" {
 		var typeInt = 0
 		alltype += `{"terms":{"subtype":[`
 		for k, v := range strings.Split(subtype, ",") {
-			if ttype := MC.If(topTypeMap[v] != "" && in.Toptype == "", topTypeMap[v], "").(string); ttype != "" {
+			if ttype := MC.If(topTypeMap[v] != "" && in.TopType == "", topTypeMap[v], "").(string); ttype != "" {
 				toptype = append(toptype, ttype)
 				typeInt += 1
 				continue
@@ -624,7 +627,7 @@ func searchListFormart(repl *[]map[string]interface{}, b bool) (list []*bxcore.S
 		searchList.SubtypeUrl = IC.LabelMap[searchList.Subtype].Url
 		searchList.Title = MC.ObjToString(v["title"])
 		searchList.Budget = MC.Int64All(v["budget"])
-		searchList.Bidamount = MC.Int64All(v["bidamount"])
+		searchList.BidAmount = MC.Int64All(v["bidamount"])
 		searchList.ProjectName = MC.ObjToString(v["projectname"])
 		searchList.ProjectCode = MC.ObjToString(v["projectcode"])
 		searchList.ProjectInfo = &bxcore.PInfo{}
@@ -640,7 +643,7 @@ func searchListFormart(repl *[]map[string]interface{}, b bool) (list []*bxcore.S
 		}
 		searchList.Winner = MC.ObjToString(v["winner"])
 		searchList.Buyer = MC.ObjToString(v["buyer"])
-		searchList.BidopenTime = MC.Int64All(v["bidopentime"])
+		searchList.BidOpenTime = MC.ObjToString(v["bidopentime"])
 		searchList.Site = MC.ObjToString(v["site"])
 		searchList.SpiderCode = MC.ObjToString(v["spidercode"])
 		list = append(list, searchList)