package service import ( "errors" "strings" "github.com/flipped-aurora/gin-vue-admin/server/global" "github.com/flipped-aurora/gin-vue-admin/server/plugin/wechat-integration/model" "gorm.io/gorm" ) type MpAutoReplyService struct{} // GetAutoReplyList 获取自动回复列表 func (m *MpAutoReplyService) GetAutoReplyList(page, pageSize int, replyType *int) ([]model.MpAutoReply, int64, error) { var replies []model.MpAutoReply var total int64 db := global.GVA_DB.Model(&model.MpAutoReply{}) // 根据回复类型筛选 if replyType != nil { db = db.Where("type = ?", *replyType) } // 获取总数 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(&replies).Error if err != nil { return nil, 0, err } return replies, total, nil } // CreateAutoReply 创建自动回复 func (m *MpAutoReplyService) CreateAutoReply(reply *model.MpAutoReply) error { err := global.GVA_DB.Create(reply).Error if err != nil { global.GVA_LOG.Error("创建自动回复失败: " + err.Error()) return err } return nil } // UpdateAutoReply 更新自动回复 func (m *MpAutoReplyService) UpdateAutoReply(reply *model.MpAutoReply) error { err := global.GVA_DB.Save(reply).Error if err != nil { global.GVA_LOG.Error("更新自动回复失败: " + err.Error()) return err } return nil } // DeleteAutoReply 删除自动回复 func (m *MpAutoReplyService) DeleteAutoReply(id uint) error { err := global.GVA_DB.Delete(&model.MpAutoReply{}, id).Error if err != nil { global.GVA_LOG.Error("删除自动回复失败: " + err.Error()) return err } return nil } // GetAutoReplyByID 根据ID获取自动回复 func (m *MpAutoReplyService) GetAutoReplyByID(id uint) (*model.MpAutoReply, error) { var reply model.MpAutoReply err := global.GVA_DB.Where("id = ?", id).First(&reply).Error if err != nil { return nil, err } return &reply, nil } // GetSubscribeReply 获取关注回复 func (m *MpAutoReplyService) GetSubscribeReply() (*model.MpAutoReply, error) { var reply model.MpAutoReply err := global.GVA_DB.Where("type = ?", model.AutoReplyTypeSubscribe).First(&reply).Error if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return nil, nil // 没有设置关注回复 } return nil, err } return &reply, nil } // GetKeywordReply 获取关键字回复 func (m *MpAutoReplyService) GetKeywordReply(keyword string) (*model.MpAutoReply, error) { var replies []model.MpAutoReply err := global.GVA_DB.Where("type = ?", model.AutoReplyTypeKeyword).Find(&replies).Error if err != nil { return nil, err } // 遍历所有关键字回复,查找匹配的 for _, reply := range replies { if reply.RequestKeyword == nil { continue } // 完全匹配 if reply.IsExactMatch() { if strings.EqualFold(keyword, *reply.RequestKeyword) { return &reply, nil } } // 部分匹配 if reply.IsPartialMatch() { if strings.Contains(strings.ToLower(keyword), strings.ToLower(*reply.RequestKeyword)) { return &reply, nil } } } return nil, nil // 没有找到匹配的关键字回复 } // GetMessageReply 获取消息回复 func (m *MpAutoReplyService) GetMessageReply(msgType string) (*model.MpAutoReply, error) { var reply model.MpAutoReply err := global.GVA_DB.Where("type = ? AND request_message_type = ?", model.AutoReplyTypeMessage, msgType).First(&reply).Error if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return nil, nil // 没有设置该类型消息的回复 } return nil, err } return &reply, nil } // SetSubscribeReply 设置关注回复 func (m *MpAutoReplyService) SetSubscribeReply(content string) error { // 先查找是否已存在关注回复 var reply model.MpAutoReply err := global.GVA_DB.Where("type = ?", model.AutoReplyTypeSubscribe).First(&reply).Error if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { // 不存在,创建新的 reply = model.MpAutoReply{ Type: model.AutoReplyTypeSubscribe, ResponseMessageType: "text", ResponseContent: &content, } return m.CreateAutoReply(&reply) } return err } // 存在,更新内容 reply.ResponseContent = &content return m.UpdateAutoReply(&reply) } // SetKeywordReply 设置关键字回复 func (m *MpAutoReplyService) SetKeywordReply(keyword, content string, matchType int) error { reply := model.MpAutoReply{ Type: model.AutoReplyTypeKeyword, RequestKeyword: &keyword, RequestMatch: &matchType, ResponseMessageType: "text", ResponseContent: &content, } return m.CreateAutoReply(&reply) } // TestAutoReply 测试自动回复功能 func (m *MpAutoReplyService) TestAutoReply(keyword string) (*model.MpAutoReply, error) { // 先尝试关键字匹配 reply, err := m.GetKeywordReply(keyword) if err != nil { return nil, err } if reply != nil { return reply, nil } // 如果没有关键字匹配,返回默认的文本消息回复 return m.GetMessageReply("text") }