WH01243 il y a 2 ans
Parent
commit
257b83c8f1

+ 2 - 0
jyBXCore/rpc/bxcore.proto

@@ -464,6 +464,7 @@ message PushStatisticsData{
   int64   bidNumb = 5;//投标数量
   int64   winNumb = 6;//中标数量
   int64   browseNumb = 7;//浏览数量
+  string  entUserId=8;
 }
 message ProjectStatisticsDataRes{
   int64 err_code = 1;
@@ -481,6 +482,7 @@ message ProjectStatisticsData{
   int64   channelWinNumb = 8; //渠道中标数
   int64   notBidNumber = 9; //未中标数量
   int64   endNumb = 10; //终止数量
+  string  entUserId=11;
 }
 //
 service BxCore {

+ 0 - 117
jyBXCore/rpc/entity/entity.go

@@ -1,12 +1,5 @@
 package entity
 
-import (
-	"app.yhyue.com/moapp/jybase/common"
-	"encoding/json"
-	IC "jyBXCore/rpc/init"
-	"strings"
-)
-
 const (
 	//角色
 	Role_admin_system     = 1 //系统管理员
@@ -50,113 +43,3 @@ type BiddingSearchParams struct {
 	Price            string    `json:"price,omitempty"`    //价格
 	UserId           string    `json:"userId,omitempty"`   //用户id
 }
-type User struct {
-	Id        int
-	Name      string //员工姓名
-	Mail      string //邮箱
-	Phone     string //手机号
-	Dept_id   int    //部门id
-	Dept_name string //部门名称
-	//Role      string //角色
-	Power int //权限
-}
-
-type CurrentUser struct {
-	Role_admin_department bool        //是否是部门管理员
-	Role_admin_system     bool        //是否是系统管理员
-	Dept                  *Department //部门信息
-	BondPhone             string      //手机号
-	NickName              string      //昵称
-	HeadImageUrl          string      //头像
-	PersonalAuth          int         //个人认证
-	PersonalAuthReason    string      //个人认证不通过原因
-	User_power            int         //是否分配权限
-	User_name             string      //用户姓名
-}
-type Department struct {
-	Id         int
-	Name       string //部门名
-	Pid        int    //上级部门id
-	Pname      string //上级部门名称
-	Nodiff     int    //全员无差别接收 0:关闭 1:打开
-	Subdis     int    //订阅分发 0:关闭 1:打开
-	Aid        int    //管理员id
-	Aname      string //管理员姓名
-	Rname      string //角色名
-	User_count int    //该部门下员工的总数
-	Dept_count int    //该部门下子部门总数
-	Ent_id     int    //公司id
-}
-
-func EntInfo(entId, entUserId int) *CurrentUser {
-	currentUser := &CurrentUser{
-		Dept: &Department{},
-	}
-	user := IC.MainMysql.SelectBySql(`SELECT a.name as user_name from entniche_user a INNER JOIN entniche_user_role b on (a.id=b.user_id) where a.id=? and b.role_id=? limit 1`, entUserId, Role_admin_system)
-	if user != nil && len(*user) > 0 {
-		currentUser.Role_admin_system = true
-		currentUser.User_name, _ = (*user)[0]["user_name"].(string)
-		currentUser.User_power = 1
-		r := IC.MainMysql.SelectBySql(`SELECT id,name,subdis,nodiff from entniche_department where ent_id=? and pid=0 limit 1`, entId)
-		if r != nil && len(*r) == 1 {
-			department := JsonUnmarshal((*r)[0], &Department{}).(*Department)
-			if department != nil {
-				department.Pid = department.Id
-				currentUser.Dept = department
-			}
-		}
-	} else {
-		//角色、权限
-		r := IC.MainMysql.SelectBySql(`SELECT a.name as user_name,a.power as user_power,b.role_id,d.id as dept_id,d.name as dept_name,d.subdis as dept_subdis,d.nodiff as dept_nodiff,e.id as dept_pid from entniche_user a 
-			LEFT JOIN entniche_user_role b on (b.user_id=?) 
-			INNER JOIN entniche_department_user c on (a.id=? and a.id=c.user_id) 
-			INNER JOIN entniche_department d on (c.dept_id=d.id) 
-			INNER JOIN entniche_department e on (e.ent_id=? and e.pid=0) 
-			order by a.id desc limit 1`, entUserId, entUserId, entId)
-		if r != nil && len(*r) == 1 {
-			currentUser.User_name, _ = (*r)[0]["user_name"].(string)
-			currentUser.User_power = common.IntAll((*r)[0]["user_power"])
-			if common.IntAll((*r)[0]["role_id"]) == Role_admin_department {
-				currentUser.Role_admin_department = true
-			}
-			currentUser.Dept.Id = common.IntAll((*r)[0]["dept_id"])
-			currentUser.Dept.Pid = common.IntAll((*r)[0]["dept_pid"])
-			currentUser.Dept.Name = common.ObjToString((*r)[0]["dept_name"])
-			currentUser.Dept.Subdis = common.IntAll((*r)[0]["dept_subdis"])
-			currentUser.Dept.Nodiff = common.IntAll((*r)[0]["dept_nodiff"])
-		}
-	}
-	return currentUser
-}
-
-// map转结构体
-func JsonUnmarshal(m interface{}, s interface{}) interface{} {
-	var b []byte
-	if v, ok := m.(string); ok {
-		b = []byte(v)
-	} else if v, ok := m.([]byte); ok {
-		b = v
-	} else {
-		b, _ = json.Marshal(m)
-	}
-	json.Unmarshal(b, &s)
-	return s
-}
-
-// 获取部门下可以进行分发的人员(不包含部门名称和部门id)
-func GetDisUsers(entId, deptId int) *[]map[string]interface{} {
-	r := IC.MainMysql.SelectBySql(`select DISTINCT c.id,c.name,c.phone,c.power,b.dept_id from entniche_department_parent a 
-		INNER JOIN entniche_department_user b on (b.dept_id=? or (a.pid=? and a.id=b.dept_id)) 
-		INNER JOIN entniche_user c on (c.ent_id=? and b.user_id=c.id) 
-		order by convert(c.name using gbk) COLLATE gbk_chinese_ci asc`, deptId, deptId, entId)
-	return r
-}
-func GetUser(entUserIdArr []string) *[]map[string]interface{} {
-	r := IC.MainMysql.SelectBySql("SELECT DISTINCT  a.id,  a.name,  a.phone,  d.id AS dept_id,  d.NAME AS dept_name  "+
-		"FROM  entniche_user a "+
-		" INNER JOIN entniche_department_user b ON a.id in (?) and  b.user_id = a.id  "+
-		" INNER JOIN entniche_department d ON d.id = b.dept_id "+
-		" ORDER BY  d.id,  CONVERT ( a.NAME USING gbk ) COLLATE gbk_chinese_ci ASC",
-		strings.Join(entUserIdArr, ","))
-	return r
-}

+ 201 - 78
jyBXCore/rpc/service/participateStatistics.go

@@ -2,14 +2,21 @@ package service
 
 import (
 	"app.yhyue.com/moapp/jybase/common"
+	"app.yhyue.com/moapp/jybase/encrypt"
+	"encoding/json"
 	"fmt"
-	"jyBXCore/rpc/entity"
+	"jyBXCore/rpc/bxcore"
 	IC "jyBXCore/rpc/init"
-	"jyBXCore/rpc/type/bxcore"
 	"strings"
 	"time"
 )
 
+const (
+	//角色
+	Role_admin_system     = 1 //系统管理员
+	Role_admin_department = 2 //部门管理员
+)
+
 type ParticipateStatistics struct {
 	PositionId int64
 	EntId      int64
@@ -21,58 +28,22 @@ func (in *ParticipateStatistics) PushStatistics(entUserIdArr []string, startTime
 	//判断是企业、部门还是个人
 	isAdmin, personArrStr, users := in.PersonHandle(entUserIdArr)
 	//时间处理
-	query := []string{}
-	if isAdmin {
-		//是管理员
-		query = append(query, fmt.Sprintf(" ent_user_id in (%s)", personArrStr))
-	} else {
-		//不是管理员
-		query = append(query, fmt.Sprintf(" position_id = %d", personArrStr))
-	}
-	if startTime == 0 && endTime == 0 {
-		//没有传时间,默认时间处理
-		var start = time.Now().AddDate(0, 0, -30)
-		query = append(query, fmt.Sprintf(" ymd >= %d"), start.Format("20060102"))
-	}
-	if startTime != 0 {
-		query = append(query, fmt.Sprintf(" ymd >= %d", startTime))
-	}
-	if endTime != 0 {
-		query = append(query, fmt.Sprintf(" ymd <= %d", endTime))
-	}
+	query := QueryHandle(isAdmin, startTime, endTime, personArrStr)
 	//推送数据查询
-	dataList := IC.BaseMysql.SelectBySql("select  * from  participate_push_statistics where ?", strings.Join(query, "and "))
+	dataList := IC.BaseMysql.SelectBySql(fmt.Sprintf("select  * from  participate_push_statistics where %s", strings.Join(query, " and ")))
 	if dataList != nil && len(*dataList) > 0 && users != nil && len(*users) > 0 {
 		result = PushHandle(dataList, users)
 	}
 	return
 }
+
 func (in *ParticipateStatistics) ProjectStatistics(entUserIdArr []string, startTime, endTime int64) (result []*bxcore.ProjectStatisticsData) {
 	//判断是企业、部门还是个人
 	isAdmin, personArrStr, users := in.PersonHandle(entUserIdArr)
-	//时间处理
-	query := []string{}
-	if isAdmin {
-		//是管理员
-		query = append(query, fmt.Sprintf(" ent_user_id in (%s)", personArrStr))
-	} else {
-		//不是管理员
-		query = append(query, fmt.Sprintf(" position_id = %d", personArrStr))
-	}
-	if startTime == 0 && endTime == 0 {
-		//没有传时间,默认时间处理
-		var start = time.Now().AddDate(0, 0, -30)
-		query = append(query, fmt.Sprintf(" ymd >= %d"), start.Format("20060102"))
-	}
-	if startTime != 0 {
-		query = append(query, fmt.Sprintf(" ymd >= %d", startTime))
-	}
-	if endTime != 0 {
-		query = append(query, fmt.Sprintf(" ymd <= %d", endTime))
-	}
+	query := QueryHandle(isAdmin, startTime, endTime, personArrStr)
 	//订阅推送数处理
 	//推送数据查询
-	dataList := IC.BaseMysql.SelectBySql("select  * from  participate_project_statistics where ?", strings.Join(query, "and "))
+	dataList := IC.BaseMysql.SelectBySql(fmt.Sprintf("select  * from  participate_project_statistics where %s", strings.Join(query, "and ")))
 	if dataList != nil && len(*dataList) > 0 && users != nil && len(*users) > 0 {
 		result = ProjectHandle(dataList, users)
 	}
@@ -80,17 +51,17 @@ func (in *ParticipateStatistics) ProjectStatistics(entUserIdArr []string, startT
 }
 
 func (in *ParticipateStatistics) PersonHandle(entUserIdArr []string) (isAdmin bool, idStr string, users *[]map[string]interface{}) {
-	userEnt := entity.EntInfo(common.IntAll(in.EntId), common.IntAll(in.EntUserId))
+	userEnt := EntInfo(common.IntAll(in.EntId), common.IntAll(in.EntUserId))
 	if len(entUserIdArr) > 0 {
 		//查询所选人的部门以及人员信息
-		users = entity.GetUser(entUserIdArr)
+		users = GetUser(entUserIdArr)
 		//返回所选人的信息
 		isAdmin = true
 		idStr = strings.Join(entUserIdArr, ",")
 	} else {
 		if userEnt.Role_admin_department || userEnt.Role_admin_system { //
 			// 部门管理员 获取所有部门和子部门员工
-			users = entity.GetDisUsers(common.IntAll(in.EntId), userEnt.Dept.Id)
+			users = GetDisUsers(common.IntAll(in.EntId), userEnt.Dept.Id)
 			var staffs []string
 			if users != nil && len(*users) > 0 {
 				for _, v := range *users {
@@ -109,6 +80,7 @@ func (in *ParticipateStatistics) PersonHandle(entUserIdArr []string) (isAdmin bo
 
 type PushData struct {
 	PersonName      string
+	entUserId       string
 	DepartmentName  string
 	PushNumb        map[string]interface{}
 	ParticipateNumb map[string]interface{}
@@ -119,6 +91,7 @@ type PushData struct {
 type ProjectData struct {
 	PersonName     string
 	DepartmentName string
+	entUserId      string
 	BidNumb        map[string]interface{} //投标数量
 	DirectBidNumb  map[string]interface{} //直接投标数
 	ChannelBidNumb map[string]interface{} //渠道投标数
@@ -131,55 +104,58 @@ type ProjectData struct {
 
 func PushHandle(data *[]map[string]interface{}, users *[]map[string]interface{}) []*bxcore.PushStatisticsData {
 	result := &map[int64]*PushData{}
-	for _, v := range *users {
+	for k, v := range *users {
 		(*result)[common.Int64All(v["id"])] = &PushData{
-			PersonName:     common.InterfaceToStr(v["name"]),
+			PersonName:     fmt.Sprintf("%s_%d", common.InterfaceToStr(v["name"]), k),
 			DepartmentName: common.InterfaceToStr(v["dept_name"]),
+			entUserId:      common.InterfaceToStr(v["id"]),
 		}
 	}
 	for _, v := range *data {
 		if (*result)[common.Int64All(v["ent_user_id"])] != nil {
 			//浏览总数处理处理
+			project_id := common.InterfaceToStr(common.InterfaceToStr(v["project_id"]))
 			if common.Int64All(v["isvisit"]) > 0 {
-				(*result)[common.Int64All(v["ent_user_id"])].BrowseNumb[common.InterfaceToStr(v["project_id"])] = 1
+				(*result)[common.Int64All(v["ent_user_id"])].BrowseNumb = DataHanle((*result)[common.Int64All(v["ent_user_id"])].BrowseNumb, project_id)
 			}
 			if common.IntAll(v["ispush"]) > 0 {
 				//推送总数处理
-				(*result)[common.Int64All(v["ent_user_id"])].PushNumb[common.InterfaceToStr(v["project_id"])] = 1
+				(*result)[common.Int64All(v["ent_user_id"])].PushNumb = DataHanle((*result)[common.Int64All(v["ent_user_id"])].PushNumb, project_id)
 				//参标总数处理
 				if common.Int64All(v["isparticipate"]) > 0 {
-					(*result)[common.Int64All(v["ent_user_id"])].ParticipateNumb[common.InterfaceToStr(v["project_id"])] = 1
+					(*result)[common.Int64All(v["ent_user_id"])].ParticipateNumb = DataHanle((*result)[common.Int64All(v["ent_user_id"])].ParticipateNumb, project_id)
 				}
 				//投标总数处理
 				if common.Int64All(v["isbid"]) > 0 {
-					if (*result)[common.Int64All(v["ent_user_id"])].BidNumb[common.InterfaceToStr(v["project_id"])] == nil {
-						(*result)[common.Int64All(v["ent_user_id"])].BidNumb[common.InterfaceToStr(v["project_id"])] = 1
-					}
+					(*result)[common.Int64All(v["ent_user_id"])].BidNumb = DataHanle((*result)[common.Int64All(v["ent_user_id"])].BidNumb, project_id)
 				}
 				//中标总数处理
 				if common.Int64All(v["win_status"]) != 0 {
 					win_status := common.Int64All(v["win_status"])
 					if win_status > 1 {
-						(*result)[common.Int64All(v["ent_user_id"])].WinNumb[common.InterfaceToStr(v["project_id"])] = 1
+						(*result)[common.Int64All(v["ent_user_id"])].WinNumb = DataHanle((*result)[common.Int64All(v["ent_user_id"])].WinNumb, project_id)
 					} else {
-						delete((*result)[common.Int64All(v["ent_user_id"])].WinNumb, common.InterfaceToStr(v["project_id"]))
+						delete((*result)[common.Int64All(v["ent_user_id"])].WinNumb, project_id)
 					}
 				}
 			}
 
 		}
 	}
-	pushStatisticsList := []*bxcore.PushStatisticsData{}
+	pushStatisticsList := make([]*bxcore.PushStatisticsData, len(*result))
 	for _, v := range *result {
-		pushStatisticsList = append(pushStatisticsList, &bxcore.PushStatisticsData{
-			PersonName:      v.PersonName,
+		personName := strings.Split(v.PersonName, "_")[0]
+		k := common.Int64All(strings.Split(v.PersonName, "_")[1])
+		pushStatisticsList[k] = &bxcore.PushStatisticsData{
+			PersonName:      personName,
 			DepartmentName:  v.DepartmentName,
+			EntUserId:       encrypt.SE.Encode2Hex(v.entUserId),
 			PushNumb:        common.Int64All(len(v.PushNumb)),
 			ParticipateNumb: common.Int64All(len(v.ParticipateNumb)),
 			BidNumb:         common.Int64All(len(v.BidNumb)),
 			WinNumb:         common.Int64All(len(v.WinNumb)),
 			BrowseNumb:      common.Int64All(len(v.BrowseNumb)),
-		})
+		}
 	}
 	return pushStatisticsList
 }
@@ -192,55 +168,60 @@ func ProjectHandle(data *[]map[string]interface{}, users *[]map[string]interface
 		}
 	}
 	for _, v := range *data {
+		project_id := common.InterfaceToStr(common.InterfaceToStr(v["project_id"]))
 		if (*result)[common.Int64All(v["ent_user_id"])] != nil {
 			//投标数量
 			if common.Int64All(v["isbid"]) > 0 {
-				(*result)[common.Int64All(v["ent_user_id"])].BidNumb[common.InterfaceToStr(v["project_id"])] = 1
+				(*result)[common.Int64All(v["ent_user_id"])].BidNumb = DataHanle((*result)[common.Int64All(v["ent_user_id"])].BidNumb, project_id)
+
 			}
 			//直接投标数
 			if common.Int64All(v["bid_way"]) > 0 {
 				if common.Int64All(v["bid_way"]) == 2 {
-					(*result)[common.Int64All(v["ent_user_id"])].ChannelBidNumb[common.InterfaceToStr(v["project_id"])] = 1
-					delete((*result)[common.Int64All(v["ent_user_id"])].DirectBidNumb, common.InterfaceToStr(v["project_id"]))
+					(*result)[common.Int64All(v["ent_user_id"])].ChannelBidNumb = DataHanle((*result)[common.Int64All(v["ent_user_id"])].ChannelBidNumb, project_id)
+					delete((*result)[common.Int64All(v["ent_user_id"])].DirectBidNumb, project_id)
 				} else {
-					(*result)[common.Int64All(v["ent_user_id"])].DirectBidNumb[common.InterfaceToStr(v["project_id"])] = 1
-					delete((*result)[common.Int64All(v["ent_user_id"])].ChannelBidNumb, common.InterfaceToStr(v["project_id"]))
+					(*result)[common.Int64All(v["ent_user_id"])].DirectBidNumb = DataHanle((*result)[common.Int64All(v["ent_user_id"])].DirectBidNumb, project_id)
+					delete((*result)[common.Int64All(v["ent_user_id"])].ChannelBidNumb, project_id)
 				}
 			}
 			//中标总数处理
 			if common.Int64All(v["win_status"]) != 0 {
 				if common.Int64All(v["win_status"]) > 0 {
 					//中标数量
-					(*result)[common.Int64All(v["ent_user_id"])].WinNumb[common.InterfaceToStr(v["project_id"])] = 1
-					delete((*result)[common.Int64All(v["ent_user_id"])].NotBidNumber, common.InterfaceToStr(v["project_id"]))
+					(*result)[common.Int64All(v["ent_user_id"])].WinNumb = DataHanle((*result)[common.Int64All(v["ent_user_id"])].WinNumb, project_id)
+					delete((*result)[common.Int64All(v["ent_user_id"])].NotBidNumber, project_id)
 				} else {
 					//未中标数量
-					(*result)[common.Int64All(v["ent_user_id"])].NotBidNumber[common.InterfaceToStr(v["project_id"])] = 1
-					delete((*result)[common.Int64All(v["ent_user_id"])].WinNumb, common.InterfaceToStr(v["project_id"]))
+					(*result)[common.Int64All(v["ent_user_id"])].NotBidNumber = DataHanle((*result)[common.Int64All(v["ent_user_id"])].NotBidNumber, project_id)
+					delete((*result)[common.Int64All(v["ent_user_id"])].WinNumb, project_id)
 				}
 			}
 			//中标方式处理
 			if common.Int64All(v["win_bidway"]) != 0 {
 				if common.Int64All(v["win_bidway"]) == 1 {
 					//直接投标数量
-					(*result)[common.Int64All(v["ent_user_id"])].DirectWinNumb[common.InterfaceToStr(v["project_id"])] = 1
-					delete((*result)[common.Int64All(v["ent_user_id"])].ChannelWinNumb, common.InterfaceToStr(v["project_id"]))
+					(*result)[common.Int64All(v["ent_user_id"])].DirectWinNumb = DataHanle((*result)[common.Int64All(v["ent_user_id"])].DirectWinNumb, project_id)
+					delete((*result)[common.Int64All(v["ent_user_id"])].ChannelWinNumb, project_id)
 				} else {
 					//渠道投标数量
-					(*result)[common.Int64All(v["ent_user_id"])].ChannelWinNumb[common.InterfaceToStr(v["project_id"])] = 1
-					delete((*result)[common.Int64All(v["ent_user_id"])].DirectWinNumb, common.InterfaceToStr(v["project_id"]))
+					(*result)[common.Int64All(v["ent_user_id"])].ChannelWinNumb = DataHanle((*result)[common.Int64All(v["ent_user_id"])].ChannelWinNumb, project_id)
+					delete((*result)[common.Int64All(v["ent_user_id"])].DirectWinNumb, project_id)
 				}
 			}
 			if common.Int64All(v["win_bidway"]) != 0 {
-				(*result)[common.Int64All(v["ent_user_id"])].EndNumb[common.InterfaceToStr(v["project_id"])] = 1
+				(*result)[common.Int64All(v["ent_user_id"])].EndNumb = DataHanle((*result)[common.Int64All(v["ent_user_id"])].EndNumb, project_id)
 			}
 		}
 	}
-	projectStatisticsList := []*bxcore.ProjectStatisticsData{}
+	projectStatisticsList := make([]*bxcore.ProjectStatisticsData, len(*result))
 	for _, v := range *result {
-		projectStatisticsList = append(projectStatisticsList, &bxcore.ProjectStatisticsData{
-			PersonName:     v.PersonName,
+		personName := strings.Split(v.PersonName, "_")[0]
+		k := common.Int64All(strings.Split(v.PersonName, "_")[1])
+		projectStatisticsList[k] = &bxcore.ProjectStatisticsData{
+			PersonName:     personName,
 			DepartmentName: v.DepartmentName,
+			EntUserId:      encrypt.SE.Encode2Hex(v.entUserId),
 			BidNumb:        common.Int64All(len(v.BidNumb)),
 			DirectBidNumb:  common.Int64All(len(v.DirectBidNumb)),
 			ChannelBidNumb: common.Int64All(len(v.ChannelBidNumb)),
@@ -249,7 +230,149 @@ func ProjectHandle(data *[]map[string]interface{}, users *[]map[string]interface
 			ChannelWinNumb: common.Int64All(len(v.ChannelWinNumb)),
 			NotBidNumber:   common.Int64All(len(v.NotBidNumber)),
 			EndNumb:        common.Int64All(len(v.EndNumb)),
-		})
+		}
 	}
 	return projectStatisticsList
 }
+func EntInfo(entId, entUserId int) *CurrentUser {
+	currentUser := &CurrentUser{
+		Dept: &Department{},
+	}
+	user := IC.MainMysql.SelectBySql(`SELECT a.name as user_name from entniche_user a INNER JOIN entniche_user_role b on (a.id=b.user_id) where a.id=? and b.role_id=? limit 1`, entUserId, Role_admin_system)
+	if user != nil && len(*user) > 0 {
+		currentUser.Role_admin_system = true
+		currentUser.User_name, _ = (*user)[0]["user_name"].(string)
+		currentUser.User_power = 1
+		r := IC.MainMysql.SelectBySql(`SELECT id,name,subdis,nodiff from entniche_department where ent_id=? and pid=0 limit 1`, entId)
+		if r != nil && len(*r) == 1 {
+			department := JsonUnmarshal((*r)[0], &Department{}).(*Department)
+			if department != nil {
+				department.Pid = department.Id
+				currentUser.Dept = department
+			}
+		}
+	} else {
+		//角色、权限
+		r := IC.MainMysql.SelectBySql(`SELECT a.name as user_name,a.power as user_power,b.role_id,d.id as dept_id,d.name as dept_name,d.subdis as dept_subdis,d.nodiff as dept_nodiff,e.id as dept_pid from entniche_user a 
+			LEFT JOIN entniche_user_role b on (b.user_id=?) 
+			INNER JOIN entniche_department_user c on (a.id=? and a.id=c.user_id) 
+			INNER JOIN entniche_department d on (c.dept_id=d.id) 
+			INNER JOIN entniche_department e on (e.ent_id=? and e.pid=0) 
+			order by a.id desc limit 1`, entUserId, entUserId, entId)
+		if r != nil && len(*r) == 1 {
+			currentUser.User_name, _ = (*r)[0]["user_name"].(string)
+			currentUser.User_power = common.IntAll((*r)[0]["user_power"])
+			if common.IntAll((*r)[0]["role_id"]) == Role_admin_department {
+				currentUser.Role_admin_department = true
+			}
+			currentUser.Dept.Id = common.IntAll((*r)[0]["dept_id"])
+			currentUser.Dept.Pid = common.IntAll((*r)[0]["dept_pid"])
+			currentUser.Dept.Name = common.ObjToString((*r)[0]["dept_name"])
+			currentUser.Dept.Subdis = common.IntAll((*r)[0]["dept_subdis"])
+			currentUser.Dept.Nodiff = common.IntAll((*r)[0]["dept_nodiff"])
+		}
+	}
+	return currentUser
+}
+
+// map转结构体
+func JsonUnmarshal(m interface{}, s interface{}) interface{} {
+	var b []byte
+	if v, ok := m.(string); ok {
+		b = []byte(v)
+	} else if v, ok := m.([]byte); ok {
+		b = v
+	} else {
+		b, _ = json.Marshal(m)
+	}
+	json.Unmarshal(b, &s)
+	return s
+}
+
+// 获取部门下可以进行分发的人员(不包含部门名称和部门id)
+func GetDisUsers(entId, deptId int) *[]map[string]interface{} {
+	r := IC.MainMysql.SelectBySql(`select DISTINCT c.id,c.name,c.phone,c.power,b.dept_id from entniche_department_parent a 
+		INNER JOIN entniche_department_user b on (b.dept_id=? or (a.pid=? and a.id=b.dept_id)) 
+		INNER JOIN entniche_user c on (c.ent_id=? and b.user_id=c.id) 
+		order by convert(c.name using gbk) COLLATE gbk_chinese_ci asc`, deptId, deptId, entId)
+	return r
+}
+func GetUser(entUserIdArr []string) *[]map[string]interface{} {
+	r := IC.MainMysql.SelectBySql("SELECT DISTINCT  a.id,  a.name,  a.phone,  d.id AS dept_id,  d.NAME AS dept_name  "+
+		"FROM  entniche_user a "+
+		" INNER JOIN entniche_department_user b ON a.id in (?) and  b.user_id = a.id  "+
+		" INNER JOIN entniche_department d ON d.id = b.dept_id "+
+		" ORDER BY  d.id,  CONVERT ( a.NAME USING gbk ) COLLATE gbk_chinese_ci ASC",
+		strings.Join(entUserIdArr, ","))
+	return r
+}
+
+type User struct {
+	Id        int
+	Name      string //员工姓名
+	Mail      string //邮箱
+	Phone     string //手机号
+	Dept_id   int    //部门id
+	Dept_name string //部门名称
+	//Role      string //角色
+	Power int //权限
+}
+
+type CurrentUser struct {
+	Role_admin_department bool        //是否是部门管理员
+	Role_admin_system     bool        //是否是系统管理员
+	Dept                  *Department //部门信息
+	BondPhone             string      //手机号
+	NickName              string      //昵称
+	HeadImageUrl          string      //头像
+	PersonalAuth          int         //个人认证
+	PersonalAuthReason    string      //个人认证不通过原因
+	User_power            int         //是否分配权限
+	User_name             string      //用户姓名
+}
+type Department struct {
+	Id         int
+	Name       string //部门名
+	Pid        int    //上级部门id
+	Pname      string //上级部门名称
+	Nodiff     int    //全员无差别接收 0:关闭 1:打开
+	Subdis     int    //订阅分发 0:关闭 1:打开
+	Aid        int    //管理员id
+	Aname      string //管理员姓名
+	Rname      string //角色名
+	User_count int    //该部门下员工的总数
+	Dept_count int    //该部门下子部门总数
+	Ent_id     int    //公司id
+}
+
+func DataHanle(data map[string]interface{}, project_id string) map[string]interface{} {
+	if data == nil {
+		data = map[string]interface{}{project_id: 1}
+	} else {
+		data[project_id] = 1
+	}
+	return data
+}
+func QueryHandle(isAdmin bool, startTime, endTime int64, personArrStr string) []string {
+	//时间处理
+	query := []string{}
+	if isAdmin {
+		//是管理员
+		query = append(query, fmt.Sprintf(" ent_user_id in (%s)", personArrStr))
+	} else {
+		//不是管理员
+		query = append(query, fmt.Sprintf(" position_id = %d", personArrStr))
+	}
+	if startTime == 0 && endTime == 0 {
+		//没有传时间,默认时间处理
+		var start = time.Now().AddDate(0, 0, -30)
+		query = append(query, fmt.Sprintf(" ymd >= %s", start.Format("20060102")))
+	}
+	if startTime != 0 {
+		query = append(query, fmt.Sprintf(" ymd >= %d", startTime))
+	}
+	if endTime != 0 {
+		query = append(query, fmt.Sprintf(" ymd <= %d", endTime))
+	}
+	return query
+}

+ 113 - 94
jyBXCore/rpc/type/bxcore/bxcore.pb.go

@@ -4248,6 +4248,7 @@ type PushStatisticsData struct {
 	BidNumb         int64  `protobuf:"varint,5,opt,name=bidNumb,proto3" json:"bidNumb,omitempty"`                 //投标数量
 	WinNumb         int64  `protobuf:"varint,6,opt,name=winNumb,proto3" json:"winNumb,omitempty"`                 //中标数量
 	BrowseNumb      int64  `protobuf:"varint,7,opt,name=browseNumb,proto3" json:"browseNumb,omitempty"`           //浏览数量
+	EntUserId       string `protobuf:"bytes,8,opt,name=entUserId,proto3" json:"entUserId,omitempty"`
 }
 
 func (x *PushStatisticsData) Reset() {
@@ -4331,6 +4332,13 @@ func (x *PushStatisticsData) GetBrowseNumb() int64 {
 	return 0
 }
 
+func (x *PushStatisticsData) GetEntUserId() string {
+	if x != nil {
+		return x.EntUserId
+	}
+	return ""
+}
+
 type ProjectStatisticsDataRes struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -4409,6 +4417,7 @@ type ProjectStatisticsData struct {
 	ChannelWinNumb int64  `protobuf:"varint,8,opt,name=channelWinNumb,proto3" json:"channelWinNumb,omitempty"` //渠道中标数
 	NotBidNumber   int64  `protobuf:"varint,9,opt,name=notBidNumber,proto3" json:"notBidNumber,omitempty"`     //未中标数量
 	EndNumb        int64  `protobuf:"varint,10,opt,name=endNumb,proto3" json:"endNumb,omitempty"`              //终止数量
+	EntUserId      string `protobuf:"bytes,11,opt,name=entUserId,proto3" json:"entUserId,omitempty"`
 }
 
 func (x *ProjectStatisticsData) Reset() {
@@ -4513,6 +4522,13 @@ func (x *ProjectStatisticsData) GetEndNumb() int64 {
 	return 0
 }
 
+func (x *ProjectStatisticsData) GetEntUserId() string {
+	if x != nil {
+		return x.EntUserId
+	}
+	return ""
+}
+
 var File_bxcore_proto protoreflect.FileDescriptor
 
 var file_bxcore_proto_rawDesc = []byte{
@@ -5190,7 +5206,7 @@ var file_bxcore_proto_rawDesc = []byte{
 	0x2e, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e,
 	0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x75, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x69,
 	0x73, 0x74, 0x69, 0x63, 0x73, 0x44, 0x61, 0x74, 0x61, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22,
-	0xf6, 0x01, 0x0a, 0x12, 0x50, 0x75, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69,
+	0x94, 0x02, 0x0a, 0x12, 0x50, 0x75, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69,
 	0x63, 0x73, 0x44, 0x61, 0x74, 0x61, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e,
 	0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x73,
 	0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x61, 0x72, 0x74,
@@ -5205,103 +5221,106 @@ var file_bxcore_proto_rawDesc = []byte{
 	0x0a, 0x07, 0x77, 0x69, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52,
 	0x07, 0x77, 0x69, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x12, 0x1e, 0x0a, 0x0a, 0x62, 0x72, 0x6f, 0x77,
 	0x73, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x62, 0x72,
-	0x6f, 0x77, 0x73, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x22, 0x81, 0x01, 0x0a, 0x18, 0x50, 0x72, 0x6f,
-	0x6a, 0x65, 0x63, 0x74, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x44, 0x61,
-	0x74, 0x61, 0x52, 0x65, 0x73, 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, 0x31, 0x0a, 0x04, 0x64, 0x61, 0x74,
-	0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x62, 0x78, 0x63, 0x6f, 0x72, 0x65,
-	0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69,
-	0x63, 0x73, 0x44, 0x61, 0x74, 0x61, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xed, 0x02, 0x0a,
-	0x15, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69,
-	0x63, 0x73, 0x44, 0x61, 0x74, 0x61, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e,
-	0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x73,
-	0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x61, 0x72, 0x74,
-	0x6d, 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e,
-	0x64, 0x65, 0x70, 0x61, 0x72, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18,
-	0x0a, 0x07, 0x62, 0x69, 0x64, 0x4e, 0x75, 0x6d, 0x62, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52,
-	0x07, 0x62, 0x69, 0x64, 0x4e, 0x75, 0x6d, 0x62, 0x12, 0x24, 0x0a, 0x0d, 0x64, 0x69, 0x72, 0x65,
-	0x63, 0x74, 0x42, 0x69, 0x64, 0x4e, 0x75, 0x6d, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52,
-	0x0d, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x42, 0x69, 0x64, 0x4e, 0x75, 0x6d, 0x62, 0x12, 0x26,
-	0x0a, 0x0e, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x42, 0x69, 0x64, 0x4e, 0x75, 0x6d, 0x62,
-	0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x42,
-	0x69, 0x64, 0x4e, 0x75, 0x6d, 0x62, 0x12, 0x18, 0x0a, 0x07, 0x77, 0x69, 0x6e, 0x4e, 0x75, 0x6d,
-	0x62, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x77, 0x69, 0x6e, 0x4e, 0x75, 0x6d, 0x62,
-	0x12, 0x24, 0x0a, 0x0d, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x57, 0x69, 0x6e, 0x4e, 0x75, 0x6d,
-	0x62, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x57,
-	0x69, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65,
-	0x6c, 0x57, 0x69, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e,
-	0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x57, 0x69, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x12, 0x22,
-	0x0a, 0x0c, 0x6e, 0x6f, 0x74, 0x42, 0x69, 0x64, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x09,
-	0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6e, 0x6f, 0x74, 0x42, 0x69, 0x64, 0x4e, 0x75, 0x6d, 0x62,
-	0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x64, 0x4e, 0x75, 0x6d, 0x62, 0x18, 0x0a, 0x20,
-	0x01, 0x28, 0x03, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x4e, 0x75, 0x6d, 0x62, 0x32, 0xf1, 0x07, 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, 0x12,
-	0x49, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x65, 0x53, 0x68,
-	0x6f, 0x77, 0x12, 0x1a, 0x2e, 0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74,
-	0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x65, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x1a, 0x1a,
+	0x6f, 0x77, 0x73, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x74, 0x55,
+	0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x74,
+	0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x81, 0x01, 0x0a, 0x18, 0x50, 0x72, 0x6f, 0x6a, 0x65,
+	0x63, 0x74, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x44, 0x61, 0x74, 0x61,
+	0x52, 0x65, 0x73, 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, 0x31, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18,
+	0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x50,
+	0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73,
+	0x44, 0x61, 0x74, 0x61, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x8b, 0x03, 0x0a, 0x15, 0x50,
+	0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73,
+	0x44, 0x61, 0x74, 0x61, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x4e, 0x61,
+	0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e,
+	0x4e, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x61, 0x72, 0x74, 0x6d, 0x65,
+	0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x64, 0x65,
+	0x70, 0x61, 0x72, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07,
+	0x62, 0x69, 0x64, 0x4e, 0x75, 0x6d, 0x62, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x62,
+	0x69, 0x64, 0x4e, 0x75, 0x6d, 0x62, 0x12, 0x24, 0x0a, 0x0d, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74,
+	0x42, 0x69, 0x64, 0x4e, 0x75, 0x6d, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x64,
+	0x69, 0x72, 0x65, 0x63, 0x74, 0x42, 0x69, 0x64, 0x4e, 0x75, 0x6d, 0x62, 0x12, 0x26, 0x0a, 0x0e,
+	0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x42, 0x69, 0x64, 0x4e, 0x75, 0x6d, 0x62, 0x18, 0x05,
+	0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x42, 0x69, 0x64,
+	0x4e, 0x75, 0x6d, 0x62, 0x12, 0x18, 0x0a, 0x07, 0x77, 0x69, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x18,
+	0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x77, 0x69, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x12, 0x24,
+	0x0a, 0x0d, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x57, 0x69, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x18,
+	0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x57, 0x69, 0x6e,
+	0x4e, 0x75, 0x6d, 0x62, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x57,
+	0x69, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x63, 0x68,
+	0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x57, 0x69, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x12, 0x22, 0x0a, 0x0c,
+	0x6e, 0x6f, 0x74, 0x42, 0x69, 0x64, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01,
+	0x28, 0x03, 0x52, 0x0c, 0x6e, 0x6f, 0x74, 0x42, 0x69, 0x64, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72,
+	0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x64, 0x4e, 0x75, 0x6d, 0x62, 0x18, 0x0a, 0x20, 0x01, 0x28,
+	0x03, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x4e, 0x75, 0x6d, 0x62, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e,
+	0x74, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65,
+	0x6e, 0x74, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x32, 0xf1, 0x07, 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, 0x12, 0x49, 0x0a, 0x0f, 0x50,
+	0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x65, 0x53, 0x68, 0x6f, 0x77, 0x12, 0x1a,
 	0x2e, 0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70,
-	0x61, 0x74, 0x65, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x12, 0x49, 0x0a, 0x0f, 0x50, 0x61,
-	0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x2e,
-	0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61,
-	0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e, 0x62, 0x78, 0x63, 0x6f,
+	0x61, 0x74, 0x65, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e, 0x62, 0x78, 0x63,
+	0x6f, 0x72, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x65, 0x53,
+	0x68, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x12, 0x49, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63,
+	0x69, 0x70, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x2e, 0x62, 0x78, 0x63, 0x6f,
 	0x72, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x65, 0x49, 0x6e,
-	0x66, 0x6f, 0x52, 0x65, 0x73, 0x12, 0x49, 0x0a, 0x0f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42,
-	0x69, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x2e, 0x62, 0x78, 0x63, 0x6f, 0x72,
-	0x65, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x69, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75,
-	0x73, 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e, 0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x55, 0x70,
-	0x64, 0x61, 0x74, 0x65, 0x42, 0x69, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73,
-	0x12, 0x52, 0x0a, 0x12, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x65, 0x43,
-	0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x2e, 0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x2e,
+	0x66, 0x6f, 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e, 0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x50,
+	0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65,
+	0x73, 0x12, 0x49, 0x0a, 0x0f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x69, 0x64, 0x53, 0x74,
+	0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x2e, 0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x55, 0x70,
+	0x64, 0x61, 0x74, 0x65, 0x42, 0x69, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71,
+	0x1a, 0x1a, 0x2e, 0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
+	0x42, 0x69, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x12, 0x52, 0x0a, 0x12,
 	0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65,
-	0x6e, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x1d, 0x2e, 0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x50,
-	0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
-	0x74, 0x52, 0x65, 0x73, 0x12, 0x52, 0x0a, 0x12, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70,
-	0x61, 0x74, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x12, 0x1d, 0x2e, 0x62, 0x78, 0x63,
-	0x6f, 0x72, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x65, 0x52,
-	0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1d, 0x2e, 0x62, 0x78, 0x63, 0x6f,
-	0x72, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x65, 0x52, 0x65,
-	0x63, 0x6f, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x12, 0x52, 0x0a, 0x12, 0x50, 0x61, 0x72, 0x74,
-	0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x65, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x73, 0x12, 0x1d,
-	0x2e, 0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70,
-	0x61, 0x74, 0x65, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1d, 0x2e,
-	0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61,
-	0x74, 0x65, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x12, 0x58, 0x0a, 0x14,
-	0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x55, 0x70,
-	0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x2e, 0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x61,
-	0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x55, 0x70, 0x49, 0x6e,
-	0x66, 0x6f, 0x52, 0x65, 0x71, 0x1a, 0x1f, 0x2e, 0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x50,
-	0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x55, 0x70, 0x49,
-	0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x12, 0x4f, 0x0a, 0x11, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63,
-	0x69, 0x70, 0x61, 0x74, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x2e, 0x62, 0x78,
-	0x63, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x65,
-	0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x62, 0x78, 0x63, 0x6f,
-	0x72, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x65, 0x41, 0x63,
-	0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x12, 0x49, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x74, 0x69,
-	0x63, 0x69, 0x70, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1a, 0x2e, 0x62, 0x78, 0x63,
-	0x6f, 0x72, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x65, 0x4c,
-	0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e, 0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x2e,
+	0x6e, 0x74, 0x12, 0x1d, 0x2e, 0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74,
+	0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x65,
+	0x71, 0x1a, 0x1d, 0x2e, 0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69,
+	0x63, 0x69, 0x70, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73,
+	0x12, 0x52, 0x0a, 0x12, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x65, 0x52,
+	0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x12, 0x1d, 0x2e, 0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x2e,
+	0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x72,
+	0x64, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1d, 0x2e, 0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x50,
+	0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64,
+	0x73, 0x52, 0x65, 0x73, 0x12, 0x52, 0x0a, 0x12, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70,
+	0x61, 0x74, 0x65, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x73, 0x12, 0x1d, 0x2e, 0x62, 0x78, 0x63,
+	0x6f, 0x72, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x65, 0x50,
+	0x65, 0x72, 0x73, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1d, 0x2e, 0x62, 0x78, 0x63, 0x6f,
+	0x72, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x65, 0x50, 0x65,
+	0x72, 0x73, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x12, 0x58, 0x0a, 0x14, 0x50, 0x61, 0x72, 0x74,
+	0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x55, 0x70, 0x49, 0x6e, 0x66, 0x6f,
+	0x12, 0x1f, 0x2e, 0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63,
+	0x69, 0x70, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x55, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65,
+	0x71, 0x1a, 0x1f, 0x2e, 0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69,
+	0x63, 0x69, 0x70, 0x61, 0x74, 0x65, 0x53, 0x65, 0x74, 0x55, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x52,
+	0x65, 0x73, 0x12, 0x4f, 0x0a, 0x11, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74,
+	0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x2e, 0x62, 0x78, 0x63, 0x6f, 0x72, 0x65,
+	0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x65, 0x41, 0x63, 0x74, 0x69,
+	0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x50,
+	0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+	0x52, 0x65, 0x73, 0x12, 0x49, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61,
+	0x74, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1a, 0x2e, 0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x2e,
 	0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52,
-	0x65, 0x73, 0x12, 0x4a, 0x0a, 0x0e, 0x50, 0x75, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73,
-	0x74, 0x69, 0x63, 0x73, 0x12, 0x19, 0x2e, 0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x53, 0x74,
-	0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a,
-	0x1d, 0x2e, 0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x75, 0x73, 0x68, 0x53, 0x74, 0x61,
-	0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x12, 0x50,
-	0x0a, 0x11, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74,
-	0x69, 0x63, 0x73, 0x12, 0x19, 0x2e, 0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x53, 0x74, 0x61,
-	0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x20,
-	0x2e, 0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53,
-	0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73,
-	0x42, 0x0a, 0x5a, 0x08, 0x2e, 0x2f, 0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x62, 0x06, 0x70, 0x72,
-	0x6f, 0x74, 0x6f, 0x33,
+	0x65, 0x71, 0x1a, 0x1a, 0x2e, 0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74,
+	0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x12, 0x4a,
+	0x0a, 0x0e, 0x50, 0x75, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73,
+	0x12, 0x19, 0x2e, 0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73,
+	0x74, 0x69, 0x63, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x1d, 0x2e, 0x62, 0x78,
+	0x63, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x75, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74,
+	0x69, 0x63, 0x73, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x12, 0x50, 0x0a, 0x11, 0x50, 0x72,
+	0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12,
+	0x19, 0x2e, 0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74,
+	0x69, 0x63, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x20, 0x2e, 0x62, 0x78, 0x63,
+	0x6f, 0x72, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x74, 0x61, 0x74, 0x69,
+	0x73, 0x74, 0x69, 0x63, 0x73, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x42, 0x0a, 0x5a, 0x08,
+	0x2e, 0x2f, 0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (