package app import ( "errors" "git.echol.cn/loser/ai_proxy/server/global" "git.echol.cn/loser/ai_proxy/server/model/app" "git.echol.cn/loser/ai_proxy/server/model/app/request" "git.echol.cn/loser/ai_proxy/server/model/app/response" "gorm.io/gorm" ) type PresetBindingService struct{} // CreateBinding 创建预设绑定 func (s *PresetBindingService) CreateBinding(req *request.CreateBindingRequest) error { // 检查预设是否存在 var preset app.AiPreset if err := global.GVA_DB.First(&preset, req.PresetID).Error; err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return errors.New("预设不存在") } return err } // 检查提供商是否存在 var provider app.AiProvider if err := global.GVA_DB.First(&provider, req.ProviderID).Error; err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return errors.New("提供商不存在") } return err } // 检查是否已存在相同的绑定 var count int64 err := global.GVA_DB.Model(&app.AiPresetBinding{}). Where("preset_id = ? AND provider_id = ?", req.PresetID, req.ProviderID). Count(&count).Error if err != nil { return err } if count > 0 { return errors.New("该绑定已存在") } binding := app.AiPresetBinding{ PresetID: req.PresetID, ProviderID: req.ProviderID, Priority: req.Priority, IsActive: true, } return global.GVA_DB.Create(&binding).Error } // UpdateBinding 更新预设绑定 func (s *PresetBindingService) UpdateBinding(req *request.UpdateBindingRequest) error { var binding app.AiPresetBinding if err := global.GVA_DB.First(&binding, req.ID).Error; err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return errors.New("绑定不存在") } return err } updates := map[string]interface{}{ "priority": req.Priority, "is_active": req.IsActive, } return global.GVA_DB.Model(&binding).Updates(updates).Error } // DeleteBinding 删除预设绑定 func (s *PresetBindingService) DeleteBinding(id uint) error { var binding app.AiPresetBinding if err := global.GVA_DB.First(&binding, id).Error; err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return errors.New("绑定不存在") } return err } return global.GVA_DB.Delete(&binding).Error } // GetBindingList 获取绑定列表 func (s *PresetBindingService) GetBindingList(req *request.GetBindingListRequest) (list []response.BindingInfo, total int64, err error) { db := global.GVA_DB.Model(&app.AiPresetBinding{}) // 条件查询 if req.ProviderID > 0 { db = db.Where("provider_id = ?", req.ProviderID) } if req.PresetID > 0 { db = db.Where("preset_id = ?", req.PresetID) } // 获取总数 err = db.Count(&total).Error if err != nil { return nil, 0, err } // 分页查询 if req.Page > 0 && req.PageSize > 0 { offset := (req.Page - 1) * req.PageSize db = db.Offset(offset).Limit(req.PageSize) } var bindings []app.AiPresetBinding err = db.Preload("Preset").Preload("Provider").Order("priority ASC, created_at DESC").Find(&bindings).Error if err != nil { return nil, 0, err } // 转换为响应格式 list = make([]response.BindingInfo, len(bindings)) for i, binding := range bindings { list[i] = response.BindingInfo{ ID: binding.ID, PresetID: binding.PresetID, PresetName: binding.Preset.Name, ProviderID: binding.ProviderID, ProviderName: binding.Provider.Name, Priority: binding.Priority, IsActive: binding.IsActive, CreatedAt: binding.CreatedAt, UpdatedAt: binding.UpdatedAt, } } return list, total, nil } // GetBindingsByProvider 根据提供商获取绑定的预设列表 func (s *PresetBindingService) GetBindingsByProvider(providerID uint) ([]app.AiPreset, error) { var bindings []app.AiPresetBinding err := global.GVA_DB.Where("provider_id = ? AND is_active = ?", providerID, true). Preload("Preset"). Order("priority ASC"). Find(&bindings).Error if err != nil { return nil, err } presets := make([]app.AiPreset, len(bindings)) for i, binding := range bindings { presets[i] = binding.Preset } return presets, nil }