fix(billing): 修复 OpenAI fast 档位计费并补齐展示

- 打通 service_tier 在 OpenAI HTTP、WS、passthrough 与 usage 记录中的传递
- 修正 priority/flex 计费逻辑,并将 fast 归一化为 priority
- 在用户端和管理端补齐服务档位与计费明细展示
- 补齐前后端测试,并修复 WS 限流信号重复持久化导致的全量回归失败

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
yangjianbo
2026-03-08 23:22:28 +08:00
parent bcb6444f89
commit 87f4ed591e
29 changed files with 1417 additions and 47 deletions
@@ -0,0 +1,39 @@
import { describe, expect, it } from 'vitest'
import { formatUsageServiceTier, getUsageServiceTierLabel, normalizeUsageServiceTier } from '@/utils/usageServiceTier'
describe('usageServiceTier utils', () => {
it('normalizes fast/default aliases', () => {
expect(normalizeUsageServiceTier('fast')).toBe('priority')
expect(normalizeUsageServiceTier(' default ')).toBe('standard')
expect(normalizeUsageServiceTier('STANDARD')).toBe('standard')
})
it('preserves supported tiers', () => {
expect(normalizeUsageServiceTier('priority')).toBe('priority')
expect(normalizeUsageServiceTier('flex')).toBe('flex')
})
it('formats empty values as standard', () => {
expect(formatUsageServiceTier()).toBe('standard')
expect(formatUsageServiceTier('')).toBe('standard')
})
it('passes through unknown non-empty tiers for display fallback', () => {
expect(normalizeUsageServiceTier('custom-tier')).toBe('custom-tier')
expect(formatUsageServiceTier('custom-tier')).toBe('custom-tier')
})
it('maps tiers to translated labels', () => {
const translate = (key: string) => ({
'usage.serviceTierPriority': 'Fast',
'usage.serviceTierFlex': 'Flex',
'usage.serviceTierStandard': 'Standard',
})[key] ?? key
expect(getUsageServiceTierLabel('fast', translate)).toBe('Fast')
expect(getUsageServiceTierLabel('flex', translate)).toBe('Flex')
expect(getUsageServiceTierLabel(undefined, translate)).toBe('Standard')
expect(getUsageServiceTierLabel('custom-tier', translate)).toBe('custom-tier')
})
})