From c84c26b5a2738d527c1104d546033a9733fc93da Mon Sep 17 00:00:00 2001 From: fengsilin Date: Fri, 17 Apr 2026 09:23:27 +0800 Subject: [PATCH] =?UTF-8?q?feat(channel-pricing):=20GetChannelPricingByMod?= =?UTF-8?q?elWithChannelInfo=20=E6=94=AF=E6=8C=81=20CASE=20WHEN=20?= =?UTF-8?q?=E5=9B=9E=E9=80=80=20+=20=E6=89=A9=E5=B1=95=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在 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 --- model/channel_pricing.go | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/model/channel_pricing.go b/model/channel_pricing.go index 8bc308b..a5280fb 100644 --- a/model/channel_pricing.go +++ b/model/channel_pricing.go @@ -235,6 +235,13 @@ func GetChannelPricingByModelWithChannelInfo(modelName string) ([]*ChannelPricin 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"). 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, channel_pricings.id as id, 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`, - 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 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.enabled = ?", true). 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 if err != nil { return nil, err