package radio import ( "sundynix-go/global" "sundynix-go/model/radio" radioReq "sundynix-go/model/radio/request" "gorm.io/gorm" ) type VoiceService struct{} // GetVoiceList 获取音色列表 func (s *VoiceService) GetVoiceList(req radioReq.GetVoiceList) ([]radio.RadioVoice, int64, error) { db := global.DB.Model(&radio.RadioVoice{}).Preload("Audio") var list []radio.RadioVoice var total int64 if req.Name != "" { db = db.Where("name LIKE ?", "%"+req.Name+"%") } if req.Status > 0 { db = db.Where("status = ?", req.Status) } err := db.Count(&total).Error if err != nil { return nil, 0, err } offset := (req.Current - 1) * req.PageSize err = db.Offset(offset).Limit(req.PageSize).Order("sort ASC").Find(&list).Error if err != nil { return nil, 0, err } return list, total, nil } // GetVoiceById 获取音色详情 func (s *VoiceService) GetVoiceById(id string) (*radio.RadioVoice, error) { var voice radio.RadioVoice err := global.DB.Preload("Audio").Where("id = ?", id).First(&voice).Error return &voice, err } // GetVoiceBySpeakerId 根据SpeakerId获取音色 func (s *VoiceService) GetVoiceBySpeakerId(speakerId string) (*radio.RadioVoice, error) { var voice radio.RadioVoice err := global.DB.Where("speaker_id = ? AND status = ?", speakerId, 1).First(&voice).Error return &voice, err } // GetDefaultVoice 获取默认音色 func (s *VoiceService) GetDefaultVoice() (*radio.RadioVoice, error) { var voice radio.RadioVoice err := global.DB.Where("is_default = ? AND status = ?", 1, 1).First(&voice).Error if err != nil { // 如果没有默认音色,返回第一个启用的音色 err = global.DB.Where("status = ?", 1).Order("sort ASC").First(&voice).Error } return &voice, err } // GetAllEnabledVoice 获取所有启用的音色(前端选择用) func (s *VoiceService) GetAllEnabledVoice() ([]radio.RadioVoice, error) { var list []radio.RadioVoice err := global.DB.Where("status = ?", 1).Order("sort ASC").Find(&list).Error if err != nil { return nil, err } return list, nil } // SaveVoice 保存音色 func (s *VoiceService) SaveVoice(req radioReq.SaveVoice) error { return global.DB.Transaction(func(tx *gorm.DB) error { // 如果设置为默认音色,先取消其他默认 if req.IsDefault == 1 { if err := tx.Model(&radio.RadioVoice{}).Where("is_default = ?", 1).Update("is_default", 0).Error; err != nil { return err } } voice := radio.RadioVoice{ SpeakerId: req.SpeakerId, Name: req.Name, Description: req.Description, Gender: req.Gender, Icon: req.Icon, AudioId: req.AudioId, Sort: req.Sort, Status: req.Status, IsDefault: req.IsDefault, } return tx.Create(&voice).Error }) } // UpdateVoice 更新音色 func (s *VoiceService) UpdateVoice(req radioReq.UpdateVoice) error { return global.DB.Transaction(func(tx *gorm.DB) error { updates := map[string]interface{}{ "speaker_id": req.SpeakerId, "name": req.Name, "description": req.Description, "gender": req.Gender, "icon": req.Icon, "audio_id": req.AudioId, "sort": req.Sort, "status": req.Status, } // 如果设置为默认音色,先取消其他默认 if req.IsDefault == 1 { if err := tx.Model(&radio.RadioVoice{}).Where("is_default = ? AND id != ?", 1, req.Id).Update("is_default", 0).Error; err != nil { return err } updates["is_default"] = 1 } return tx.Model(&radio.RadioVoice{}).Where("id = ?", req.Id).Updates(updates).Error }) } // DeleteVoice 删除音色 func (s *VoiceService) DeleteVoice(ids []string) error { return global.DB.Where("id IN ?", ids).Delete(&radio.RadioVoice{}).Error } // IncrementUseCount 增加使用次数 func (s *VoiceService) IncrementUseCount(speakerId string) error { return global.DB.Model(&radio.RadioVoice{}).Where("speaker_id = ?", speakerId).UpdateColumn("use_count", gorm.Expr("use_count + 1")).Error } // SetDefaultVoice 设置默认音色 func (s *VoiceService) SetDefaultVoice(id string) error { return global.DB.Transaction(func(tx *gorm.DB) error { // 先清除其他默认 if err := tx.Model(&radio.RadioVoice{}).Where("is_default = ?", 1).Update("is_default", 0).Error; err != nil { return err } // 设置当前为默认 if err := tx.Model(&radio.RadioVoice{}).Where("id = ?", id).Update("is_default", 1).Error; err != nil { return err } return nil }) } var VoiceServiceApp = new(VoiceService)