- 新增账单配置 API,包括获取和更新显示小数位数的功能。 - 在前端页面中集成账单配置,允许用户设置金额显示精度。 - 更新相关页面(分析、定价、令牌、使用日志)以支持动态显示小数位数。 - 规范化账单金额处理,确保金额在前端和后端一致。
62 lines
1.9 KiB
TypeScript
62 lines
1.9 KiB
TypeScript
export const BILLING_RAW_SCALE = 1_000_000_000;
|
|
export const LEGACY_BILLING_SCALE = 1_000_000;
|
|
export const LEGACY_TO_RAW_FACTOR = BILLING_RAW_SCALE / LEGACY_BILLING_SCALE;
|
|
|
|
export const DEFAULT_BILLING_DISPLAY_DECIMALS = 6;
|
|
export const MIN_BILLING_DISPLAY_DECIMALS = 0;
|
|
export const MAX_BILLING_DISPLAY_DECIMALS = 9;
|
|
|
|
export type BillingConfig = {
|
|
displayDecimals: number;
|
|
}
|
|
|
|
const toFiniteNumber = (value: unknown): number => {
|
|
if (typeof value === "number" && Number.isFinite(value)) {
|
|
return value;
|
|
}
|
|
|
|
if (typeof value === "string" && value.trim().length > 0) {
|
|
const parsed = Number(value);
|
|
if (Number.isFinite(parsed)) {
|
|
return parsed;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
};
|
|
|
|
export const normalizeRawBillingAmount = (value: unknown): number => {
|
|
return Math.max(0, Math.round(toFiniteNumber(value)));
|
|
};
|
|
|
|
export const legacyBillingAmountToRaw = (value: unknown): number => {
|
|
return normalizeRawBillingAmount(toFiniteNumber(value) * LEGACY_TO_RAW_FACTOR);
|
|
};
|
|
|
|
export const calculateTokenRateCostRaw = (tokens: unknown, rate: unknown): number => {
|
|
return normalizeRawBillingAmount(toFiniteNumber(tokens) * toFiniteNumber(rate) * LEGACY_TO_RAW_FACTOR);
|
|
};
|
|
|
|
export const calculateRequestCostRaw = (value: unknown): number => {
|
|
return legacyBillingAmountToRaw(value);
|
|
};
|
|
|
|
export const normalizeBillingDisplayDecimals = (value: unknown): number => {
|
|
const parsed = Math.round(toFiniteNumber(value));
|
|
|
|
if (!Number.isFinite(parsed)) {
|
|
return DEFAULT_BILLING_DISPLAY_DECIMALS;
|
|
}
|
|
|
|
return Math.min(
|
|
MAX_BILLING_DISPLAY_DECIMALS,
|
|
Math.max(MIN_BILLING_DISPLAY_DECIMALS, parsed)
|
|
);
|
|
};
|
|
|
|
export const normalizeBillingConfig = (value: Partial<BillingConfig> | null | undefined): BillingConfig => {
|
|
return {
|
|
displayDecimals: normalizeBillingDisplayDecimals(value?.displayDecimals),
|
|
};
|
|
};
|