feat(desktop): 「用量」视图 —— 我的积分余额/消耗趋势/最近消耗(P3 续)
给终端用户一个自己的计量观测面(守边界:只读自己租户): - 新增 UsageView(左导航 MANAGE 组「用量」,Coins 图标):余额 hero 卡 (硬拦截+余额≤0→红/偏低→橙)、区间 KPI(积分/Token/成本/运行数)、 积分消耗按天趋势条形图(近7/近30天可切)、最近消耗明细表(任务/模型/token/积分/成本)。 读 /api/v1/me/usage。 - 顶栏积分余额芯片改为可点,进「用量」页(onOpenUsage → setView)。 live 验证(preview):视图显示 公司A 余额 15.92 + KPI + 趋势bar(落在实际消耗日) + 最近消耗 3 行真实数据;tsc + 48 测试全过。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -139,6 +139,48 @@ export async function tenantCurrent(): Promise<TenantCtx | null> {
|
||||
};
|
||||
}
|
||||
|
||||
// ---- 我的用量明细(当前用户自己租户:余额 + 按天趋势 + 最近消耗)----
|
||||
export interface UsageDay {
|
||||
day: string; // YYYYMMDD
|
||||
total_tok: number;
|
||||
credits_micro: number;
|
||||
cost_micros: number;
|
||||
task_count: number;
|
||||
}
|
||||
export interface UsageRecent {
|
||||
task_id: string;
|
||||
model: string;
|
||||
total_tok: number;
|
||||
credits_micro: number;
|
||||
cost_micros: number;
|
||||
currency: string;
|
||||
ts: number;
|
||||
}
|
||||
export interface MyUsage {
|
||||
from: string;
|
||||
to: string;
|
||||
balance_micro: number;
|
||||
credit_enforce: boolean;
|
||||
trend: UsageDay[];
|
||||
totals: { total_tok: number; credits_micro: number; cost_micros: number; task_count: number };
|
||||
recent: UsageRecent[];
|
||||
}
|
||||
|
||||
export async function myUsage(days = 30): Promise<MyUsage> {
|
||||
const res = guard401(await fetch(`${GATEWAY}/api/v1/me/usage?days=${days}`, { headers: bearer() }));
|
||||
if (!res.ok) throw new Error(`usage failed: ${res.status}`);
|
||||
const d = (await res.json()) as Partial<MyUsage>;
|
||||
return {
|
||||
from: d.from ?? "",
|
||||
to: d.to ?? "",
|
||||
balance_micro: d.balance_micro ?? 0,
|
||||
credit_enforce: !!d.credit_enforce,
|
||||
trend: d.trend ?? [],
|
||||
totals: d.totals ?? { total_tok: 0, credits_micro: 0, cost_micros: 0, task_count: 0 },
|
||||
recent: d.recent ?? [],
|
||||
};
|
||||
}
|
||||
|
||||
// taskStatus: GET /api/v1/tasks/:id —— 任务生命周期状态(submitted/running/waiting/done/failed/timeout/rejected)。
|
||||
// 轮询它来可靠捕获 waiting(审批中断)—— 不依赖易抢跑的实时 exec 事件。
|
||||
export async function taskStatus(taskId: string): Promise<{ status: string; detail: string }> {
|
||||
|
||||
Reference in New Issue
Block a user