Browse Source

Merge remote-tracking branch 'origin/lcd250411' into lcd250411

lichangdong 1 week ago
parent
commit
18f7ae24e6

+ 47 - 0
internal/service/MessageHandlers/chatroom_push_notice.go

@@ -65,3 +65,50 @@ func (f *ChatroomPushNoticeHandler) Handler(msg *wechat_ws.MsgJsonObject) error
 	}
 	return nil
 }
+
+type ChatroomPushNoticeTypeHandler struct {
+	svcCtx *svc.ServiceContext
+}
+
+func NewChatroomPushNoticeTypeHandler(svcCtx *svc.ServiceContext) *ChatroomPushNoticeTypeHandler {
+	return &ChatroomPushNoticeTypeHandler{
+		svcCtx: svcCtx,
+	}
+}
+
+// Handle 实现 MessageHandlerStrategy 接口
+func (c *ChatroomPushNoticeTypeHandler) Handle(ctx context.Context, msg *wechat_ws.MsgJsonObject, svcCtx *svc.ServiceContext) error {
+	message := workphone.ChatRoomPushNoticeMessage{}
+	err := json.Unmarshal([]byte(msg.Message), &message)
+	if err != nil {
+		return err
+	}
+	// 拿到租户 id
+	wxInfo, err := svcCtx.DB.Wx.Query().
+		Where(
+			wx.WxidEQ(message.WeChatId), // Additional filter by organizationId
+		).
+		Only(ctx)
+	hookClient := hook.NewHook("", "", "")
+	for _, friend := range message.ChatRooms {
+		friendType := 2
+		_ = hookClient.RequestChatRoomInfo(friend.UserName, message.WeChatId)
+		_, err = svcCtx.DB.Contact.Create().
+			SetWxWxid(message.WeChatId).
+			SetType(friendType).
+			SetWxid(friend.UserName).
+			SetNickname(friend.NickName).
+			SetHeadimg(friend.Avatar).
+			SetOrganizationID(wxInfo.OrganizationID).
+			OnConflict().
+			UpdateNewValues().
+			SetOrganizationID(wxInfo.OrganizationID).
+			ID(ctx)
+
+		if err != nil {
+			logx.Error("Contact.Create: ", wxInfo.OrganizationID)
+			return err
+		}
+	}
+	return nil
+}

+ 52 - 0
internal/service/MessageHandlers/friend_push_notice.go

@@ -66,3 +66,55 @@ func (f *FriendPushNoticeHandler) Handler(msg *wechat_ws.MsgJsonObject) error {
 	}
 	return nil
 }
+
+type FriendPushNoticeTypeHandler struct {
+	svcCtx *svc.ServiceContext
+}
+
+func NewFriendPushNoticeTypeHandler(svcCtx *svc.ServiceContext) *FriendPushNoticeTypeHandler {
+	return &FriendPushNoticeTypeHandler{
+		svcCtx: svcCtx,
+	}
+}
+
+// Handle 实现 MessageHandlerStrategy 接口
+func (f *FriendPushNoticeTypeHandler) Handle(ctx context.Context, msg *wechat_ws.MsgJsonObject, svcCtx *svc.ServiceContext) error {
+	message := workphone.FriendPushNoticeMessage{}
+	err := json.Unmarshal([]byte(msg.Message), &message)
+	if err != nil {
+		return err
+	}
+	// 拿到租户 id
+	wxInfo, err := svcCtx.DB.Wx.Query().
+		Where(
+			wx.WxidEQ(message.WeChatId), // Additional filter by organizationId
+		).
+		Only(ctx)
+	if err != nil {
+		return err
+	}
+
+	for _, friend := range message.Friends {
+		friendType := 1
+		_, err = svcCtx.DB.Contact.Create().
+			SetWxWxid(message.WeChatId).
+			SetType(friendType).
+			SetWxid(friend.FriendId).
+			SetAccount(friend.FriendNo).
+			SetNickname(friend.FriendNick).
+			SetMarkname(friend.Memo).
+			SetHeadimg(friend.Avatar).
+			SetOrganizationID(wxInfo.OrganizationID).
+			OnConflict().
+			UpdateNewValues().
+			SetType(friendType).
+			SetOrganizationID(wxInfo.OrganizationID).
+			ID(ctx)
+
+		if err != nil {
+			logx.Error("Contact.Create: ", wxInfo.OrganizationID)
+			return err
+		}
+	}
+	return nil
+}

+ 55 - 0
internal/service/MessageHandlers/register_strategy.go

@@ -0,0 +1,55 @@
+package MessageHandlers
+
+import (
+	"context"
+	"github.com/zeromicro/go-zero/core/logx"
+	"wechat-api/internal/pkg/wechat_ws"
+	"wechat-api/internal/svc"
+)
+
+// MessageHandlerStrategy 消息处理策略接口
+type MessageHandlerStrategy interface {
+	Handle(ctx context.Context, msg *wechat_ws.MsgJsonObject, svcCtx *svc.ServiceContext) error
+}
+
+type MessageHandler struct {
+	strategies map[string]MessageHandlerStrategy
+	svcCtx     *svc.ServiceContext
+}
+
+func NewMessageHandler(svcCtx *svc.ServiceContext) *MessageHandler {
+	return &MessageHandler{
+		strategies: make(map[string]MessageHandlerStrategy),
+		svcCtx:     svcCtx,
+	}
+}
+
+// RegisterStrategy 注册消息处理策略
+func (h *MessageHandler) RegisterStrategy(msgType string, strategy MessageHandlerStrategy) {
+	h.strategies[msgType] = strategy
+}
+
+// Handle 根据 msgType 处理消息
+func (h *MessageHandler) Handle(ctx context.Context, msg *wechat_ws.MsgJsonObject) error {
+	strategy, exists := h.strategies[msg.MsgType]
+	if !exists {
+		logx.Error("No handler registered for msgType: %s", msg.MsgType)
+		return nil
+	}
+	return strategy.Handle(ctx, msg, h.svcCtx)
+}
+
+// RegisterStrategies 使用映射表注册所有策略
+func (h *MessageHandler) RegisterStrategies() {
+	strategyMap := map[string]func(*svc.ServiceContext) MessageHandlerStrategy{
+		"FriendPushNotice": func(svcCtx *svc.ServiceContext) MessageHandlerStrategy {
+			return NewFriendPushNoticeTypeHandler(svcCtx)
+		},
+		"ChatroomPushNotice": func(svcCtx *svc.ServiceContext) MessageHandlerStrategy {
+			return NewChatroomPushNoticeTypeHandler(svcCtx)
+		},
+	}
+	for msgType, strategyFunc := range strategyMap {
+		h.RegisterStrategy(msgType, strategyFunc(h.svcCtx))
+	}
+}