This commit is contained in:
@@ -0,0 +1,237 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user