Просмотр исходного кода

feat(pricing): updatePricing 按 sort_order 排序 vendors 和 models

- vendorsList 按 vendor.SortOrder 升序排列,相同则按 ID 排序
- pricingMap 按 model.SortOrder 升序排列,相同则按模型名字典序
- 修复默认通道设置的 API 错误响应未正确展示的问题

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
master
fengsilin 2 недель назад
Родитель
Сommit
e507897f21
2 измененных файлов: 37 добавлений и 6 удалений
  1. +30
    -0
      model/pricing.go
  2. +7
    -6
      web/src/pages/Setting/Ratio/ChannelPricingView.jsx

+ 30
- 0
model/pricing.go Просмотреть файл

@@ -3,6 +3,7 @@ package model
import ( import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"sort"
"strings" "strings"


"sync" "sync"
@@ -165,6 +166,11 @@ func updatePricing() {
initDefaultVendorMapping(metaMap, vendorMap, enableAbilities) initDefaultVendorMapping(metaMap, vendorMap, enableAbilities)


// 构建对前端友好的供应商列表 // 构建对前端友好的供应商列表
vendorOrderMap := make(map[int]int)
for _, v := range vendorMap {
vendorOrderMap[v.Id] = v.SortOrder
}

vendorsList = make([]PricingVendor, 0, len(vendorMap)) vendorsList = make([]PricingVendor, 0, len(vendorMap))
for _, v := range vendorMap { for _, v := range vendorMap {
vendorsList = append(vendorsList, PricingVendor{ vendorsList = append(vendorsList, PricingVendor{
@@ -174,6 +180,14 @@ func updatePricing() {
Icon: v.Icon, 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]) modelGroupsMap := make(map[string]*types.Set[string])


@@ -322,6 +336,22 @@ func updatePricing() {
pricingMap = append(pricingMap, pricing) 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 { if len(pricingMap) > 0 {
pricingMap[0].PricingVersion = "82c4a357505fff6fee8462c3f7ec8a645bb95532669cb73b2cabee6a416ec24f" pricingMap[0].PricingVersion = "82c4a357505fff6fee8462c3f7ec8a645bb95532669cb73b2cabee6a416ec24f"


+ 7
- 6
web/src/pages/Setting/Ratio/ChannelPricingView.jsx Просмотреть файл

@@ -332,13 +332,14 @@ const ChannelPricingView = ({ channels, channelPricings, tags, onRefresh }) => {
icon={<IconStar />} icon={<IconStar />}
onClick={async () => { onClick={async () => {
try { 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(); onRefresh();
} catch (e) { } catch (e) {
showError(e); showError(e);


Загрузка…
Отмена
Сохранить