package service import ( "encoding/json" "github.com/flipped-aurora/gin-vue-admin/server/global" "github.com/flipped-aurora/gin-vue-admin/server/plugin/wechat-integration/model" "github.com/silenceper/wechat/v2/officialaccount/message" ) type MpMessageService struct{} // SaveMessage 保存消息记录 func (m *MpMessageService) SaveMessage(msgType, openid, inMsgID string, content interface{}) error { contentBytes, err := json.Marshal(content) if err != nil { global.GVA_LOG.Error("序列化消息内容失败: " + err.Error()) return err } contentStr := string(contentBytes) msg := model.MpMessage{ Type: msgType, OpenID: openid, InMsgID: &inMsgID, Content: &contentStr, } err = global.GVA_DB.Create(&msg).Error if err != nil { global.GVA_LOG.Error("保存消息记录失败: " + err.Error()) return err } return nil } // GetMessageList 获取消息列表 func (m *MpMessageService) GetMessageList(page, pageSize int, msgType, openid string) ([]model.MpMessage, int64, error) { var messages []model.MpMessage var total int64 db := global.GVA_DB.Model(&model.MpMessage{}) // 根据消息类型筛选 if msgType != "" { db = db.Where("type = ?", msgType) } // 根据用户筛选 if openid != "" { db = db.Where("openid = ?", openid) } // 获取总数 err := db.Count(&total).Error if err != nil { return nil, 0, err } // 分页查询 offset := (page - 1) * pageSize err = db.Offset(offset).Limit(pageSize).Order("created_at desc").Find(&messages).Error if err != nil { return nil, 0, err } return messages, total, nil } // SendTextMessage 发送文本消息 func (m *MpMessageService) SendTextMessage(openid, content string) error { mpUserService := &MpUserService{} oa, err := mpUserService.GetOfficialAccount() if err != nil { return err } msg := &message.CustomerMessage{ ToUser: openid, Msgtype: message.MsgTypeText, Text: &message.MediaText{ Content: content, }, } err = oa.GetCustomerMessageManager().Send(msg) if err != nil { global.GVA_LOG.Error("发送文本消息失败: " + err.Error()) return err } // 保存发送记录 err = m.SaveMessage("text", openid, "", map[string]interface{}{ "content": content, "type": "send", }) if err != nil { global.GVA_LOG.Error("保存发送消息记录失败: " + err.Error()) } return nil } // SendImageMessage 发送图片消息 func (m *MpMessageService) SendImageMessage(openid, mediaID string) error { mpUserService := &MpUserService{} oa, err := mpUserService.GetOfficialAccount() if err != nil { return err } msg := &message.CustomerMessage{ ToUser: openid, Msgtype: message.MsgTypeImage, Image: &message.MediaResource{ MediaID: mediaID, }, } err = oa.GetCustomerMessageManager().Send(msg) if err != nil { global.GVA_LOG.Error("发送图片消息失败: " + err.Error()) return err } // 保存发送记录 err = m.SaveMessage("image", openid, "", map[string]interface{}{ "media_id": mediaID, "type": "send", }) if err != nil { global.GVA_LOG.Error("保存发送消息记录失败: " + err.Error()) } return nil } // ProcessTextMessage 处理文本消息 func (m *MpMessageService) ProcessTextMessage(openid, content, msgID string) error { // 保存接收到的消息 err := m.SaveMessage("text", openid, msgID, map[string]interface{}{ "content": content, "type": "receive", }) if err != nil { return err } // 检查是否有自动回复 autoReplyService := &MpAutoReplyService{} reply, err := autoReplyService.GetKeywordReply(content) if err == nil && reply != nil { // 发送自动回复 if reply.ResponseMessageType == "text" && reply.ResponseContent != nil { err = m.SendTextMessage(openid, *reply.ResponseContent) if err != nil { global.GVA_LOG.Error("发送自动回复失败: " + err.Error()) } } } return nil } // ProcessEventMessage 处理事件消息 func (m *MpMessageService) ProcessEventMessage(openid, event, eventKey, msgID string) error { // 保存事件消息 err := m.SaveMessage("event", openid, msgID, map[string]interface{}{ "event": event, "event_key": eventKey, "type": "receive", }) if err != nil { return err } mpUserService := &MpUserService{} switch event { case "subscribe": // 处理关注事件 err = mpUserService.SubscribeUser(openid) if err != nil { global.GVA_LOG.Error("处理关注事件失败: " + err.Error()) return err } // 发送关注回复 autoReplyService := &MpAutoReplyService{} reply, err := autoReplyService.GetSubscribeReply() if err == nil && reply != nil && reply.ResponseContent != nil { err = m.SendTextMessage(openid, *reply.ResponseContent) if err != nil { global.GVA_LOG.Error("发送关注回复失败: " + err.Error()) } } case "unsubscribe": // 处理取消关注事件 err = mpUserService.UnsubscribeUser(openid) if err != nil { global.GVA_LOG.Error("处理取消关注事件失败: " + err.Error()) return err } case "CLICK": // 处理菜单点击事件 menuService := &MpMenuService{} err = menuService.ProcessMenuClick(openid, eventKey) if err != nil { global.GVA_LOG.Error("处理菜单点击事件失败: " + err.Error()) } } return nil } // GetMessageByID 根据ID获取消息 func (m *MpMessageService) GetMessageByID(id uint) (*model.MpMessage, error) { var message model.MpMessage err := global.GVA_DB.Where("id = ?", id).First(&message).Error if err != nil { return nil, err } return &message, nil } // DeleteMessage 删除消息 func (m *MpMessageService) DeleteMessage(id uint) error { err := global.GVA_DB.Delete(&model.MpMessage{}, id).Error if err != nil { global.GVA_LOG.Error("删除消息失败: " + err.Error()) return err } return nil }