Browse Source

fenzhihebing

lianbingjie 1 năm trước cách đây
mục cha
commit
27ca993168

+ 5 - 0
api/internal/handler/routes.go

@@ -12,6 +12,11 @@ import (
 func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
 	server.AddRoutes(
 		[]rest.Route{
+			{
+				Method:  http.MethodPost,
+				Path:    "/messageCenter/WorkDeskList",
+				Handler: WorkDeskListHandler(serverCtx),
+			},
 			{
 				Method:  http.MethodPost,
 				Path:    "/messageCenter/BitmapSaveMsg",

+ 28 - 0
api/internal/handler/workdesklisthandler.go

@@ -0,0 +1,28 @@
+package handler
+
+import (
+	"net/http"
+
+	"app.yhyue.com/moapp/MessageCenter/api/internal/logic"
+	"app.yhyue.com/moapp/MessageCenter/api/internal/svc"
+	"app.yhyue.com/moapp/MessageCenter/api/internal/types"
+	"github.com/zeromicro/go-zero/rest/httpx"
+)
+
+func WorkDeskListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.WorkDeskListReq
+		if err := httpx.Parse(r, &req); err != nil {
+			httpx.Error(w, err)
+			return
+		}
+
+		l := logic.NewWorkDeskListLogic(r.Context(), svcCtx)
+		resp, err := l.WorkDeskList(&req)
+		if err != nil {
+			httpx.Error(w, err)
+		} else {
+			httpx.OkJson(w, resp)
+		}
+	}
+}

+ 1 - 0
api/internal/logic/messagelistlogic.go

@@ -44,6 +44,7 @@ func (l *MessageListLogic) MessageList(req *types.MessageListReq) (resp *types.M
 		NewUserId:       req.NewUserId,
 		IsContainLetter: req.IsContainLetter,
 		IsClassSearch:   req.IsClassSearch,
+		IsfilterActive:  req.IsfilterActive,
 	})
 	if err != nil {
 		return nil, err

+ 68 - 0
api/internal/logic/workdesklistlogic.go

@@ -0,0 +1,68 @@
+package logic
+
+import (
+	"app.yhyue.com/moapp/MessageCenter/api/internal/svc"
+	"app.yhyue.com/moapp/MessageCenter/api/internal/types"
+	"app.yhyue.com/moapp/MessageCenter/rpc/messageclient"
+	"context"
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type WorkDeskListLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewWorkDeskListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *WorkDeskListLogic {
+	return &WorkDeskListLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *WorkDeskListLogic) WorkDeskList(req *types.WorkDeskListReq) (resp *types.WorkDeskListResp, err error) {
+	// todo: add your logic here and delete this line
+	result := &types.WorkDeskListResp{}
+	lsi := l.svcCtx.MessageCenter
+	res, err := lsi.WorkingDesktopList(l.ctx, &messageclient.WorkingDesktopReq{
+		Appid:              req.AppId,
+		UserId:             req.UserId,
+		MsgType:            req.MsgType,
+		OffSet:             req.Offset,
+		PageSize:           req.PageSize,
+		NeedDealtWithCount: req.NeedDealtWithCount,
+	})
+	if err != nil {
+		return nil, err
+	}
+
+	for _, val := range res.BusMsgList {
+		result.BusData = append(result.BusData, map[string]interface{}{
+			"title":      val.Title,
+			"content":    val.Content,
+			"url":        val.Url,
+			"link":       val.Link,
+			"createTime": val.Createtime,
+			"id":         val.Id,
+			"msgLogId":   val.MsgLogId,
+			"isRead":     val.IsRead,
+		})
+	}
+	for _, v := range res.NeedDo {
+		result.NeedDoData = append(result.NeedDoData, map[string]interface{}{
+			"title":      v.Title,
+			"content":    v.Content,
+			"url":        v.Url,
+			"link":       v.Link,
+			"createTime": v.Createtime,
+			"id":         v.Id,
+			"msgLogId":   v.MsgLogId,
+			"isRead":     v.IsRead,
+		})
+	}
+	result.Code = res.Code
+	result.Message = res.Message
+	return result, nil
+}

+ 17 - 0
api/internal/types/types.go

@@ -102,6 +102,7 @@ type MessageListReq struct {
 	IsMsgList       bool   `json:"isMsgList"`                             //是否需要列表信息
 	IsContainLetter bool   `json:"isContainLetter,optional,default=true"` //是否未读数包含私信
 	IsClassSearch   bool   `json:"isClassSearch,optional"`                // 是否为具体分类查询
+	IsfilterActive  bool   `json:"isfilterActive,optional"`               //是否过滤活动通知消息
 }
 
 type MessageListResp struct {
@@ -162,3 +163,19 @@ type BitmapSaveMsgReq struct {
 	UserIds     string                 `json:"userIds"`
 	PositionIds string                 `json:"positionIds,optional"` // 职位id 如果是多个就逗号分割 和用户id一一对应
 }
+
+type WorkDeskListReq struct {
+	UserId             string `header:"mgoUserId"`
+	AppId              string `header:"appId"`
+	Offset             int64  `json:"offset"`
+	PageSize           int64  `json:"size"`
+	MsgType            int64  `json:"msgType"`
+	NeedDealtWithCount bool   `json:"needDealtWithCount"`
+}
+
+type WorkDeskListResp struct {
+	Code       int64                    `json:"code"`
+	Message    string                   `json:"message"`
+	BusData    []map[string]interface{} `json:"busData"`
+	NeedDoData []map[string]interface{} `json:"needDoData"`
+}

+ 19 - 0
api/message.api

@@ -106,6 +106,7 @@ type MessageListReq {
 	IsMsgList       bool   `json:"isMsgList"`                             //是否需要列表信息
 	IsContainLetter bool   `json:"isContainLetter,optional,default=true"` //是否未读数包含私信
 	IsClassSearch   bool   `json:"isClassSearch,optional"`                // 是否为具体分类查询
+	IsfilterActive  bool   `json:"isfilterActive,optional"`               //是否过滤活动通知消息
 }
 
 type MessageListResp {
@@ -175,8 +176,26 @@ type BitmapSaveMsgReq {
 	UserIds     string                 `json:"userIds"`
 	PositionIds string                 `json:"positionIds,optional"` // 职位id 如果是多个就逗号分割 和用户id一一对应
 }
+type WorkDeskListReq {
+	UserId             string `header:"mgoUserId"`
+	AppId              string `header:"appId"`
+	Offset             int64  `json:"offset"`
+	PageSize           int64  `json:"size"`
+	MsgType            int64  `json:"msgType"`
+	NeedDealtWithCount bool   `json:"needDealtWithCount"`
+}
+type WorkDeskListResp {
+	Code       int64                    `json:"code"`
+	Message    string                   `json:"message"`
+	BusData    []map[string]interface{} `json:"busData"`
+	NeedDoData []map[string]interface{} `json:"needDoData"`
+}
 
 service message-api {
+	// 工作桌面商机情报
+	@handler WorkDeskListHandler
+	post /messageCenter/WorkDeskList (WorkDeskListReq) returns (WorkDeskListResp)
+	
 	// 更新用户all_msg bitmap
 	@handler BitmapSaveMsgHandler
 	post /messageCenter/BitmapSaveMsg (BitmapSaveMsgReq) returns (MultipleSaveMsgResp)

+ 1 - 0
entity/message.go

@@ -16,6 +16,7 @@ var Mysql *mysql.Mysql
 var BaseMysql *mysql.Mysql
 var MessageColumn []map[string]interface{}
 var MQFW m.MongodbSim
+var Bidding m.MongodbSim
 var GmailAuth []*mail.GmailAuth
 var SurvivalTime int
 var RollingTiming int64

+ 15 - 0
rpc/etc/message.yaml

@@ -17,6 +17,15 @@ Mongodb:
   Password:
   Collection:
   Collection_back:
+Bidding:
+  Address: 192.168.3.206:27002
+  Size: 10
+  DbName: mixdata
+  ReplSet:
+  UserName: jyDevGroup
+  Password: jy@DevGroup
+  Collection: bidding
+  Collection_back: bidding_back
 DataSource:
     DbName: jianyu
     Address: 192.168.3.217:4000
@@ -75,5 +84,11 @@ Clickhouse:
   MaxIdleConns: 5
   MaxOpenConns: 30
 GlobMsgLoadTime: "0 0/5 * * * *"
+
+FreeIntelTime: "0 0 10 ? * MON"
+PayIntelTime: "0 0 10 * * ?"
+FreePushNumber: 1
+PayPushNumber: 5
 EquityInfoMsgType: 13 #营销权益消息需要特殊处理
 NewUserMsgTitle: 做任务赚好礼
+IsFilterActive: true

+ 148 - 6
rpc/internal/common/msglistService.go

@@ -1,6 +1,16 @@
 package common
 
 import (
+<<<<<<< HEAD
+=======
+	"app.yhyue.com/moapp/MessageCenter/entity"
+	"app.yhyue.com/moapp/MessageCenter/rpc/internal/config"
+	"app.yhyue.com/moapp/MessageCenter/rpc/type/message"
+	"app.yhyue.com/moapp/MessageCenter/util"
+	"app.yhyue.com/moapp/jybase/common"
+	m "app.yhyue.com/moapp/jybase/mongodb"
+	"app.yhyue.com/moapp/jybase/redis"
+>>>>>>> master
 	"context"
 	"errors"
 	"fmt"
@@ -22,7 +32,7 @@ func BitmapUserMsgList(this *message.UserMsgListReq) (*message.UserMsgList, *mes
 		data                      = new(message.UserMsgList)
 	)
 	//取出用户所有消息、已读消息id bitmap 查库
-	userAllMsgArr, _, userUnreadArr, err := GetUserMsgSummary(this.UserId)
+	userAllMsgArr, _, userUnreadArr, err := GetUserMsgSummary(this.UserId, this.IsfilterActive)
 	if len(userAllMsgArr) == 0 && err != nil {
 		fmt.Printf("此用户暂无消息 : %s", err.Error())
 	}
@@ -124,11 +134,12 @@ func BitmapUserMsgList(this *message.UserMsgListReq) (*message.UserMsgList, *mes
 			column.IsClassSearch = true
 			columnData = append(columnData, &column)
 		}
-	} else if this.IsColumn {
+	} else if this.IsColumn || this.IsfilterActive {
 		//获取所有分类未读数 不初始化
 		sortUnread, total := BitmapCountUnread(this.UserId, classUnreadCountMap, false)
 		//fmt.Println("*************", total)
 		unread += total
+<<<<<<< HEAD
 		toDoUnread = sortUnread["11"]
 		for _, v := range entity.MessageColumn {
 			var column message.AllSortData
@@ -145,8 +156,27 @@ func BitmapUserMsgList(this *message.UserMsgListReq) (*message.UserMsgList, *mes
 			}
 			if _, ok := entity.ClassSearchMap[column.MsgType]; ok {
 				column.IsClassSearch = true
+=======
+		if this.IsColumn {
+			for _, v := range entity.MessageColumn {
+				var column message.AllSortData
+				column.Name = common.InterfaceToStr(v["name"])
+				column.Img = fmt.Sprintf("/common-module/msgCenter/%s.png", common.InterfaceToStr(v["img"]))
+				column.MsgType = common.Int64All(v["group_id"])
+				if column.Name == "私信" {
+					column.UnreadMessages = unreadMsg(this)
+				} else if common.IntAll(v["group_id"]) > 0 {
+					//消息未读数
+					msgType := common.InterfaceToStr(v["group_id"])
+					column.UnreadMessages = sortUnread[msgType]
+					column.Data = sData[msgType]
+				}
+				if _, ok := entity.ClassSearchMap[column.MsgType]; ok {
+					column.IsClassSearch = true
+				}
+				columnData = append(columnData, &column)
+>>>>>>> master
 			}
-			columnData = append(columnData, &column)
 		}
 	}
 	data.SortData = columnData
@@ -434,9 +464,10 @@ func FindUserClassMsg(userId string) (map[int]int, map[int][]int) {
 }
 
 // GetUserMsgSummary 从用户消息汇总表取数据
-func GetUserMsgSummary(userId string) (userAllMsg, userReadMsg, userUnreadMsg []uint32, err error) {
+func GetUserMsgSummary(userId string, isfilterActive bool) (userAllMsg, userReadMsg, userUnreadMsg []uint32, err error) {
 	var count uint64
-	sqlc := fmt.Sprintf("SELECT COUNT(*) as count from message_user_summary WHERE userId = '%s'", userId)
+	sqlc := ""
+	sqlc = fmt.Sprintf("SELECT COUNT(*) as count from message_user_summary WHERE userId = '%s'", userId)
 	log.Println("GetUserMsgSummary selcet ", sqlc)
 	row1 := entity.ClickhouseConn.QueryRow(context.Background(), sqlc)
 	err = row1.Scan(&count)
@@ -444,7 +475,14 @@ func GetUserMsgSummary(userId string) (userAllMsg, userReadMsg, userUnreadMsg []
 		err = errors.New("用户暂无数据")
 		return
 	}
-	sql := fmt.Sprintf("SELECT bitmapToArray(allMsg) as userAllMsg,bitmapToArray(readMsg) as userReadMsg,bitmapToArray(bitmapAndnot(allMsg,readMsg)) as userunRead from message_user_summary where userId ='%s'", userId)
+	var sql string
+	isfilterActive = config.ConfigJson.IsFilterActive
+	if isfilterActive {
+		sql = fmt.Sprintf("SELECT a1.userAllMsg,a1.userReadMsg,bitmapToArray(bitmapAndnot(a1.userunRead,a2.msg_bitmap)) as userunRead from (SELECT bitmapToArray(allMsg) as userAllMsg,bitmapToArray(readMsg) as userReadMsg,bitmapAndnot(allMsg,readMsg) as userunRead from message_user_summary where userId ='%s') a1,(select msg_bitmap,group_id from message_summary ms  where group_id = 1 ) a2", userId)
+	} else {
+		sql = fmt.Sprintf("SELECT bitmapToArray(allMsg) as userAllMsg,bitmapToArray(readMsg) as userReadMsg,bitmapToArray(bitmapAndnot(allMsg,readMsg)) as userunRead from message_user_summary where userId ='%s'", userId)
+	}
+	//sql := fmt.Sprintf("SELECT bitmapToArray(allMsg) as userAllMsg,bitmapToArray(readMsg) as userReadMsg,bitmapToArray(bitmapAndnot(allMsg,readMsg)) as userunRead from message_user_summary where userId ='%s'", userId)
 	log.Println("GetUserMsgSummary selcet2 ", sql)
 	row := entity.ClickhouseConn.QueryRow(context.Background(), sql)
 	err = row.Scan(&userAllMsg, &userReadMsg, &userUnreadMsg)
@@ -486,6 +524,110 @@ func IntArrSort(arr []int) []int {
 	return resArr
 }
 
+type UserMsg struct {
+	GroupId   int32    `ch:"group_id"`
+	UnreadArr []uint32 `ch:"unreadArr"`
+	ReadArr   []uint32 `ch:"readArr"`
+}
+
+func WorkDeskList(in *message.WorkingDesktopReq) (res1, res2 []*message.Messages, err error) {
+	//待办查询
+	sqlStr := ""
+	needDo := map[int][]uint32{} //msgType对应的消息id
+	if in.NeedDealtWithCount {
+		sqlStr = fmt.Sprintf("  or p_group_id = 11")
+	}
+	sql := fmt.Sprintf(`select a2.group_id,bitmapToArray(bitmapAnd(a1.allMsg,a2.msg_bitmap)) as unreadArr,bitmapToArray(a1.readMsg) as readArr from 
+				(SELECT mus.allMsg as allMsg,mus.readMsg as readMsg FROM message_user_summary mus WHERE mus.userId = '%s') a1,
+			(select msg_bitmap,group_id from message_summary ms  where group_id = %d %s) a2`, in.UserId, in.MsgType, sqlStr)
+
+	log.Println("WorkDeskList", sql)
+	rows, err := entity.ClickhouseConn.Query(context.Background(), sql)
+	if err != nil {
+		return nil, nil, err
+	}
+	readMsgMap := map[int]bool{}
+	for rows.Next() {
+		group := UserMsg{}
+		err = rows.ScanStruct(&group)
+		if err != nil {
+			log.Println("获取各分类读取分类数据出错:", err)
+			return nil, nil, err
+		}
+		if len(group.ReadArr) > 0 && len(readMsgMap) == 0 {
+			for _, v := range group.ReadArr {
+				readMsgMap[int(v)] = true
+			}
+		}
+		if group.GroupId == int32(in.MsgType) {
+			res1 = GetMsgList(IntArrSort(Uint32ArrToIntArr(group.UnreadArr)), int(in.PageSize), in.UserId, readMsgMap)
+		} else {
+			if len(group.UnreadArr) > 0 {
+				needDo[int(group.GroupId)] = group.UnreadArr
+			}
+		}
+	}
+	if len(needDo) > 0 {
+		totalMsg := append(needDo[11], needDo[12]...)
+		needMsgArr := IntArrSort(Uint32ArrToIntArr(totalMsg))
+		res2 = GetMsgList(needMsgArr, int(in.PageSize), in.UserId, readMsgMap)
+	}
+	return res1, res2, nil
+}
+
+func GetMsgList(arr []int, size int, userId string, readMsgMap map[int]bool) []*message.Messages {
+	newMsg := []int{}
+	if len(arr) > 0 {
+		if len(arr) >= size {
+			newMsg = arr[len(arr)-size:]
+		} else {
+			newMsg = arr
+		}
+	}
+	//fmt.Println("*********8", newMsg)
+	resData := []*message.Messages{}
+	for i := len(newMsg) - 1; i >= 0; i-- {
+		//for _, v := range newMsg {
+		msg := GetMsgInfo(int(newMsg[i]), userId)
+		links4 := common.InterfaceToStr(msg["link"])
+		link4, androidUrl4, iosUrl4, weChatUrl4 := util.LinkSplit(links4)
+		resData = append(resData, &message.Messages{
+			Id:         common.InterfaceToStr(newMsg[i]),
+			Createtime: common.InterfaceToStr(msg["send_time"]),
+			Title:      common.InterfaceToStr(msg["title"]),
+			MsgType:    int64(util.IntAll(msg["group_id"])),
+			Link:       link4,
+			Content:    common.InterfaceToStr(msg["content"]),
+			MsgLogId:   int64(newMsg[i]),
+			Url: map[string]string{
+				"androidUrl": androidUrl4,
+				"iosUrl":     iosUrl4,
+				"weChatUrl":  weChatUrl4,
+			},
+			IsRead: common.Int64All(common.If(readMsgMap[int(newMsg[i])], 1, 0)),
+		})
+	}
+	return resData
+}
+
+func GetMsgInfo(msgId int, userId string) map[string]interface{} {
+	msg := GlobMsgMap[msgId]
+	if msg == nil || len(msg) <= 0 {
+		ms := entity.Mysql.FindOne("message_send_log", map[string]interface{}{"id": msgId}, "id,msg_type,title,content,send_time,link,menu_name,group_id,sign", "")
+		if ms != nil && len(*ms) > 0 {
+			msg = *ms
+		}
+	}
+	if common.IntAll(msg["sign"]) == 4 {
+		//查询用户注册时间
+		rData, _ := entity.MQFW.FindOneByField("user", map[string]interface{}{"_id": m.StringTOBsonId(userId)}, `{"l_registedate":1}`)
+		if rData != nil && len(*rData) > 0 {
+			msg["send_time"] = time.Unix(common.Int64All((*rData)["l_registedate"]), 0).Local().Format("2006-01-02 15:04:05")
+		}
+	}
+	return msg
+}
+
 // PutRedisUserAllMsg 加载用户的所有消息
 /*func PutRedisUserAllMsg(userId string, allMsgBitmap *roaring.Bitmap) (rData []map[string]interface{}) {
 	str := ""

+ 28 - 10
rpc/internal/common/sendMsg.go

@@ -269,16 +269,34 @@ func unreadMsg(this *message.UserMsgListReq) int64 {
 	if this.PositionId <= 0 {
 		return 0
 	}
-	querySql := fmt.Sprintf("SELECT  b.*,(SELECT SUM( a.unread) FROM  %s a "+
-		"LEFT JOIN %s b ON a.message_id = b.id  "+
-		"WHERE  a.unread > 0 "+
-		"AND ( a.my_position_id = %d OR a.user_id = %d )) AS unread "+
-		"FROM %s a  "+
-		"LEFT JOIN %s b ON a.message_id = b.id  "+
-		"WHERE a.unread > 0  "+
-		"AND ( a.my_position_id = %d OR a.user_id = %d ) "+
-		"ORDER BY a.TIMESTAMP DESC LIMIT 0,1", "socialize_summary", "socialize_message", this.PositionId, this.NewUserId,
-		"socialize_summary", "socialize_message", this.PositionId, this.NewUserId)
+	//querySql := fmt.Sprintf("SELECT  b.*,(SELECT SUM( a.unread) FROM  %s a "+
+	//	"LEFT JOIN %s b ON a.message_id = b.id  "+
+	//	"WHERE  a.unread > 0 "+
+	//	"AND ( a.my_position_id = %d OR a.user_id = %d )) AS unread "+
+	//	"FROM %s a  "+
+	//	"LEFT JOIN %s b ON a.message_id = b.id  "+
+	//	"WHERE a.unread > 0  "+
+	//	"AND ( a.my_position_id = %d OR a.user_id = %d ) "+
+	//	"ORDER BY a.TIMESTAMP DESC LIMIT 0,1", "socialize_summary", "socialize_message", this.PositionId, this.NewUserId,
+	//	"socialize_summary", "socialize_message", this.PositionId, this.NewUserId)
+	querySql := fmt.Sprintf(`SELECT
+		SUM( unread ) as unread
+	FROM (
+SELECT
+		SUM( unread ) as unread
+	FROM
+		socialize_summary
+	WHERE
+	my_position_id = %d  
+	AND unread > 0  
+	UNION ALL
+	SELECT
+		SUM( unread ) as unread
+	FROM
+		socialize_summary
+	WHERE
+	user_id = %d 
+	AND	unread > 0)`, this.PositionId, this.NewUserId)
 	log.Println("查询sql", querySql)
 	msgUnread := entity.BaseMysql.SelectBySql(querySql)
 	if msgUnread != nil && len(*msgUnread) > 0 {

+ 199 - 0
rpc/internal/common/task.go

@@ -4,8 +4,14 @@ import (
 	"app.yhyue.com/moapp/MessageCenter/entity"
 	"app.yhyue.com/moapp/MessageCenter/rpc/internal/config"
 	"app.yhyue.com/moapp/jybase/common"
+	"app.yhyue.com/moapp/jybase/encrypt"
+	"app.yhyue.com/moapp/jybase/redis"
+	"context"
 	"fmt"
 	"github.com/robfig/cron/v3"
+	"log"
+	"strings"
+	"time"
 )
 
 var GlobMsgMap map[int]map[string]interface{}
@@ -15,6 +21,9 @@ func LoadTask() {
 	LoadMsgOnTime()
 	c := cron.New(cron.WithSeconds())
 	c.AddFunc(config.ConfigJson.GlobMsgLoadTime, LoadMsgOnTime)
+	c.AddFunc(config.ConfigJson.FreeIntelTime, FreeIntelUserPush) //免费用户推送
+	c.AddFunc(config.ConfigJson.PayIntelTime, PayIntelUserPush)   //付费用户推送
+
 	go c.Start()
 	defer c.Stop()
 }
@@ -31,3 +40,193 @@ func LoadMsgOnTime() {
 	}
 	fmt.Println("GlobMsgMap len", len(GlobMsgMap))
 }
+
+func FreeIntelUserPush() {
+	data := messageData(config.ConfigJson.FreePushNumber)
+	if data == nil || len(*data) == 0 {
+		return
+	}
+	users := IntelUser(true)
+	PushData(users, data)
+}
+
+func PayIntelUserPush() {
+	data := messageData(config.ConfigJson.PayPushNumber)
+	if data == nil || len(*data) == 0 {
+		return
+	}
+	users := IntelUser(false)
+	PushData(users, data)
+}
+
+func PushData(users []string, data *[]map[string]interface{}) {
+	log.Printf("需推送用户:%d\n", len(users))
+	var ids []int64
+	if data != nil {
+		for _, m := range *data {
+			_id := common.InterfaceToStr(m["_id"])
+			var link []string
+			link = append(link, fmt.Sprintf("/swordfish/page_big_pc/business_detail/%s", encrypt.EncodeArticleId2ByCheck(_id)))
+			mobLink := fmt.Sprintf("/jy_mobile/business/detail/%s", encrypt.EncodeArticleId2ByCheck(_id))
+			link = append(link, mobLink)
+			link = append(link, mobLink)
+			link = append(link, mobLink)
+
+			iData := map[string]interface{}{
+				"msg_type":    9,
+				"title":       "您有一条专属商机情报",
+				"content":     fmt.Sprintf("【商机情报】%s", common.ObjToString(m["title"])),
+				"send_mode":   1,
+				"send_time":   time.Now().Format("2006-01-02 15:04:05"),
+				"send_status": 4,
+				"update_time": time.Now().Format("2006-01-02 15:04:05"),
+				"createtime":  time.Now().Format("2006-01-02 15:04:05"),
+				"link":        strings.Join(link, ","),
+				"isdel":       1,
+				"send_userid": "商机情报定时推送",
+				"sign":        0,
+				"group_id":    5,
+			}
+			id := entity.Mysql.Insert("message_send_log", iData)
+			ids = append(ids, id)
+		}
+	}
+
+	if len(ids) > 0 {
+		var bits []string
+		for _, i2 := range ids {
+			bits = append(bits, fmt.Sprintf("toUInt64(%d)", i2))
+		}
+		err := entity.ClickhouseConn.Exec(context.Background(), fmt.Sprintf(`alter table message_summary UPDATE msg_bitmap = bitmapOr(msg_bitmap,bitmapBuild([%s])) where group_id = %d`, strings.Join(bits, ","), 5))
+		if err != nil {
+			log.Println("message_summary err=== ", err.Error())
+			return
+		}
+
+		var userIds []string
+		for k, user := range users {
+			userIds = append(userIds, user)
+			if len(userIds) == 1000 || k == len(users)-1 {
+				UpdateBatch(userIds, ids)
+				userIds = []string{}
+			}
+		}
+	}
+}
+
+// 用户
+func IntelUser(isFree bool) []string {
+	mUser := make(map[string]bool)
+	data := entity.Mysql.SelectBySql(`SELECT a.phone as phone FROM entniche_user a INNER JOIN entniche_info b on  b.status = 1 and a.power = 1 and a.ent_id = b.id and a.phone != ''`)
+	if data != nil { //统计商机管理用户
+		for _, m := range *data {
+			mUser[common.InterfaceToStr(m["phone"])] = true
+		}
+	}
+	var uData []string
+	switch isFree {
+	case false:
+		user, ok := entity.MQFW.Find("user", map[string]interface{}{
+			"i_appid": 2,
+			"$or": []map[string]interface{}{
+				{
+					"i_vip_status": map[string]interface{}{"$gt": 0},
+				},
+				{
+					"i_member_status": map[string]interface{}{"$gt": 0},
+				},
+			},
+		}, "", `{"_id":1,"s_phone":1,"s_m_phone":1}`, false, -1, -1)
+		if ok && user != nil && len(*user) > 0 {
+			for _, m := range *user {
+				phone := common.If(common.InterfaceToStr(m["s_phone"]) == "", common.InterfaceToStr(m["s_m_phone"]), common.InterfaceToStr(m["s_phone"])).(string)
+				uData = append(uData, common.InterfaceToStr(m["_id"]))
+				if mUser[phone] { //获取剩余商机管理用户
+					delete(mUser, phone)
+				}
+			}
+			if len(mUser) > 0 { //统计剩余商机管理用户
+				var (
+					phones []string
+					count  int
+				)
+
+				for phone := range mUser {
+					count++
+					phones = append(phones, phone)
+					if len(phones) == 100 || count == len(mUser) {
+						user1, ok1 := entity.MQFW.Find("user", map[string]interface{}{
+							"i_appid": 2,
+							"$or": []map[string]interface{}{
+								{
+									"s_phone": map[string]interface{}{
+										"$in": phones,
+									},
+								},
+								{
+									"s_m_phone": map[string]interface{}{
+										"$in": phones,
+									},
+								},
+							},
+						}, "", `{"_id":1}`, false, -1, -1)
+						if ok1 && user1 != nil && len(*user1) > 0 {
+							for _, m := range *user1 {
+								uData = append(uData, common.InterfaceToStr(m["_id"]))
+							}
+						}
+						phones = []string{}
+					}
+				}
+			}
+		}
+
+	case true:
+		sess := entity.MQFW.GetMgoConn()
+		defer entity.MQFW.DestoryMongoConn(sess)
+		iter := sess.DB("qfw").C("user").Find(map[string]interface{}{
+			"i_appid": 2,
+		}).Select(map[string]interface{}{"i_vip_status": 1, "i_member_status": 1, "_id": 1, "s_phone": 1, "s_m_phone": 1}).Iter()
+		for m := make(map[string]interface{}); iter.Next(&m); {
+			if common.IntAll(m["i_vip_status"]) <= 0 && common.IntAll(m["i_member_status"]) <= 0 {
+				phone := common.If(common.InterfaceToStr(m["s_phone"]) == "", common.InterfaceToStr(m["s_m_phone"]), common.InterfaceToStr(m["s_phone"])).(string)
+				if !mUser[phone] {
+					uData = append(uData, common.InterfaceToStr(m["_id"]))
+				}
+			}
+			m = map[string]interface{}{}
+		}
+	}
+	return uData
+}
+
+// 获取推送消息
+func messageData(number int) *[]map[string]interface{} {
+	now := time.Now().AddDate(0, 0, -1)
+	starttime := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, time.Local).Unix()
+	enttime := time.Date(now.Year(), now.Month(), now.Day(), 24, 0, 0, 0, time.Local).Unix()
+
+	query := map[string]interface{}{
+		"yucetime": map[string]interface{}{"$gt": starttime, "$lt": enttime},
+	}
+	data, _ := entity.Bidding.Find("project_forecast", query, `{"yucetime": -1}`, `{"title":1,"_id":1}`, false, 0, number)
+	return data
+}
+
+func UpdateBatch(ids []string, msgLogId []int64) {
+	str := fmt.Sprintf(`'%s'`, strings.Join(ids, `','`))
+	var bits []string
+	for _, i2 := range msgLogId {
+		bits = append(bits, fmt.Sprintf("toUInt64(%d)", i2))
+	}
+	log.Println(fmt.Sprintf(`alter table message_user_summary UPDATE allMsg = bitmapOr(allMsg,bitmapBuild([%s])) where userId in (%s)`, strings.Join(bits, ","), str))
+	err1 := entity.ClickhouseConn.Exec(context.Background(), fmt.Sprintf(`alter table message_user_summary UPDATE allMsg = bitmapOr(allMsg,bitmapBuild([%s])) where userId in (%s)`, strings.Join(bits, ","), str))
+	if err1 != nil {
+		log.Printf("批量更新message_user_summary出错:%s", err1)
+		return
+	}
+	for _, id := range ids {
+		keyString := fmt.Sprintf(MsgCountKey, id, 5)
+		redis.Del(redisModule, keyString)
+	}
+}

+ 7 - 1
rpc/internal/config/config.go

@@ -12,6 +12,7 @@ type Config struct {
 	//Mysql           string
 	RedisAddr       string `json:"RedisAddr"`
 	Mongodb         *mgoConf
+	Bidding         *mgoConf
 	SurvivalTime    int
 	SaveConcurrency int       // 消息保存并发数
 	WxWebdomain     string    `json:"WxWebdomain"`
@@ -23,13 +24,18 @@ type Config struct {
 		Pwd  string `json:"pwd"`
 		User string `json:"user"`
 	} `json:"mail"`
-	TidbEng           string `json:"Tidb"`
 	Registedate       int64
+	TidbEng           string  `json:"Tidb"`
 	ClassSearchList   []int64 `json:"ClassSearchList"` // 需要按照messageclass 查询的groupId
 	Clickhouse        *CHouseConfig
 	GlobMsgLoadTime   string `json:"GlobMsgLoadTime"`
+	FreeIntelTime     string `json:"FreeIntelTime"`
+	PayIntelTime      string `json:"PayIntelTime"`
+	FreePushNumber    int    `json:"FreePushNumber"`
+	PayPushNumber     int    `json:"PayPushNumber"`
 	EquityInfoMsgType int64  `json:"EquityInfoMsgType"` // 营销权益消息需要特殊处理的消息类型
 	NewUserMsgTitle   string `json:"NewUserMsgTitle"`
+	IsFilterActive    bool   `json:"IsFilterActive"`
 }
 
 type CHouseConfig struct {

+ 43 - 0
rpc/internal/logic/workingdesktoplistlogic.go

@@ -0,0 +1,43 @@
+package logic
+
+import (
+	"app.yhyue.com/moapp/MessageCenter/rpc/internal/common"
+	"app.yhyue.com/moapp/MessageCenter/rpc/internal/svc"
+	"app.yhyue.com/moapp/MessageCenter/rpc/type/message"
+	"context"
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type WorkingDesktopListLogic struct {
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+	logx.Logger
+}
+
+func NewWorkingDesktopListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *WorkingDesktopListLogic {
+	return &WorkingDesktopListLogic{
+		ctx:    ctx,
+		svcCtx: svcCtx,
+		Logger: logx.WithContext(ctx),
+	}
+}
+
+// 工作桌面列表
+func (l *WorkingDesktopListLogic) WorkingDesktopList(in *message.WorkingDesktopReq) (*message.WorkingDesktopResp, error) {
+	// todo: add your logic here and delete this line
+	msg := ""
+	code := 0
+	res1, res2, err := common.WorkDeskList(in)
+	//fmt.Println(len(res1))
+	//fmt.Println(len(res2))
+	if err != nil {
+		code = 1
+		msg = err.Error()
+	}
+	return &message.WorkingDesktopResp{
+		Code:       int64(code),
+		Message:    msg,
+		BusMsgList: res1,
+		NeedDo:     res2,
+	}, nil
+}

+ 6 - 0
rpc/internal/server/messageserver.go

@@ -22,6 +22,12 @@ func NewMessageServer(svcCtx *svc.ServiceContext) *MessageServer {
 	}
 }
 
+// 工作桌面列表
+func (s *MessageServer) WorkingDesktopList(ctx context.Context, in *message.WorkingDesktopReq) (*message.WorkingDesktopResp, error) {
+	l := logic.NewWorkingDesktopListLogic(ctx, s.svcCtx)
+	return l.WorkingDesktopList(in)
+}
+
 // 发送消息更新一次消息汇总表
 func (s *MessageServer) UpdateMsgSummary(ctx context.Context, in *message.UpdateMsgSummaryReq) (*message.Response, error) {
 	l := logic.NewUpdateMsgSummaryLogic(ctx, s.svcCtx)

+ 13 - 0
rpc/message.go

@@ -105,6 +105,19 @@ func init() {
 		}
 		entity.MQFW.InitPool()
 	}
+	// 初始化mongo
+	if config.ConfigJson.Bidding != nil {
+		log.Println("初始化 mongodb Bidding")
+		entity.Bidding = m.MongodbSim{
+			MongodbAddr: config.ConfigJson.Bidding.Address,
+			Size:        config.ConfigJson.Bidding.Size,
+			DbName:      config.ConfigJson.Bidding.DbName,
+			UserName:    config.ConfigJson.Bidding.UserName,
+			Password:    config.ConfigJson.Bidding.Password,
+			ReplSet:     config.ConfigJson.Bidding.ReplSet,
+		}
+		entity.Bidding.InitPool()
+	}
 	// 初始化发送邮件
 	for _, v := range config.ConfigJson.Mail {
 		entity.GmailAuth = append(entity.GmailAuth, &mail.GmailAuth{

+ 240 - 206
rpc/message.proto

@@ -4,106 +4,106 @@ package message;
 option go_package = "message/";
 
 message ChangeReadStatusReq {
-    int64 id = 1; // 消息id
-    int64 readStatus = 2; // 阅读状态 0-未读 1-已读
-    string appid = 3; //应用标识
-    string userId = 4;
+  int64 id = 1; // 消息id
+  int64 readStatus = 2; // 阅读状态 0-未读 1-已读
+  string appid = 3; //应用标识
+  string userId = 4;
 }
 message ResCount {
-    int64 msgType = 1; // 类型及未读数量
-    int64 count = 2; // 类型及未读数量
+  int64 msgType = 1; // 类型及未读数量
+  int64 count = 2; // 类型及未读数量
 }
 
 message Response {
-    int64 code = 1; //状态码
-    string message = 2; //响应消息
+  int64 code = 1; //状态码
+  string message = 2; //响应消息
 }
 
 message FindUserMsgReq {
-    string userId = 1; //用户id
-    string receiveUserId = 2; //聊天方用户id
-    string appid = 3; //应用标识
-    int64 offSet = 4; //当前
-    int64 pageSize = 5; //大小
-    int64 msgType = 6; //是否区分类型
-    int64 read = 7; // 是否区分已读未读 -1 不区分已读未读  0 未读 1 已读
+  string userId = 1; //用户id
+  string receiveUserId = 2; //聊天方用户id
+  string appid = 3; //应用标识
+  int64 offSet = 4; //当前
+  int64 pageSize = 5; //大小
+  int64 msgType = 6; //是否区分类型
+  int64 read = 7; // 是否区分已读未读 -1 不区分已读未读  0 未读 1 已读
 }
 
 message Messages {
-    string receiveUserId = 1; //接收方用户ID
-    string receiveName = 2; //接收方用户名
-    string sendUserId = 3; //发送方用户ID
-    string sendName = 4; //发送方用户名
-    string title = 5; //主题
-    string content = 6; //内容
-    int64 msgType = 7; //消息类型 1:客服   2:系统通知  3:营销   4:用户会话
-    string link = 8; //跳转链接
-    int64 citeId = 9; //引用id
-    int64 isRead = 10; //已读未读 0:未读  1:已读
-    string createtime = 11;
-    string appid = 12; //应用标识
-    string id = 13; //消息id
-    int64 msgLogId = 14;
-    map<string, string> url = 15;
+  string receiveUserId = 1; //接收方用户ID
+  string receiveName = 2; //接收方用户名
+  string sendUserId = 3; //发送方用户ID
+  string sendName = 4; //发送方用户名
+  string title = 5; //主题
+  string content = 6; //内容
+  int64 msgType = 7; //消息类型 1:客服   2:系统通知  3:营销   4:用户会话
+  string link = 8; //跳转链接
+  int64 citeId = 9; //引用id
+  int64 isRead = 10; //已读未读 0:未读  1:已读
+  string createtime = 11;
+  string appid = 12; //应用标识
+  string id = 13; //消息id
+  int64 msgLogId = 14;
+  map<string, string> url = 15;
 }
 
 message FindUserMsgRes {
-    int64 code = 1; //状态码
-    string message = 2; //响应消息
-    repeated Messages data = 3; //
-    int64 count = 4; //总数
+  int64 code = 1; //状态码
+  string message = 2; //响应消息
+  repeated Messages data = 3; //
+  int64 count = 4; //总数
 }
 
 message GetClassUnreadCountReq {
-    string userId = 1; // 用户id
-    int64 msgType = 2; //分类 1:客服   2:系统通知  3:营销   4:用户会话
-    string appid = 3; //应用标识
+  string userId = 1; // 用户id
+  int64 msgType = 2; //分类 1:客服   2:系统通知  3:营销   4:用户会话
+  string appid = 3; //应用标识
 }
 
 //查看消息内容
 message MessageDetailReq {
-    int64 id = 1; //消息id
-    int64 msgLogId = 2;
-    string userId = 3;
+  int64 id = 1; //消息id
+  int64 msgLogId = 2;
+  string userId = 3;
 }
 message MessageDetailResp {
-    int64 code = 1; //状态码
-    string message = 2; //响应消息
-    Messages data = 3; //
+  int64 code = 1; //状态码
+  string message = 2; //响应消息
+  Messages data = 3; //
 }
 message GetLastMessageReq {
-    string userId = 1; // 用户id
-    int64 msgType = 2; //分类 1:客服   2:系统通知  3:营销   4:用户会话
-    string appid = 3; //应用标识
-    int64 isRead = 4; // 0:未读  1:已读  -1 不区分
+  string userId = 1; // 用户id
+  int64 msgType = 2; //分类 1:客服   2:系统通知  3:营销   4:用户会话
+  string appid = 3; //应用标识
+  int64 isRead = 4; // 0:未读  1:已读  -1 不区分
 }
 message GetLastMessageRes {
-    int64 code = 1; //状态码
-    string message = 2; //响应消息
-    Messages data = 3; //
+  int64 code = 1; //状态码
+  string message = 2; //响应消息
+  Messages data = 3; //
 }
 // 获取用户分类的的未读消息分类及数量 及分类下最新的消息
 message GetUnreadClassCountReq {
-    string userId = 1; // 用户id
-    string appid = 2; //应用标识
-    bool needMsg = 3; //是否需要分类下的最新一条消息
+  string userId = 1; // 用户id
+  string appid = 2; //应用标识
+  bool needMsg = 3; //是否需要分类下的最新一条消息
 }
 message GetUnreadClassCountRes {
-    int64 code = 1; //状态码
-    string message = 2; //响应消息
-    repeated ResCount data = 3; //
-    repeated Messages info = 4; // 每个类型最新消息列表
+  int64 code = 1; //状态码
+  string message = 2; //响应消息
+  repeated ResCount data = 3; //
+  repeated Messages info = 4; // 每个类型最新消息列表
 }
 /*message GetMsgTypeReq {
     string userId = 1; // 用户id
     string appid = 2; //应用标识
 }*/
 message MsgTypes{
-    int64 msgType =1;
-    string img = 2;
-    string name =3;
-    string code = 4;
-    string displayPlatform = 5;
+  int64 msgType = 1;
+  string img = 2;
+  string name = 3;
+  string code = 4;
+  string displayPlatform = 5;
 }
 /*message GetMsgTypeRes {
     int64 code = 1; //状态码
@@ -112,94 +112,95 @@ message MsgTypes{
 }*/
 
 message user {
-    string userId = 1;
-    string userName = 2;
+  string userId = 1;
+  string userName = 2;
 }
 
 message multipleSaveMsgReq {
-    string userIds = 1;
-    string sendUserId = 3; //发送方用户ID
-    string title = 5; //主题
-    string content = 6; //内容
-    int64 msgType = 7; //消息类型 1:客服   2:系统通知  3:营销   4:用户会话
-    string link = 8; //跳转链接
-    string appid = 10; //应用标识
-    int64 msgLogId = 11;//消息记录表id
-    string positionIds = 14;// 职位id  逗号分割
-    string row4 = 15;
-    string productName = 16;
-    string orderId = 17;
-    string orderMoney = 18;
-    string identity = 19;
-    string appPushUrl = 20;
-    string wxPushUrl = 21;
-    string iosPushUrl = 22;
-    string baseUserIds = 23;
- }
+  string userIds = 1;
+  string sendUserId = 3; //发送方用户ID
+  string title = 5; //主题
+  string content = 6; //内容
+  int64 msgType = 7; //消息类型 1:客服   2:系统通知  3:营销   4:用户会话
+  string link = 8; //跳转链接
+  string appid = 10; //应用标识
+  int64 msgLogId = 11;//消息记录表id
+  string positionIds = 14;// 职位id  逗号分割
+  string row4 = 15;
+  string productName = 16;
+  string orderId = 17;
+  string orderMoney = 18;
+  string identity = 19;
+  string appPushUrl = 20;
+  string wxPushUrl = 21;
+  string iosPushUrl = 22;
+  string baseUserIds = 23;
+}
 
 message CustomWxTpl {
-	string TplId = 1;
-	map<string, TmplItem> tmplData = 2;
+  string TplId = 1;
+  map<string, TmplItem> tmplData = 2;
 }
 
 message TmplItem {
-	string value = 1;
-	string color = 2;
+  string value = 1;
+  string color = 2;
 }
 
 message multipleSaveMsgResp {
-    int64 code = 1; //状态码
-    string message = 2; //响应消息
-    int64 errCount = 3; // 保存出错数量
+  int64 code = 1; //状态码
+  string message = 2; //响应消息
+  int64 errCount = 3; // 保存出错数量
 }
 
 message FindUserBuoyMsgReq {
-    string userId = 1; //用户id
-    string appid = 2; //应用标识
-    int64 pageSize = 3; //大小
+  string userId = 1; //用户id
+  string appid = 2; //应用标识
+  int64 pageSize = 3; //大小
 }
 message FindUserBuoyMsgRes {
-    int64 code = 1; //状态码
-    string message = 2; //响应消息
-    repeated BuoyMessages data = 3; //
+  int64 code = 1; //状态码
+  string message = 2; //响应消息
+  repeated BuoyMessages data = 3; //
 }
 message BuoyMessages {
-    string id = 1; //消息id
-    string buoy_detail = 2; //浮标内容
-    string pcUrl   =3;
-    string androidUrl = 4;
-    string iosUrl = 5;
-    string weChatUrl =6;
+  string id = 1; //消息id
+  string buoy_detail = 2; //浮标内容
+  string pcUrl = 3;
+  string androidUrl = 4;
+  string iosUrl = 5;
+  string weChatUrl = 6;
 
 }
 
 message ClearUnreadMsgReq {
-    string userid = 1; //mgoId
-    int64  entId = 2;
-    int64 positionId = 3; //职位id
-    string appId = 4;
-    int64 NewUserId   =5;//私信相关
+  string userid = 1; //mgoId
+  int64  entId = 2;
+  int64 positionId = 3; //职位id
+  string appId = 4;
+  int64 NewUserId = 5;//私信相关
 }
 
 message UserMsgListReq {
-    string userId = 1; //用户id
-    string appid = 3; //应用标识
-    int64 offSet = 4; //当前
-    int64 pageSize = 5; //大小
-    int64 msgType = 6; //是否区分类型
-    int64 read = 7; // 是否区分已读未读 -1 不区分已读未读  0 未读 1 已读
-    int64 SortSize = 8; //分类 每类数
-    bool isColumn   =9;    //是否需要获取栏目
-    bool isColumnNewMsg = 10; //是否需各栏目获取最新消息
-    bool isMsgList =11;  //是否需要列表信息
-    int64 NewUserId   =12;//私信相关
-    int64 PositionId  =13;//私信相关
-    bool isContainLetter  =14;//是否包含私信未读数
-    bool isClassSearch  =15;// 是否是消息细化分类查询
-
+  string userId = 1; //用户id
+  string appid = 3; //应用标识
+  int64 offSet = 4; //当前
+  int64 pageSize = 5; //大小
+  int64 msgType = 6; //是否区分类型
+  int64 read = 7; // 是否区分已读未读 -1 不区分已读未读  0 未读 1 已读
+  int64 SortSize = 8; //分类 每类数
+  bool isColumn = 9;    //是否需要获取栏目
+  bool isColumnNewMsg = 10; //是否需各栏目获取最新消息
+  bool isMsgList = 11;  //是否需要列表信息
+  int64 NewUserId = 12;//私信相关
+  int64 PositionId = 13;//私信相关
+  bool isContainLetter = 14;//是否包含私信未读数
+  bool isClassSearch = 15;// 是否是消息细化分类查询
+  bool isfilterActive = 16; //是否过滤
 }
 
 message UserMsgListRes {
+<<<<<<< HEAD
     int64 code = 1; //状态码
     string message = 2; //响应消息
     repeated Messages list = 3; //
@@ -216,21 +217,37 @@ message UserMsgList {
     int64 count = 3; //总数
     int64 unread = 4; //未读总数
     int64 toDoUnread = 5; //待办未读数量
+=======
+  int64 code = 1; //状态码
+  string message = 2; //响应消息
+  repeated Messages list = 3; //
+  Messages last = 4; //
+  repeated AllSortData column = 5; //
+  int64 count = 6; //总数
+  int64 unread = 7; //未读总数
+}
+
+message UserMsgList {
+  repeated Messages data = 1; //
+  repeated AllSortData sortData = 2; //
+  int64 count = 3; //总数
+  int64 unread = 4; //未读总数
+>>>>>>> master
 }
 
 message AllSortData {
-    int64 unreadMessages =1 ;
-   string name =2;
-   string img = 3;
-   int64 msgType = 4; //是否区分类型;
-   repeated Messages data = 5; //
-    bool isClassSearch  =6;// 是否是消息细化分类查询
+  int64 unreadMessages = 1 ;
+  string name = 2;
+  string img = 3;
+  int64 msgType = 4; //是否区分类型;
+  repeated Messages data = 5; //
+  bool isClassSearch = 6;// 是否是消息细化分类查询
 }
 
 
 message WxTmplResponse {
-    int64 sendTotal = 1; //发送数量
-    string message = 2; //信息
+  int64 sendTotal = 1; //发送数量
+  string message = 2; //信息
 }
 
 /*message UserUnreadMsgListReq {
@@ -252,11 +269,11 @@ message WxTmplResponse {
 message WxTmplMsgRequest {
   string userIds = 1;      //接受人 mongo_userId(多个用,分割)
   string positionIds = 2;  //接受人 职位id(多个用,分割)
-  int64 msgType =3;  //数据库中switch字段
+  int64 msgType = 3;  //数据库中switch字段
   string title = 4;        //课程名称
   string detail = 5;       //课程时间
   string date = 6;         //课程地点
-  string row4 =7;
+  string row4 = 7;
   string url = 8;          //消息跳转连接
 }
 
@@ -265,90 +282,107 @@ message SendMsgResponse {
   string message = 2; //响应消息
 }
 message MsgOpenLogReq{
-    int64 msgLogId =1;
-    int64 platform =2;
-    string userId = 3;
-    string appId = 4;
+  int64 msgLogId = 1;
+  int64 platform = 2;
+  string userId = 3;
+  string appId = 4;
 }
 
 //新用户消息调用接口
 message NewUserInsertMsgReq{
-    string userIds = 1;
-    string title = 5; //主题
-    string content = 6; //内容
-    int64 msgType = 7; //消息类型 1:客服   2:系统通知  3:营销   4:用户会话
-    string link = 8; //跳转链接
-    string appid = 10; //应用标识
-    int64 msgLogId = 11;//消息记录表id
-    string positionIds = 14;// 职位id  逗号分割
-    string row4 = 15;
-    string productName = 16;
-    string orderId = 17;
-    string orderMoney = 18;
-    string identity = 19;
-    string appPushUrl = 20;
-    string wxPushUrl = 21;
-    string iosPushUrl = 22;
+  string userIds = 1;
+  string title = 5; //主题
+  string content = 6; //内容
+  int64 msgType = 7; //消息类型 1:客服   2:系统通知  3:营销   4:用户会话
+  string link = 8; //跳转链接
+  string appid = 10; //应用标识
+  int64 msgLogId = 11;//消息记录表id
+  string positionIds = 14;// 职位id  逗号分割
+  string row4 = 15;
+  string productName = 16;
+  string orderId = 17;
+  string orderMoney = 18;
+  string identity = 19;
+  string appPushUrl = 20;
+  string wxPushUrl = 21;
+  string iosPushUrl = 22;
 }
 message UpdateMsgSummaryReq{
-    int64 msgLogId = 1;
-    int64 groupId = 2;
-    int64 msgType = 3;
+  int64 msgLogId = 1;
+  int64 groupId = 2;
+  int64 msgType = 3;
 }
 message BitmapSaveMsgReq{
-    string userIds = 1;
-    string title = 5; //主题
-    string content = 6; //内容
-    int64 msgType = 7; //消息类型 1:客服   2:系统通知  3:营销   4:用户会话
-    string link = 8; //跳转链接
-    string appid = 10; //应用标识
-    int64 msgLogId = 11;//消息记录表id
-    string positionIds = 14;// 职位id  逗号分割
-    string row4 = 15;
-    string productName = 16;
-    string orderId = 17;
-    string orderMoney = 18;
-    string identity = 19;
-    string appPushUrl = 20;
-    string wxPushUrl = 21;
-    string iosPushUrl = 22;
-    string baseUserIds = 23;
-    string sendUserId = 24;
+  string userIds = 1;
+  string title = 5; //主题
+  string content = 6; //内容
+  int64 msgType = 7; //消息类型 1:客服   2:系统通知  3:营销   4:用户会话
+  string link = 8; //跳转链接
+  string appid = 10; //应用标识
+  int64 msgLogId = 11;//消息记录表id
+  string positionIds = 14;// 职位id  逗号分割
+  string row4 = 15;
+  string productName = 16;
+  string orderId = 17;
+  string orderMoney = 18;
+  string identity = 19;
+  string appPushUrl = 20;
+  string wxPushUrl = 21;
+  string iosPushUrl = 22;
+  string baseUserIds = 23;
+  string sendUserId = 24;
+}
+
+message WorkingDesktopReq{
+  string userId = 1; //用户id
+  string appid = 3; //应用标识
+  int64 offSet = 4; //当前
+  int64 pageSize = 5; //大小
+  int64 msgType = 6;
+  bool needDealtWithCount = 7;
+}
+message WorkingDesktopResp{
+  int64 code = 1; //状态码
+  string message = 2; //响应消息
+  repeated Messages busMsgList = 3;
+  repeated Messages needDo = 4;
 }
 
 service Message {
-    //发送消息更新一次消息汇总表
-    rpc UpdateMsgSummary (UpdateMsgSummaryReq) returns (Response);
-    //新用户发送消息
-    rpc NewUserMsg (NewUserInsertMsgReq) returns (Response);
-    //bitmap保存消息
-    rpc bitmapSaveMsg (multipleSaveMsgReq) returns (multipleSaveMsgResp);
-    //批量保存消息
-    rpc multipleSaveMsg (multipleSaveMsgReq) returns (multipleSaveMsgResp);
-    // 修改消息阅读状态
-    rpc ChangeReadStatus (ChangeReadStatusReq) returns (Response);
-    //  查询指定用户的历史消息记录
-    rpc FindUserMsg (FindUserMsgReq) returns (FindUserMsgRes);
-    //查看详细详情
-    rpc FindMessageDetail (MessageDetailReq) returns (MessageDetailResp);
-    //  消息的分类
-//    rpc GetMsgType (GetMsgTypeReq) returns (GetMsgTypeRes);
-    //  查询指定用户的浮标消息
-    rpc FindUserBuoyMsg (FindUserBuoyMsgReq) returns (FindUserBuoyMsgRes);
-
-    //   一键清空未读消息
-    rpc ClearUnreadMsg (ClearUnreadMsgReq) returns (Response);
-
-    //   new用户消息列表
-    rpc UserMsgList (UserMsgListReq) returns (UserMsgListRes);
-    //  发送剑鱼微信模版消息
-    rpc SendWxTmplMsg (WxTmplMsgRequest) returns(SendMsgResponse);
-    //   官网、移动端首页、工作桌面消息滚动
-//    rpc UserUnreadMsgList (UserUnreadMsgListReq) returns (UserUnreadMsgListRes);
-    // 点击消息-存查看记录
-    rpc MsgOpenLog (MsgOpenLogReq) returns (Response);
-
-    //  发送剑鱼微信模版消息
-    rpc AppLetterPush (WxTmplMsgRequest) returns(SendMsgResponse);
+  //工作桌面列表
+  rpc WorkingDesktopList (WorkingDesktopReq) returns (WorkingDesktopResp);
+  //发送消息更新一次消息汇总表
+  rpc UpdateMsgSummary (UpdateMsgSummaryReq) returns (Response);
+  //新用户发送消息
+  rpc NewUserMsg (NewUserInsertMsgReq) returns (Response);
+  //bitmap保存消息
+  rpc bitmapSaveMsg (multipleSaveMsgReq) returns (multipleSaveMsgResp);
+  //批量保存消息
+  rpc multipleSaveMsg (multipleSaveMsgReq) returns (multipleSaveMsgResp);
+  // 修改消息阅读状态
+  rpc ChangeReadStatus (ChangeReadStatusReq) returns (Response);
+  //  查询指定用户的历史消息记录
+  rpc FindUserMsg (FindUserMsgReq) returns (FindUserMsgRes);
+  //查看详细详情
+  rpc FindMessageDetail (MessageDetailReq) returns (MessageDetailResp);
+  //  消息的分类
+  //    rpc GetMsgType (GetMsgTypeReq) returns (GetMsgTypeRes);
+  //  查询指定用户的浮标消息
+  rpc FindUserBuoyMsg (FindUserBuoyMsgReq) returns (FindUserBuoyMsgRes);
+
+  //   一键清空未读消息
+  rpc ClearUnreadMsg (ClearUnreadMsgReq) returns (Response);
+
+  //   new用户消息列表
+  rpc UserMsgList (UserMsgListReq) returns (UserMsgListRes);
+  //  发送剑鱼微信模版消息
+  rpc SendWxTmplMsg (WxTmplMsgRequest) returns(SendMsgResponse);
+  //   官网、移动端首页、工作桌面消息滚动
+  //    rpc UserUnreadMsgList (UserUnreadMsgListReq) returns (UserUnreadMsgListRes);
+  // 点击消息-存查看记录
+  rpc MsgOpenLog (MsgOpenLogReq) returns (Response);
+
+  //  发送剑鱼微信模版消息
+  rpc AppLetterPush (WxTmplMsgRequest) returns(SendMsgResponse);
 
 }

+ 10 - 0
rpc/messageclient/message.go

@@ -45,10 +45,14 @@ type (
 	UserMsgList            = message.UserMsgList
 	UserMsgListReq         = message.UserMsgListReq
 	UserMsgListRes         = message.UserMsgListRes
+	WorkingDesktopReq      = message.WorkingDesktopReq
+	WorkingDesktopResp     = message.WorkingDesktopResp
 	WxTmplMsgRequest       = message.WxTmplMsgRequest
 	WxTmplResponse         = message.WxTmplResponse
 
 	Message interface {
+		// 工作桌面列表
+		WorkingDesktopList(ctx context.Context, in *WorkingDesktopReq, opts ...grpc.CallOption) (*WorkingDesktopResp, error)
 		// 发送消息更新一次消息汇总表
 		UpdateMsgSummary(ctx context.Context, in *UpdateMsgSummaryReq, opts ...grpc.CallOption) (*Response, error)
 		// 新用户发送消息
@@ -88,6 +92,12 @@ func NewMessage(cli zrpc.Client) Message {
 	}
 }
 
+// 工作桌面列表
+func (m *defaultMessage) WorkingDesktopList(ctx context.Context, in *WorkingDesktopReq, opts ...grpc.CallOption) (*WorkingDesktopResp, error) {
+	client := message.NewMessageClient(m.cli.Conn())
+	return client.WorkingDesktopList(ctx, in, opts...)
+}
+
 // 发送消息更新一次消息汇总表
 func (m *defaultMessage) UpdateMsgSummary(ctx context.Context, in *UpdateMsgSummaryReq, opts ...grpc.CallOption) (*Response, error) {
 	client := message.NewMessageClient(m.cli.Conn())

+ 461 - 39
rpc/type/message/message.pb.go

@@ -1790,6 +1790,7 @@ type UserMsgListReq struct {
 	PositionId      int64  `protobuf:"varint,13,opt,name=PositionId,proto3" json:"PositionId,omitempty"`           //私信相关
 	IsContainLetter bool   `protobuf:"varint,14,opt,name=isContainLetter,proto3" json:"isContainLetter,omitempty"` //是否包含私信未读数
 	IsClassSearch   bool   `protobuf:"varint,15,opt,name=isClassSearch,proto3" json:"isClassSearch,omitempty"`     // 是否是消息细化分类查询
+	IsfilterActive  bool   `protobuf:"varint,16,opt,name=isfilterActive,proto3" json:"isfilterActive,omitempty"`   //是否过滤
 }
 
 func (x *UserMsgListReq) Reset() {
@@ -1922,6 +1923,13 @@ func (x *UserMsgListReq) GetIsClassSearch() bool {
 	return false
 }
 
+func (x *UserMsgListReq) GetIsfilterActive() bool {
+	if x != nil {
+		return x.IsfilterActive
+	}
+	return false
+}
+
 type UserMsgListRes struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -2890,6 +2898,164 @@ func (x *BitmapSaveMsgReq) GetSendUserId() string {
 	return ""
 }
 
+type WorkingDesktopReq struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	UserId             string `protobuf:"bytes,1,opt,name=userId,proto3" json:"userId,omitempty"`      //用户id
+	Appid              string `protobuf:"bytes,3,opt,name=appid,proto3" json:"appid,omitempty"`        //应用标识
+	OffSet             int64  `protobuf:"varint,4,opt,name=offSet,proto3" json:"offSet,omitempty"`     //当前
+	PageSize           int64  `protobuf:"varint,5,opt,name=pageSize,proto3" json:"pageSize,omitempty"` //大小
+	MsgType            int64  `protobuf:"varint,6,opt,name=msgType,proto3" json:"msgType,omitempty"`
+	NeedDealtWithCount bool   `protobuf:"varint,7,opt,name=needDealtWithCount,proto3" json:"needDealtWithCount,omitempty"`
+}
+
+func (x *WorkingDesktopReq) Reset() {
+	*x = WorkingDesktopReq{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_message_proto_msgTypes[34]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *WorkingDesktopReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*WorkingDesktopReq) ProtoMessage() {}
+
+func (x *WorkingDesktopReq) ProtoReflect() protoreflect.Message {
+	mi := &file_message_proto_msgTypes[34]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use WorkingDesktopReq.ProtoReflect.Descriptor instead.
+func (*WorkingDesktopReq) Descriptor() ([]byte, []int) {
+	return file_message_proto_rawDescGZIP(), []int{34}
+}
+
+func (x *WorkingDesktopReq) GetUserId() string {
+	if x != nil {
+		return x.UserId
+	}
+	return ""
+}
+
+func (x *WorkingDesktopReq) GetAppid() string {
+	if x != nil {
+		return x.Appid
+	}
+	return ""
+}
+
+func (x *WorkingDesktopReq) GetOffSet() int64 {
+	if x != nil {
+		return x.OffSet
+	}
+	return 0
+}
+
+func (x *WorkingDesktopReq) GetPageSize() int64 {
+	if x != nil {
+		return x.PageSize
+	}
+	return 0
+}
+
+func (x *WorkingDesktopReq) GetMsgType() int64 {
+	if x != nil {
+		return x.MsgType
+	}
+	return 0
+}
+
+func (x *WorkingDesktopReq) GetNeedDealtWithCount() bool {
+	if x != nil {
+		return x.NeedDealtWithCount
+	}
+	return false
+}
+
+type WorkingDesktopResp struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Code       int64       `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"`      //状态码
+	Message    string      `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` //响应消息
+	BusMsgList []*Messages `protobuf:"bytes,3,rep,name=busMsgList,proto3" json:"busMsgList,omitempty"`
+	NeedDo     []*Messages `protobuf:"bytes,4,rep,name=needDo,proto3" json:"needDo,omitempty"`
+}
+
+func (x *WorkingDesktopResp) Reset() {
+	*x = WorkingDesktopResp{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_message_proto_msgTypes[35]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *WorkingDesktopResp) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*WorkingDesktopResp) ProtoMessage() {}
+
+func (x *WorkingDesktopResp) ProtoReflect() protoreflect.Message {
+	mi := &file_message_proto_msgTypes[35]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use WorkingDesktopResp.ProtoReflect.Descriptor instead.
+func (*WorkingDesktopResp) Descriptor() ([]byte, []int) {
+	return file_message_proto_rawDescGZIP(), []int{35}
+}
+
+func (x *WorkingDesktopResp) GetCode() int64 {
+	if x != nil {
+		return x.Code
+	}
+	return 0
+}
+
+func (x *WorkingDesktopResp) GetMessage() string {
+	if x != nil {
+		return x.Message
+	}
+	return ""
+}
+
+func (x *WorkingDesktopResp) GetBusMsgList() []*Messages {
+	if x != nil {
+		return x.BusMsgList
+	}
+	return nil
+}
+
+func (x *WorkingDesktopResp) GetNeedDo() []*Messages {
+	if x != nil {
+		return x.NeedDo
+	}
+	return nil
+}
+
 var File_message_proto protoreflect.FileDescriptor
 
 var file_message_proto_rawDesc = []byte{
@@ -3107,7 +3273,7 @@ var file_message_proto_rawDesc = []byte{
 	0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28,
 	0x09, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x4e, 0x65, 0x77, 0x55,
 	0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x4e, 0x65, 0x77,
-	0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0xac, 0x03, 0x0a, 0x0e, 0x55, 0x73, 0x65, 0x72, 0x4d,
+	0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0xd4, 0x03, 0x0a, 0x0e, 0x55, 0x73, 0x65, 0x72, 0x4d,
 	0x73, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65,
 	0x72, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49,
 	0x64, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x70, 0x70, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,
@@ -3134,6 +3300,7 @@ var file_message_proto_rawDesc = []byte{
 	0x69, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x4c, 0x65, 0x74, 0x74, 0x65, 0x72, 0x12,
 	0x24, 0x0a, 0x0d, 0x69, 0x73, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68,
 	0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, 0x73, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53,
+<<<<<<< HEAD
 	0x65, 0x61, 0x72, 0x63, 0x68, 0x22, 0x88, 0x02, 0x0a, 0x0e, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x73,
 	0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65,
 	0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07,
@@ -3331,6 +3498,231 @@ var file_message_proto_rawDesc = []byte{
 	0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x73,
 	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x0a, 0x5a, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
 	0x2f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+=======
+	0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x26, 0x0a, 0x0e, 0x69, 0x73, 0x66, 0x69, 0x6c, 0x74, 0x65,
+	0x72, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69,
+	0x73, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0xe8, 0x01,
+	0x0a, 0x0e, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x73, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73,
+	0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04,
+	0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x25,
+	0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6d,
+	0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52,
+	0x04, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x04, 0x6c, 0x61, 0x73, 0x74, 0x18, 0x04, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x4d, 0x65,
+	0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x04, 0x6c, 0x61, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x06,
+	0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6d,
+	0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x41, 0x6c, 0x6c, 0x53, 0x6f, 0x72, 0x74, 0x44, 0x61,
+	0x74, 0x61, 0x52, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f,
+	0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74,
+	0x12, 0x16, 0x0a, 0x06, 0x75, 0x6e, 0x72, 0x65, 0x61, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03,
+	0x52, 0x06, 0x75, 0x6e, 0x72, 0x65, 0x61, 0x64, 0x22, 0x94, 0x01, 0x0a, 0x0b, 0x55, 0x73, 0x65,
+	0x72, 0x4d, 0x73, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61,
+	0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
+	0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12,
+	0x30, 0x0a, 0x08, 0x73, 0x6f, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28,
+	0x0b, 0x32, 0x14, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x41, 0x6c, 0x6c, 0x53,
+	0x6f, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x52, 0x08, 0x73, 0x6f, 0x72, 0x74, 0x44, 0x61, 0x74,
+	0x61, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03,
+	0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x6e, 0x72, 0x65, 0x61,
+	0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x75, 0x6e, 0x72, 0x65, 0x61, 0x64, 0x22,
+	0xc2, 0x01, 0x0a, 0x0b, 0x41, 0x6c, 0x6c, 0x53, 0x6f, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12,
+	0x26, 0x0a, 0x0e, 0x75, 0x6e, 0x72, 0x65, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
+	0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x75, 0x6e, 0x72, 0x65, 0x61, 0x64, 0x4d,
+	0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x69,
+	0x6d, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x69, 0x6d, 0x67, 0x12, 0x18, 0x0a,
+	0x07, 0x6d, 0x73, 0x67, 0x54, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07,
+	0x6d, 0x73, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x25, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18,
+	0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e,
+	0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x24,
+	0x0a, 0x0d, 0x69, 0x73, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x18,
+	0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, 0x73, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53, 0x65,
+	0x61, 0x72, 0x63, 0x68, 0x22, 0x48, 0x0a, 0x0e, 0x57, 0x78, 0x54, 0x6d, 0x70, 0x6c, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x6e, 0x64, 0x54, 0x6f,
+	0x74, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x65, 0x6e, 0x64, 0x54,
+	0x6f, 0x74, 0x61, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xd0,
+	0x01, 0x0a, 0x10, 0x57, 0x78, 0x54, 0x6d, 0x70, 0x6c, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x73, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x20, 0x0a,
+	0x0b, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x0b, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x12,
+	0x18, 0x0a, 0x07, 0x6d, 0x73, 0x67, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03,
+	0x52, 0x07, 0x6d, 0x73, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74,
+	0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12,
+	0x16, 0x0a, 0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x65, 0x18,
+	0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x72,
+	0x6f, 0x77, 0x34, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x77, 0x34, 0x12,
+	0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72,
+	0x6c, 0x22, 0x41, 0x0a, 0x0f, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65,
+	0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73,
+	0x73, 0x61, 0x67, 0x65, 0x22, 0x75, 0x0a, 0x0d, 0x4d, 0x73, 0x67, 0x4f, 0x70, 0x65, 0x6e, 0x4c,
+	0x6f, 0x67, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x73, 0x67, 0x4c, 0x6f, 0x67, 0x49,
+	0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x73, 0x67, 0x4c, 0x6f, 0x67, 0x49,
+	0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x03, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x16, 0x0a,
+	0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75,
+	0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x18, 0x04,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x22, 0xcb, 0x03, 0x0a, 0x13,
+	0x4e, 0x65, 0x77, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x73, 0x67,
+	0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x73, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x14, 0x0a,
+	0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69,
+	0x74, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x06,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a,
+	0x07, 0x6d, 0x73, 0x67, 0x54, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07,
+	0x6d, 0x73, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x18,
+	0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x12, 0x14, 0x0a, 0x05, 0x61,
+	0x70, 0x70, 0x69, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x70, 0x70, 0x69,
+	0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x73, 0x67, 0x4c, 0x6f, 0x67, 0x49, 0x64, 0x18, 0x0b, 0x20,
+	0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x73, 0x67, 0x4c, 0x6f, 0x67, 0x49, 0x64, 0x12, 0x20, 0x0a,
+	0x0b, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x18, 0x0e, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x0b, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x12,
+	0x12, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x34, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72,
+	0x6f, 0x77, 0x34, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61,
+	0x6d, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63,
+	0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x64,
+	0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x64, 0x12,
+	0x1e, 0x0a, 0x0a, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x18, 0x12, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x0a, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x12,
+	0x1a, 0x0a, 0x08, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x13, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x08, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x61,
+	0x70, 0x70, 0x50, 0x75, 0x73, 0x68, 0x55, 0x72, 0x6c, 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x0a, 0x61, 0x70, 0x70, 0x50, 0x75, 0x73, 0x68, 0x55, 0x72, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x77,
+	0x78, 0x50, 0x75, 0x73, 0x68, 0x55, 0x72, 0x6c, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09,
+	0x77, 0x78, 0x50, 0x75, 0x73, 0x68, 0x55, 0x72, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x6f, 0x73,
+	0x50, 0x75, 0x73, 0x68, 0x55, 0x72, 0x6c, 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69,
+	0x6f, 0x73, 0x50, 0x75, 0x73, 0x68, 0x55, 0x72, 0x6c, 0x22, 0x65, 0x0a, 0x13, 0x55, 0x70, 0x64,
+	0x61, 0x74, 0x65, 0x4d, 0x73, 0x67, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x71,
+	0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x73, 0x67, 0x4c, 0x6f, 0x67, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x03, 0x52, 0x08, 0x6d, 0x73, 0x67, 0x4c, 0x6f, 0x67, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07,
+	0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x67,
+	0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x73, 0x67, 0x54, 0x79, 0x70,
+	0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6d, 0x73, 0x67, 0x54, 0x79, 0x70, 0x65,
+	0x22, 0x8a, 0x04, 0x0a, 0x10, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x53, 0x61, 0x76, 0x65, 0x4d,
+	0x73, 0x67, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x73,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12,
+	0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,
+	0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
+	0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12,
+	0x18, 0x0a, 0x07, 0x6d, 0x73, 0x67, 0x54, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03,
+	0x52, 0x07, 0x6d, 0x73, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e,
+	0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x12, 0x14, 0x0a,
+	0x05, 0x61, 0x70, 0x70, 0x69, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x70,
+	0x70, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x73, 0x67, 0x4c, 0x6f, 0x67, 0x49, 0x64, 0x18,
+	0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x73, 0x67, 0x4c, 0x6f, 0x67, 0x49, 0x64, 0x12,
+	0x20, 0x0a, 0x0b, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x18, 0x0e,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64,
+	0x73, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x34, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x04, 0x72, 0x6f, 0x77, 0x34, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,
+	0x4e, 0x61, 0x6d, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x64,
+	0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72,
+	0x49, 0x64, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x49,
+	0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x18,
+	0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x4d, 0x6f, 0x6e, 0x65,
+	0x79, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x13, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x1e, 0x0a,
+	0x0a, 0x61, 0x70, 0x70, 0x50, 0x75, 0x73, 0x68, 0x55, 0x72, 0x6c, 0x18, 0x14, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x0a, 0x61, 0x70, 0x70, 0x50, 0x75, 0x73, 0x68, 0x55, 0x72, 0x6c, 0x12, 0x1c, 0x0a,
+	0x09, 0x77, 0x78, 0x50, 0x75, 0x73, 0x68, 0x55, 0x72, 0x6c, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x09, 0x77, 0x78, 0x50, 0x75, 0x73, 0x68, 0x55, 0x72, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x69,
+	0x6f, 0x73, 0x50, 0x75, 0x73, 0x68, 0x55, 0x72, 0x6c, 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x0a, 0x69, 0x6f, 0x73, 0x50, 0x75, 0x73, 0x68, 0x55, 0x72, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x62,
+	0x61, 0x73, 0x65, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x73, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x0b, 0x62, 0x61, 0x73, 0x65, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x1e, 0x0a,
+	0x0a, 0x73, 0x65, 0x6e, 0x64, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x18, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x0a, 0x73, 0x65, 0x6e, 0x64, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0xbf, 0x01,
+	0x0a, 0x11, 0x57, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70,
+	0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x61,
+	0x70, 0x70, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x70, 0x70, 0x69,
+	0x64, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x53, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28,
+	0x03, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x53, 0x65, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x67,
+	0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x70, 0x61, 0x67,
+	0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x73, 0x67, 0x54, 0x79, 0x70, 0x65,
+	0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6d, 0x73, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12,
+	0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x65, 0x64, 0x44, 0x65, 0x61, 0x6c, 0x74, 0x57, 0x69, 0x74, 0x68,
+	0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x6e, 0x65, 0x65,
+	0x64, 0x44, 0x65, 0x61, 0x6c, 0x74, 0x57, 0x69, 0x74, 0x68, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22,
+	0xa0, 0x01, 0x0a, 0x12, 0x57, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x73, 0x6b, 0x74,
+	0x6f, 0x70, 0x52, 0x65, 0x73, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65,
+	0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73,
+	0x73, 0x61, 0x67, 0x65, 0x12, 0x31, 0x0a, 0x0a, 0x62, 0x75, 0x73, 0x4d, 0x73, 0x67, 0x4c, 0x69,
+	0x73, 0x74, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61,
+	0x67, 0x65, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x0a, 0x62, 0x75, 0x73,
+	0x4d, 0x73, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x06, 0x6e, 0x65, 0x65, 0x64, 0x44,
+	0x6f, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67,
+	0x65, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x06, 0x6e, 0x65, 0x65, 0x64,
+	0x44, 0x6f, 0x32, 0xdc, 0x07, 0x0a, 0x07, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x4d,
+	0x0a, 0x12, 0x57, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70,
+	0x4c, 0x69, 0x73, 0x74, 0x12, 0x1a, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x57,
+	0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71,
+	0x1a, 0x1b, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x69,
+	0x6e, 0x67, 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x73, 0x70, 0x12, 0x43, 0x0a,
+	0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x73, 0x67, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72,
+	0x79, 0x12, 0x1c, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x70, 0x64, 0x61,
+	0x74, 0x65, 0x4d, 0x73, 0x67, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x71, 0x1a,
+	0x11, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x12, 0x3d, 0x0a, 0x0a, 0x4e, 0x65, 0x77, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x73, 0x67,
+	0x12, 0x1c, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x4e, 0x65, 0x77, 0x55, 0x73,
+	0x65, 0x72, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x71, 0x1a, 0x11,
+	0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x12, 0x4a, 0x0a, 0x0d, 0x62, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x53, 0x61, 0x76, 0x65, 0x4d,
+	0x73, 0x67, 0x12, 0x1b, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x6d, 0x75, 0x6c,
+	0x74, 0x69, 0x70, 0x6c, 0x65, 0x53, 0x61, 0x76, 0x65, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x71, 0x1a,
+	0x1c, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70,
+	0x6c, 0x65, 0x53, 0x61, 0x76, 0x65, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4c, 0x0a,
+	0x0f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x53, 0x61, 0x76, 0x65, 0x4d, 0x73, 0x67,
+	0x12, 0x1b, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69,
+	0x70, 0x6c, 0x65, 0x53, 0x61, 0x76, 0x65, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e,
+	0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65,
+	0x53, 0x61, 0x76, 0x65, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x73, 0x70, 0x12, 0x43, 0x0a, 0x10, 0x43,
+	0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12,
+	0x1c, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65,
+	0x52, 0x65, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e,
+	0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x12, 0x3f, 0x0a, 0x0b, 0x46, 0x69, 0x6e, 0x64, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x73, 0x67, 0x12,
+	0x17, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x55, 0x73,
+	0x65, 0x72, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61,
+	0x67, 0x65, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x73, 0x67, 0x52, 0x65,
+	0x73, 0x12, 0x4a, 0x0a, 0x11, 0x46, 0x69, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
+	0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x19, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
+	0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65,
+	0x71, 0x1a, 0x1a, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x4d, 0x65, 0x73, 0x73,
+	0x61, 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4b, 0x0a,
+	0x0f, 0x46, 0x69, 0x6e, 0x64, 0x55, 0x73, 0x65, 0x72, 0x42, 0x75, 0x6f, 0x79, 0x4d, 0x73, 0x67,
+	0x12, 0x1b, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x55,
+	0x73, 0x65, 0x72, 0x42, 0x75, 0x6f, 0x79, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e,
+	0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x55, 0x73, 0x65, 0x72,
+	0x42, 0x75, 0x6f, 0x79, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x73, 0x12, 0x3f, 0x0a, 0x0e, 0x43, 0x6c,
+	0x65, 0x61, 0x72, 0x55, 0x6e, 0x72, 0x65, 0x61, 0x64, 0x4d, 0x73, 0x67, 0x12, 0x1a, 0x2e, 0x6d,
+	0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x72, 0x55, 0x6e, 0x72, 0x65,
+	0x61, 0x64, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61,
+	0x67, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x55,
+	0x73, 0x65, 0x72, 0x4d, 0x73, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x17, 0x2e, 0x6d, 0x65, 0x73,
+	0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x73, 0x67, 0x4c, 0x69, 0x73, 0x74,
+	0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x73,
+	0x65, 0x72, 0x4d, 0x73, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x12, 0x44, 0x0a, 0x0d,
+	0x53, 0x65, 0x6e, 0x64, 0x57, 0x78, 0x54, 0x6d, 0x70, 0x6c, 0x4d, 0x73, 0x67, 0x12, 0x19, 0x2e,
+	0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x57, 0x78, 0x54, 0x6d, 0x70, 0x6c, 0x4d, 0x73,
+	0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61,
+	0x67, 0x65, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x12, 0x37, 0x0a, 0x0a, 0x4d, 0x73, 0x67, 0x4f, 0x70, 0x65, 0x6e, 0x4c, 0x6f, 0x67,
+	0x12, 0x16, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x4d, 0x73, 0x67, 0x4f, 0x70,
+	0x65, 0x6e, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61,
+	0x67, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x44, 0x0a, 0x0d, 0x41,
+	0x70, 0x70, 0x4c, 0x65, 0x74, 0x74, 0x65, 0x72, 0x50, 0x75, 0x73, 0x68, 0x12, 0x19, 0x2e, 0x6d,
+	0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x57, 0x78, 0x54, 0x6d, 0x70, 0x6c, 0x4d, 0x73, 0x67,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67,
+	0x65, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x42, 0x0a, 0x5a, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2f, 0x62, 0x06, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x33,
+>>>>>>> master
 }
 
 var (
@@ -3345,7 +3737,7 @@ func file_message_proto_rawDescGZIP() []byte {
 	return file_message_proto_rawDescData
 }
 
-var file_message_proto_msgTypes = make([]protoimpl.MessageInfo, 36)
+var file_message_proto_msgTypes = make([]protoimpl.MessageInfo, 38)
 var file_message_proto_goTypes = []interface{}{
 	(*ChangeReadStatusReq)(nil),    // 0: message.ChangeReadStatusReq
 	(*ResCount)(nil),               // 1: message.ResCount
@@ -3381,17 +3773,19 @@ var file_message_proto_goTypes = []interface{}{
 	(*NewUserInsertMsgReq)(nil),    // 31: message.NewUserInsertMsgReq
 	(*UpdateMsgSummaryReq)(nil),    // 32: message.UpdateMsgSummaryReq
 	(*BitmapSaveMsgReq)(nil),       // 33: message.BitmapSaveMsgReq
-	nil,                            // 34: message.Messages.UrlEntry
-	nil,                            // 35: message.CustomWxTpl.TmplDataEntry
+	(*WorkingDesktopReq)(nil),      // 34: message.WorkingDesktopReq
+	(*WorkingDesktopResp)(nil),     // 35: message.WorkingDesktopResp
+	nil,                            // 36: message.Messages.UrlEntry
+	nil,                            // 37: message.CustomWxTpl.TmplDataEntry
 }
 var file_message_proto_depIdxs = []int32{
-	34, // 0: message.Messages.url:type_name -> message.Messages.UrlEntry
+	36, // 0: message.Messages.url:type_name -> message.Messages.UrlEntry
 	4,  // 1: message.FindUserMsgRes.data:type_name -> message.Messages
 	4,  // 2: message.MessageDetailResp.data:type_name -> message.Messages
 	4,  // 3: message.GetLastMessageRes.data:type_name -> message.Messages
 	1,  // 4: message.GetUnreadClassCountRes.data:type_name -> message.ResCount
 	4,  // 5: message.GetUnreadClassCountRes.info:type_name -> message.Messages
-	35, // 6: message.CustomWxTpl.tmplData:type_name -> message.CustomWxTpl.TmplDataEntry
+	37, // 6: message.CustomWxTpl.tmplData:type_name -> message.CustomWxTpl.TmplDataEntry
 	21, // 7: message.FindUserBuoyMsgRes.data:type_name -> message.BuoyMessages
 	4,  // 8: message.UserMsgListRes.list:type_name -> message.Messages
 	4,  // 9: message.UserMsgListRes.last:type_name -> message.Messages
@@ -3399,38 +3793,42 @@ var file_message_proto_depIdxs = []int32{
 	4,  // 11: message.UserMsgList.data:type_name -> message.Messages
 	26, // 12: message.UserMsgList.sortData:type_name -> message.AllSortData
 	4,  // 13: message.AllSortData.data:type_name -> message.Messages
-	17, // 14: message.CustomWxTpl.TmplDataEntry.value:type_name -> message.TmplItem
-	32, // 15: message.Message.UpdateMsgSummary:input_type -> message.UpdateMsgSummaryReq
-	31, // 16: message.Message.NewUserMsg:input_type -> message.NewUserInsertMsgReq
-	15, // 17: message.Message.bitmapSaveMsg:input_type -> message.multipleSaveMsgReq
-	15, // 18: message.Message.multipleSaveMsg:input_type -> message.multipleSaveMsgReq
-	0,  // 19: message.Message.ChangeReadStatus:input_type -> message.ChangeReadStatusReq
-	3,  // 20: message.Message.FindUserMsg:input_type -> message.FindUserMsgReq
-	7,  // 21: message.Message.FindMessageDetail:input_type -> message.MessageDetailReq
-	19, // 22: message.Message.FindUserBuoyMsg:input_type -> message.FindUserBuoyMsgReq
-	22, // 23: message.Message.ClearUnreadMsg:input_type -> message.ClearUnreadMsgReq
-	23, // 24: message.Message.UserMsgList:input_type -> message.UserMsgListReq
-	28, // 25: message.Message.SendWxTmplMsg:input_type -> message.WxTmplMsgRequest
-	30, // 26: message.Message.MsgOpenLog:input_type -> message.MsgOpenLogReq
-	28, // 27: message.Message.AppLetterPush:input_type -> message.WxTmplMsgRequest
-	2,  // 28: message.Message.UpdateMsgSummary:output_type -> message.Response
-	2,  // 29: message.Message.NewUserMsg:output_type -> message.Response
-	18, // 30: message.Message.bitmapSaveMsg:output_type -> message.multipleSaveMsgResp
-	18, // 31: message.Message.multipleSaveMsg:output_type -> message.multipleSaveMsgResp
-	2,  // 32: message.Message.ChangeReadStatus:output_type -> message.Response
-	5,  // 33: message.Message.FindUserMsg:output_type -> message.FindUserMsgRes
-	8,  // 34: message.Message.FindMessageDetail:output_type -> message.MessageDetailResp
-	20, // 35: message.Message.FindUserBuoyMsg:output_type -> message.FindUserBuoyMsgRes
-	2,  // 36: message.Message.ClearUnreadMsg:output_type -> message.Response
-	24, // 37: message.Message.UserMsgList:output_type -> message.UserMsgListRes
-	29, // 38: message.Message.SendWxTmplMsg:output_type -> message.SendMsgResponse
-	2,  // 39: message.Message.MsgOpenLog:output_type -> message.Response
-	29, // 40: message.Message.AppLetterPush:output_type -> message.SendMsgResponse
-	28, // [28:41] is the sub-list for method output_type
-	15, // [15:28] is the sub-list for method input_type
-	15, // [15:15] is the sub-list for extension type_name
-	15, // [15:15] is the sub-list for extension extendee
-	0,  // [0:15] is the sub-list for field type_name
+	4,  // 14: message.WorkingDesktopResp.busMsgList:type_name -> message.Messages
+	4,  // 15: message.WorkingDesktopResp.needDo:type_name -> message.Messages
+	17, // 16: message.CustomWxTpl.TmplDataEntry.value:type_name -> message.TmplItem
+	34, // 17: message.Message.WorkingDesktopList:input_type -> message.WorkingDesktopReq
+	32, // 18: message.Message.UpdateMsgSummary:input_type -> message.UpdateMsgSummaryReq
+	31, // 19: message.Message.NewUserMsg:input_type -> message.NewUserInsertMsgReq
+	15, // 20: message.Message.bitmapSaveMsg:input_type -> message.multipleSaveMsgReq
+	15, // 21: message.Message.multipleSaveMsg:input_type -> message.multipleSaveMsgReq
+	0,  // 22: message.Message.ChangeReadStatus:input_type -> message.ChangeReadStatusReq
+	3,  // 23: message.Message.FindUserMsg:input_type -> message.FindUserMsgReq
+	7,  // 24: message.Message.FindMessageDetail:input_type -> message.MessageDetailReq
+	19, // 25: message.Message.FindUserBuoyMsg:input_type -> message.FindUserBuoyMsgReq
+	22, // 26: message.Message.ClearUnreadMsg:input_type -> message.ClearUnreadMsgReq
+	23, // 27: message.Message.UserMsgList:input_type -> message.UserMsgListReq
+	28, // 28: message.Message.SendWxTmplMsg:input_type -> message.WxTmplMsgRequest
+	30, // 29: message.Message.MsgOpenLog:input_type -> message.MsgOpenLogReq
+	28, // 30: message.Message.AppLetterPush:input_type -> message.WxTmplMsgRequest
+	35, // 31: message.Message.WorkingDesktopList:output_type -> message.WorkingDesktopResp
+	2,  // 32: message.Message.UpdateMsgSummary:output_type -> message.Response
+	2,  // 33: message.Message.NewUserMsg:output_type -> message.Response
+	18, // 34: message.Message.bitmapSaveMsg:output_type -> message.multipleSaveMsgResp
+	18, // 35: message.Message.multipleSaveMsg:output_type -> message.multipleSaveMsgResp
+	2,  // 36: message.Message.ChangeReadStatus:output_type -> message.Response
+	5,  // 37: message.Message.FindUserMsg:output_type -> message.FindUserMsgRes
+	8,  // 38: message.Message.FindMessageDetail:output_type -> message.MessageDetailResp
+	20, // 39: message.Message.FindUserBuoyMsg:output_type -> message.FindUserBuoyMsgRes
+	2,  // 40: message.Message.ClearUnreadMsg:output_type -> message.Response
+	24, // 41: message.Message.UserMsgList:output_type -> message.UserMsgListRes
+	29, // 42: message.Message.SendWxTmplMsg:output_type -> message.SendMsgResponse
+	2,  // 43: message.Message.MsgOpenLog:output_type -> message.Response
+	29, // 44: message.Message.AppLetterPush:output_type -> message.SendMsgResponse
+	31, // [31:45] is the sub-list for method output_type
+	17, // [17:31] is the sub-list for method input_type
+	17, // [17:17] is the sub-list for extension type_name
+	17, // [17:17] is the sub-list for extension extendee
+	0,  // [0:17] is the sub-list for field type_name
 }
 
 func init() { file_message_proto_init() }
@@ -3847,6 +4245,30 @@ func file_message_proto_init() {
 				return nil
 			}
 		}
+		file_message_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*WorkingDesktopReq); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_message_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*WorkingDesktopResp); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
 	}
 	type x struct{}
 	out := protoimpl.TypeBuilder{
@@ -3854,7 +4276,7 @@ func file_message_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_message_proto_rawDesc,
 			NumEnums:      0,
-			NumMessages:   36,
+			NumMessages:   38,
 			NumExtensions: 0,
 			NumServices:   1,
 		},

+ 38 - 0
rpc/type/message/message_grpc.pb.go

@@ -22,6 +22,8 @@ const _ = grpc.SupportPackageIsVersion7
 //
 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
 type MessageClient interface {
+	//工作桌面列表
+	WorkingDesktopList(ctx context.Context, in *WorkingDesktopReq, opts ...grpc.CallOption) (*WorkingDesktopResp, error)
 	//发送消息更新一次消息汇总表
 	UpdateMsgSummary(ctx context.Context, in *UpdateMsgSummaryReq, opts ...grpc.CallOption) (*Response, error)
 	//新用户发送消息
@@ -62,6 +64,15 @@ func NewMessageClient(cc grpc.ClientConnInterface) MessageClient {
 	return &messageClient{cc}
 }
 
+func (c *messageClient) WorkingDesktopList(ctx context.Context, in *WorkingDesktopReq, opts ...grpc.CallOption) (*WorkingDesktopResp, error) {
+	out := new(WorkingDesktopResp)
+	err := c.cc.Invoke(ctx, "/message.Message/WorkingDesktopList", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
 func (c *messageClient) UpdateMsgSummary(ctx context.Context, in *UpdateMsgSummaryReq, opts ...grpc.CallOption) (*Response, error) {
 	out := new(Response)
 	err := c.cc.Invoke(ctx, "/message.Message/UpdateMsgSummary", in, out, opts...)
@@ -183,6 +194,8 @@ func (c *messageClient) AppLetterPush(ctx context.Context, in *WxTmplMsgRequest,
 // All implementations must embed UnimplementedMessageServer
 // for forward compatibility
 type MessageServer interface {
+	//工作桌面列表
+	WorkingDesktopList(context.Context, *WorkingDesktopReq) (*WorkingDesktopResp, error)
 	//发送消息更新一次消息汇总表
 	UpdateMsgSummary(context.Context, *UpdateMsgSummaryReq) (*Response, error)
 	//新用户发送消息
@@ -220,6 +233,9 @@ type MessageServer interface {
 type UnimplementedMessageServer struct {
 }
 
+func (UnimplementedMessageServer) WorkingDesktopList(context.Context, *WorkingDesktopReq) (*WorkingDesktopResp, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method WorkingDesktopList not implemented")
+}
 func (UnimplementedMessageServer) UpdateMsgSummary(context.Context, *UpdateMsgSummaryReq) (*Response, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method UpdateMsgSummary not implemented")
 }
@@ -272,6 +288,24 @@ func RegisterMessageServer(s grpc.ServiceRegistrar, srv MessageServer) {
 	s.RegisterService(&Message_ServiceDesc, srv)
 }
 
+func _Message_WorkingDesktopList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(WorkingDesktopReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(MessageServer).WorkingDesktopList(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/message.Message/WorkingDesktopList",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(MessageServer).WorkingDesktopList(ctx, req.(*WorkingDesktopReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
 func _Message_UpdateMsgSummary_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 	in := new(UpdateMsgSummaryReq)
 	if err := dec(in); err != nil {
@@ -513,6 +547,10 @@ var Message_ServiceDesc = grpc.ServiceDesc{
 	ServiceName: "message.Message",
 	HandlerType: (*MessageServer)(nil),
 	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "WorkingDesktopList",
+			Handler:    _Message_WorkingDesktopList_Handler,
+		},
 		{
 			MethodName: "UpdateMsgSummary",
 			Handler:    _Message_UpdateMsgSummary_Handler,