Преглед изворни кода

保存消息rpc、api提交

renjiaojiao пре 1 година
родитељ
комит
f8f21656f4

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

@@ -12,6 +12,21 @@ import (
 func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
 func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
 	server.AddRoutes(
 	server.AddRoutes(
 		[]rest.Route{
 		[]rest.Route{
+			{
+				Method:  http.MethodPost,
+				Path:    "/messageCenter/BitmapSaveMsg",
+				Handler: BitmapSaveMsgHandler(serverCtx),
+			},
+			{
+				Method:  http.MethodPost,
+				Path:    "/messageCenter/UpdateMsgSummary",
+				Handler: UpdateMsgSummaryHandler(serverCtx),
+			},
+			{
+				Method:  http.MethodPost,
+				Path:    "/messageCenter/NewUserSaveMsg",
+				Handler: NewUserSaveMsgHandler(serverCtx),
+			},
 			{
 			{
 				Method:  http.MethodPost,
 				Method:  http.MethodPost,
 				Path:    "/messageCenter/messageDetail",
 				Path:    "/messageCenter/messageDetail",

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

@@ -152,3 +152,26 @@ type MsgOpenLogReq struct {
 	UserId   string `header:"mgoUserId"`
 	UserId   string `header:"mgoUserId"`
 	AppId    string `header:"appId"`
 	AppId    string `header:"appId"`
 }
 }
+
+type NewUserSaveMsgReq struct {
+	MsgInfo     map[string]interface{} `json:"msgInfo"`
+	UserIds     string                 `json:"userIds"`
+	PositionIds string                 `json:"positionIds,optional"` // 职位id 如果是多个就逗号分割 和用户id一一对应
+}
+
+type NewUserSaveMsgResp struct {
+	Code    int64  `json:"code"`
+	Message string `json:"message"`
+}
+
+type UpdateMsgSummaryReq struct {
+	MsgLogId int64 `json:"msgLogId"`
+	GroupId  int64 `json:"groupId"`
+	MsgType  int64 `json:"msgType"`
+}
+
+type BitmapSaveMsgReq struct {
+	MsgInfo     map[string]interface{} `json:"msgInfo"`
+	UserIds     string                 `json:"userIds"`
+	PositionIds string                 `json:"positionIds,optional"` // 职位id 如果是多个就逗号分割 和用户id一一对应
+}

+ 29 - 0
api/message.api

@@ -154,7 +154,36 @@ type MsgOpenLogReq {
 	AppId    string `header:"appId"`
 	AppId    string `header:"appId"`
 }
 }
 
 
+type NewUserSaveMsgReq {
+	MsgInfo     map[string]interface{} `json:"msgInfo"`
+	UserIds     string                 `json:"userIds"`
+	PositionIds string                 `json:"positionIds,optional"` // 职位id 如果是多个就逗号分割 和用户id一一对应
+}
+type NewUserSaveMsgResp {
+	Code    int64  `json:"code"`
+	Message string `json:"message"`
+}
+type UpdateMsgSummaryReq {
+	MsgLogId int64 `json:"msgLogId"`
+	GroupId  int64 `json:"groupId"`
+	MsgType  int64 `json:"msgType"`
+}
+type BitmapSaveMsgReq {
+	MsgInfo     map[string]interface{} `json:"msgInfo"`
+	UserIds     string                 `json:"userIds"`
+	PositionIds string                 `json:"positionIds,optional"` // 职位id 如果是多个就逗号分割 和用户id一一对应
+}
+
 service message-api {
 service message-api {
+	// 更新用户all_msg bitmap
+	@handler BitmapSaveMsgHandler
+	post /messageCenter/BitmapSaveMsg (BitmapSaveMsgReq) returns (MultipleSaveMsgResp)
+	// 更新消息汇总表
+	@handler UpdateMsgSummaryHandler
+	post /messageCenter/UpdateMsgSummary (UpdateMsgSummaryReq) returns (response)
+	// 新用户发送消息
+	@handler NewUserSaveMsgHandler
+	post /messageCenter/NewUserSaveMsg (NewUserSaveMsgReq) returns (NewUserSaveMsgResp)
 	//查询消息详情
 	//查询消息详情
 	@handler MessageDetailHandler
 	@handler MessageDetailHandler
 	post /messageCenter/messageDetail (MessageDetailReq) returns (MessageDetailResp)
 	post /messageCenter/messageDetail (MessageDetailReq) returns (MessageDetailResp)

+ 2 - 0
entity/message.go

@@ -4,6 +4,7 @@ import (
 	"app.yhyue.com/moapp/jybase/mail"
 	"app.yhyue.com/moapp/jybase/mail"
 	m "app.yhyue.com/moapp/jybase/mongodb"
 	m "app.yhyue.com/moapp/jybase/mongodb"
 	"app.yhyue.com/moapp/jybase/mysql"
 	"app.yhyue.com/moapp/jybase/mysql"
+	"github.com/ClickHouse/clickhouse-go/v2/lib/driver"
 	"time"
 	"time"
 
 
 	"github.com/go-xorm/xorm"
 	"github.com/go-xorm/xorm"
@@ -21,6 +22,7 @@ var RollingTiming int64
 var SaveConcurrencyChan chan int //  定义保存消息并发
 var SaveConcurrencyChan chan int //  定义保存消息并发
 var ClassSearchMap map[int64][]MsgClass
 var ClassSearchMap map[int64][]MsgClass
 var ClassMap map[int64]MsgClass
 var ClassMap map[int64]MsgClass
+var ClickhouseConn driver.Conn
 
 
 type MsgClass struct {
 type MsgClass struct {
 	MsgType int64  `json:"msgType"`
 	MsgType int64  `json:"msgType"`

+ 17 - 0
entity/newEntity.go

@@ -0,0 +1,17 @@
+package entity
+
+type MsgGroup struct {
+	Name     string `ch:"name"`
+	GroupId  int32  `ch:"group_id"`
+	Switch   string `ch:"switch"`
+	Img      string `ch:"img"`
+	Sequence int32  `ch:"sequence"`
+	Msg_type int32  `ch:"msg_type"`
+}
+type GroupClass struct {
+	Switch      string `ch:"switch"`
+	Wxtmpl_Id   string `ch:"wxtmpl_Id"`
+	Msg_type    int32  `ch:"msg_type"`
+	Msg_name    string `ch:"msg_name"`
+	Wxtmp_value string `ch:"wxtmp_value"`
+}

+ 2 - 0
go.mod

@@ -5,7 +5,9 @@ go 1.13
 require (
 require (
 	app.yhyue.com/moapp/jybase v0.0.0-20230901064756-2fc66b18db40
 	app.yhyue.com/moapp/jybase v0.0.0-20230901064756-2fc66b18db40
 	bp.jydev.jianyu360.cn/BaseService/gateway v1.3.4
 	bp.jydev.jianyu360.cn/BaseService/gateway v1.3.4
+	github.com/ClickHouse/clickhouse-go/v2 v2.2.0
 	github.com/go-xorm/xorm v0.7.9
 	github.com/go-xorm/xorm v0.7.9
+	github.com/gogf/gf/contrib/drivers/clickhouse/v2 v2.6.1
 	github.com/zeromicro/go-zero v1.3.5
 	github.com/zeromicro/go-zero v1.3.5
 	google.golang.org/grpc v1.47.0
 	google.golang.org/grpc v1.47.0
 	google.golang.org/protobuf v1.28.0
 	google.golang.org/protobuf v1.28.0

+ 80 - 27
go.sum

@@ -62,11 +62,15 @@ github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZ
 github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8=
 github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8=
 github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU=
 github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU=
 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
-github.com/BurntSushi/toml v0.4.1 h1:GaI7EiDXDRfa8VshkTj7Fym7ha+y8/XxIgD2okUIjLw=
 github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
 github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
+github.com/BurntSushi/toml v1.2.0 h1:Rt8g24XnyGTyglgET/PRUNlrUeu9F5L+7FilkXfZgs0=
+github.com/BurntSushi/toml v1.2.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
 github.com/ClickHouse/clickhouse-go v1.5.1/go.mod h1:EaI/sW7Azgz9UATzd5ZdZHRUhHgv5+JMS9NSr2smCJI=
 github.com/ClickHouse/clickhouse-go v1.5.1/go.mod h1:EaI/sW7Azgz9UATzd5ZdZHRUhHgv5+JMS9NSr2smCJI=
+github.com/ClickHouse/clickhouse-go v1.5.4 h1:cKjXeYLNWVJIx2J1K6H2CqyRmfwVJVY1OV1coaaFcI0=
 github.com/ClickHouse/clickhouse-go v1.5.4/go.mod h1:EaI/sW7Azgz9UATzd5ZdZHRUhHgv5+JMS9NSr2smCJI=
 github.com/ClickHouse/clickhouse-go v1.5.4/go.mod h1:EaI/sW7Azgz9UATzd5ZdZHRUhHgv5+JMS9NSr2smCJI=
+github.com/ClickHouse/clickhouse-go/v2 v2.0.15/go.mod h1:Z21o82zD8FFqefOQDg93c0XITlxGbTsWQuRm588Azkk=
+github.com/ClickHouse/clickhouse-go/v2 v2.2.0 h1:dj00TDKY+xwuTJdbpspCSmTLFyWzRJerTHwaBxut1C0=
 github.com/ClickHouse/clickhouse-go/v2 v2.2.0/go.mod h1:8f2XZUi7XoeU+uPIytSi1cvx8fmJxi7vIgqpvYTF1+o=
 github.com/ClickHouse/clickhouse-go/v2 v2.2.0/go.mod h1:8f2XZUi7XoeU+uPIytSi1cvx8fmJxi7vIgqpvYTF1+o=
 github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
 github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
 github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
 github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
@@ -108,8 +112,9 @@ github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL
 github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
 github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
 github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
 github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
 github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
 github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
-github.com/clbanning/mxj/v2 v2.5.5 h1:oT81vUeEiQQ/DcHbzSytRngP6Ky9O+L+0Bw0zSJag9E=
 github.com/clbanning/mxj/v2 v2.5.5/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s=
 github.com/clbanning/mxj/v2 v2.5.5/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s=
+github.com/clbanning/mxj/v2 v2.7.0 h1:WA/La7UGCanFe5NpHF0Q3DNtnCsVoxbPKuyBNHWRyME=
+github.com/clbanning/mxj/v2 v2.7.0/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s=
 github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
 github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
 github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80=
 github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80=
 github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
 github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
@@ -157,16 +162,18 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7
 github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
 github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
 github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
 github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
 github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM=
 github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM=
-github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=
 github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
 github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
+github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs=
+github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw=
 github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
 github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
 github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
 github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
 github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
 github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
 github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k=
 github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k=
 github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
 github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
 github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
 github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
-github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI=
 github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU=
 github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU=
+github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
+github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
 github.com/garyburd/redigo v1.6.2 h1:yE/pwKCrbLpLpQICzYTeZ7JsTA/C53wFTJHaEtRqniM=
 github.com/garyburd/redigo v1.6.2 h1:yE/pwKCrbLpLpQICzYTeZ7JsTA/C53wFTJHaEtRqniM=
 github.com/garyburd/redigo v1.6.2/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY=
 github.com/garyburd/redigo v1.6.2/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY=
 github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
 github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
@@ -187,8 +194,9 @@ github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTg
 github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
 github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
 github.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
 github.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
 github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
 github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
-github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
 github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
 github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ=
+github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
 github.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI=
 github.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI=
 github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
 github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
 github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
 github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
@@ -212,7 +220,6 @@ github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LB
 github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
 github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
 github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
 github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
 github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
 github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
-github.com/go-test/deep v1.0.7 h1:/VSMRlnY/JSyqxQUzQLKVMAskpY/NZKFA5j2P+0pP2M=
 github.com/go-test/deep v1.0.7/go.mod h1:QV8Hv/iy04NyLBxAdO9njL0iVPN1S4d/A3NVv1V36o8=
 github.com/go-test/deep v1.0.7/go.mod h1:QV8Hv/iy04NyLBxAdO9njL0iVPN1S4d/A3NVv1V36o8=
 github.com/go-xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a h1:9wScpmSP5A3Bk8V3XHWUcJmYTh+ZnlHVyc+A4oZYS3Y=
 github.com/go-xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a h1:9wScpmSP5A3Bk8V3XHWUcJmYTh+ZnlHVyc+A4oZYS3Y=
 github.com/go-xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:56xuuqnHyryaerycW3BfssRdxQstACi0Epw/yC5E2xM=
 github.com/go-xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:56xuuqnHyryaerycW3BfssRdxQstACi0Epw/yC5E2xM=
@@ -244,8 +251,11 @@ github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/V
 github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw=
 github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw=
 github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
 github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
 github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
 github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
-github.com/gogf/gf/v2 v2.0.6 h1:2etb4FMpbQKWIJO+UjtIWrZUp01HUsFb6Po8pgizAWk=
+github.com/gogf/gf/contrib/drivers/clickhouse/v2 v2.6.1 h1:ECineDg2mz0fJgfh8Pyh7xwPC8MN/nHSyfsLD0qtrE0=
+github.com/gogf/gf/contrib/drivers/clickhouse/v2 v2.6.1/go.mod h1:wlqfsjkIw3ZLEbcns5jK5urj1lt2JLweaqB+OlduRl0=
 github.com/gogf/gf/v2 v2.0.6/go.mod h1:8uYzw7qNzuq8vrhVlWke1b1925FFqOJIgmyYW1sr/0M=
 github.com/gogf/gf/v2 v2.0.6/go.mod h1:8uYzw7qNzuq8vrhVlWke1b1925FFqOJIgmyYW1sr/0M=
+github.com/gogf/gf/v2 v2.6.1 h1:n/cfXM506WjhPa6Z1CEDuHNM1XZ7C8JzSDPn2AfuxgQ=
+github.com/gogf/gf/v2 v2.6.1/go.mod h1:x2XONYcI4hRQ/4gMNbWHmZrNzSEIg20s2NULbzom5k0=
 github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
 github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
 github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
 github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
 github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
 github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
@@ -305,8 +315,9 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
 github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
 github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
-github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=
 github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
+github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
 github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
@@ -411,8 +422,9 @@ github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
 github.com/lib/pq v1.10.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
 github.com/lib/pq v1.10.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
 github.com/lib/pq v1.10.6 h1:jbk+ZieJ0D7EVGJYpL9QTz7/YW6UHbmdnZWYyK5cdBs=
 github.com/lib/pq v1.10.6 h1:jbk+ZieJ0D7EVGJYpL9QTz7/YW6UHbmdnZWYyK5cdBs=
 github.com/lib/pq v1.10.6/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
 github.com/lib/pq v1.10.6/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
-github.com/longbridgeapp/sqlparser v0.3.1 h1:iWOZWGIFgQrJRgobLXUNJdvqGRpbVXkyKUKUA5CNJBE=
 github.com/longbridgeapp/sqlparser v0.3.1/go.mod h1:GIHaUq8zvYyHLCLMJJykx1CdM6LHtkUih/QaJXySSx4=
 github.com/longbridgeapp/sqlparser v0.3.1/go.mod h1:GIHaUq8zvYyHLCLMJJykx1CdM6LHtkUih/QaJXySSx4=
+github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo=
+github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
 github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
 github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
@@ -420,14 +432,19 @@ github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJ
 github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE=
 github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE=
 github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0=
 github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0=
 github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
 github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
-github.com/mattn/go-colorable v0.1.9 h1:sqDoxXbdeALODt0DAeJCVp38ps9ZogZEAXjus69YV3U=
 github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
 github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
+github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
+github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
 github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
 github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
-github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=
 github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
 github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
+github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
+github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
+github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
+github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
 github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
 github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
-github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU=
 github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
 github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
+github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U=
+github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
 github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
 github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
 github.com/mattn/go-sqlite3 v1.10.0 h1:jbhqpg7tQe4SupckyijYiy0mJJ/pRyHvXf7JdWK860o=
 github.com/mattn/go-sqlite3 v1.10.0 h1:jbhqpg7tQe4SupckyijYiy0mJJ/pRyHvXf7JdWK860o=
 github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
 github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
@@ -486,6 +503,7 @@ github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJ
 github.com/openzipkin/zipkin-go v0.3.0/go.mod h1:4c3sLeE8xjNqehmF5RpAFLPLJxXscc0R4l6Zg0P1tTQ=
 github.com/openzipkin/zipkin-go v0.3.0/go.mod h1:4c3sLeE8xjNqehmF5RpAFLPLJxXscc0R4l6Zg0P1tTQ=
 github.com/openzipkin/zipkin-go v0.4.0 h1:CtfRrOVZtbDj8rt1WXjklw0kqqJQwICrCKmlfUuBUUw=
 github.com/openzipkin/zipkin-go v0.4.0 h1:CtfRrOVZtbDj8rt1WXjklw0kqqJQwICrCKmlfUuBUUw=
 github.com/openzipkin/zipkin-go v0.4.0/go.mod h1:4c3sLeE8xjNqehmF5RpAFLPLJxXscc0R4l6Zg0P1tTQ=
 github.com/openzipkin/zipkin-go v0.4.0/go.mod h1:4c3sLeE8xjNqehmF5RpAFLPLJxXscc0R4l6Zg0P1tTQ=
+github.com/paulmach/orb v0.7.1 h1:Zha++Z5OX/l168sqHK3k4z18LDvr+YAO/VjK0ReQ9rU=
 github.com/paulmach/orb v0.7.1/go.mod h1:FWRlTgl88VI1RBx/MkrwWDRhQ96ctqMCh8boXhmqB/A=
 github.com/paulmach/orb v0.7.1/go.mod h1:FWRlTgl88VI1RBx/MkrwWDRhQ96ctqMCh8boXhmqB/A=
 github.com/paulmach/protoscan v0.2.1/go.mod h1:SpcSwydNLrxUGSDvXvO0P7g7AuhJ7lcKfDlhJCDw2gY=
 github.com/paulmach/protoscan v0.2.1/go.mod h1:SpcSwydNLrxUGSDvXvO0P7g7AuhJ7lcKfDlhJCDw2gY=
 github.com/pelletier/go-toml v1.7.0 h1:7utD74fnzVc/cpcyy8sjrlFr5vYpypUixARcHIMIGuI=
 github.com/pelletier/go-toml v1.7.0 h1:7utD74fnzVc/cpcyy8sjrlFr5vYpypUixARcHIMIGuI=
@@ -494,7 +512,10 @@ github.com/pelletier/go-toml/v2 v2.0.2 h1:+jQXlF3scKIcSEKkdHzXhCTDLPFi5r1wnK6yPS
 github.com/pelletier/go-toml/v2 v2.0.2/go.mod h1:MovirKjgVRESsAvNZlAjtFwV867yGuwRkXbG66OzopI=
 github.com/pelletier/go-toml/v2 v2.0.2/go.mod h1:MovirKjgVRESsAvNZlAjtFwV867yGuwRkXbG66OzopI=
 github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
 github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
 github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
 github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
+github.com/pierrec/lz4 v2.6.1+incompatible h1:9UY3+iC23yxF0UfGaYrGplQ+79Rg+h/q9FV9ix19jjM=
 github.com/pierrec/lz4 v2.6.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
 github.com/pierrec/lz4 v2.6.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
+github.com/pierrec/lz4/v4 v4.1.14/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
+github.com/pierrec/lz4/v4 v4.1.15 h1:MO0/ucJhngq7299dKLwIMtgTfbkoSPF6AoMYDd8Q4q0=
 github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
 github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
 github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
@@ -535,8 +556,9 @@ github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1
 github.com/rabbitmq/amqp091-go v1.1.0/go.mod h1:ogQDLSOACsLPsIq0NpbtiifNZi2YOz0VTJ0kHRghqbM=
 github.com/rabbitmq/amqp091-go v1.1.0/go.mod h1:ogQDLSOACsLPsIq0NpbtiifNZi2YOz0VTJ0kHRghqbM=
 github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
 github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
 github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
 github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
-github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
 github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
 github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
+github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis=
+github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
 github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
 github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
 github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
@@ -546,6 +568,7 @@ github.com/shirou/gopsutil v2.19.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMT
 github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
 github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
 github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc=
 github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc=
 github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=
 github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=
+github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8=
 github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
 github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
 github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
 github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
 github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
 github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
@@ -569,8 +592,9 @@ github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
 github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
-github.com/stretchr/objx v0.4.0 h1:M2gUjqZET1qApGOWNSnZ49BAIMX4F/1plDv3+l31EJ4=
 github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
 github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
+github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=
+github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
 github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
 github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
@@ -580,8 +604,9 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
 github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=
 github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=
 github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
 github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
-github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
 github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
 github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
+github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=
+github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
 github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4=
 github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4=
 github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
 github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
 github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYaQ2hGm7jmxEFk=
 github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYaQ2hGm7jmxEFk=
@@ -604,6 +629,7 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
 github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
 github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
 github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
 github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
+github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
 github.com/yuin/gopher-lua v0.0.0-20200816102855-ee81675732da/go.mod h1:E1AXubJBdNmFERAOucpDIxNzeGfLzg0mYh+UfMWdChA=
 github.com/yuin/gopher-lua v0.0.0-20200816102855-ee81675732da/go.mod h1:E1AXubJBdNmFERAOucpDIxNzeGfLzg0mYh+UfMWdChA=
 github.com/yuin/gopher-lua v0.0.0-20210529063254-f4c35e4016d9 h1:k/gmLsJDWwWqbLCur2yWnJzwQEKRcAHXo6seXGuSwWw=
 github.com/yuin/gopher-lua v0.0.0-20210529063254-f4c35e4016d9 h1:k/gmLsJDWwWqbLCur2yWnJzwQEKRcAHXo6seXGuSwWw=
 github.com/yuin/gopher-lua v0.0.0-20210529063254-f4c35e4016d9/go.mod h1:E1AXubJBdNmFERAOucpDIxNzeGfLzg0mYh+UfMWdChA=
 github.com/yuin/gopher-lua v0.0.0-20210529063254-f4c35e4016d9/go.mod h1:E1AXubJBdNmFERAOucpDIxNzeGfLzg0mYh+UfMWdChA=
@@ -635,8 +661,9 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
 go.opentelemetry.io/otel v1.0.0/go.mod h1:AjRVh9A5/5DE7S+mZtTR6t8vpKKryam+0lREnfmS4cg=
 go.opentelemetry.io/otel v1.0.0/go.mod h1:AjRVh9A5/5DE7S+mZtTR6t8vpKKryam+0lREnfmS4cg=
 go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs=
 go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs=
 go.opentelemetry.io/otel v1.7.0/go.mod h1:5BdUoMIz5WEs0vt0CUEMtSSaTSHBBVwrhnz7+nrD5xk=
 go.opentelemetry.io/otel v1.7.0/go.mod h1:5BdUoMIz5WEs0vt0CUEMtSSaTSHBBVwrhnz7+nrD5xk=
-go.opentelemetry.io/otel v1.8.0 h1:zcvBFizPbpa1q7FehvFiHbQwGzmPILebO0tyqIR5Djg=
 go.opentelemetry.io/otel v1.8.0/go.mod h1:2pkj+iMj0o03Y+cW6/m8Y4WkRdYN3AvCXCnzRMp9yvM=
 go.opentelemetry.io/otel v1.8.0/go.mod h1:2pkj+iMj0o03Y+cW6/m8Y4WkRdYN3AvCXCnzRMp9yvM=
+go.opentelemetry.io/otel v1.14.0 h1:/79Huy8wbf5DnIPhemGB+zEPVwnN6fuQybr/SRXa6hM=
+go.opentelemetry.io/otel v1.14.0/go.mod h1:o4buv+dJzx8rohcUeRmWUZhqupFvzWis188WlggnNeU=
 go.opentelemetry.io/otel/exporters/jaeger v1.3.0/go.mod h1:KoYHi1BtkUPncGSRtCe/eh1ijsnePhSkxwzz07vU0Fc=
 go.opentelemetry.io/otel/exporters/jaeger v1.3.0/go.mod h1:KoYHi1BtkUPncGSRtCe/eh1ijsnePhSkxwzz07vU0Fc=
 go.opentelemetry.io/otel/exporters/jaeger v1.8.0 h1:TLLqD6kDhLPziEC7pgPrMvP9lAqdk3n1gf8DiFSnfW8=
 go.opentelemetry.io/otel/exporters/jaeger v1.8.0 h1:TLLqD6kDhLPziEC7pgPrMvP9lAqdk3n1gf8DiFSnfW8=
 go.opentelemetry.io/otel/exporters/jaeger v1.8.0/go.mod h1:GbWg+ng88rDtx+id26C34QLqw2erqJeAjsCx9AFeHfE=
 go.opentelemetry.io/otel/exporters/jaeger v1.8.0/go.mod h1:GbWg+ng88rDtx+id26C34QLqw2erqJeAjsCx9AFeHfE=
@@ -645,13 +672,15 @@ go.opentelemetry.io/otel/exporters/zipkin v1.8.0 h1:PIAiDdROZzATAFfxr5ASYuSOG0JI
 go.opentelemetry.io/otel/exporters/zipkin v1.8.0/go.mod h1:0uYAyCuGT67MFV9Z/Mmx93wGuugHw0FbxMc74fs3LNo=
 go.opentelemetry.io/otel/exporters/zipkin v1.8.0/go.mod h1:0uYAyCuGT67MFV9Z/Mmx93wGuugHw0FbxMc74fs3LNo=
 go.opentelemetry.io/otel/sdk v1.0.0/go.mod h1:PCrDHlSy5x1kjezSdL37PhbFUMjrsLRshJ2zCzeXwbM=
 go.opentelemetry.io/otel/sdk v1.0.0/go.mod h1:PCrDHlSy5x1kjezSdL37PhbFUMjrsLRshJ2zCzeXwbM=
 go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs=
 go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs=
-go.opentelemetry.io/otel/sdk v1.8.0 h1:xwu69/fNuwbSHWe/0PGS888RmjWY181OmcXDQKu7ZQk=
 go.opentelemetry.io/otel/sdk v1.8.0/go.mod h1:uPSfc+yfDH2StDM/Rm35WE8gXSNdvCg023J6HeGNO0c=
 go.opentelemetry.io/otel/sdk v1.8.0/go.mod h1:uPSfc+yfDH2StDM/Rm35WE8gXSNdvCg023J6HeGNO0c=
+go.opentelemetry.io/otel/sdk v1.14.0 h1:PDCppFRDq8A1jL9v6KMI6dYesaq+DFcDZvjsoGvxGzY=
+go.opentelemetry.io/otel/sdk v1.14.0/go.mod h1:bwIC5TjrNG6QDCHNWvW4HLHtUQ4I+VQDsnjhvyZCALM=
 go.opentelemetry.io/otel/trace v1.0.0/go.mod h1:PXTWqayeFUlJV1YDNhsJYB184+IvAH814St6o6ajzIs=
 go.opentelemetry.io/otel/trace v1.0.0/go.mod h1:PXTWqayeFUlJV1YDNhsJYB184+IvAH814St6o6ajzIs=
 go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk=
 go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk=
 go.opentelemetry.io/otel/trace v1.7.0/go.mod h1:fzLSB9nqR2eXzxPXb2JW9IKE+ScyXA48yyE4TNvoHqU=
 go.opentelemetry.io/otel/trace v1.7.0/go.mod h1:fzLSB9nqR2eXzxPXb2JW9IKE+ScyXA48yyE4TNvoHqU=
-go.opentelemetry.io/otel/trace v1.8.0 h1:cSy0DF9eGI5WIfNwZ1q2iUyGj00tGzP24dE1lOlHrfY=
 go.opentelemetry.io/otel/trace v1.8.0/go.mod h1:0Bt3PXY8w+3pheS3hQUt+wow8b1ojPaTBoTCh2zIFI4=
 go.opentelemetry.io/otel/trace v1.8.0/go.mod h1:0Bt3PXY8w+3pheS3hQUt+wow8b1ojPaTBoTCh2zIFI4=
+go.opentelemetry.io/otel/trace v1.14.0 h1:wp2Mmvj41tDsyAJXiWDWpfNsOiIyd38fy85pyKcFq/M=
+go.opentelemetry.io/otel/trace v1.14.0/go.mod h1:8avnQLK+CG77yNLUae4ea2JDQ6iT+gozhnZjy/rw9G8=
 go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
 go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
 go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
 go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
 go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=
 go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=
@@ -682,8 +711,10 @@ golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPh
 golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
 golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
 golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
 golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
-golang.org/x/crypto v0.0.0-20210920023735-84f357641f63 h1:kETrAMYZq6WVGPa8IIixL0CaEcIUNi+1WX7grUoi3y8=
 golang.org/x/crypto v0.0.0-20210920023735-84f357641f63/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.0.0-20210920023735-84f357641f63/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc=
+golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
 golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -716,8 +747,10 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB
 golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
 golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
 golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo=
 golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
+golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8=
+golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -761,8 +794,12 @@ golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qx
 golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
 golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
-golang.org/x/net v0.0.0-20220531201128-c960675eff93 h1:MYimHLfoXEpOhqd/zgoA/uoXzHB86AEky4LAx5ij9xA=
 golang.org/x/net v0.0.0-20220531201128-c960675eff93/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
 golang.org/x/net v0.0.0-20220531201128-c960675eff93/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
+golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
+golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
+golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -782,8 +819,10 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ
 golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=
 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
+golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -851,13 +890,23 @@ golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220429233432-b5fbb4746d32/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220429233432-b5fbb4746d32/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k=
 golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE=
+golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
 golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
-golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
+golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
+golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
+golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek=
+golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=
 golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -866,8 +915,11 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
 golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
-golang.org/x/text v0.3.8-0.20211105212822-18b340fc7af2 h1:GLw7MR8AfAG2GmGcmVgObFOHXYypgGjnGno25RDwn3Y=
 golang.org/x/text v0.3.8-0.20211105212822-18b340fc7af2/go.mod h1:EFNZuWvGYxIRUEX+K8UmCFwYmZjqcrnq15ZuVldZkZ0=
 golang.org/x/text v0.3.8-0.20211105212822-18b340fc7af2/go.mod h1:EFNZuWvGYxIRUEX+K8UmCFwYmZjqcrnq15ZuVldZkZ0=
+golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
+golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k=
+golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
 golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -928,12 +980,13 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f
 golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
 golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
 golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
 golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
 golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
 golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
-golang.org/x/tools v0.1.7 h1:6j8CgantCy3yc8JGBqkDLMKWqZ0RDU2g1HVgacojGWQ=
 golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo=
 golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo=
+golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
+golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM=
+golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
 google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
 google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
 google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=

+ 7 - 0
rpc/etc/message.yaml

@@ -66,3 +66,10 @@ WxTmplConfig:
 Tidb: "root:=PDT49#80Z!RVv52_z@tcp(192.168.3.217:4000)/messagetest?charset=utf8mb4&parseTime=true&loc=Local"
 Tidb: "root:=PDT49#80Z!RVv52_z@tcp(192.168.3.217:4000)/messagetest?charset=utf8mb4&parseTime=true&loc=Local"
 ClassSearchList: # 需要按照messageClass 查询的groupId
 ClassSearchList: # 需要按照messageClass 查询的groupId
   - 11  # 待办 group id
   - 11  # 待办 group id
+Clickhouse:
+  Addr: 192.168.3.207:19000
+  UserName: jytop
+  Password: pwdTopJy123
+  DbName: messageCenter
+  MaxIdleConns: 5
+  MaxOpenConns: 30

+ 29 - 19
rpc/internal/common/messageClass.go

@@ -4,7 +4,9 @@ import (
 	"app.yhyue.com/moapp/MessageCenter/entity"
 	"app.yhyue.com/moapp/MessageCenter/entity"
 	"app.yhyue.com/moapp/MessageCenter/rpc/internal/config"
 	"app.yhyue.com/moapp/MessageCenter/rpc/internal/config"
 	"app.yhyue.com/moapp/jybase/common"
 	"app.yhyue.com/moapp/jybase/common"
+	"context"
 	"fmt"
 	"fmt"
+	"log"
 	"strings"
 	"strings"
 )
 )
 
 
@@ -20,26 +22,34 @@ func InitClassSearchMap() {
 			qArr = append(qArr, fmt.Sprintf("%d", groupIDs[i]))
 			qArr = append(qArr, fmt.Sprintf("%d", groupIDs[i]))
 		}
 		}
 		// 查库
 		// 查库
-		q := "SELECT * FROM message_class where group_id in (" + strings.Join(qArr, ",") + ") order by msg_type;"
-		rs := entity.Mysql.SelectBySql(q)
-		if rs != nil && len(*rs) > 0 {
-			for i := 0; i < len(*rs); i++ {
-				groupID := common.Int64All((*rs)[i]["group_id"])
-				msgName := common.ObjToString((*rs)[i]["msg_name"])
-				msgType := common.Int64All((*rs)[i]["msg_type"])
-				img := common.ObjToString((*rs)[i]["img"])
-				// 处理成map
-				if _, ok := entity.ClassSearchMap[groupID]; !ok {
-					entity.ClassSearchMap[groupID] = []entity.MsgClass{}
-				}
-				tmp := entity.MsgClass{
-					MsgType: msgType,
-					Name:    msgName,
-					Img:     img,
-				}
-				entity.ClassSearchMap[groupID] = append(entity.ClassSearchMap[groupID], tmp)
-				entity.ClassMap[msgType] = tmp
+		q := "SELECT msg_type,msg_name as name,group_id,img FROM message_class where group_id in (" + strings.Join(qArr, ",") + ") order by msg_type;"
+		rs, err := entity.ClickhouseConn.Query(context.Background(), q)
+		if err != nil {
+			log.Println("InitClassSearchMap 查询message_class出错:", err)
+			return
+		}
+		for rs.Next() {
+			mg := entity.MsgGroup{}
+			err = rs.ScanStruct(&mg)
+			if err != nil {
+				log.Println("InitClassSearchMap 初始化rs ScanStruct出错:", err)
+				return
+			}
+			groupID := common.Int64All(mg.GroupId)
+			msgName := common.ObjToString(mg.Name)
+			msgType := common.Int64All(mg.Msg_type)
+			img := common.ObjToString(mg.Img)
+			// 处理成map
+			if _, ok := entity.ClassSearchMap[groupID]; !ok {
+				entity.ClassSearchMap[groupID] = []entity.MsgClass{}
+			}
+			tmp := entity.MsgClass{
+				MsgType: msgType,
+				Name:    msgName,
+				Img:     img,
 			}
 			}
+			entity.ClassSearchMap[groupID] = append(entity.ClassSearchMap[groupID], tmp)
+			entity.ClassMap[msgType] = tmp
 		}
 		}
 	}
 	}
 }
 }

+ 289 - 0
rpc/internal/common/newSendMsgService.go

@@ -0,0 +1,289 @@
+package common
+
+import (
+	"app.yhyue.com/moapp/MessageCenter/entity"
+	"app.yhyue.com/moapp/MessageCenter/rpc/type/message"
+	"app.yhyue.com/moapp/MessageCenter/util"
+	"app.yhyue.com/moapp/jybase/common"
+	"context"
+	"errors"
+	"fmt"
+	"github.com/zeromicro/go-zero/core/logx"
+	"log"
+	"strconv"
+	"strings"
+	"sync"
+	"time"
+)
+
+var MsgGroupIdMap map[int]int
+
+func SetMsgSummary(newMsg, groupId, msgType int64) error {
+	//更新所有消息
+	if groupId == 11 {
+		//groupId = msgType
+		//根据msgType更新待办二级分类汇总
+		err1 := entity.ClickhouseConn.Exec(context.Background(), fmt.Sprintf(`alter table message_summary UPDATE msg_bitmap = bitmapOr(msg_bitmap,bitmapBuild([toUInt64(%d)])) where group_id = %d`, newMsg, msgType))
+		if err1 != nil {
+			//插入失败
+			return err1
+		}
+	}
+	err := entity.ClickhouseConn.Exec(context.Background(), fmt.Sprintf(`alter table message_summary UPDATE msg_bitmap = bitmapOr(msg_bitmap,bitmapBuild([toUInt64(%d)])) where group_id = %d`, newMsg, groupId))
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+func MultSave11(this *message.MultipleSaveMsgReq) (int64, string) {
+	userIdArr := strings.Split(this.UserIds, ",")
+	positionIdArr := strings.Split(this.PositionIds, ",")
+	if len(userIdArr) == 0 {
+		return 0, "无效的用户id"
+	}
+	wg := &sync.WaitGroup{}
+	group_id := MsgGroupIdMap[int(this.MsgType)]
+
+	for i := 0; i < len(userIdArr); i++ {
+		if userIdArr[i] == "" {
+			continue
+		}
+		//查询
+		wg.Add(1)
+		entity.SaveConcurrencyChan <- 1
+		var positionId int64
+		if len(positionIdArr) == len(userIdArr) {
+			positionId = common.Int64All(positionIdArr[i])
+		}
+
+		go func(v string, positionId int64) {
+			defer func() {
+				<-entity.SaveConcurrencyChan
+				wg.Done()
+			}()
+			//消息数组
+			nTime := time.Now().Format("2006-01-02 15:04:05")
+			sql3 := `INSERT INTO message(appid,receive_userid,receive_name,send_userid,send_name,title,content,msg_type,link,cite_id,createtime,isRead,isdel,msg_log_id,show_buoy,show_content,group_id,position_id) values ("%s",'%s','%s','%s','%s','%s','%s',%d,'%s',0,'%s',0,1,%d,%d,'%s',%d,?);`
+			sql3 = fmt.Sprintf(sql3, this.Appid, v, "", this.SendUserId, this.SendName, this.Title, this.Content, this.MsgType, this.Link, nTime, this.MsgLogId, this.ShowBuoy, this.ShowContent, group_id)
+			in := entity.Mysql.InsertBySql(sql3, common.If(positionId != 0, positionId, nil))
+			logx.Info("插入消息返回 in1 id:", in, "消息类型:", this.MsgType, "用户id:", v)
+			if in > -1 {
+				ok := MsgCountAdd(v, this.Appid, util.Int64All(group_id), this.MsgType)
+				if !ok {
+					log.Println("存redis:", ok, v)
+				}
+			}
+
+			if in > -1 {
+				//微信推送模板消息、app push
+				pushData := WxTmplAndPush{
+					MsgType:     this.MsgType,
+					Title:       this.Title,
+					Content:     this.Content,
+					WxPushUrl:   this.WxPushUrl,
+					AppPushUrl:  this.AppPushUrl,
+					ProductName: this.ProductName,
+					OrderId:     this.OrderId,
+					OrderMoney:  this.OrderMoney,
+					Row4:        this.Row4,
+					SendUserId:  this.SendUserId,
+				}
+				SentWxTmplAndAppPush(pushData, v, group_id)
+			} else {
+				logx.Error(fmt.Sprintf("SendAppMsg uId %s  发送消息失败", v))
+			}
+		}(userIdArr[i], positionId)
+	}
+	wg.Wait()
+	return 0, ""
+}
+
+func NewUserSendMsg(in *message.NewUserInsertMsgReq) string {
+	userIdArr := strings.Split(in.UserIds, ",")
+	positionIdArr := strings.Split(in.PositionIds, ",")
+	if len(userIdArr) == 0 {
+		return "无效的用户id"
+	}
+	wg := &sync.WaitGroup{}
+	group_id := MsgGroupIdMap[int(in.MsgType)]
+	for i := 0; i < len(userIdArr); i++ {
+		if userIdArr[i] == "" {
+			continue
+		}
+		//查询
+		wg.Add(1)
+		entity.SaveConcurrencyChan <- 1
+		var positionId int64
+		if len(positionIdArr) == len(userIdArr) {
+			positionId = common.Int64All(positionIdArr[i])
+		}
+
+		go func(v string, positionId int64) {
+			defer func() {
+				<-entity.SaveConcurrencyChan
+				wg.Done()
+			}()
+
+			row := entity.ClickhouseConn.QueryRow(context.Background(), fmt.Sprintf("SELECT COUNT(*) from message_user_summary where userId = '%s'", v))
+			var count uint64
+			row.Scan(&count)
+			if count > 0 { //存在则更新
+				err1 := entity.ClickhouseConn.Exec(context.Background(), fmt.Sprintf(`alter table message_user_summary UPDATE allMsg = bitmapOr(allMsg,bitmapBuild([toUInt64(%d)])) where userId = '%s'`, in.MsgLogId, v))
+				if err1 != nil {
+					log.Println("新用户update message_user_summary表出错,error", err1)
+					return
+				}
+			} else {
+				//新用户需要insert
+				sql := "INSERT INTO message_user_summary values "
+				sql += fmt.Sprintf(" ('%s',bitmapBuild([toUInt64(%d)]),bitmapBuild([toUInt64(0)])) ", v, int(in.MsgLogId))
+				fmt.Println("sql", sql)
+				err1 := entity.ClickhouseConn.Exec(context.Background(), sql)
+				if err1 != nil {
+					//插入失败
+					log.Println("新用户insert message_user_summary表出错,error", err1)
+					return
+				}
+			}
+			//微信推送模板消息、app push
+			pushData := WxTmplAndPush{
+				MsgType:     in.MsgType,
+				Title:       in.Title,
+				Content:     in.Content,
+				WxPushUrl:   in.WxPushUrl,
+				AppPushUrl:  in.AppPushUrl,
+				ProductName: in.ProductName,
+				OrderId:     in.OrderId,
+				OrderMoney:  in.OrderMoney,
+				Row4:        in.Row4,
+			}
+			SentWxTmplAndAppPush(pushData, v, group_id)
+		}(userIdArr[i], positionId)
+	}
+	wg.Wait()
+	return ""
+}
+
+func UpdateUserMsgSummary(in *message.BitmapSaveMsgReq) error {
+	userIdArr := strings.Split(in.UserIds, ",")
+	//positionIdArr := strings.Split(in.PositionIds, ",")
+	if len(userIdArr) == 0 {
+		return errors.New("无效的用户id")
+	}
+	wg := &sync.WaitGroup{}
+	group_id := MsgGroupIdMap[int(in.MsgType)]
+	str := ""
+	for k, v := range userIdArr {
+		if k != 0 {
+			str += ","
+		}
+		str += "'" + v + "'"
+	}
+	fmt.Println(fmt.Sprintf(`alter table message_user_summary UPDATE allMsg = bitmapOr(allMsg,bitmapBuild([toUInt64(%d)])) where userId in (%s)`, in.MsgLogId, str))
+	err1 := entity.ClickhouseConn.Exec(context.Background(), fmt.Sprintf(`alter table message_user_summary UPDATE allMsg = bitmapOr(allMsg,bitmapBuild([toUInt64(%d)])) where userId in (%s)`, in.MsgLogId, str))
+	if err1 != nil {
+		return err1
+	}
+	for i := 0; i < len(userIdArr); i++ {
+		if userIdArr[i] == "" {
+			continue
+		}
+		//查询
+		wg.Add(1)
+		entity.SaveConcurrencyChan <- 1
+		/*var positionId int64
+		if len(positionIdArr) == len(userIdArr) {
+			positionId = common.Int64All(positionIdArr[i])
+		}*/
+		go func(v string) {
+			defer func() {
+				<-entity.SaveConcurrencyChan
+				wg.Done()
+			}()
+			//微信推送模板消息、app push
+			pushData := WxTmplAndPush{
+				MsgType:     in.MsgType,
+				Title:       in.Title,
+				Content:     in.Content,
+				WxPushUrl:   in.WxPushUrl,
+				AppPushUrl:  in.AppPushUrl,
+				ProductName: in.ProductName,
+				OrderId:     in.OrderId,
+				OrderMoney:  in.OrderMoney,
+				Row4:        in.Row4,
+			}
+			SentWxTmplAndAppPush(pushData, v, group_id)
+		}(userIdArr[i])
+	}
+	wg.Wait()
+	return nil
+}
+
+func ConvertToBitmap(num int) (res []uint32) {
+	binary := strconv.FormatInt(int64(num), 2)
+	total := len(binary)
+	for i := total - 1; i >= 0; i-- {
+		if binary[i] == '1' {
+			res = append(res, uint32(total-i))
+		}
+	}
+	return
+}
+
+type WxTmplAndPush struct {
+	MsgType     int64
+	Title       string
+	Content     string
+	WxPushUrl   string
+	AppPushUrl  string
+	ProductName string
+	OrderId     string
+	OrderMoney  string
+	Row4        string
+	SendUserId  string
+}
+
+func SentWxTmplAndAppPush(this WxTmplAndPush, v string, group_id int) {
+	nTime := time.Now().Format("2006-01-02 15:04:05")
+	//发送消息成功,推送微信、app
+	//fmt.Println("this.MsgType", this.MsgType)
+	pushConfig, err := GetWxTmplConfig(this.MsgType)
+	if err != nil {
+		logx.Error(fmt.Sprintf("SendWxTmplMsg uId %s  Error %s", v, err.Error()))
+	}
+	p := &WxTmplPush{
+		Config: pushConfig,
+	}
+	p.MgoId = v
+	if this.MsgType == 10 {
+		this.Title = this.ProductName
+		this.Content = this.OrderId
+		nTime = this.OrderMoney
+	}
+	// 消息模版 工单类型 {{thing19.DATA}} 工单标题 {{thing6.DATA}} 项目名称 {{thing13.DATA}} 服务时间 {{time25.DATA}} 服务地址 {{thing26.DATA}}
+	if this.MsgType != 1 && this.MsgType != 10 {
+		err = p.SendMsg(this.WxPushUrl, this.Title, this.Content, nTime, this.Row4)
+		if err != nil {
+			logx.Error(fmt.Sprintf("SendWxTmplMsg uId %s  Error %s", v, err.Error()))
+		} else {
+			logx.Infof("SendWxTmplMsg uId success %s ", v)
+		}
+	}
+	if this.MsgType == 1 {
+		mst := new(WxTmplConfig)
+		mst.Switch = AppPushMsgType[group_id]
+		p.Config = mst
+	}
+	uData := p.GetUserPushInfo()
+	//app推送
+	if this.MsgType != 10 {
+		category := ""
+		if this.SendUserId == "cbgl" {
+			category = "服务通知_工作事项"
+		}
+		if err = AppPushMsg(uData, AppPushMsgType[group_id], this.AppPushUrl, this.Title, this.Content, this.MsgType, category); err != nil {
+			logx.Error(fmt.Sprintf("SendAppMsg uId %s  Error %s", v, err.Error()))
+		}
+	}
+}

+ 45 - 11
rpc/internal/common/sendWxTmplMsg.go

@@ -1,6 +1,7 @@
 package common
 package common
 
 
 import (
 import (
+	"context"
 	"encoding/json"
 	"encoding/json"
 	"fmt"
 	"fmt"
 	"log"
 	"log"
@@ -41,22 +42,39 @@ const CacheDb = "msgCount"
 
 
 func MessageType() (func() map[int64]WxTmplConfig, []map[string]interface{}) {
 func MessageType() (func() map[int64]WxTmplConfig, []map[string]interface{}) {
 	var data []map[string]interface{}
 	var data []map[string]interface{}
-	rData1 := entity.Mysql.SelectBySql(`SELECT * FROM message_group ORDER BY sequence ASC`)
+	rData1, err := entity.ClickhouseConn.Query(context.Background(), `SELECT group_id,name,switch,img,sequence FROM message_group ORDER BY sequence ASC`)
+	if err != nil {
+		log.Println("MessageType SELECT message_group出错:", err)
+		return nil, nil
+	}
 	switchName := map[int64]WxTmplConfig{}
 	switchName := map[int64]WxTmplConfig{}
 	appMsgType := map[int]string{}
 	appMsgType := map[int]string{}
-	if rData1 != nil && len(*rData1) > 0 {
-		data = *rData1
-		for _, v := range *rData1 {
-			groupId := util.IntAll(v["group_id"])
-			switchs := util.ObjToString(v["switch"])
-			appMsgType[groupId] = switchs
+	for rData1.Next() {
+		group := entity.MsgGroup{}
+		err = rData1.ScanStruct(&group)
+		if err != nil {
+			log.Println("MessageType 初始化rData1 ScanStruct出错:", err)
+			return nil, nil
 		}
 		}
-		AppPushMsgType = appMsgType
+		groupId := util.IntAll(group.GroupId)
+		switchs := util.ObjToString(group.Switch)
+		appMsgType[groupId] = switchs
 	}
 	}
+	AppPushMsgType = appMsgType
 
 
-	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 != "" {
+	rData2, err := entity.ClickhouseConn.Query(context.Background(), `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`)
+	if err != nil {
+		log.Println("MessageType SELECT message_group,message_class出错:", err)
+		return nil, nil
+	}
+	for rData2.Next() {
+		gc := entity.GroupClass{}
+		err = rData2.ScanStruct(&gc)
+		if err != nil {
+			log.Println("MessageType 初始化rData2 ScanStruct出错:", err)
+			return nil, nil
+		}
+		if msg_type, settingKey, messageName, tmplId, tmplValue := util.Int64All(gc.Msg_type), util.ObjToString(gc.Switch), util.ObjToString(gc.Msg_name), util.ObjToString(gc.Wxtmpl_Id), util.ObjToString(gc.Wxtmp_value); msg_type > 0 && settingKey != "" && messageName != "" && tmplId != "" && tmplValue != "" {
 			switchName[msg_type] = WxTmplConfig{
 			switchName[msg_type] = WxTmplConfig{
 				Name:      messageName,
 				Name:      messageName,
 				Switch:    settingKey,
 				Switch:    settingKey,
@@ -65,6 +83,22 @@ func MessageType() (func() map[int64]WxTmplConfig, []map[string]interface{}) {
 			}
 			}
 		}
 		}
 	}
 	}
+	rData3, err := entity.ClickhouseConn.Query(context.Background(), "SELECT msg_type,group_id FROM message_class WHERE msg_type < 999")
+	if err != nil {
+		log.Println("MessageType SELECT message_class出错:", err)
+		return nil, nil
+	}
+	mg := map[int]int{}
+	for rData3.Next() {
+		group := entity.MsgGroup{}
+		err = rData3.ScanStruct(&group)
+		if err != nil {
+			log.Println("MessageType 初始化rData1 ScanStruct出错:", err)
+			return nil, nil
+		}
+		mg[common.IntAll(group.Msg_type)] = common.IntAll(group.GroupId)
+	}
+	MsgGroupIdMap = mg
 
 
 	return func() map[int64]WxTmplConfig {
 	return func() map[int64]WxTmplConfig {
 		return switchName
 		return switchName

+ 10 - 0
rpc/internal/config/config.go

@@ -25,6 +25,16 @@ type Config struct {
 	} `json:"mail"`
 	} `json:"mail"`
 	TidbEng         string  `json:"Tidb"`
 	TidbEng         string  `json:"Tidb"`
 	ClassSearchList []int64 `json:"ClassSearchList"` // 需要按照messageclass 查询的groupId
 	ClassSearchList []int64 `json:"ClassSearchList"` // 需要按照messageclass 查询的groupId
+	Clickhouse      *CHouseConfig
+}
+
+type CHouseConfig struct {
+	Addr         string
+	UserName     string
+	Password     string
+	DbName       string
+	MaxIdleConns int
+	MaxOpenConns int
 }
 }
 
 
 type mysqlConfig struct {
 type mysqlConfig struct {

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

@@ -22,6 +22,24 @@ func NewMessageServer(svcCtx *svc.ServiceContext) *MessageServer {
 	}
 	}
 }
 }
 
 
+// 发送消息更新一次消息汇总表
+func (s *MessageServer) UpdateMsgSummary(ctx context.Context, in *message.UpdateMsgSummaryReq) (*message.Response, error) {
+	l := logic.NewUpdateMsgSummaryLogic(ctx, s.svcCtx)
+	return l.UpdateMsgSummary(in)
+}
+
+// 新用户发送消息
+func (s *MessageServer) NewUserMsg(ctx context.Context, in *message.NewUserInsertMsgReq) (*message.Response, error) {
+	l := logic.NewNewUserMsgLogic(ctx, s.svcCtx)
+	return l.NewUserMsg(in)
+}
+
+// bitmap保存消息
+func (s *MessageServer) BitmapSaveMsg(ctx context.Context, in *message.BitmapSaveMsgReq) (*message.MultipleSaveMsgResp, error) {
+	l := logic.NewBitmapSaveMsgLogic(ctx, s.svcCtx)
+	return l.BitmapSaveMsg(in)
+}
+
 // 批量保存消息
 // 批量保存消息
 func (s *MessageServer) MultipleSaveMsg(ctx context.Context, in *message.MultipleSaveMsgReq) (*message.MultipleSaveMsgResp, error) {
 func (s *MessageServer) MultipleSaveMsg(ctx context.Context, in *message.MultipleSaveMsgReq) (*message.MultipleSaveMsgResp, error) {
 	l := logic.NewMultipleSaveMsgLogic(ctx, s.svcCtx)
 	l := logic.NewMultipleSaveMsgLogic(ctx, s.svcCtx)

+ 41 - 9
rpc/message.go

@@ -16,14 +16,18 @@ import (
 	m "app.yhyue.com/moapp/jybase/mongodb"
 	m "app.yhyue.com/moapp/jybase/mongodb"
 	"app.yhyue.com/moapp/jybase/mysql"
 	"app.yhyue.com/moapp/jybase/mysql"
 	"app.yhyue.com/moapp/jybase/redis"
 	"app.yhyue.com/moapp/jybase/redis"
+	"context"
 	"flag"
 	"flag"
 	"fmt"
 	"fmt"
+	"github.com/ClickHouse/clickhouse-go/v2"
 	"github.com/go-xorm/xorm"
 	"github.com/go-xorm/xorm"
+	_ "github.com/gogf/gf/contrib/drivers/clickhouse/v2"
 	"github.com/zeromicro/go-zero/core/conf"
 	"github.com/zeromicro/go-zero/core/conf"
 	"github.com/zeromicro/go-zero/core/logx"
 	"github.com/zeromicro/go-zero/core/logx"
 	"github.com/zeromicro/go-zero/zrpc"
 	"github.com/zeromicro/go-zero/zrpc"
 	"google.golang.org/grpc"
 	"google.golang.org/grpc"
 	"log"
 	"log"
+	"time"
 )
 )
 
 
 var configFile = flag.String("f", "etc/message.yaml", "the config file")
 var configFile = flag.String("f", "etc/message.yaml", "the config file")
@@ -56,16 +60,12 @@ func main() {
 func init() {
 func init() {
 	conf.MustLoad(*configFile, &config.ConfigJson)
 	conf.MustLoad(*configFile, &config.ConfigJson)
 	log.Println("开始初始化数据库。。。。。")
 	log.Println("开始初始化数据库。。。。。")
-	//初始化mysql
-	entity.Mysql = &mysql.Mysql{
-		Address:      config.ConfigJson.DataSource.Address,
-		UserName:     config.ConfigJson.DataSource.UserName,
-		PassWord:     config.ConfigJson.DataSource.PassWord,
-		DBName:       config.ConfigJson.DataSource.DbName,
-		MaxOpenConns: config.ConfigJson.DataSource.MaxOpenConns,
-		MaxIdleConns: config.ConfigJson.DataSource.MaxIdleConns,
+	//初始化clickhouse
+	err := connectClickhouse(config.ConfigJson.Clickhouse)
+	if err != nil {
+		log.Println("初始化clickhouse出错:", err)
 	}
 	}
-	entity.Mysql.Init()
+
 	common.AllMsgType, entity.MessageColumn = common.MessageType()
 	common.AllMsgType, entity.MessageColumn = common.MessageType()
 	// 初始化需要展示消息细化分类的groupid 和对应的class信息
 	// 初始化需要展示消息细化分类的groupid 和对应的class信息
 	common.InitClassSearchMap()
 	common.InitClassSearchMap()
@@ -125,3 +125,35 @@ func init() {
 	entity.Engine, _ = xorm.NewEngine("mysql", config.ConfigJson.TidbEng)
 	entity.Engine, _ = xorm.NewEngine("mysql", config.ConfigJson.TidbEng)
 	entity.Engine.ShowSQL(true)
 	entity.Engine.ShowSQL(true)
 }
 }
+
+// 创建clickhouse连接
+func connectClickhouse(cHouseConfig *config.CHouseConfig) error {
+	var (
+		ctx = context.Background()
+		err error
+	)
+	entity.ClickhouseConn, err = clickhouse.Open(&clickhouse.Options{
+		Addr:         []string{cHouseConfig.Addr},
+		DialTimeout:  10 * time.Second,
+		MaxIdleConns: cHouseConfig.MaxIdleConns,
+		MaxOpenConns: cHouseConfig.MaxOpenConns,
+		Auth: clickhouse.Auth{
+			Database: cHouseConfig.DbName,
+			Username: cHouseConfig.UserName,
+			Password: cHouseConfig.Password,
+		},
+		Debugf: func(format string, v ...interface{}) {
+			fmt.Printf(format, v)
+		},
+	})
+	if err != nil {
+		return err
+	}
+	if err := entity.ClickhouseConn.Ping(ctx); err != nil {
+		if exception, ok := err.(*clickhouse.Exception); ok {
+			fmt.Printf("Exception [%d] %s \n%s\n", exception.Code, exception.Message, exception.StackTrace)
+		}
+		return err
+	}
+	return nil
+}

+ 51 - 9
rpc/message.proto

@@ -250,15 +250,6 @@ message UserUnreadMsgListRes {
     int64 count = 4; //总数
     int64 count = 4; //总数
 }
 }
 
 
-// 剑鱼学堂模版消息
-//message JySchoolMsg {
-//  string userIds = 1;  //接受人 mongo_userId(多个用,分割)
-//  string title = 2;    //课程名称
-//  string date = 3;     //课程时间
-//  string address = 4;  //课程地点
-//  string url = 5;      //消息跳转连接
-//}
-
 // 剑鱼系统通用模版
 // 剑鱼系统通用模版
 message WxTmplMsgRequest {
 message WxTmplMsgRequest {
   string userIds = 1;      //接受人 mongo_userId(多个用,分割)
   string userIds = 1;      //接受人 mongo_userId(多个用,分割)
@@ -282,7 +273,58 @@ message MsgOpenLogReq{
     string appId = 4;
     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;
+}
+message UpdateMsgSummaryReq{
+    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;
+}
+
 service Message {
 service Message {
+    //发送消息更新一次消息汇总表
+    rpc UpdateMsgSummary (UpdateMsgSummaryReq) returns (Response);
+    //新用户发送消息
+    rpc NewUserMsg (NewUserInsertMsgReq) returns (Response);
+    //bitmap保存消息
+    rpc bitmapSaveMsg (BitmapSaveMsgReq) returns (multipleSaveMsgResp);
     //批量保存消息
     //批量保存消息
     rpc multipleSaveMsg (multipleSaveMsgReq) returns (multipleSaveMsgResp);
     rpc multipleSaveMsg (multipleSaveMsgReq) returns (multipleSaveMsgResp);
     // 修改消息阅读状态
     // 修改消息阅读状态

+ 0 - 160
rpc/message/message.go

@@ -1,160 +0,0 @@
-// Code generated by goctl. DO NOT EDIT!
-// Source: message.proto
-
-package message
-
-import (
-	"context"
-
-	"app.yhyue.com/moapp/MessageCenter/rpc/type/message"
-
-	"github.com/zeromicro/go-zero/zrpc"
-	"google.golang.org/grpc"
-)
-
-type (
-	AllSortData            = message.AllSortData
-	BuoyMessages           = message.BuoyMessages
-	ChangeReadStatusReq    = message.ChangeReadStatusReq
-	ClearUnreadMsgReq      = message.ClearUnreadMsgReq
-	CustomWxTpl            = message.CustomWxTpl
-	FindUserBuoyMsgReq     = message.FindUserBuoyMsgReq
-	FindUserBuoyMsgRes     = message.FindUserBuoyMsgRes
-	FindUserMsgReq         = message.FindUserMsgReq
-	FindUserMsgRes         = message.FindUserMsgRes
-	GetClassUnreadCountReq = message.GetClassUnreadCountReq
-	GetLastMessageReq      = message.GetLastMessageReq
-	GetLastMessageRes      = message.GetLastMessageRes
-	GetMsgTypeReq          = message.GetMsgTypeReq
-	GetMsgTypeRes          = message.GetMsgTypeRes
-	GetUnreadClassCountReq = message.GetUnreadClassCountReq
-	GetUnreadClassCountRes = message.GetUnreadClassCountRes
-	MessageDetailReq       = message.MessageDetailReq
-	MessageDetailResp      = message.MessageDetailResp
-	Messages               = message.Messages
-	MsgOpenLogReq          = message.MsgOpenLogReq
-	MsgTypes               = message.MsgTypes
-	MultipleSaveMsgReq     = message.MultipleSaveMsgReq
-	MultipleSaveMsgResp    = message.MultipleSaveMsgResp
-	ResCount               = message.ResCount
-	Response               = message.Response
-	SendMsgResponse        = message.SendMsgResponse
-	TmplItem               = message.TmplItem
-	User                   = message.User
-	UserMsgList            = message.UserMsgList
-	UserMsgListReq         = message.UserMsgListReq
-	UserMsgListRes         = message.UserMsgListRes
-	UserUnreadMsgListReq   = message.UserUnreadMsgListReq
-	UserUnreadMsgListRes   = message.UserUnreadMsgListRes
-	WxTmplMsgRequest       = message.WxTmplMsgRequest
-	WxTmplResponse         = message.WxTmplResponse
-
-	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用户消息列表
-		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)
-	}
-
-	defaultMessage struct {
-		cli zrpc.Client
-	}
-)
-
-func NewMessage(cli zrpc.Client) Message {
-	return &defaultMessage{
-		cli: cli,
-	}
-}
-
-// 批量保存消息
-func (m *defaultMessage) MultipleSaveMsg(ctx context.Context, in *MultipleSaveMsgReq, opts ...grpc.CallOption) (*MultipleSaveMsgResp, error) {
-	client := message.NewMessageClient(m.cli.Conn())
-	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...)
-}
-
-// 查看详细详情
-func (m *defaultMessage) FindMessageDetail(ctx context.Context, in *MessageDetailReq, opts ...grpc.CallOption) (*MessageDetailResp, error) {
-	client := message.NewMessageClient(m.cli.Conn())
-	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用户消息列表
-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...)
-}

+ 29 - 0
rpc/messageclient/message.go

@@ -14,9 +14,11 @@ import (
 
 
 type (
 type (
 	AllSortData            = message.AllSortData
 	AllSortData            = message.AllSortData
+	BitmapSaveMsgReq       = message.BitmapSaveMsgReq
 	BuoyMessages           = message.BuoyMessages
 	BuoyMessages           = message.BuoyMessages
 	ChangeReadStatusReq    = message.ChangeReadStatusReq
 	ChangeReadStatusReq    = message.ChangeReadStatusReq
 	ClearUnreadMsgReq      = message.ClearUnreadMsgReq
 	ClearUnreadMsgReq      = message.ClearUnreadMsgReq
+	CustomWxTpl            = message.CustomWxTpl
 	FindUserBuoyMsgReq     = message.FindUserBuoyMsgReq
 	FindUserBuoyMsgReq     = message.FindUserBuoyMsgReq
 	FindUserBuoyMsgRes     = message.FindUserBuoyMsgRes
 	FindUserBuoyMsgRes     = message.FindUserBuoyMsgRes
 	FindUserMsgReq         = message.FindUserMsgReq
 	FindUserMsgReq         = message.FindUserMsgReq
@@ -35,9 +37,12 @@ type (
 	MsgTypes               = message.MsgTypes
 	MsgTypes               = message.MsgTypes
 	MultipleSaveMsgReq     = message.MultipleSaveMsgReq
 	MultipleSaveMsgReq     = message.MultipleSaveMsgReq
 	MultipleSaveMsgResp    = message.MultipleSaveMsgResp
 	MultipleSaveMsgResp    = message.MultipleSaveMsgResp
+	NewUserInsertMsgReq    = message.NewUserInsertMsgReq
 	ResCount               = message.ResCount
 	ResCount               = message.ResCount
 	Response               = message.Response
 	Response               = message.Response
 	SendMsgResponse        = message.SendMsgResponse
 	SendMsgResponse        = message.SendMsgResponse
+	TmplItem               = message.TmplItem
+	UpdateMsgSummaryReq    = message.UpdateMsgSummaryReq
 	User                   = message.User
 	User                   = message.User
 	UserMsgList            = message.UserMsgList
 	UserMsgList            = message.UserMsgList
 	UserMsgListReq         = message.UserMsgListReq
 	UserMsgListReq         = message.UserMsgListReq
@@ -48,6 +53,12 @@ type (
 	WxTmplResponse         = message.WxTmplResponse
 	WxTmplResponse         = message.WxTmplResponse
 
 
 	Message interface {
 	Message interface {
+		// 发送消息更新一次消息汇总表
+		UpdateMsgSummary(ctx context.Context, in *UpdateMsgSummaryReq, opts ...grpc.CallOption) (*Response, error)
+		// 新用户发送消息
+		NewUserMsg(ctx context.Context, in *NewUserInsertMsgReq, opts ...grpc.CallOption) (*Response, error)
+		// bitmap保存消息
+		BitmapSaveMsg(ctx context.Context, in *BitmapSaveMsgReq, opts ...grpc.CallOption) (*MultipleSaveMsgResp, error)
 		// 批量保存消息
 		// 批量保存消息
 		MultipleSaveMsg(ctx context.Context, in *MultipleSaveMsgReq, opts ...grpc.CallOption) (*MultipleSaveMsgResp, error)
 		MultipleSaveMsg(ctx context.Context, in *MultipleSaveMsgReq, opts ...grpc.CallOption) (*MultipleSaveMsgResp, error)
 		//  修改消息阅读状态
 		//  修改消息阅读状态
@@ -85,6 +96,24 @@ func NewMessage(cli zrpc.Client) Message {
 	}
 	}
 }
 }
 
 
+// 发送消息更新一次消息汇总表
+func (m *defaultMessage) UpdateMsgSummary(ctx context.Context, in *UpdateMsgSummaryReq, opts ...grpc.CallOption) (*Response, error) {
+	client := message.NewMessageClient(m.cli.Conn())
+	return client.UpdateMsgSummary(ctx, in, opts...)
+}
+
+// 新用户发送消息
+func (m *defaultMessage) NewUserMsg(ctx context.Context, in *NewUserInsertMsgReq, opts ...grpc.CallOption) (*Response, error) {
+	client := message.NewMessageClient(m.cli.Conn())
+	return client.NewUserMsg(ctx, in, opts...)
+}
+
+// bitmap保存消息
+func (m *defaultMessage) BitmapSaveMsg(ctx context.Context, in *BitmapSaveMsgReq, opts ...grpc.CallOption) (*MultipleSaveMsgResp, error) {
+	client := message.NewMessageClient(m.cli.Conn())
+	return client.BitmapSaveMsg(ctx, in, opts...)
+}
+
 // 批量保存消息
 // 批量保存消息
 func (m *defaultMessage) MultipleSaveMsg(ctx context.Context, in *MultipleSaveMsgReq, opts ...grpc.CallOption) (*MultipleSaveMsgResp, error) {
 func (m *defaultMessage) MultipleSaveMsg(ctx context.Context, in *MultipleSaveMsgReq, opts ...grpc.CallOption) (*MultipleSaveMsgResp, error) {
 	client := message.NewMessageClient(m.cli.Conn())
 	client := message.NewMessageClient(m.cli.Conn())

+ 574 - 34
rpc/type/message/message.pb.go

@@ -2756,6 +2756,420 @@ func (x *MsgOpenLogReq) GetAppId() string {
 	return ""
 	return ""
 }
 }
 
 
+//新用户消息调用接口
+type NewUserInsertMsgReq struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	UserIds     string `protobuf:"bytes,1,opt,name=userIds,proto3" json:"userIds,omitempty"`
+	Title       string `protobuf:"bytes,5,opt,name=title,proto3" json:"title,omitempty"`              //主题
+	Content     string `protobuf:"bytes,6,opt,name=content,proto3" json:"content,omitempty"`          //内容
+	MsgType     int64  `protobuf:"varint,7,opt,name=msgType,proto3" json:"msgType,omitempty"`         //消息类型 1:客服   2:系统通知  3:营销   4:用户会话
+	Link        string `protobuf:"bytes,8,opt,name=link,proto3" json:"link,omitempty"`                //跳转链接
+	Appid       string `protobuf:"bytes,10,opt,name=appid,proto3" json:"appid,omitempty"`             //应用标识
+	MsgLogId    int64  `protobuf:"varint,11,opt,name=msgLogId,proto3" json:"msgLogId,omitempty"`      //消息记录表id
+	PositionIds string `protobuf:"bytes,14,opt,name=positionIds,proto3" json:"positionIds,omitempty"` // 职位id  逗号分割
+	Row4        string `protobuf:"bytes,15,opt,name=row4,proto3" json:"row4,omitempty"`
+	ProductName string `protobuf:"bytes,16,opt,name=productName,proto3" json:"productName,omitempty"`
+	OrderId     string `protobuf:"bytes,17,opt,name=orderId,proto3" json:"orderId,omitempty"`
+	OrderMoney  string `protobuf:"bytes,18,opt,name=orderMoney,proto3" json:"orderMoney,omitempty"`
+	Identity    string `protobuf:"bytes,19,opt,name=identity,proto3" json:"identity,omitempty"`
+	AppPushUrl  string `protobuf:"bytes,20,opt,name=appPushUrl,proto3" json:"appPushUrl,omitempty"`
+	WxPushUrl   string `protobuf:"bytes,21,opt,name=wxPushUrl,proto3" json:"wxPushUrl,omitempty"`
+	IosPushUrl  string `protobuf:"bytes,22,opt,name=iosPushUrl,proto3" json:"iosPushUrl,omitempty"`
+}
+
+func (x *NewUserInsertMsgReq) Reset() {
+	*x = NewUserInsertMsgReq{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_message_proto_msgTypes[35]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *NewUserInsertMsgReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*NewUserInsertMsgReq) ProtoMessage() {}
+
+func (x *NewUserInsertMsgReq) 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 NewUserInsertMsgReq.ProtoReflect.Descriptor instead.
+func (*NewUserInsertMsgReq) Descriptor() ([]byte, []int) {
+	return file_message_proto_rawDescGZIP(), []int{35}
+}
+
+func (x *NewUserInsertMsgReq) GetUserIds() string {
+	if x != nil {
+		return x.UserIds
+	}
+	return ""
+}
+
+func (x *NewUserInsertMsgReq) GetTitle() string {
+	if x != nil {
+		return x.Title
+	}
+	return ""
+}
+
+func (x *NewUserInsertMsgReq) GetContent() string {
+	if x != nil {
+		return x.Content
+	}
+	return ""
+}
+
+func (x *NewUserInsertMsgReq) GetMsgType() int64 {
+	if x != nil {
+		return x.MsgType
+	}
+	return 0
+}
+
+func (x *NewUserInsertMsgReq) GetLink() string {
+	if x != nil {
+		return x.Link
+	}
+	return ""
+}
+
+func (x *NewUserInsertMsgReq) GetAppid() string {
+	if x != nil {
+		return x.Appid
+	}
+	return ""
+}
+
+func (x *NewUserInsertMsgReq) GetMsgLogId() int64 {
+	if x != nil {
+		return x.MsgLogId
+	}
+	return 0
+}
+
+func (x *NewUserInsertMsgReq) GetPositionIds() string {
+	if x != nil {
+		return x.PositionIds
+	}
+	return ""
+}
+
+func (x *NewUserInsertMsgReq) GetRow4() string {
+	if x != nil {
+		return x.Row4
+	}
+	return ""
+}
+
+func (x *NewUserInsertMsgReq) GetProductName() string {
+	if x != nil {
+		return x.ProductName
+	}
+	return ""
+}
+
+func (x *NewUserInsertMsgReq) GetOrderId() string {
+	if x != nil {
+		return x.OrderId
+	}
+	return ""
+}
+
+func (x *NewUserInsertMsgReq) GetOrderMoney() string {
+	if x != nil {
+		return x.OrderMoney
+	}
+	return ""
+}
+
+func (x *NewUserInsertMsgReq) GetIdentity() string {
+	if x != nil {
+		return x.Identity
+	}
+	return ""
+}
+
+func (x *NewUserInsertMsgReq) GetAppPushUrl() string {
+	if x != nil {
+		return x.AppPushUrl
+	}
+	return ""
+}
+
+func (x *NewUserInsertMsgReq) GetWxPushUrl() string {
+	if x != nil {
+		return x.WxPushUrl
+	}
+	return ""
+}
+
+func (x *NewUserInsertMsgReq) GetIosPushUrl() string {
+	if x != nil {
+		return x.IosPushUrl
+	}
+	return ""
+}
+
+type UpdateMsgSummaryReq struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	MsgLogId int64 `protobuf:"varint,1,opt,name=msgLogId,proto3" json:"msgLogId,omitempty"`
+	GroupId  int64 `protobuf:"varint,2,opt,name=groupId,proto3" json:"groupId,omitempty"`
+	MsgType  int64 `protobuf:"varint,3,opt,name=msgType,proto3" json:"msgType,omitempty"`
+}
+
+func (x *UpdateMsgSummaryReq) Reset() {
+	*x = UpdateMsgSummaryReq{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_message_proto_msgTypes[36]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *UpdateMsgSummaryReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*UpdateMsgSummaryReq) ProtoMessage() {}
+
+func (x *UpdateMsgSummaryReq) ProtoReflect() protoreflect.Message {
+	mi := &file_message_proto_msgTypes[36]
+	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 UpdateMsgSummaryReq.ProtoReflect.Descriptor instead.
+func (*UpdateMsgSummaryReq) Descriptor() ([]byte, []int) {
+	return file_message_proto_rawDescGZIP(), []int{36}
+}
+
+func (x *UpdateMsgSummaryReq) GetMsgLogId() int64 {
+	if x != nil {
+		return x.MsgLogId
+	}
+	return 0
+}
+
+func (x *UpdateMsgSummaryReq) GetGroupId() int64 {
+	if x != nil {
+		return x.GroupId
+	}
+	return 0
+}
+
+func (x *UpdateMsgSummaryReq) GetMsgType() int64 {
+	if x != nil {
+		return x.MsgType
+	}
+	return 0
+}
+
+type BitmapSaveMsgReq struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	UserIds     string `protobuf:"bytes,1,opt,name=userIds,proto3" json:"userIds,omitempty"`
+	Title       string `protobuf:"bytes,5,opt,name=title,proto3" json:"title,omitempty"`              //主题
+	Content     string `protobuf:"bytes,6,opt,name=content,proto3" json:"content,omitempty"`          //内容
+	MsgType     int64  `protobuf:"varint,7,opt,name=msgType,proto3" json:"msgType,omitempty"`         //消息类型 1:客服   2:系统通知  3:营销   4:用户会话
+	Link        string `protobuf:"bytes,8,opt,name=link,proto3" json:"link,omitempty"`                //跳转链接
+	Appid       string `protobuf:"bytes,10,opt,name=appid,proto3" json:"appid,omitempty"`             //应用标识
+	MsgLogId    int64  `protobuf:"varint,11,opt,name=msgLogId,proto3" json:"msgLogId,omitempty"`      //消息记录表id
+	PositionIds string `protobuf:"bytes,14,opt,name=positionIds,proto3" json:"positionIds,omitempty"` // 职位id  逗号分割
+	Row4        string `protobuf:"bytes,15,opt,name=row4,proto3" json:"row4,omitempty"`
+	ProductName string `protobuf:"bytes,16,opt,name=productName,proto3" json:"productName,omitempty"`
+	OrderId     string `protobuf:"bytes,17,opt,name=orderId,proto3" json:"orderId,omitempty"`
+	OrderMoney  string `protobuf:"bytes,18,opt,name=orderMoney,proto3" json:"orderMoney,omitempty"`
+	Identity    string `protobuf:"bytes,19,opt,name=identity,proto3" json:"identity,omitempty"`
+	AppPushUrl  string `protobuf:"bytes,20,opt,name=appPushUrl,proto3" json:"appPushUrl,omitempty"`
+	WxPushUrl   string `protobuf:"bytes,21,opt,name=wxPushUrl,proto3" json:"wxPushUrl,omitempty"`
+	IosPushUrl  string `protobuf:"bytes,22,opt,name=iosPushUrl,proto3" json:"iosPushUrl,omitempty"`
+	BaseUserIds string `protobuf:"bytes,23,opt,name=baseUserIds,proto3" json:"baseUserIds,omitempty"`
+	SendUserId  string `protobuf:"bytes,24,opt,name=sendUserId,proto3" json:"sendUserId,omitempty"`
+}
+
+func (x *BitmapSaveMsgReq) Reset() {
+	*x = BitmapSaveMsgReq{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_message_proto_msgTypes[37]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *BitmapSaveMsgReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*BitmapSaveMsgReq) ProtoMessage() {}
+
+func (x *BitmapSaveMsgReq) ProtoReflect() protoreflect.Message {
+	mi := &file_message_proto_msgTypes[37]
+	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 BitmapSaveMsgReq.ProtoReflect.Descriptor instead.
+func (*BitmapSaveMsgReq) Descriptor() ([]byte, []int) {
+	return file_message_proto_rawDescGZIP(), []int{37}
+}
+
+func (x *BitmapSaveMsgReq) GetUserIds() string {
+	if x != nil {
+		return x.UserIds
+	}
+	return ""
+}
+
+func (x *BitmapSaveMsgReq) GetTitle() string {
+	if x != nil {
+		return x.Title
+	}
+	return ""
+}
+
+func (x *BitmapSaveMsgReq) GetContent() string {
+	if x != nil {
+		return x.Content
+	}
+	return ""
+}
+
+func (x *BitmapSaveMsgReq) GetMsgType() int64 {
+	if x != nil {
+		return x.MsgType
+	}
+	return 0
+}
+
+func (x *BitmapSaveMsgReq) GetLink() string {
+	if x != nil {
+		return x.Link
+	}
+	return ""
+}
+
+func (x *BitmapSaveMsgReq) GetAppid() string {
+	if x != nil {
+		return x.Appid
+	}
+	return ""
+}
+
+func (x *BitmapSaveMsgReq) GetMsgLogId() int64 {
+	if x != nil {
+		return x.MsgLogId
+	}
+	return 0
+}
+
+func (x *BitmapSaveMsgReq) GetPositionIds() string {
+	if x != nil {
+		return x.PositionIds
+	}
+	return ""
+}
+
+func (x *BitmapSaveMsgReq) GetRow4() string {
+	if x != nil {
+		return x.Row4
+	}
+	return ""
+}
+
+func (x *BitmapSaveMsgReq) GetProductName() string {
+	if x != nil {
+		return x.ProductName
+	}
+	return ""
+}
+
+func (x *BitmapSaveMsgReq) GetOrderId() string {
+	if x != nil {
+		return x.OrderId
+	}
+	return ""
+}
+
+func (x *BitmapSaveMsgReq) GetOrderMoney() string {
+	if x != nil {
+		return x.OrderMoney
+	}
+	return ""
+}
+
+func (x *BitmapSaveMsgReq) GetIdentity() string {
+	if x != nil {
+		return x.Identity
+	}
+	return ""
+}
+
+func (x *BitmapSaveMsgReq) GetAppPushUrl() string {
+	if x != nil {
+		return x.AppPushUrl
+	}
+	return ""
+}
+
+func (x *BitmapSaveMsgReq) GetWxPushUrl() string {
+	if x != nil {
+		return x.WxPushUrl
+	}
+	return ""
+}
+
+func (x *BitmapSaveMsgReq) GetIosPushUrl() string {
+	if x != nil {
+		return x.IosPushUrl
+	}
+	return ""
+}
+
+func (x *BitmapSaveMsgReq) GetBaseUserIds() string {
+	if x != nil {
+		return x.BaseUserIds
+	}
+	return ""
+}
+
+func (x *BitmapSaveMsgReq) GetSendUserId() string {
+	if x != nil {
+		return x.SendUserId
+	}
+	return ""
+}
+
 var File_message_proto protoreflect.FileDescriptor
 var File_message_proto protoreflect.FileDescriptor
 
 
 var file_message_proto_rawDesc = []byte{
 var file_message_proto_rawDesc = []byte{
@@ -3103,8 +3517,89 @@ var file_message_proto_rawDesc = []byte{
 	0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49,
 	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,
 	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,
 	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,
+	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, 0x32, 0x9c, 0x08, 0x0a, 0x07, 0x4d, 0x65, 0x73, 0x73,
+	0x61, 0x67, 0x65, 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, 0x48, 0x0a, 0x0d, 0x62, 0x69, 0x74, 0x6d, 0x61,
+	0x70, 0x53, 0x61, 0x76, 0x65, 0x4d, 0x73, 0x67, 0x12, 0x19, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61,
+	0x67, 0x65, 0x2e, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 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,
 	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,
 	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,
 	0x71, 0x1a, 0x1c, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x6d, 0x75, 0x6c, 0x74,
@@ -3172,7 +3667,7 @@ func file_message_proto_rawDescGZIP() []byte {
 	return file_message_proto_rawDescData
 	return file_message_proto_rawDescData
 }
 }
 
 
-var file_message_proto_msgTypes = make([]protoimpl.MessageInfo, 37)
+var file_message_proto_msgTypes = make([]protoimpl.MessageInfo, 40)
 var file_message_proto_goTypes = []interface{}{
 var file_message_proto_goTypes = []interface{}{
 	(*ChangeReadStatusReq)(nil),    // 0: message.ChangeReadStatusReq
 	(*ChangeReadStatusReq)(nil),    // 0: message.ChangeReadStatusReq
 	(*ResCount)(nil),               // 1: message.ResCount
 	(*ResCount)(nil),               // 1: message.ResCount
@@ -3209,11 +3704,14 @@ var file_message_proto_goTypes = []interface{}{
 	(*WxTmplMsgRequest)(nil),       // 32: message.WxTmplMsgRequest
 	(*WxTmplMsgRequest)(nil),       // 32: message.WxTmplMsgRequest
 	(*SendMsgResponse)(nil),        // 33: message.SendMsgResponse
 	(*SendMsgResponse)(nil),        // 33: message.SendMsgResponse
 	(*MsgOpenLogReq)(nil),          // 34: message.MsgOpenLogReq
 	(*MsgOpenLogReq)(nil),          // 34: message.MsgOpenLogReq
-	nil,                            // 35: message.Messages.UrlEntry
-	nil,                            // 36: message.CustomWxTpl.TmplDataEntry
+	(*NewUserInsertMsgReq)(nil),    // 35: message.NewUserInsertMsgReq
+	(*UpdateMsgSummaryReq)(nil),    // 36: message.UpdateMsgSummaryReq
+	(*BitmapSaveMsgReq)(nil),       // 37: message.BitmapSaveMsgReq
+	nil,                            // 38: message.Messages.UrlEntry
+	nil,                            // 39: message.CustomWxTpl.TmplDataEntry
 }
 }
 var file_message_proto_depIdxs = []int32{
 var file_message_proto_depIdxs = []int32{
-	35, // 0: message.Messages.url:type_name -> message.Messages.UrlEntry
+	38, // 0: message.Messages.url:type_name -> message.Messages.UrlEntry
 	4,  // 1: message.FindUserMsgRes.data:type_name -> message.Messages
 	4,  // 1: message.FindUserMsgRes.data:type_name -> message.Messages
 	4,  // 2: message.MessageDetailResp.data:type_name -> message.Messages
 	4,  // 2: message.MessageDetailResp.data:type_name -> message.Messages
 	4,  // 3: message.GetLastMessageRes.data:type_name -> message.Messages
 	4,  // 3: message.GetLastMessageRes.data:type_name -> message.Messages
@@ -3221,7 +3719,7 @@ var file_message_proto_depIdxs = []int32{
 	4,  // 5: message.GetUnreadClassCountRes.info:type_name -> message.Messages
 	4,  // 5: message.GetUnreadClassCountRes.info:type_name -> message.Messages
 	14, // 6: message.GetMsgTypeRes.data:type_name -> message.MsgTypes
 	14, // 6: message.GetMsgTypeRes.data:type_name -> message.MsgTypes
 	18, // 7: message.multipleSaveMsgReq.customWxTpl:type_name -> message.CustomWxTpl
 	18, // 7: message.multipleSaveMsgReq.customWxTpl:type_name -> message.CustomWxTpl
-	36, // 8: message.CustomWxTpl.tmplData:type_name -> message.CustomWxTpl.TmplDataEntry
+	39, // 8: message.CustomWxTpl.tmplData:type_name -> message.CustomWxTpl.TmplDataEntry
 	23, // 9: message.FindUserBuoyMsgRes.data:type_name -> message.BuoyMessages
 	23, // 9: message.FindUserBuoyMsgRes.data:type_name -> message.BuoyMessages
 	4,  // 10: message.UserMsgListRes.list:type_name -> message.Messages
 	4,  // 10: message.UserMsgListRes.list:type_name -> message.Messages
 	4,  // 11: message.UserMsgListRes.last:type_name -> message.Messages
 	4,  // 11: message.UserMsgListRes.last:type_name -> message.Messages
@@ -3231,32 +3729,38 @@ var file_message_proto_depIdxs = []int32{
 	4,  // 15: message.AllSortData.data:type_name -> message.Messages
 	4,  // 15: message.AllSortData.data:type_name -> message.Messages
 	4,  // 16: message.UserUnreadMsgListRes.list:type_name -> message.Messages
 	4,  // 16: message.UserUnreadMsgListRes.list:type_name -> message.Messages
 	19, // 17: message.CustomWxTpl.TmplDataEntry.value:type_name -> message.TmplItem
 	19, // 17: message.CustomWxTpl.TmplDataEntry.value:type_name -> message.TmplItem
-	17, // 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
-	13, // 22: message.Message.GetMsgType:input_type -> message.GetMsgTypeReq
-	21, // 23: message.Message.FindUserBuoyMsg:input_type -> message.FindUserBuoyMsgReq
-	24, // 24: message.Message.ClearUnreadMsg:input_type -> message.ClearUnreadMsgReq
-	25, // 25: message.Message.UserMsgList:input_type -> message.UserMsgListReq
-	32, // 26: message.Message.SendWxTmplMsg:input_type -> message.WxTmplMsgRequest
-	30, // 27: message.Message.UserUnreadMsgList:input_type -> message.UserUnreadMsgListReq
-	34, // 28: message.Message.MsgOpenLog:input_type -> message.MsgOpenLogReq
-	32, // 29: message.Message.AppLetterPush:input_type -> message.WxTmplMsgRequest
-	20, // 30: message.Message.multipleSaveMsg:output_type -> message.multipleSaveMsgResp
-	2,  // 31: message.Message.ChangeReadStatus:output_type -> message.Response
-	5,  // 32: message.Message.FindUserMsg:output_type -> message.FindUserMsgRes
-	8,  // 33: message.Message.FindMessageDetail:output_type -> message.MessageDetailResp
-	15, // 34: message.Message.GetMsgType:output_type -> message.GetMsgTypeRes
-	22, // 35: message.Message.FindUserBuoyMsg:output_type -> message.FindUserBuoyMsgRes
-	2,  // 36: message.Message.ClearUnreadMsg:output_type -> message.Response
-	26, // 37: message.Message.UserMsgList:output_type -> message.UserMsgListRes
-	33, // 38: message.Message.SendWxTmplMsg:output_type -> message.SendMsgResponse
-	31, // 39: message.Message.UserUnreadMsgList:output_type -> message.UserUnreadMsgListRes
-	2,  // 40: message.Message.MsgOpenLog:output_type -> message.Response
-	33, // 41: message.Message.AppLetterPush:output_type -> message.SendMsgResponse
-	30, // [30:42] is the sub-list for method output_type
-	18, // [18:30] is the sub-list for method input_type
+	36, // 18: message.Message.UpdateMsgSummary:input_type -> message.UpdateMsgSummaryReq
+	35, // 19: message.Message.NewUserMsg:input_type -> message.NewUserInsertMsgReq
+	37, // 20: message.Message.bitmapSaveMsg:input_type -> message.BitmapSaveMsgReq
+	17, // 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
+	13, // 25: message.Message.GetMsgType:input_type -> message.GetMsgTypeReq
+	21, // 26: message.Message.FindUserBuoyMsg:input_type -> message.FindUserBuoyMsgReq
+	24, // 27: message.Message.ClearUnreadMsg:input_type -> message.ClearUnreadMsgReq
+	25, // 28: message.Message.UserMsgList:input_type -> message.UserMsgListReq
+	32, // 29: message.Message.SendWxTmplMsg:input_type -> message.WxTmplMsgRequest
+	30, // 30: message.Message.UserUnreadMsgList:input_type -> message.UserUnreadMsgListReq
+	34, // 31: message.Message.MsgOpenLog:input_type -> message.MsgOpenLogReq
+	32, // 32: message.Message.AppLetterPush:input_type -> message.WxTmplMsgRequest
+	2,  // 33: message.Message.UpdateMsgSummary:output_type -> message.Response
+	2,  // 34: message.Message.NewUserMsg:output_type -> message.Response
+	20, // 35: message.Message.bitmapSaveMsg:output_type -> message.multipleSaveMsgResp
+	20, // 36: message.Message.multipleSaveMsg:output_type -> message.multipleSaveMsgResp
+	2,  // 37: message.Message.ChangeReadStatus:output_type -> message.Response
+	5,  // 38: message.Message.FindUserMsg:output_type -> message.FindUserMsgRes
+	8,  // 39: message.Message.FindMessageDetail:output_type -> message.MessageDetailResp
+	15, // 40: message.Message.GetMsgType:output_type -> message.GetMsgTypeRes
+	22, // 41: message.Message.FindUserBuoyMsg:output_type -> message.FindUserBuoyMsgRes
+	2,  // 42: message.Message.ClearUnreadMsg:output_type -> message.Response
+	26, // 43: message.Message.UserMsgList:output_type -> message.UserMsgListRes
+	33, // 44: message.Message.SendWxTmplMsg:output_type -> message.SendMsgResponse
+	31, // 45: message.Message.UserUnreadMsgList:output_type -> message.UserUnreadMsgListRes
+	2,  // 46: message.Message.MsgOpenLog:output_type -> message.Response
+	33, // 47: message.Message.AppLetterPush:output_type -> message.SendMsgResponse
+	33, // [33:48] is the sub-list for method output_type
+	18, // [18:33] is the sub-list for method input_type
 	18, // [18:18] is the sub-list for extension type_name
 	18, // [18:18] is the sub-list for extension type_name
 	18, // [18:18] is the sub-list for extension extendee
 	18, // [18:18] is the sub-list for extension extendee
 	0,  // [0:18] is the sub-list for field type_name
 	0,  // [0:18] is the sub-list for field type_name
@@ -3688,6 +4192,42 @@ func file_message_proto_init() {
 				return nil
 				return nil
 			}
 			}
 		}
 		}
+		file_message_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*NewUserInsertMsgReq); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_message_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*UpdateMsgSummaryReq); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_message_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*BitmapSaveMsgReq); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
 	}
 	}
 	type x struct{}
 	type x struct{}
 	out := protoimpl.TypeBuilder{
 	out := protoimpl.TypeBuilder{
@@ -3695,7 +4235,7 @@ func file_message_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_message_proto_rawDesc,
 			RawDescriptor: file_message_proto_rawDesc,
 			NumEnums:      0,
 			NumEnums:      0,
-			NumMessages:   37,
+			NumMessages:   40,
 			NumExtensions: 0,
 			NumExtensions: 0,
 			NumServices:   1,
 			NumServices:   1,
 		},
 		},

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

@@ -22,6 +22,12 @@ 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.
 // 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 {
 type MessageClient interface {
+	//发送消息更新一次消息汇总表
+	UpdateMsgSummary(ctx context.Context, in *UpdateMsgSummaryReq, opts ...grpc.CallOption) (*Response, error)
+	//新用户发送消息
+	NewUserMsg(ctx context.Context, in *NewUserInsertMsgReq, opts ...grpc.CallOption) (*Response, error)
+	//bitmap保存消息
+	BitmapSaveMsg(ctx context.Context, in *BitmapSaveMsgReq, opts ...grpc.CallOption) (*MultipleSaveMsgResp, error)
 	//批量保存消息
 	//批量保存消息
 	MultipleSaveMsg(ctx context.Context, in *MultipleSaveMsgReq, opts ...grpc.CallOption) (*MultipleSaveMsgResp, error)
 	MultipleSaveMsg(ctx context.Context, in *MultipleSaveMsgReq, opts ...grpc.CallOption) (*MultipleSaveMsgResp, error)
 	// 修改消息阅读状态
 	// 修改消息阅读状态
@@ -56,6 +62,33 @@ func NewMessageClient(cc grpc.ClientConnInterface) MessageClient {
 	return &messageClient{cc}
 	return &messageClient{cc}
 }
 }
 
 
+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...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *messageClient) NewUserMsg(ctx context.Context, in *NewUserInsertMsgReq, opts ...grpc.CallOption) (*Response, error) {
+	out := new(Response)
+	err := c.cc.Invoke(ctx, "/message.Message/NewUserMsg", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *messageClient) BitmapSaveMsg(ctx context.Context, in *BitmapSaveMsgReq, opts ...grpc.CallOption) (*MultipleSaveMsgResp, error) {
+	out := new(MultipleSaveMsgResp)
+	err := c.cc.Invoke(ctx, "/message.Message/bitmapSaveMsg", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
 func (c *messageClient) MultipleSaveMsg(ctx context.Context, in *MultipleSaveMsgReq, opts ...grpc.CallOption) (*MultipleSaveMsgResp, error) {
 func (c *messageClient) MultipleSaveMsg(ctx context.Context, in *MultipleSaveMsgReq, opts ...grpc.CallOption) (*MultipleSaveMsgResp, error) {
 	out := new(MultipleSaveMsgResp)
 	out := new(MultipleSaveMsgResp)
 	err := c.cc.Invoke(ctx, "/message.Message/multipleSaveMsg", in, out, opts...)
 	err := c.cc.Invoke(ctx, "/message.Message/multipleSaveMsg", in, out, opts...)
@@ -168,6 +201,12 @@ func (c *messageClient) AppLetterPush(ctx context.Context, in *WxTmplMsgRequest,
 // All implementations must embed UnimplementedMessageServer
 // All implementations must embed UnimplementedMessageServer
 // for forward compatibility
 // for forward compatibility
 type MessageServer interface {
 type MessageServer interface {
+	//发送消息更新一次消息汇总表
+	UpdateMsgSummary(context.Context, *UpdateMsgSummaryReq) (*Response, error)
+	//新用户发送消息
+	NewUserMsg(context.Context, *NewUserInsertMsgReq) (*Response, error)
+	//bitmap保存消息
+	BitmapSaveMsg(context.Context, *BitmapSaveMsgReq) (*MultipleSaveMsgResp, error)
 	//批量保存消息
 	//批量保存消息
 	MultipleSaveMsg(context.Context, *MultipleSaveMsgReq) (*MultipleSaveMsgResp, error)
 	MultipleSaveMsg(context.Context, *MultipleSaveMsgReq) (*MultipleSaveMsgResp, error)
 	// 修改消息阅读状态
 	// 修改消息阅读状态
@@ -199,6 +238,15 @@ type MessageServer interface {
 type UnimplementedMessageServer struct {
 type UnimplementedMessageServer struct {
 }
 }
 
 
+func (UnimplementedMessageServer) UpdateMsgSummary(context.Context, *UpdateMsgSummaryReq) (*Response, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method UpdateMsgSummary not implemented")
+}
+func (UnimplementedMessageServer) NewUserMsg(context.Context, *NewUserInsertMsgReq) (*Response, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method NewUserMsg not implemented")
+}
+func (UnimplementedMessageServer) BitmapSaveMsg(context.Context, *BitmapSaveMsgReq) (*MultipleSaveMsgResp, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method BitmapSaveMsg not implemented")
+}
 func (UnimplementedMessageServer) MultipleSaveMsg(context.Context, *MultipleSaveMsgReq) (*MultipleSaveMsgResp, error) {
 func (UnimplementedMessageServer) MultipleSaveMsg(context.Context, *MultipleSaveMsgReq) (*MultipleSaveMsgResp, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method MultipleSaveMsg not implemented")
 	return nil, status.Errorf(codes.Unimplemented, "method MultipleSaveMsg not implemented")
 }
 }
@@ -248,6 +296,60 @@ func RegisterMessageServer(s grpc.ServiceRegistrar, srv MessageServer) {
 	s.RegisterService(&Message_ServiceDesc, srv)
 	s.RegisterService(&Message_ServiceDesc, srv)
 }
 }
 
 
+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 {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(MessageServer).UpdateMsgSummary(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/message.Message/UpdateMsgSummary",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(MessageServer).UpdateMsgSummary(ctx, req.(*UpdateMsgSummaryReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _Message_NewUserMsg_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(NewUserInsertMsgReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(MessageServer).NewUserMsg(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/message.Message/NewUserMsg",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(MessageServer).NewUserMsg(ctx, req.(*NewUserInsertMsgReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _Message_BitmapSaveMsg_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(BitmapSaveMsgReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(MessageServer).BitmapSaveMsg(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/message.Message/bitmapSaveMsg",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(MessageServer).BitmapSaveMsg(ctx, req.(*BitmapSaveMsgReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
 func _Message_MultipleSaveMsg_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 func _Message_MultipleSaveMsg_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 	in := new(MultipleSaveMsgReq)
 	in := new(MultipleSaveMsgReq)
 	if err := dec(in); err != nil {
 	if err := dec(in); err != nil {
@@ -471,6 +573,18 @@ var Message_ServiceDesc = grpc.ServiceDesc{
 	ServiceName: "message.Message",
 	ServiceName: "message.Message",
 	HandlerType: (*MessageServer)(nil),
 	HandlerType: (*MessageServer)(nil),
 	Methods: []grpc.MethodDesc{
 	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "UpdateMsgSummary",
+			Handler:    _Message_UpdateMsgSummary_Handler,
+		},
+		{
+			MethodName: "NewUserMsg",
+			Handler:    _Message_NewUserMsg_Handler,
+		},
+		{
+			MethodName: "bitmapSaveMsg",
+			Handler:    _Message_BitmapSaveMsg_Handler,
+		},
 		{
 		{
 			MethodName: "multipleSaveMsg",
 			MethodName: "multipleSaveMsg",
 			Handler:    _Message_MultipleSaveMsg_Handler,
 			Handler:    _Message_MultipleSaveMsg_Handler,