模型和供应商查询统一排序规则:sort_order=0 视为未设置排到最后, 非0值按升序排列。涉及 GetAllModels、SearchModels、GetAllVendors、 SearchVendors 以及 pricing 的内存排序。 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>master
| @@ -118,7 +118,7 @@ func GetVendorModelCounts() (map[int64]int64, error) { | |||||
| func GetAllModels(offset int, limit int) ([]*Model, error) { | func GetAllModels(offset int, limit int) ([]*Model, error) { | ||||
| var models []*Model | var models []*Model | ||||
| err := DB.Order("sort_order ASC, id ASC").Offset(offset).Limit(limit).Find(&models).Error | |||||
| err := DB.Order("CASE WHEN sort_order = 0 THEN 1 ELSE 0 END ASC, sort_order ASC, id ASC").Offset(offset).Limit(limit).Find(&models).Error | |||||
| return models, err | return models, err | ||||
| } | } | ||||
| @@ -166,7 +166,7 @@ func SearchModels(keyword string, vendor string, offset int, limit int) ([]*Mode | |||||
| if err := db.Count(&total).Error; err != nil { | if err := db.Count(&total).Error; err != nil { | ||||
| return nil, 0, err | return nil, 0, err | ||||
| } | } | ||||
| if err := db.Order("sort_order ASC, models.id ASC").Offset(offset).Limit(limit).Find(&models).Error; err != nil { | |||||
| if err := db.Order("CASE WHEN sort_order = 0 THEN 1 ELSE 0 END ASC, sort_order ASC, models.id ASC").Offset(offset).Limit(limit).Find(&models).Error; err != nil { | |||||
| return nil, 0, err | return nil, 0, err | ||||
| } | } | ||||
| return models, total, nil | return models, total, nil | ||||
| @@ -183,6 +183,16 @@ func updatePricing() { | |||||
| sort.Slice(vendorsList, func(i, j int) bool { | sort.Slice(vendorsList, func(i, j int) bool { | ||||
| oi := vendorOrderMap[vendorsList[i].ID] | oi := vendorOrderMap[vendorsList[i].ID] | ||||
| oj := vendorOrderMap[vendorsList[j].ID] | oj := vendorOrderMap[vendorsList[j].ID] | ||||
| // 0 排到最后 | |||||
| if oi == 0 && oj == 0 { | |||||
| return vendorsList[i].ID < vendorsList[j].ID | |||||
| } | |||||
| if oi == 0 { | |||||
| return false | |||||
| } | |||||
| if oj == 0 { | |||||
| return true | |||||
| } | |||||
| if oi != oj { | if oi != oj { | ||||
| return oi < oj | return oi < oj | ||||
| } | } | ||||
| @@ -336,13 +346,23 @@ func updatePricing() { | |||||
| pricingMap = append(pricingMap, pricing) | pricingMap = append(pricingMap, pricing) | ||||
| } | } | ||||
| // 按 sort_order 排序 pricingMap | |||||
| // 按 sort_order 排序 pricingMap,0 排到最后 | |||||
| sort.Slice(pricingMap, func(i, j int) bool { | sort.Slice(pricingMap, func(i, j int) bool { | ||||
| mi, okI := metaMap[pricingMap[i].ModelName] | mi, okI := metaMap[pricingMap[i].ModelName] | ||||
| mj, okJ := metaMap[pricingMap[j].ModelName] | mj, okJ := metaMap[pricingMap[j].ModelName] | ||||
| if okI && okJ { | if okI && okJ { | ||||
| if mi.SortOrder != mj.SortOrder { | |||||
| return mi.SortOrder < mj.SortOrder | |||||
| si, sj := mi.SortOrder, mj.SortOrder | |||||
| if si == 0 && sj == 0 { | |||||
| return pricingMap[i].ModelName < pricingMap[j].ModelName | |||||
| } | |||||
| if si == 0 { | |||||
| return false | |||||
| } | |||||
| if sj == 0 { | |||||
| return true | |||||
| } | |||||
| if si != sj { | |||||
| return si < sj | |||||
| } | } | ||||
| } else if okI { | } else if okI { | ||||
| return true | return true | ||||
| @@ -66,7 +66,7 @@ func GetVendorByID(id int) (*Vendor, error) { | |||||
| // GetAllVendors 获取全部供应商(分页) | // GetAllVendors 获取全部供应商(分页) | ||||
| func GetAllVendors(offset int, limit int) ([]*Vendor, error) { | func GetAllVendors(offset int, limit int) ([]*Vendor, error) { | ||||
| var vendors []*Vendor | var vendors []*Vendor | ||||
| err := DB.Order("sort_order ASC, id ASC").Offset(offset).Limit(limit).Find(&vendors).Error | |||||
| err := DB.Order("CASE WHEN sort_order = 0 THEN 1 ELSE 0 END ASC, sort_order ASC, id ASC").Offset(offset).Limit(limit).Find(&vendors).Error | |||||
| return vendors, err | return vendors, err | ||||
| } | } | ||||
| @@ -82,7 +82,7 @@ func SearchVendors(keyword string, offset int, limit int) ([]*Vendor, int64, err | |||||
| return nil, 0, err | return nil, 0, err | ||||
| } | } | ||||
| var vendors []*Vendor | var vendors []*Vendor | ||||
| if err := db.Order("sort_order ASC, id ASC").Offset(offset).Limit(limit).Find(&vendors).Error; err != nil { | |||||
| if err := db.Order("CASE WHEN sort_order = 0 THEN 1 ELSE 0 END ASC, sort_order ASC, id ASC").Offset(offset).Limit(limit).Find(&vendors).Error; err != nil { | |||||
| return nil, 0, err | return nil, 0, err | ||||
| } | } | ||||
| return vendors, total, nil | return vendors, total, nil | ||||