238 lines
5.7 KiB
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
|
|
}
|