ソースを参照

feat(channel-pricing): GetChannelPricingByModelWithChannelInfo 支持 CASE WHEN 回退 + 扩展字段

在 SQL 查询中使用 CASE WHEN > 0 回退策略,让渠道定价的扩展比率
(cache_ratio, cache_creation_ratio, image_ratio, audio_ratio,
audio_completion_ratio) 在未设置时自动回退到全局默认值,
而不是像 COALESCE 那样被零值拦截。同时更新 GROUP BY 子句包含所有
新选择的列,确保 MySQL 兼容。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
master
fengsilin 3週間前
コミット
c84c26b5a2
1個のファイルの変更14行の追加2行の削除
  1. +14
    -2
      model/channel_pricing.go

+ 14
- 2
model/channel_pricing.go ファイルの表示

@@ -235,6 +235,13 @@ func GetChannelPricingByModelWithChannelInfo(modelName string) ([]*ChannelPricin
globalModelPrice = 0 globalModelPrice = 0
} }



// 获取全局扩展比率(用于 CASE WHEN 回退)
globalCacheRatio, _ := ratio_setting.GetCacheRatio(modelName)
globalCacheCreationRatio, _ := ratio_setting.GetCreateCacheRatio(modelName)
globalImageRatio, _ := ratio_setting.GetImageRatio(modelName)
globalAudioRatio := ratio_setting.GetAudioRatio(modelName)
globalAudioCompletionRatio := ratio_setting.GetAudioCompletionRatio(modelName)
// 查询所有支持该模型的渠道,左连接渠道定价表 // 查询所有支持该模型的渠道,左连接渠道定价表
err := DB.Table("abilities"). err := DB.Table("abilities").
Select(`abilities.channel_id, channels.name as channel_name, channels.type as channel_type, Select(`abilities.channel_id, channels.name as channel_name, channels.type as channel_type,
@@ -244,14 +251,19 @@ func GetChannelPricingByModelWithChannelInfo(modelName string) ([]*ChannelPricin
COALESCE(channel_pricings.model_price, ?) as model_price, COALESCE(channel_pricings.model_price, ?) as model_price,
channel_pricings.id as id, channel_pricings.id as id,
channel_pricings.tag_ids as tag_ids, channel_pricings.tag_ids as tag_ids,
CASE WHEN channel_pricings.cache_ratio > 0 THEN channel_pricings.cache_ratio ELSE ? END as cache_ratio,
CASE WHEN channel_pricings.cache_creation_ratio > 0 THEN channel_pricings.cache_creation_ratio ELSE ? END as cache_creation_ratio,
CASE WHEN channel_pricings.image_ratio > 0 THEN channel_pricings.image_ratio ELSE ? END as image_ratio,
CASE WHEN channel_pricings.audio_ratio > 0 THEN channel_pricings.audio_ratio ELSE ? END as audio_ratio,
CASE WHEN channel_pricings.audio_completion_ratio > 0 THEN channel_pricings.audio_completion_ratio ELSE ? END as audio_completion_ratio,
(channel_pricings.id IS NOT NULL) as has_custom_pricing`, (channel_pricings.id IS NOT NULL) as has_custom_pricing`,
defaultQuotaType, globalModelRatio, globalCompletionRatio, globalModelPrice).
defaultQuotaType, globalModelRatio, globalCompletionRatio, globalModelPrice, globalCacheRatio, globalCacheCreationRatio, globalImageRatio, globalAudioRatio, globalAudioCompletionRatio).
Joins("LEFT JOIN channels ON abilities.channel_id = channels.id"). Joins("LEFT JOIN channels ON abilities.channel_id = channels.id").
Joins("LEFT JOIN channel_pricings ON abilities.channel_id = channel_pricings.channel_id AND channel_pricings.model_name = ? AND channel_pricings.deleted_at IS NULL", modelName). Joins("LEFT JOIN channel_pricings ON abilities.channel_id = channel_pricings.channel_id AND channel_pricings.model_name = ? AND channel_pricings.deleted_at IS NULL", modelName).
Where("abilities.model = ?", modelName). Where("abilities.model = ?", modelName).
Where("abilities.enabled = ?", true). Where("abilities.enabled = ?", true).
Where("channels.status = ?", 1). // 只显示启用的渠道 Where("channels.status = ?", 1). // 只显示启用的渠道
Group("abilities.channel_id, channels.name, channels.type, channel_pricings.quota_type, channel_pricings.model_ratio, channel_pricings.completion_ratio, channel_pricings.model_price, channel_pricings.id, channel_pricings.tag_ids").
Group("abilities.channel_id, channels.name, channels.type, channel_pricings.quota_type, channel_pricings.model_ratio, channel_pricings.completion_ratio, channel_pricings.model_price, channel_pricings.id, channel_pricings.tag_ids, channel_pricings.cache_ratio, channel_pricings.cache_creation_ratio, channel_pricings.image_ratio, channel_pricings.audio_ratio, channel_pricings.audio_completion_ratio").
Scan(&results).Error Scan(&results).Error
if err != nil { if err != nil {
return nil, err return nil, err


読み込み中…
キャンセル
保存