Przeglądaj źródła

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 tygodni temu
rodzic
commit
e507897f21
2 zmienionych plików z 37 dodań i 6 usunięć
  1. +30
    -0
      model/pricing.go
  2. +7
    -6
      web/src/pages/Setting/Ratio/ChannelPricingView.jsx

+ 30
- 0
model/pricing.go Wyświetl plik

@@ -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"


+ 7
- 6
web/src/pages/Setting/Ratio/ChannelPricingView.jsx Wyświetl plik

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


Ładowanie…
Anuluj
Zapisz