ソースを参照

wip:表结构调整提交

wangkaiyue 1 年間 前
コミット
b311be59d7

+ 8 - 7
api/internal/logic/sendwxtmplmsglogic.go

@@ -26,13 +26,14 @@ func NewSendWxTmplMsgLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Sen
 
 func (l *SendWxTmplMsgLogic) SendWxTmplMsg(req *types.WxTmplMessageReq) (resp *types.WxTmplMessageResponse, err error) {
 	res, err := l.svcCtx.MessageCenter.SendWxTmplMsg(l.ctx, &messageclient.WxTmplMsgRequest{
-		UserIds:      req.UserIds,
-		PositionIds:  req.PositionIds,
-		MessageClass: req.Class,
-		Title:        req.Title,
-		Detail:       req.Detail,
-		Date:         req.Date,
-		Url:          req.Url,
+		UserIds:     req.UserIds,
+		PositionIds: req.PositionIds,
+		MsgType:     req.MsgType,
+		Title:       req.Title,
+		Detail:      req.Detail,
+		Date:        req.Date,
+		Url:         req.Url,
+		Row4:        req.Row4,
 	})
 	if err != nil {
 		return &types.WxTmplMessageResponse{

+ 2 - 1
api/internal/types/types.go

@@ -134,7 +134,8 @@ type WxTmplMessageReq struct {
 	Title       string `json:"title"`
 	Date        string `json:"date"`
 	Detail      string `json:"detail"`
-	Class       string `json:"class"`
+	Row4        string `json:"row4"`
+	MsgType     int64  `json:"class"` //msg_type
 	Url         string `json:"url"`
 }
 

+ 2 - 1
api/message.api

@@ -136,7 +136,8 @@ type WxTmplMessageReq {
 	Title       string `json:"title"`
 	Date        string `json:"date"`
 	Detail      string `json:"detail"`
-	Class       string `json:"class"`
+	Row4        string `json:"row4"`
+	MsgType     int64  `json:"class"` //msg_type
 	Url         string `json:"url"`
 }
 

+ 1 - 1
go.mod

@@ -7,8 +7,8 @@ require (
 	bp.jydev.jianyu360.cn/BaseService/gateway v1.3.4
 	github.com/go-xorm/xorm v0.7.9
 	github.com/zeromicro/go-zero v1.3.5
-	go.etcd.io/etcd/client/v3 v3.5.4
 	google.golang.org/grpc v1.47.0
 	google.golang.org/protobuf v1.28.0
+	k8s.io/apimachinery v0.22.9
 
 )

+ 2 - 0
go.sum

@@ -1032,6 +1032,7 @@ google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ
 google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=
 google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
 gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
+gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk=
 gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
@@ -1042,6 +1043,7 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EV
 gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
 gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
 gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
+gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df h1:n7WqCuqOuCbNr617RXOY0AWRXxgwEyPp2z+p0+hgMuE=
 gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df/go.mod h1:LRQQ+SO6ZHR7tOkpBDuZnXENFzX8qRjMDMyPD6BRkCw=
 gopkg.in/h2non/gock.v1 v1.1.2 h1:jBbHXgGBK/AoPVfJh5x4r/WxIrElvbLel8TCZkkZJoY=
 gopkg.in/h2non/gock.v1 v1.1.2/go.mod h1:n7UGz/ckNChHiK05rDoiC4MYSunEC/lyaUm2WWaDva0=

+ 26 - 26
rpc/internal/common/sendWxTmplMsg.go

@@ -22,8 +22,8 @@ type WxTmplPush struct {
 	Config                  *WxTmplConfig
 }
 
-var AllMsgType func() map[string]WxTmplConfig
-var allMsgValueKeys = []string{"$class", "$title", "$detail", "$date", "$note"}
+var AllMsgType func() map[int64]WxTmplConfig
+var allMsgValueKeys = []string{"$class", "$title", "$detail", "$date", "$row4", "$note"}
 
 type WxTmplConfig struct {
 	Name      string //信息名称
@@ -34,24 +34,27 @@ type WxTmplConfig struct {
 
 const CacheDb = "msgCount"
 
-func MessageType() (func() map[string]WxTmplConfig, []map[string]interface{}) {
+func MessageType() (func() map[int64]WxTmplConfig, []map[string]interface{}) {
 	var data []map[string]interface{}
-	rData := entity.Mysql.SelectBySql(`SELECT * FROM message_group ORDER BY sequence ASC`)
-	switchName := map[string]WxTmplConfig{}
-	if rData != nil && len(*rData) > 0 {
-		data = *rData
-		for _, mData := range *rData {
-			if settingKey, messageName, tmplId, tmplValue := util.ObjToString(mData["switch"]), util.ObjToString(mData["name"]), util.ObjToString(mData["wxtmplId"]), util.ObjToString(mData["wxtmpValue"]); settingKey != "" && messageName != "" && tmplId != "" && tmplValue != "" {
-				switchName[settingKey] = WxTmplConfig{
-					Name:      messageName,
-					Switch:    settingKey,
-					TmplId:    tmplId,
-					TmplValue: tmplValue,
-				}
+	rData1 := entity.Mysql.SelectBySql(`SELECT * FROM message_group ORDER BY sequence ASC`)
+	switchName := map[int64]WxTmplConfig{}
+	if rData1 != nil && len(*rData1) > 0 {
+		data = *rData1
+	}
+
+	rData2 := entity.Mysql.SelectBySql(`SELECT g.switch,c.wxtmpl_Id,c.msg_type,c.msg_name,c.wxtmp_value FROM message_class c INNER JOIN message_group g on c.group_id =g.group_id WHERE c.wxtmpl_Id IS NOT NULL`)
+	for _, mData := range *rData2 {
+		if msg_type, settingKey, messageName, tmplId, tmplValue := util.Int64All(mData["msg_type"]), util.ObjToString(mData["switch"]), util.ObjToString(mData["msg_name"]), util.ObjToString(mData["wxtmpl_Id"]), util.ObjToString(mData["wxtmp_value"]); msg_type > 0 && settingKey != "" && messageName != "" && tmplId != "" && tmplValue != "" {
+			switchName[msg_type] = WxTmplConfig{
+				Name:      messageName,
+				Switch:    settingKey,
+				TmplId:    tmplId,
+				TmplValue: tmplValue,
 			}
 		}
 	}
-	return func() map[string]WxTmplConfig {
+
+	return func() map[int64]WxTmplConfig {
 		return switchName
 	}, data
 }
@@ -63,14 +66,14 @@ var getSendTotalRedisKey = func(uFlag ...string) string {
 	return fmt.Sprintf("messageCenter_SendWxMsgTotal_%s_%s", time.Now().Format(dataFormat.Date_yyyyMMdd), uFlag[0])
 }
 
-func GetWxTmplConfig(class string) (*WxTmplConfig, error) {
-	if val, ok := AllMsgType()[class]; ok {
+func GetWxTmplConfig(msgType int64) (*WxTmplConfig, error) {
+	if val, ok := AllMsgType()[msgType]; ok {
 		return &val, nil
 	}
 	return nil, fmt.Errorf("未知消息类型")
 }
 
-func (stm *WxTmplPush) SendMsg(link, title, detail, date string) error {
+func (stm *WxTmplPush) SendMsg(link, title, detail, date, row4 string) error {
 	if stm.Config.TmplId == "" || (stm.MgoId != "" && stm.OpenId != "" && stm.Position != "") || link == "" {
 		return fmt.Errorf("缺少参数")
 	}
@@ -83,7 +86,7 @@ func (stm *WxTmplPush) SendMsg(link, title, detail, date string) error {
 		return err
 	}
 	// 获取消息
-	msg, err := stm.getMessage(title, detail, date)
+	msg, err := stm.getMessage(title, detail, date, row4)
 	if err != nil {
 		return err
 	}
@@ -102,7 +105,7 @@ var (
 )
 
 // getMessage 获取消息内容
-func (stm *WxTmplPush) getMessage(title, detail, date string) (map[string]*qrpc.TmplItem, error) {
+func (stm *WxTmplPush) getMessage(title, detail, date, row4 string) (map[string]*qrpc.TmplItem, error) {
 	var formatValue string = stm.Config.TmplValue
 	for _, key := range allMsgValueKeys {
 		switch key {
@@ -110,15 +113,12 @@ func (stm *WxTmplPush) getMessage(title, detail, date string) (map[string]*qrpc.
 			formatValue = strings.ReplaceAll(formatValue, key, regSpecial.ReplaceAllString(stm.Config.Name, ""))
 		case "$title":
 			formatValue = strings.ReplaceAll(formatValue, key, regSpecial.ReplaceAllString(title, ""))
-
 		case "$detail":
 			formatValue = strings.ReplaceAll(formatValue, key, regSpecial.ReplaceAllString(detail, ""))
-			fmt.Println("1", regSpecial.ReplaceAllString(detail, ""))
-			fmt.Println("2", regSpecial.ReplaceAllString("这是推送\\n信\\t息的\\n内容", ""))
-			fmt.Println("3", detail, "这是推送\\n信\\t息的\\n内容", detail == "这是推送\\n信\\t息的\\n内容")
-			fmt.Println(strings.ReplaceAll(formatValue, key, regSpecial.ReplaceAllString(detail, "")))
 		case "$date":
 			formatValue = strings.ReplaceAll(formatValue, key, regSpecial.ReplaceAllString(date, ""))
+		case "$row4":
+			formatValue = strings.ReplaceAll(formatValue, key, regSpecial.ReplaceAllString(row4, ""))
 		case "$note":
 			formatValue = strings.ReplaceAll(formatValue, key, regSpecial.ReplaceAllString(config.ConfigJson.WxTmplConfig.CloseNotice, ""))
 		}

+ 1 - 1
rpc/internal/logic/appletterpushlogic.go

@@ -33,7 +33,7 @@ func (l *AppLetterPushLogic) AppLetterPush(in *message.WxTmplMsgRequest) (*messa
 	var userArr []string
 	log.Println("app私信push推送内容===", in)
 	userArr = strings.Split(in.PositionIds, ",")
-	pushConfig, err := common.GetWxTmplConfig(in.MessageClass)
+	pushConfig, err := common.GetWxTmplConfig(in.MsgType)
 	if err != nil {
 		return &message.SendMsgResponse{
 			Total:   0,

+ 5 - 3
rpc/internal/logic/sendwxtmplmsglogic.go

@@ -4,6 +4,7 @@ import (
 	"app.yhyue.com/moapp/MessageCenter/rpc/internal/common"
 	"app.yhyue.com/moapp/MessageCenter/util"
 	"context"
+	"fmt"
 	"strings"
 
 	"app.yhyue.com/moapp/MessageCenter/rpc/internal/svc"
@@ -43,7 +44,7 @@ func (l *SendWxTmplMsgLogic) SendWxTmplMsg(in *message.WxTmplMsgRequest) (*messa
 		}, nil
 	}
 
-	pushConfig, err := common.GetWxTmplConfig(in.MessageClass)
+	pushConfig, err := common.GetWxTmplConfig(in.MsgType)
 	if err != nil {
 		return &message.SendMsgResponse{
 			Total:   0,
@@ -63,10 +64,11 @@ func (l *SendWxTmplMsgLogic) SendWxTmplMsg(in *message.WxTmplMsgRequest) (*messa
 			p.Position = uId
 		}
 		// 消息模版 工单类型 {{thing19.DATA}} 工单标题 {{thing6.DATA}} 项目名称 {{thing13.DATA}} 服务时间 {{time25.DATA}} 服务地址 {{thing26.DATA}}
-		err = p.SendMsg(in.Url, in.Title, in.Detail, in.Date)
+		err = p.SendMsg(in.Url, in.Title, in.Detail, in.Date, in.Row4)
 		if err != nil {
-			logx.Error(err)
+			logx.Error(fmt.Sprintf("SendWxTmplMsg uId %s  Error %s", uId, err.Error()))
 		} else {
+			logx.Infof("SendWxTmplMsg uId success %s ", uId)
 			messageSendOk++
 		}
 		if index%10 == 0 {

+ 11 - 11
rpc/internal/server/messageserver.go

@@ -1,4 +1,4 @@
-// Code generated by goctl. DO NOT EDIT!
+// Code generated by goctl. DO NOT EDIT.
 // Source: message.proto
 
 package server
@@ -28,13 +28,13 @@ func (s *MessageServer) MultipleSaveMsg(ctx context.Context, in *message.Multipl
 	return l.MultipleSaveMsg(in)
 }
 
-//  修改消息阅读状态
+// 修改消息阅读状态
 func (s *MessageServer) ChangeReadStatus(ctx context.Context, in *message.ChangeReadStatusReq) (*message.Response, error) {
 	l := logic.NewChangeReadStatusLogic(ctx, s.svcCtx)
 	return l.ChangeReadStatus(in)
 }
 
-//   查询指定用户的历史消息记录
+// 查询指定用户的历史消息记录
 func (s *MessageServer) FindUserMsg(ctx context.Context, in *message.FindUserMsgReq) (*message.FindUserMsgRes, error) {
 	l := logic.NewFindUserMsgLogic(ctx, s.svcCtx)
 	return l.FindUserMsg(in)
@@ -46,49 +46,49 @@ func (s *MessageServer) FindMessageDetail(ctx context.Context, in *message.Messa
 	return l.FindMessageDetail(in)
 }
 
-//   消息的分类
+// 消息的分类
 func (s *MessageServer) GetMsgType(ctx context.Context, in *message.GetMsgTypeReq) (*message.GetMsgTypeRes, error) {
 	l := logic.NewGetMsgTypeLogic(ctx, s.svcCtx)
 	return l.GetMsgType(in)
 }
 
-//   查询指定用户的浮标消息
+// 查询指定用户的浮标消息
 func (s *MessageServer) FindUserBuoyMsg(ctx context.Context, in *message.FindUserBuoyMsgReq) (*message.FindUserBuoyMsgRes, error) {
 	l := logic.NewFindUserBuoyMsgLogic(ctx, s.svcCtx)
 	return l.FindUserBuoyMsg(in)
 }
 
-//    一键清空未读消息
+// 一键清空未读消息
 func (s *MessageServer) ClearUnreadMsg(ctx context.Context, in *message.ClearUnreadMsgReq) (*message.Response, error) {
 	l := logic.NewClearUnreadMsgLogic(ctx, s.svcCtx)
 	return l.ClearUnreadMsg(in)
 }
 
-//    new用户消息列表
+// new用户消息列表
 func (s *MessageServer) UserMsgList(ctx context.Context, in *message.UserMsgListReq) (*message.UserMsgListRes, error) {
 	l := logic.NewUserMsgListLogic(ctx, s.svcCtx)
 	return l.UserMsgList(in)
 }
 
-//   发送剑鱼微信模版消息
+// 发送剑鱼微信模版消息
 func (s *MessageServer) SendWxTmplMsg(ctx context.Context, in *message.WxTmplMsgRequest) (*message.SendMsgResponse, error) {
 	l := logic.NewSendWxTmplMsgLogic(ctx, s.svcCtx)
 	return l.SendWxTmplMsg(in)
 }
 
-//    官网、移动端首页、工作桌面消息滚动
+// 官网、移动端首页、工作桌面消息滚动
 func (s *MessageServer) UserUnreadMsgList(ctx context.Context, in *message.UserUnreadMsgListReq) (*message.UserUnreadMsgListRes, error) {
 	l := logic.NewUserUnreadMsgListLogic(ctx, s.svcCtx)
 	return l.UserUnreadMsgList(in)
 }
 
-//  点击消息-存查看记录
+// 点击消息-存查看记录
 func (s *MessageServer) MsgOpenLog(ctx context.Context, in *message.MsgOpenLogReq) (*message.Response, error) {
 	l := logic.NewMsgOpenLogLogic(ctx, s.svcCtx)
 	return l.MsgOpenLog(in)
 }
 
-//   发送剑鱼微信模版消息
+// 发送剑鱼微信模版消息
 func (s *MessageServer) AppLetterPush(ctx context.Context, in *message.WxTmplMsgRequest) (*message.SendMsgResponse, error) {
 	l := logic.NewAppLetterPushLogic(ctx, s.svcCtx)
 	return l.AppLetterPush(in)

+ 3 - 2
rpc/message.proto

@@ -242,11 +242,12 @@ message UserUnreadMsgListRes {
 message WxTmplMsgRequest {
   string userIds = 1;      //接受人 mongo_userId(多个用,分割)
   string positionIds = 2;  //接受人 职位id(多个用,分割)
-  string messageClass =3;  //数据库中switch字段
+  int64 msgType =3;  //数据库中switch字段
   string title = 4;        //课程名称
   string detail = 5;       //课程时间
   string date = 6;         //课程地点
-  string url = 7;          //消息跳转连接
+  string row4 =7;
+  string url = 8;          //消息跳转连接
 }
 
 message SendMsgResponse {

+ 21 - 21
rpc/messageclient/message.go

@@ -1,4 +1,4 @@
-// Code generated by goctl. DO NOT EDIT!
+// Code generated by goctl. DO NOT EDIT.
 // Source: message.proto
 
 package messageclient
@@ -50,27 +50,27 @@ type (
 	Message interface {
 		// 批量保存消息
 		MultipleSaveMsg(ctx context.Context, in *MultipleSaveMsgReq, opts ...grpc.CallOption) (*MultipleSaveMsgResp, error)
-		//  修改消息阅读状态
+		// 修改消息阅读状态
 		ChangeReadStatus(ctx context.Context, in *ChangeReadStatusReq, opts ...grpc.CallOption) (*Response, error)
-		//   查询指定用户的历史消息记录
+		// 查询指定用户的历史消息记录
 		FindUserMsg(ctx context.Context, in *FindUserMsgReq, opts ...grpc.CallOption) (*FindUserMsgRes, error)
 		// 查看详细详情
 		FindMessageDetail(ctx context.Context, in *MessageDetailReq, opts ...grpc.CallOption) (*MessageDetailResp, error)
-		//   消息的分类
+		// 消息的分类
 		GetMsgType(ctx context.Context, in *GetMsgTypeReq, opts ...grpc.CallOption) (*GetMsgTypeRes, error)
-		//   查询指定用户的浮标消息
+		// 查询指定用户的浮标消息
 		FindUserBuoyMsg(ctx context.Context, in *FindUserBuoyMsgReq, opts ...grpc.CallOption) (*FindUserBuoyMsgRes, error)
-		//    一键清空未读消息
+		// 一键清空未读消息
 		ClearUnreadMsg(ctx context.Context, in *ClearUnreadMsgReq, opts ...grpc.CallOption) (*Response, error)
-		//    new用户消息列表
+		// new用户消息列表
 		UserMsgList(ctx context.Context, in *UserMsgListReq, opts ...grpc.CallOption) (*UserMsgListRes, error)
-		//   发送剑鱼微信模版消息
+		// 发送剑鱼微信模版消息
 		SendWxTmplMsg(ctx context.Context, in *WxTmplMsgRequest, opts ...grpc.CallOption) (*SendMsgResponse, error)
-		//    官网、移动端首页、工作桌面消息滚动
+		// 官网、移动端首页、工作桌面消息滚动
 		UserUnreadMsgList(ctx context.Context, in *UserUnreadMsgListReq, opts ...grpc.CallOption) (*UserUnreadMsgListRes, error)
-		//  点击消息-存查看记录
+		// 点击消息-存查看记录
 		MsgOpenLog(ctx context.Context, in *MsgOpenLogReq, opts ...grpc.CallOption) (*Response, error)
-		//   发送剑鱼微信模版消息
+		// 发送剑鱼微信模版消息
 		AppLetterPush(ctx context.Context, in *WxTmplMsgRequest, opts ...grpc.CallOption) (*SendMsgResponse, error)
 	}
 
@@ -91,13 +91,13 @@ func (m *defaultMessage) MultipleSaveMsg(ctx context.Context, in *MultipleSaveMs
 	return client.MultipleSaveMsg(ctx, in, opts...)
 }
 
-//  修改消息阅读状态
+// 修改消息阅读状态
 func (m *defaultMessage) ChangeReadStatus(ctx context.Context, in *ChangeReadStatusReq, opts ...grpc.CallOption) (*Response, error) {
 	client := message.NewMessageClient(m.cli.Conn())
 	return client.ChangeReadStatus(ctx, in, opts...)
 }
 
-//   查询指定用户的历史消息记录
+// 查询指定用户的历史消息记录
 func (m *defaultMessage) FindUserMsg(ctx context.Context, in *FindUserMsgReq, opts ...grpc.CallOption) (*FindUserMsgRes, error) {
 	client := message.NewMessageClient(m.cli.Conn())
 	return client.FindUserMsg(ctx, in, opts...)
@@ -109,49 +109,49 @@ func (m *defaultMessage) FindMessageDetail(ctx context.Context, in *MessageDetai
 	return client.FindMessageDetail(ctx, in, opts...)
 }
 
-//   消息的分类
+// 消息的分类
 func (m *defaultMessage) GetMsgType(ctx context.Context, in *GetMsgTypeReq, opts ...grpc.CallOption) (*GetMsgTypeRes, error) {
 	client := message.NewMessageClient(m.cli.Conn())
 	return client.GetMsgType(ctx, in, opts...)
 }
 
-//   查询指定用户的浮标消息
+// 查询指定用户的浮标消息
 func (m *defaultMessage) FindUserBuoyMsg(ctx context.Context, in *FindUserBuoyMsgReq, opts ...grpc.CallOption) (*FindUserBuoyMsgRes, error) {
 	client := message.NewMessageClient(m.cli.Conn())
 	return client.FindUserBuoyMsg(ctx, in, opts...)
 }
 
-//    一键清空未读消息
+// 一键清空未读消息
 func (m *defaultMessage) ClearUnreadMsg(ctx context.Context, in *ClearUnreadMsgReq, opts ...grpc.CallOption) (*Response, error) {
 	client := message.NewMessageClient(m.cli.Conn())
 	return client.ClearUnreadMsg(ctx, in, opts...)
 }
 
-//    new用户消息列表
+// new用户消息列表
 func (m *defaultMessage) UserMsgList(ctx context.Context, in *UserMsgListReq, opts ...grpc.CallOption) (*UserMsgListRes, error) {
 	client := message.NewMessageClient(m.cli.Conn())
 	return client.UserMsgList(ctx, in, opts...)
 }
 
-//   发送剑鱼微信模版消息
+// 发送剑鱼微信模版消息
 func (m *defaultMessage) SendWxTmplMsg(ctx context.Context, in *WxTmplMsgRequest, opts ...grpc.CallOption) (*SendMsgResponse, error) {
 	client := message.NewMessageClient(m.cli.Conn())
 	return client.SendWxTmplMsg(ctx, in, opts...)
 }
 
-//    官网、移动端首页、工作桌面消息滚动
+// 官网、移动端首页、工作桌面消息滚动
 func (m *defaultMessage) UserUnreadMsgList(ctx context.Context, in *UserUnreadMsgListReq, opts ...grpc.CallOption) (*UserUnreadMsgListRes, error) {
 	client := message.NewMessageClient(m.cli.Conn())
 	return client.UserUnreadMsgList(ctx, in, opts...)
 }
 
-//  点击消息-存查看记录
+// 点击消息-存查看记录
 func (m *defaultMessage) MsgOpenLog(ctx context.Context, in *MsgOpenLogReq, opts ...grpc.CallOption) (*Response, error) {
 	client := message.NewMessageClient(m.cli.Conn())
 	return client.MsgOpenLog(ctx, in, opts...)
 }
 
-//   发送剑鱼微信模版消息
+// 发送剑鱼微信模版消息
 func (m *defaultMessage) AppLetterPush(ctx context.Context, in *WxTmplMsgRequest, opts ...grpc.CallOption) (*SendMsgResponse, error) {
 	client := message.NewMessageClient(m.cli.Conn())
 	return client.AppLetterPush(ctx, in, opts...)

+ 111 - 96
rpc/type/message/message.pb.go

@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.28.0
-// 	protoc        v3.19.4
+// 	protoc-gen-go v1.30.0
+// 	protoc        v3.21.12
 // source: message.proto
 
 package message
@@ -581,7 +581,7 @@ func (x *GetClassUnreadCountReq) GetAppid() string {
 	return ""
 }
 
-//查看消息内容
+// 查看消息内容
 type MessageDetailReq struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -2334,13 +2334,14 @@ type WxTmplMsgRequest struct {
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	UserIds      string `protobuf:"bytes,1,opt,name=userIds,proto3" json:"userIds,omitempty"`           //接受人 mongo_userId(多个用,分割)
-	PositionIds  string `protobuf:"bytes,2,opt,name=positionIds,proto3" json:"positionIds,omitempty"`   //接受人 职位id(多个用,分割)
-	MessageClass string `protobuf:"bytes,3,opt,name=messageClass,proto3" json:"messageClass,omitempty"` //数据库中switch字段
-	Title        string `protobuf:"bytes,4,opt,name=title,proto3" json:"title,omitempty"`               //课程名称
-	Detail       string `protobuf:"bytes,5,opt,name=detail,proto3" json:"detail,omitempty"`             //课程时间
-	Date         string `protobuf:"bytes,6,opt,name=date,proto3" json:"date,omitempty"`                 //课程地点
-	Url          string `protobuf:"bytes,7,opt,name=url,proto3" json:"url,omitempty"`                   //消息跳转连接
+	UserIds     string `protobuf:"bytes,1,opt,name=userIds,proto3" json:"userIds,omitempty"`         //接受人 mongo_userId(多个用,分割)
+	PositionIds string `protobuf:"bytes,2,opt,name=positionIds,proto3" json:"positionIds,omitempty"` //接受人 职位id(多个用,分割)
+	MsgType     int64  `protobuf:"varint,3,opt,name=msgType,proto3" json:"msgType,omitempty"`        //数据库中switch字段
+	Title       string `protobuf:"bytes,4,opt,name=title,proto3" json:"title,omitempty"`             //课程名称
+	Detail      string `protobuf:"bytes,5,opt,name=detail,proto3" json:"detail,omitempty"`           //课程时间
+	Date        string `protobuf:"bytes,6,opt,name=date,proto3" json:"date,omitempty"`               //课程地点
+	Row4        string `protobuf:"bytes,7,opt,name=row4,proto3" json:"row4,omitempty"`
+	Url         string `protobuf:"bytes,8,opt,name=url,proto3" json:"url,omitempty"` //消息跳转连接
 }
 
 func (x *WxTmplMsgRequest) Reset() {
@@ -2389,11 +2390,11 @@ func (x *WxTmplMsgRequest) GetPositionIds() string {
 	return ""
 }
 
-func (x *WxTmplMsgRequest) GetMessageClass() string {
+func (x *WxTmplMsgRequest) GetMsgType() int64 {
 	if x != nil {
-		return x.MessageClass
+		return x.MsgType
 	}
-	return ""
+	return 0
 }
 
 func (x *WxTmplMsgRequest) GetTitle() string {
@@ -2417,6 +2418,13 @@ func (x *WxTmplMsgRequest) GetDate() string {
 	return ""
 }
 
+func (x *WxTmplMsgRequest) GetRow4() string {
+	if x != nil {
+		return x.Row4
+	}
+	return ""
+}
+
 func (x *WxTmplMsgRequest) GetUrl() string {
 	if x != nil {
 		return x.Url
@@ -2834,80 +2842,85 @@ var file_message_proto_rawDesc = []byte{
 	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, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18,
-	0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xc6, 0x01, 0x0a,
+	0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 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, 0x22, 0x0a,
-	0x0c, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x03, 0x20,
-	0x01, 0x28, 0x09, 0x52, 0x0c, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73,
-	0x73, 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, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x07, 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, 0x32,
-	0x88, 0x06, 0x0a, 0x07, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 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, 0x3c, 0x0a, 0x0a, 0x47,
-	0x65, 0x74, 0x4d, 0x73, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x2e, 0x6d, 0x65, 0x73, 0x73,
-	0x61, 0x67, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x73, 0x67, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65,
-	0x71, 0x1a, 0x16, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x4d,
-	0x73, 0x67, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x73, 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, 0x51,
-	0x0a, 0x11, 0x55, 0x73, 0x65, 0x72, 0x55, 0x6e, 0x72, 0x65, 0x61, 0x64, 0x4d, 0x73, 0x67, 0x4c,
-	0x69, 0x73, 0x74, 0x12, 0x1d, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x73,
-	0x65, 0x72, 0x55, 0x6e, 0x72, 0x65, 0x61, 0x64, 0x4d, 0x73, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52,
-	0x65, 0x71, 0x1a, 0x1d, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x73, 0x65,
-	0x72, 0x55, 0x6e, 0x72, 0x65, 0x61, 0x64, 0x4d, 0x73, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65,
-	0x73, 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, 0x42, 0x0a, 0x5a, 0x08, 0x6d, 0x65,
+	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, 0x32, 0xce, 0x06, 0x0a, 0x07, 0x4d, 0x65,
+	0x73, 0x73, 0x61, 0x67, 0x65, 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, 0x3c, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x4d, 0x73, 0x67, 0x54,
+	0x79, 0x70, 0x65, 0x12, 0x16, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x47, 0x65,
+	0x74, 0x4d, 0x73, 0x67, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x6d, 0x65,
+	0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x73, 0x67, 0x54, 0x79, 0x70, 0x65,
+	0x52, 0x65, 0x73, 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, 0x51, 0x0a, 0x11, 0x55, 0x73, 0x65, 0x72,
+	0x55, 0x6e, 0x72, 0x65, 0x61, 0x64, 0x4d, 0x73, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1d, 0x2e,
+	0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x55, 0x6e, 0x72, 0x65,
+	0x61, 0x64, 0x4d, 0x73, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x1d, 0x2e, 0x6d,
+	0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x55, 0x6e, 0x72, 0x65, 0x61,
+	0x64, 0x4d, 0x73, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 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,
 }
 
@@ -2987,19 +3000,21 @@ var file_message_proto_depIdxs = []int32{
 	30, // 23: message.Message.SendWxTmplMsg:input_type -> message.WxTmplMsgRequest
 	28, // 24: message.Message.UserUnreadMsgList:input_type -> message.UserUnreadMsgListReq
 	32, // 25: message.Message.MsgOpenLog:input_type -> message.MsgOpenLogReq
-	18, // 26: message.Message.multipleSaveMsg:output_type -> message.multipleSaveMsgResp
-	2,  // 27: message.Message.ChangeReadStatus:output_type -> message.Response
-	5,  // 28: message.Message.FindUserMsg:output_type -> message.FindUserMsgRes
-	8,  // 29: message.Message.FindMessageDetail:output_type -> message.MessageDetailResp
-	15, // 30: message.Message.GetMsgType:output_type -> message.GetMsgTypeRes
-	20, // 31: message.Message.FindUserBuoyMsg:output_type -> message.FindUserBuoyMsgRes
-	2,  // 32: message.Message.ClearUnreadMsg:output_type -> message.Response
-	24, // 33: message.Message.UserMsgList:output_type -> message.UserMsgListRes
-	31, // 34: message.Message.SendWxTmplMsg:output_type -> message.SendMsgResponse
-	29, // 35: message.Message.UserUnreadMsgList:output_type -> message.UserUnreadMsgListRes
-	2,  // 36: message.Message.MsgOpenLog:output_type -> message.Response
-	26, // [26:37] is the sub-list for method output_type
-	15, // [15:26] is the sub-list for method input_type
+	30, // 26: message.Message.AppLetterPush:input_type -> message.WxTmplMsgRequest
+	18, // 27: message.Message.multipleSaveMsg:output_type -> message.multipleSaveMsgResp
+	2,  // 28: message.Message.ChangeReadStatus:output_type -> message.Response
+	5,  // 29: message.Message.FindUserMsg:output_type -> message.FindUserMsgRes
+	8,  // 30: message.Message.FindMessageDetail:output_type -> message.MessageDetailResp
+	15, // 31: message.Message.GetMsgType:output_type -> message.GetMsgTypeRes
+	20, // 32: message.Message.FindUserBuoyMsg:output_type -> message.FindUserBuoyMsgRes
+	2,  // 33: message.Message.ClearUnreadMsg:output_type -> message.Response
+	24, // 34: message.Message.UserMsgList:output_type -> message.UserMsgListRes
+	31, // 35: message.Message.SendWxTmplMsg:output_type -> message.SendMsgResponse
+	29, // 36: message.Message.UserUnreadMsgList:output_type -> message.UserUnreadMsgListRes
+	2,  // 37: message.Message.MsgOpenLog:output_type -> message.Response
+	31, // 38: message.Message.AppLetterPush:output_type -> message.SendMsgResponse
+	27, // [27:39] is the sub-list for method output_type
+	15, // [15:27] 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

+ 59 - 44
rpc/type/message/message_grpc.pb.go

@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 // versions:
-// - protoc-gen-go-grpc v1.2.0
-// - protoc             v3.19.4
+// - protoc-gen-go-grpc v1.3.0
+// - protoc             v3.21.12
 // source: message.proto
 
 package message
@@ -18,29 +18,44 @@ import (
 // Requires gRPC-Go v1.32.0 or later.
 const _ = grpc.SupportPackageIsVersion7
 
+const (
+	Message_MultipleSaveMsg_FullMethodName   = "/message.Message/multipleSaveMsg"
+	Message_ChangeReadStatus_FullMethodName  = "/message.Message/ChangeReadStatus"
+	Message_FindUserMsg_FullMethodName       = "/message.Message/FindUserMsg"
+	Message_FindMessageDetail_FullMethodName = "/message.Message/FindMessageDetail"
+	Message_GetMsgType_FullMethodName        = "/message.Message/GetMsgType"
+	Message_FindUserBuoyMsg_FullMethodName   = "/message.Message/FindUserBuoyMsg"
+	Message_ClearUnreadMsg_FullMethodName    = "/message.Message/ClearUnreadMsg"
+	Message_UserMsgList_FullMethodName       = "/message.Message/UserMsgList"
+	Message_SendWxTmplMsg_FullMethodName     = "/message.Message/SendWxTmplMsg"
+	Message_UserUnreadMsgList_FullMethodName = "/message.Message/UserUnreadMsgList"
+	Message_MsgOpenLog_FullMethodName        = "/message.Message/MsgOpenLog"
+	Message_AppLetterPush_FullMethodName     = "/message.Message/AppLetterPush"
+)
+
 // MessageClient is the client API for Message service.
 //
 // 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 {
-	//批量保存消息
+	// 批量保存消息
 	MultipleSaveMsg(ctx context.Context, in *MultipleSaveMsgReq, opts ...grpc.CallOption) (*MultipleSaveMsgResp, error)
 	// 修改消息阅读状态
 	ChangeReadStatus(ctx context.Context, in *ChangeReadStatusReq, opts ...grpc.CallOption) (*Response, error)
-	//  查询指定用户的历史消息记录
+	// 查询指定用户的历史消息记录
 	FindUserMsg(ctx context.Context, in *FindUserMsgReq, opts ...grpc.CallOption) (*FindUserMsgRes, error)
-	//查看详细详情
+	// 查看详细详情
 	FindMessageDetail(ctx context.Context, in *MessageDetailReq, opts ...grpc.CallOption) (*MessageDetailResp, error)
-	//  消息的分类
+	// 消息的分类
 	GetMsgType(ctx context.Context, in *GetMsgTypeReq, opts ...grpc.CallOption) (*GetMsgTypeRes, error)
-	//  查询指定用户的浮标消息
+	// 查询指定用户的浮标消息
 	FindUserBuoyMsg(ctx context.Context, in *FindUserBuoyMsgReq, opts ...grpc.CallOption) (*FindUserBuoyMsgRes, error)
-	//   一键清空未读消息
+	// 一键清空未读消息
 	ClearUnreadMsg(ctx context.Context, in *ClearUnreadMsgReq, opts ...grpc.CallOption) (*Response, error)
-	//   new用户消息列表
+	// new用户消息列表
 	UserMsgList(ctx context.Context, in *UserMsgListReq, opts ...grpc.CallOption) (*UserMsgListRes, error)
-	//  发送剑鱼微信模版消息
+	// 发送剑鱼微信模版消息
 	SendWxTmplMsg(ctx context.Context, in *WxTmplMsgRequest, opts ...grpc.CallOption) (*SendMsgResponse, error)
-	//   官网、移动端首页、工作桌面消息滚动
+	// 官网、移动端首页、工作桌面消息滚动
 	UserUnreadMsgList(ctx context.Context, in *UserUnreadMsgListReq, opts ...grpc.CallOption) (*UserUnreadMsgListRes, error)
 	// 点击消息-存查看记录
 	MsgOpenLog(ctx context.Context, in *MsgOpenLogReq, opts ...grpc.CallOption) (*Response, error)
@@ -58,7 +73,7 @@ func NewMessageClient(cc grpc.ClientConnInterface) MessageClient {
 
 func (c *messageClient) MultipleSaveMsg(ctx context.Context, in *MultipleSaveMsgReq, opts ...grpc.CallOption) (*MultipleSaveMsgResp, error) {
 	out := new(MultipleSaveMsgResp)
-	err := c.cc.Invoke(ctx, "/message.Message/multipleSaveMsg", in, out, opts...)
+	err := c.cc.Invoke(ctx, Message_MultipleSaveMsg_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -67,7 +82,7 @@ func (c *messageClient) MultipleSaveMsg(ctx context.Context, in *MultipleSaveMsg
 
 func (c *messageClient) ChangeReadStatus(ctx context.Context, in *ChangeReadStatusReq, opts ...grpc.CallOption) (*Response, error) {
 	out := new(Response)
-	err := c.cc.Invoke(ctx, "/message.Message/ChangeReadStatus", in, out, opts...)
+	err := c.cc.Invoke(ctx, Message_ChangeReadStatus_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -76,7 +91,7 @@ func (c *messageClient) ChangeReadStatus(ctx context.Context, in *ChangeReadStat
 
 func (c *messageClient) FindUserMsg(ctx context.Context, in *FindUserMsgReq, opts ...grpc.CallOption) (*FindUserMsgRes, error) {
 	out := new(FindUserMsgRes)
-	err := c.cc.Invoke(ctx, "/message.Message/FindUserMsg", in, out, opts...)
+	err := c.cc.Invoke(ctx, Message_FindUserMsg_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -85,7 +100,7 @@ func (c *messageClient) FindUserMsg(ctx context.Context, in *FindUserMsgReq, opt
 
 func (c *messageClient) FindMessageDetail(ctx context.Context, in *MessageDetailReq, opts ...grpc.CallOption) (*MessageDetailResp, error) {
 	out := new(MessageDetailResp)
-	err := c.cc.Invoke(ctx, "/message.Message/FindMessageDetail", in, out, opts...)
+	err := c.cc.Invoke(ctx, Message_FindMessageDetail_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -94,7 +109,7 @@ func (c *messageClient) FindMessageDetail(ctx context.Context, in *MessageDetail
 
 func (c *messageClient) GetMsgType(ctx context.Context, in *GetMsgTypeReq, opts ...grpc.CallOption) (*GetMsgTypeRes, error) {
 	out := new(GetMsgTypeRes)
-	err := c.cc.Invoke(ctx, "/message.Message/GetMsgType", in, out, opts...)
+	err := c.cc.Invoke(ctx, Message_GetMsgType_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -103,7 +118,7 @@ func (c *messageClient) GetMsgType(ctx context.Context, in *GetMsgTypeReq, opts
 
 func (c *messageClient) FindUserBuoyMsg(ctx context.Context, in *FindUserBuoyMsgReq, opts ...grpc.CallOption) (*FindUserBuoyMsgRes, error) {
 	out := new(FindUserBuoyMsgRes)
-	err := c.cc.Invoke(ctx, "/message.Message/FindUserBuoyMsg", in, out, opts...)
+	err := c.cc.Invoke(ctx, Message_FindUserBuoyMsg_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -112,7 +127,7 @@ func (c *messageClient) FindUserBuoyMsg(ctx context.Context, in *FindUserBuoyMsg
 
 func (c *messageClient) ClearUnreadMsg(ctx context.Context, in *ClearUnreadMsgReq, opts ...grpc.CallOption) (*Response, error) {
 	out := new(Response)
-	err := c.cc.Invoke(ctx, "/message.Message/ClearUnreadMsg", in, out, opts...)
+	err := c.cc.Invoke(ctx, Message_ClearUnreadMsg_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -121,7 +136,7 @@ func (c *messageClient) ClearUnreadMsg(ctx context.Context, in *ClearUnreadMsgRe
 
 func (c *messageClient) UserMsgList(ctx context.Context, in *UserMsgListReq, opts ...grpc.CallOption) (*UserMsgListRes, error) {
 	out := new(UserMsgListRes)
-	err := c.cc.Invoke(ctx, "/message.Message/UserMsgList", in, out, opts...)
+	err := c.cc.Invoke(ctx, Message_UserMsgList_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -130,7 +145,7 @@ func (c *messageClient) UserMsgList(ctx context.Context, in *UserMsgListReq, opt
 
 func (c *messageClient) SendWxTmplMsg(ctx context.Context, in *WxTmplMsgRequest, opts ...grpc.CallOption) (*SendMsgResponse, error) {
 	out := new(SendMsgResponse)
-	err := c.cc.Invoke(ctx, "/message.Message/SendWxTmplMsg", in, out, opts...)
+	err := c.cc.Invoke(ctx, Message_SendWxTmplMsg_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -139,7 +154,7 @@ func (c *messageClient) SendWxTmplMsg(ctx context.Context, in *WxTmplMsgRequest,
 
 func (c *messageClient) UserUnreadMsgList(ctx context.Context, in *UserUnreadMsgListReq, opts ...grpc.CallOption) (*UserUnreadMsgListRes, error) {
 	out := new(UserUnreadMsgListRes)
-	err := c.cc.Invoke(ctx, "/message.Message/UserUnreadMsgList", in, out, opts...)
+	err := c.cc.Invoke(ctx, Message_UserUnreadMsgList_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -148,7 +163,7 @@ func (c *messageClient) UserUnreadMsgList(ctx context.Context, in *UserUnreadMsg
 
 func (c *messageClient) MsgOpenLog(ctx context.Context, in *MsgOpenLogReq, opts ...grpc.CallOption) (*Response, error) {
 	out := new(Response)
-	err := c.cc.Invoke(ctx, "/message.Message/MsgOpenLog", in, out, opts...)
+	err := c.cc.Invoke(ctx, Message_MsgOpenLog_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -157,7 +172,7 @@ func (c *messageClient) MsgOpenLog(ctx context.Context, in *MsgOpenLogReq, opts
 
 func (c *messageClient) AppLetterPush(ctx context.Context, in *WxTmplMsgRequest, opts ...grpc.CallOption) (*SendMsgResponse, error) {
 	out := new(SendMsgResponse)
-	err := c.cc.Invoke(ctx, "/message.Message/AppLetterPush", in, out, opts...)
+	err := c.cc.Invoke(ctx, Message_AppLetterPush_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -168,25 +183,25 @@ func (c *messageClient) AppLetterPush(ctx context.Context, in *WxTmplMsgRequest,
 // All implementations must embed UnimplementedMessageServer
 // for forward compatibility
 type MessageServer interface {
-	//批量保存消息
+	// 批量保存消息
 	MultipleSaveMsg(context.Context, *MultipleSaveMsgReq) (*MultipleSaveMsgResp, error)
 	// 修改消息阅读状态
 	ChangeReadStatus(context.Context, *ChangeReadStatusReq) (*Response, error)
-	//  查询指定用户的历史消息记录
+	// 查询指定用户的历史消息记录
 	FindUserMsg(context.Context, *FindUserMsgReq) (*FindUserMsgRes, error)
-	//查看详细详情
+	// 查看详细详情
 	FindMessageDetail(context.Context, *MessageDetailReq) (*MessageDetailResp, error)
-	//  消息的分类
+	// 消息的分类
 	GetMsgType(context.Context, *GetMsgTypeReq) (*GetMsgTypeRes, error)
-	//  查询指定用户的浮标消息
+	// 查询指定用户的浮标消息
 	FindUserBuoyMsg(context.Context, *FindUserBuoyMsgReq) (*FindUserBuoyMsgRes, error)
-	//   一键清空未读消息
+	// 一键清空未读消息
 	ClearUnreadMsg(context.Context, *ClearUnreadMsgReq) (*Response, error)
-	//   new用户消息列表
+	// new用户消息列表
 	UserMsgList(context.Context, *UserMsgListReq) (*UserMsgListRes, error)
-	//  发送剑鱼微信模版消息
+	// 发送剑鱼微信模版消息
 	SendWxTmplMsg(context.Context, *WxTmplMsgRequest) (*SendMsgResponse, error)
-	//   官网、移动端首页、工作桌面消息滚动
+	// 官网、移动端首页、工作桌面消息滚动
 	UserUnreadMsgList(context.Context, *UserUnreadMsgListReq) (*UserUnreadMsgListRes, error)
 	// 点击消息-存查看记录
 	MsgOpenLog(context.Context, *MsgOpenLogReq) (*Response, error)
@@ -258,7 +273,7 @@ func _Message_MultipleSaveMsg_Handler(srv interface{}, ctx context.Context, dec
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/message.Message/multipleSaveMsg",
+		FullMethod: Message_MultipleSaveMsg_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(MessageServer).MultipleSaveMsg(ctx, req.(*MultipleSaveMsgReq))
@@ -276,7 +291,7 @@ func _Message_ChangeReadStatus_Handler(srv interface{}, ctx context.Context, dec
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/message.Message/ChangeReadStatus",
+		FullMethod: Message_ChangeReadStatus_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(MessageServer).ChangeReadStatus(ctx, req.(*ChangeReadStatusReq))
@@ -294,7 +309,7 @@ func _Message_FindUserMsg_Handler(srv interface{}, ctx context.Context, dec func
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/message.Message/FindUserMsg",
+		FullMethod: Message_FindUserMsg_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(MessageServer).FindUserMsg(ctx, req.(*FindUserMsgReq))
@@ -312,7 +327,7 @@ func _Message_FindMessageDetail_Handler(srv interface{}, ctx context.Context, de
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/message.Message/FindMessageDetail",
+		FullMethod: Message_FindMessageDetail_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(MessageServer).FindMessageDetail(ctx, req.(*MessageDetailReq))
@@ -330,7 +345,7 @@ func _Message_GetMsgType_Handler(srv interface{}, ctx context.Context, dec func(
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/message.Message/GetMsgType",
+		FullMethod: Message_GetMsgType_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(MessageServer).GetMsgType(ctx, req.(*GetMsgTypeReq))
@@ -348,7 +363,7 @@ func _Message_FindUserBuoyMsg_Handler(srv interface{}, ctx context.Context, dec
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/message.Message/FindUserBuoyMsg",
+		FullMethod: Message_FindUserBuoyMsg_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(MessageServer).FindUserBuoyMsg(ctx, req.(*FindUserBuoyMsgReq))
@@ -366,7 +381,7 @@ func _Message_ClearUnreadMsg_Handler(srv interface{}, ctx context.Context, dec f
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/message.Message/ClearUnreadMsg",
+		FullMethod: Message_ClearUnreadMsg_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(MessageServer).ClearUnreadMsg(ctx, req.(*ClearUnreadMsgReq))
@@ -384,7 +399,7 @@ func _Message_UserMsgList_Handler(srv interface{}, ctx context.Context, dec func
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/message.Message/UserMsgList",
+		FullMethod: Message_UserMsgList_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(MessageServer).UserMsgList(ctx, req.(*UserMsgListReq))
@@ -402,7 +417,7 @@ func _Message_SendWxTmplMsg_Handler(srv interface{}, ctx context.Context, dec fu
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/message.Message/SendWxTmplMsg",
+		FullMethod: Message_SendWxTmplMsg_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(MessageServer).SendWxTmplMsg(ctx, req.(*WxTmplMsgRequest))
@@ -420,7 +435,7 @@ func _Message_UserUnreadMsgList_Handler(srv interface{}, ctx context.Context, de
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/message.Message/UserUnreadMsgList",
+		FullMethod: Message_UserUnreadMsgList_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(MessageServer).UserUnreadMsgList(ctx, req.(*UserUnreadMsgListReq))
@@ -438,7 +453,7 @@ func _Message_MsgOpenLog_Handler(srv interface{}, ctx context.Context, dec func(
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/message.Message/MsgOpenLog",
+		FullMethod: Message_MsgOpenLog_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(MessageServer).MsgOpenLog(ctx, req.(*MsgOpenLogReq))
@@ -456,7 +471,7 @@ func _Message_AppLetterPush_Handler(srv interface{}, ctx context.Context, dec fu
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/message.Message/AppLetterPush",
+		FullMethod: Message_AppLetterPush_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(MessageServer).AppLetterPush(ctx, req.(*WxTmplMsgRequest))