pet-ai/server/plugin/wechat-integration/service/mp_message_service.go

238 lines
5.7 KiB
Go

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
}