From e507897f216a4fdba8d1ecfe5f9ba5f33ea462d7 Mon Sep 17 00:00:00 2001 From: fengsilin Date: Thu, 23 Apr 2026 09:33:30 +0800 Subject: [PATCH] =?UTF-8?q?feat(pricing):=20updatePricing=20=E6=8C=89=20so?= =?UTF-8?q?rt=5Forder=20=E6=8E=92=E5=BA=8F=20vendors=20=E5=92=8C=20models?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - vendorsList 按 vendor.SortOrder 升序排列,相同则按 ID 排序 - pricingMap 按 model.SortOrder 升序排列,相同则按模型名字典序 - 修复默认通道设置的 API 错误响应未正确展示的问题 Co-Authored-By: Claude Opus 4.7 --- model/pricing.go | 30 +++++++++++++++++++ .../Setting/Ratio/ChannelPricingView.jsx | 13 ++++---- 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/model/pricing.go b/model/pricing.go index b67c11a..c38b3e6 100644 --- a/model/pricing.go +++ b/model/pricing.go @@ -3,6 +3,7 @@ package model import ( "encoding/json" "fmt" + "sort" "strings" "sync" @@ -165,6 +166,11 @@ func updatePricing() { initDefaultVendorMapping(metaMap, vendorMap, enableAbilities) // 构建对前端友好的供应商列表 + vendorOrderMap := make(map[int]int) + for _, v := range vendorMap { + vendorOrderMap[v.Id] = v.SortOrder + } + vendorsList = make([]PricingVendor, 0, len(vendorMap)) for _, v := range vendorMap { vendorsList = append(vendorsList, PricingVendor{ @@ -174,6 +180,14 @@ func updatePricing() { Icon: v.Icon, }) } + sort.Slice(vendorsList, func(i, j int) bool { + oi := vendorOrderMap[vendorsList[i].ID] + oj := vendorOrderMap[vendorsList[j].ID] + if oi != oj { + return oi < oj + } + return vendorsList[i].ID < vendorsList[j].ID + }) modelGroupsMap := make(map[string]*types.Set[string]) @@ -322,6 +336,22 @@ func updatePricing() { pricingMap = append(pricingMap, pricing) } + // 按 sort_order 排序 pricingMap + sort.Slice(pricingMap, func(i, j int) bool { + mi, okI := metaMap[pricingMap[i].ModelName] + mj, okJ := metaMap[pricingMap[j].ModelName] + if okI && okJ { + if mi.SortOrder != mj.SortOrder { + return mi.SortOrder < mj.SortOrder + } + } else if okI { + return true + } else if okJ { + return false + } + return pricingMap[i].ModelName < pricingMap[j].ModelName + }) + // 防止大更新后数据不通用 if len(pricingMap) > 0 { pricingMap[0].PricingVersion = "82c4a357505fff6fee8462c3f7ec8a645bb95532669cb73b2cabee6a416ec24f" diff --git a/web/src/pages/Setting/Ratio/ChannelPricingView.jsx b/web/src/pages/Setting/Ratio/ChannelPricingView.jsx index 28d2e66..47794fd 100644 --- a/web/src/pages/Setting/Ratio/ChannelPricingView.jsx +++ b/web/src/pages/Setting/Ratio/ChannelPricingView.jsx @@ -332,13 +332,14 @@ const ChannelPricingView = ({ channels, channelPricings, tags, onRefresh }) => { icon={} onClick={async () => { try { - if (isDefault) { - await channelPricingApi.clearDefault(record.modelName); - showSuccess(t('已取消默认通道')); - } else { - await channelPricingApi.setDefault(record.modelName, record.channelId); - showSuccess(t('已设为默认通道')); + const res = isDefault + ? await channelPricingApi.clearDefault(record.modelName) + : await channelPricingApi.setDefault(record.modelName, record.channelId); + if (res.data?.success === false) { + showError(res.data.message || t('操作失败')); + return; } + showSuccess(isDefault ? t('已取消默认通道') : t('已设为默认通道')); onRefresh(); } catch (e) { showError(e);