Browse Source

Merge branch 'dev/v1.2.7_dx' of moapp/MessageCenter into feature/v1.2.7

duxin 2 years ago
parent
commit
86688595cc

+ 1 - 0
rpc/etc/message.yaml

@@ -6,6 +6,7 @@ Etcd:
   - 127.0.0.1:2379
   Key: message.rpc
 Timeout: 10000
+PushGrpcServer: 192.168.3.11:5565
 Mysql: root:=PDT49#80Z!RVv52_z@tcp(192.168.3.217:4000)/messagetest?charset=utf8mb4&parseTime=true&loc=Local
 Mongodb:
   Address: 192.168.3.206:27080

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

@@ -36,7 +36,7 @@ const CacheDb = "msgCount"
 
 func MessageType() (func() map[string]WxTmplConfig, []map[string]interface{}) {
 	var data []map[string]interface{}
-	rData := entity.Mysql.SelectBySql("SELECT * FROM message_column ORDER BY sequence ASC")
+	rData := entity.Mysql.SelectBySql(`SELECT * FROM message_column where switch != "" ORDER BY sequence ASC`)
 	switchName := map[string]WxTmplConfig{}
 	if rData != nil && len(*rData) > 0 {
 		data = *rData

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

@@ -16,6 +16,7 @@ type Config struct {
 	SaveConcurrency int       // 消息保存并发数
 	WxWebdomain     string    `json:"WxWebdomain"`
 	WxTmplConfig    WxTmplMsg `json:"WxTmplConfig"`
+	PushGrpcServer  string    `json:"PushGrpcServer"`
 	Mail            []struct {
 		Addr string `json:"addr"`
 		Port int    `json:"port"`

+ 144 - 0
rpc/internal/logic/appletterpushlogic.go

@@ -0,0 +1,144 @@
+package logic
+
+import (
+	"app.yhyue.com/moapp/MessageCenter/entity"
+	"app.yhyue.com/moapp/MessageCenter/rpc/internal/common"
+	"app.yhyue.com/moapp/MessageCenter/rpc/internal/config"
+	"app.yhyue.com/moapp/MessageCenter/rpc/internal/svc"
+	"app.yhyue.com/moapp/MessageCenter/rpc/type/message"
+	qutil "app.yhyue.com/moapp/jybase/common"
+	"app.yhyue.com/moapp/jybase/go-xweb/log"
+	"app.yhyue.com/moapp/jybase/mongodb"
+	"context"
+	"encoding/json"
+	"fmt"
+	"net/rpc"
+	"strings"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type AppLetterPushLogic struct {
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+	logx.Logger
+}
+
+func NewAppLetterPushLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AppLetterPushLogic {
+	return &AppLetterPushLogic{
+		ctx:    ctx,
+		svcCtx: svcCtx,
+		Logger: logx.WithContext(ctx),
+	}
+}
+
+// 发送剑鱼微信模版消息
+func (l *AppLetterPushLogic) AppLetterPush(in *message.WxTmplMsgRequest) (*message.SendMsgResponse, error) {
+	var userArr []string
+	userArr = strings.Split(in.PositionIds, ",")
+	pushConfig, err := common.GetWxTmplConfig(in.MessageClass)
+	if err != nil {
+		return &message.SendMsgResponse{
+			Total:   0,
+			Message: err.Error(),
+		}, nil
+	}
+
+	for _, uId := range userArr {
+		if uId == "" {
+			continue
+		}
+		query := make(map[string]interface{})
+		uInfo := entity.Mysql.SelectBySql("SELECT user_id FROM base_service.base_position WHERE id = ? ", uId)
+		if uInfo != nil && len(*uInfo) > 0 {
+			if baseUserId := qutil.Int64All((*uInfo)[0]["user_id"]); baseUserId != 0 {
+				query["base_user_id"] = baseUserId
+			}
+		}
+		userData := make(map[string]interface{})
+		if len(query) > 0 {
+			rData, _ := entity.MQFW.FindOneByField("user", query, fmt.Sprintf(`{"s_appversion":1,"s_nmae":1,"s_nmae":1,"s_jpushid":1,"s_opushid":1,"s_m_openid":1,"o_pushset.%s.i_apppush":1}`, pushConfig.Switch))
+			if rData != nil && len(*rData) > 0 {
+				userData = *rData
+			}
+		}
+
+		AppPushMsg(userData, pushConfig.Switch, in.Url, in.Title, in.Detail)
+	}
+	return &message.SendMsgResponse{
+		Total: 1,
+	}, nil
+}
+
+func AppPushMsg(userInfo map[string]interface{}, stm, appPushUrl, title string, detail string) {
+	userId := mongodb.BsonIdToSId(userInfo["_id"])
+	if pushSetMap := qutil.ObjToMap(userInfo["o_pushset"]); pushSetMap != nil && len(*pushSetMap) > 0 {
+		if pushKeyMap := qutil.ObjToMap((*pushSetMap)[stm]); pushKeyMap != nil && len(*pushKeyMap) > 0 {
+			if qutil.Int64All((*pushKeyMap)["i_apppush"]) == 1 {
+				//用户信息
+				var otherPushId, jgPushId, phoneType, name, appVersion = "", "", "", "", ""
+				otherPushId = qutil.ObjToString(userInfo["s_opushid"])
+				jgPushId = qutil.ObjToString(userInfo["s_jpushid"])
+				phoneType = qutil.ObjToString(userInfo["s_appponetype"])
+				name = qutil.ObjToString(userInfo["s_name"])
+				appVersion = qutil.ObjToString(userInfo["s_appversion"])
+
+				dt := map[string]interface{}{
+					"receiveUserId": userId,
+					"receiveName":   name,
+					//"sendName":      loginUserName,
+					"title":    title,
+					"content":  detail,
+					"msgType":  "messagecenter",
+					"link":     appPushUrl,
+					"appid":    "10000",
+					"menuName": "message",
+				}
+				//推送消息
+				if appVersion > "3.0.3" {
+					go AppGrpcPush(dt, otherPushId, jgPushId, phoneType, appPushUrl)
+				}
+				return
+			}
+		}
+	}
+	//log.Println("用户未打开app推送", msgType, userId)
+}
+
+func AppGrpcPush(pushData map[string]interface{}, otherPushId, jgPushId, phoneType, appPushUrl string) {
+	menuName := "message"
+	if value, ok := pushData["menuName"]; ok {
+		menuName = qutil.ObjToString(value)
+	}
+	var repl string
+	client, err := rpc.DialHTTP("tcp", config.ConfigJson.PushGrpcServer)
+	if err != nil {
+		log.Println(err.Error())
+		return
+	}
+	defer client.Close()
+	push := map[string]interface{}{
+		"title":       pushData["title"],         //标题
+		"descript":    pushData["content"],       //副标题
+		"otherPushId": otherPushId,               //mongodb库user表中s_opushid
+		"jgPushId":    jgPushId,                  //mongodb库user表中s_jpushid
+		"userId":      pushData["receiveUserId"], //mongodb库user表中_id转string
+		"phoneType":   phoneType,                 //mongodb库user表中s_appponetype
+		"type":        "messagecenter",           //消息类型,消息中心推送的消息使用messagecenter
+		"url":         appPushUrl,                //点了消息以后,跳转的链接地址,不需要带域名
+		"menuName":    menuName,                  //在哪个webview打开链接,search:搜索 subscribe:订阅 box:百宝箱 me:我的 other:新的webview  消息中心 message
+		"redDot":      "",                        //在哪个底部菜单显示小红点,空值则不显示小红点,search:搜索 subscribe:订阅 box:百宝箱 me:我的
+	}
+	b, _ := json.Marshal(push)
+	err = client.Call("Rpc.Push", b, &repl)
+	if err != nil {
+		log.Println(err.Error())
+		return
+	}
+	if repl == "y" {
+		log.Println("推送成功!", pushData["receiveUserId"])
+	} else {
+		log.Println("推送失败!", pushData["receiveUserId"])
+	}
+
+}

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

@@ -87,3 +87,9 @@ func (s *MessageServer) MsgOpenLog(ctx context.Context, in *message.MsgOpenLogRe
 	l := logic.NewMsgOpenLogLogic(ctx, s.svcCtx)
 	return l.MsgOpenLog(in)
 }
+
+//   发送剑鱼微信模版消息
+func (s *MessageServer) AppLetterPush(ctx context.Context, in *message.WxTmplMsgRequest) (*message.SendMsgResponse, error) {
+	l := logic.NewAppLetterPushLogic(ctx, s.svcCtx)
+	return l.AppLetterPush(in)
+}

+ 4 - 0
rpc/message.proto

@@ -285,4 +285,8 @@ service Message {
     rpc UserUnreadMsgList (UserUnreadMsgListReq) returns (UserUnreadMsgListRes);
     // 点击消息-存查看记录
     rpc MsgOpenLog (MsgOpenLogReq) returns (Response);
+
+    //  发送剑鱼微信模版消息
+    rpc AppLetterPush (WxTmplMsgRequest) returns(SendMsgResponse);
+
 }

+ 8 - 0
rpc/messageclient/message.go

@@ -70,6 +70,8 @@ type (
 		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 {
@@ -148,3 +150,9 @@ func (m *defaultMessage) MsgOpenLog(ctx context.Context, in *MsgOpenLogReq, opts
 	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...)
+}

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

@@ -44,6 +44,8 @@ type MessageClient interface {
 	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)
 }
 
 type messageClient struct {
@@ -153,6 +155,15 @@ func (c *messageClient) MsgOpenLog(ctx context.Context, in *MsgOpenLogReq, opts
 	return out, nil
 }
 
+func (c *messageClient) AppLetterPush(ctx context.Context, in *WxTmplMsgRequest, opts ...grpc.CallOption) (*SendMsgResponse, error) {
+	out := new(SendMsgResponse)
+	err := c.cc.Invoke(ctx, "/message.Message/AppLetterPush", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
 // MessageServer is the server API for Message service.
 // All implementations must embed UnimplementedMessageServer
 // for forward compatibility
@@ -179,6 +190,8 @@ type MessageServer interface {
 	UserUnreadMsgList(context.Context, *UserUnreadMsgListReq) (*UserUnreadMsgListRes, error)
 	// 点击消息-存查看记录
 	MsgOpenLog(context.Context, *MsgOpenLogReq) (*Response, error)
+	// 发送剑鱼微信模版消息
+	AppLetterPush(context.Context, *WxTmplMsgRequest) (*SendMsgResponse, error)
 	mustEmbedUnimplementedMessageServer()
 }
 
@@ -219,6 +232,9 @@ func (UnimplementedMessageServer) UserUnreadMsgList(context.Context, *UserUnread
 func (UnimplementedMessageServer) MsgOpenLog(context.Context, *MsgOpenLogReq) (*Response, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method MsgOpenLog not implemented")
 }
+func (UnimplementedMessageServer) AppLetterPush(context.Context, *WxTmplMsgRequest) (*SendMsgResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method AppLetterPush not implemented")
+}
 func (UnimplementedMessageServer) mustEmbedUnimplementedMessageServer() {}
 
 // UnsafeMessageServer may be embedded to opt out of forward compatibility for this service.
@@ -430,6 +446,24 @@ func _Message_MsgOpenLog_Handler(srv interface{}, ctx context.Context, dec func(
 	return interceptor(ctx, in, info, handler)
 }
 
+func _Message_AppLetterPush_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(WxTmplMsgRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(MessageServer).AppLetterPush(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/message.Message/AppLetterPush",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(MessageServer).AppLetterPush(ctx, req.(*WxTmplMsgRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
 // Message_ServiceDesc is the grpc.ServiceDesc for Message service.
 // It's only intended for direct use with grpc.RegisterService,
 // and not to be introspected or modified (even as a copy)
@@ -481,6 +515,10 @@ var Message_ServiceDesc = grpc.ServiceDesc{
 			MethodName: "MsgOpenLog",
 			Handler:    _Message_MsgOpenLog_Handler,
 		},
+		{
+			MethodName: "AppLetterPush",
+			Handler:    _Message_AppLetterPush_Handler,
+		},
 	},
 	Streams:  []grpc.StreamDesc{},
 	Metadata: "message.proto",