mirror of
https://github.com/Wei-Shaw/claude-relay-service.git
synced 2026-01-22 16:43:35 +00:00
3 lines
13 KiB
JavaScript
3 lines
13 KiB
JavaScript
import{E as de,a as ie,b as ce,c as pe,d as ue}from"./element-plus-BUfCkBQO.js";import{b as M}from"./vendor-Dr8jvgFu.js";import{c as K,aW as ge,r as b,_ as O,o as J,q as xe,x as c,z as e,R as u,P as r,u as g,J as w,O as P,Q as $,ac as Y,aU as ye,y as i,I as Q}from"./vue-vendor-R8HMg95E.js";import{c as W,s as j}from"./index-CUrM4ac7.js";import{f as x,R as me}from"./RecordDetailModal-CKl9a8f2.js";const ke={class:"space-y-4 p-4 lg:p-6"},fe={class:"flex flex-wrap items-center justify-between gap-3"},_e={class:"flex items-center gap-3"},ve={class:"text-xl font-bold text-gray-900 dark:text-gray-100"},he={class:"text-xs text-gray-500 dark:text-gray-400"},be={class:"text-xs text-gray-500 dark:text-gray-400"},we={class:"flex items-center gap-2 text-sm text-gray-500 dark:text-gray-400"},Re={key:0},Ce={key:1},Ie={class:"grid gap-3 md:grid-cols-2 xl:grid-cols-4"},Te={class:"rounded-xl border border-gray-200 bg-white p-4 shadow-sm dark:border-gray-800 dark:bg-gray-900"},De={class:"mt-1 text-2xl font-bold text-gray-900 dark:text-gray-100"},Ke={class:"rounded-xl border border-gray-200 bg-white p-4 shadow-sm dark:border-gray-800 dark:bg-gray-900"},Pe={class:"mt-1 text-2xl font-bold text-gray-900 dark:text-gray-100"},Se={class:"rounded-xl border border-gray-200 bg-white p-4 shadow-sm dark:border-gray-800 dark:bg-gray-900"},Ve={class:"mt-1 text-2xl font-bold text-yellow-600 dark:text-yellow-400"},ze={class:"rounded-xl border border-gray-200 bg-white p-4 shadow-sm dark:border-gray-800 dark:bg-gray-900"},Oe={class:"mt-1 text-2xl font-bold text-gray-900 dark:text-gray-100"},$e={class:"rounded-xl border border-gray-200 bg-white p-4 shadow-sm dark:border-gray-800 dark:bg-gray-900"},Ye={class:"flex flex-wrap items-center gap-3"},je={class:"rounded-xl border border-gray-200 bg-white shadow-sm dark:border-gray-800 dark:bg-gray-900"},Ee={key:0,class:"flex items-center justify-center p-10 text-gray-500 dark:text-gray-400"},Fe={key:1},Ue={key:0,class:"flex flex-col items-center gap-2 p-10 text-gray-500 dark:text-gray-400"},Me={key:1,class:"space-y-4"},Ne={class:"hidden overflow-x-auto md:block"},Ae={class:"min-w-full divide-y divide-gray-200 dark:divide-gray-800"},Be={class:"divide-y divide-gray-200 bg-white dark:divide-gray-800 dark:bg-gray-900"},He={class:"whitespace-nowrap px-4 py-3 text-sm text-gray-800 dark:text-gray-100"},qe={class:"px-4 py-3 text-sm text-gray-800 dark:text-gray-100"},Le={class:"flex flex-col"},Ge={class:"font-semibold"},Je={class:"text-xs text-gray-500 dark:text-gray-400"},Qe={class:"whitespace-nowrap px-4 py-3 text-sm text-gray-800 dark:text-gray-100"},We={class:"whitespace-nowrap px-4 py-3 text-sm text-blue-600 dark:text-blue-400"},Ze={class:"whitespace-nowrap px-4 py-3 text-sm text-green-600 dark:text-green-400"},Xe={class:"whitespace-nowrap px-4 py-3 text-sm text-purple-600 dark:text-purple-400"},et={class:"whitespace-nowrap px-4 py-3 text-sm text-gray-800 dark:text-gray-100"},tt={class:"whitespace-nowrap px-4 py-3 text-sm text-yellow-600 dark:text-yellow-400"},at={class:"whitespace-nowrap px-4 py-3 text-right text-sm"},st={class:"space-y-3 md:hidden"},ot={class:"flex items-center justify-between"},rt={class:"text-sm font-semibold text-gray-900 dark:text-gray-100"},lt={class:"text-xs text-gray-500 dark:text-gray-400"},nt={class:"text-xs text-gray-500 dark:text-gray-400"},dt={class:"mt-3 grid grid-cols-2 gap-2 text-sm text-gray-700 dark:text-gray-300"},it={class:"text-yellow-600 dark:text-yellow-400"},ct={class:"flex items-center justify-between px-4 pb-4"},pt={class:"text-sm text-gray-500 dark:text-gray-400"},ft={__name:"AccountUsageRecordsView",setup(ut){const N=ge(),Z=ye(),f=K(()=>N.params.accountId),I=K(()=>N.query.platform),E=b(!1),S=b(!1),V=b([]),A=b([]),B=b([]),n=O({currentPage:1,pageSize:50,totalRecords:0}),s=O({dateRange:null,model:"",apiKeyId:"",sortOrder:"desc"}),y=O({totalRequests:0,totalTokens:0,totalCost:0,avgCost:0}),R=O({id:f.value,name:"",platform:I.value||""}),F=b(!1),U=b(null),X=K(()=>R.name||R.id||f.value),H=K(()=>{const o={claude:"Claude官方","claude-console":"Claude Console",ccr:"Claude Console Relay",openai:"OpenAI","openai-responses":"OpenAI Responses",gemini:"Gemini","gemini-api":"Gemini API",droid:"Droid",unknown:"未知渠道"},t=R.platform||I.value||"unknown";return o[t]||"未知渠道"}),q=K(()=>!s.dateRange||s.dateRange.length!==2?"":`${T(s.dateRange[0])} ~ ${T(s.dateRange[1])}`),T=o=>o?M(o).format("YYYY-MM-DD HH:mm:ss"):"--",D=o=>{const t=typeof o=="number"?o:0;return t>=1?`$${t.toFixed(2)}`:t>=.001?`$${t.toFixed(4)}`:`$${t.toFixed(6)}`},L=o=>{const t={page:o,pageSize:n.pageSize,sortOrder:s.sortOrder};return s.model&&(t.model=s.model),s.apiKeyId&&(t.apiKeyId=s.apiKeyId),s.dateRange&&s.dateRange.length===2&&(t.startDate=M(s.dateRange[0]).toISOString(),t.endDate=M(s.dateRange[1]).toISOString()),I.value&&(t.platform=I.value),t},ee=o=>{var m,k,_,a,v;V.value=o.records||[];const t=o.pagination||{};n.currentPage=t.currentPage||1,n.pageSize=t.pageSize||n.pageSize,n.totalRecords=t.totalRecords||0;const l=o.filters||{};if(l.model!==void 0&&(s.model=l.model||""),l.apiKeyId!==void 0&&(s.apiKeyId=l.apiKeyId||""),l.sortOrder&&(s.sortOrder=l.sortOrder),l.startDate&&l.endDate){const h=[l.startDate,l.endDate],d=s.dateRange||[];(d[0]!==h[0]||d[1]!==h[1])&&(s.dateRange=h)}const p=o.summary||{};y.totalRequests=p.totalRequests||0,y.totalTokens=p.totalTokens||0,y.totalCost=p.totalCost||0,y.avgCost=p.avgCost||0,R.id=((m=o.accountInfo)==null?void 0:m.id)||f.value,R.name=((k=o.accountInfo)==null?void 0:k.name)||"",R.platform=((_=o.accountInfo)==null?void 0:_.platform)||I.value||"",A.value=((a=o.availableFilters)==null?void 0:a.models)||[],B.value=((v=o.availableFilters)==null?void 0:v.apiKeys)||[]},C=async(o=n.currentPage)=>{E.value=!0;try{const t=await W.get(`/admin/accounts/${f.value}/usage-records`,{params:L(o)});ee(t.data||{})}catch(t){j(`加载请求记录失败:${t.message||"未知错误"}`,"error")}finally{E.value=!1}},te=o=>{n.currentPage=o,C(o)},ae=o=>{n.pageSize=o,n.currentPage=1,C(1)},se=()=>{s.model="",s.apiKeyId="",s.dateRange=null,s.sortOrder="desc",n.currentPage=1,C(1)},G=o=>{U.value=o,F.value=!0},oe=()=>{F.value=!1,U.value=null},re=()=>{Z.push("/accounts")},le=async()=>{var o;if(!S.value){S.value=!0;try{const t=[];let l=1,p=1;const m=50;for(;l<=p&&l<=m;){const z=(await W.get(`/admin/accounts/${f.value}/usage-records`,{params:{...L(l),pageSize:200}})).data||{};t.push(...z.records||[]),p=((o=z.pagination)==null?void 0:o.totalPages)||1,l+=1}if(t.length===0){j("没有可导出的记录","info");return}const _=[["时间","API Key","模型","输入Token","输出Token","缓存创建Token","缓存读取Token","总Token","费用"].join(",")];t.forEach(d=>{const z=[T(d.timestamp),d.apiKeyName||d.apiKeyId||"",d.model||"",d.inputTokens||0,d.outputTokens||0,d.cacheCreateTokens||0,d.cacheReadTokens||0,d.totalTokens||0,d.costFormatted||D(d.cost)];_.push(z.map(ne=>`"${String(ne).replace(/"/g,'""')}"`).join(","))});const a=new Blob([_.join(`
|
||
`)],{type:"text/csv;charset=utf-8;"}),v=URL.createObjectURL(a),h=document.createElement("a");h.href=v,h.download=`account-${f.value}-usage-records.csv`,h.click(),URL.revokeObjectURL(v),j("导出 CSV 成功","success")}catch(t){j(`导出失败:${t.message||"未知错误"}`,"error")}finally{S.value=!1}}};return J(()=>[s.model,s.apiKeyId,s.sortOrder],()=>{n.currentPage=1,C(1)}),J(()=>s.dateRange,()=>{n.currentPage=1,C(1)},{deep:!0}),xe(()=>{C()}),(o,t)=>{const l=de,p=ue,m=ie,k=ce,_=pe;return i(),c("div",ke,[e("div",fe,[e("div",_e,[e("button",{class:"rounded-full border border-gray-200 px-3 py-2 text-sm text-gray-700 transition hover:bg-gray-100 dark:border-gray-700 dark:text-gray-200 dark:hover:bg-gray-800",onClick:re}," ← 返回 "),e("div",null,[t[4]||(t[4]=e("p",{class:"text-xs font-semibold uppercase tracking-wide text-blue-600 dark:text-blue-400"}," 账户请求详情时间线 ",-1)),e("h2",ve,r(X.value),1),e("p",he,"ID: "+r(f.value),1),e("p",be,"渠道:"+r(H.value),1)])]),e("div",we,[t[5]||(t[5]=e("i",{class:"fas fa-clock text-blue-500"},null,-1)),q.value?(i(),c("span",Re,r(q.value),1)):(i(),c("span",Ce,"显示近 5000 条记录"))])]),e("div",Ie,[e("div",Te,[t[6]||(t[6]=e("p",{class:"text-xs uppercase text-gray-500 dark:text-gray-400"},"总请求",-1)),e("p",De,r(g(x)(y.totalRequests)),1)]),e("div",Ke,[t[7]||(t[7]=e("p",{class:"text-xs uppercase text-gray-500 dark:text-gray-400"},"总 Token",-1)),e("p",Pe,r(g(x)(y.totalTokens)),1)]),e("div",Se,[t[8]||(t[8]=e("p",{class:"text-xs uppercase text-gray-500 dark:text-gray-400"},"总费用",-1)),e("p",Ve,r(D(y.totalCost)),1)]),e("div",ze,[t[9]||(t[9]=e("p",{class:"text-xs uppercase text-gray-500 dark:text-gray-400"},"平均费用/次",-1)),e("p",Oe,r(D(y.avgCost)),1)])]),e("div",$e,[e("div",Ye,[u(l,{modelValue:s.dateRange,"onUpdate:modelValue":t[0]||(t[0]=a=>s.dateRange=a),class:"max-w-[320px]",clearable:"","end-placeholder":"结束时间",format:"YYYY-MM-DD HH:mm:ss","start-placeholder":"开始时间",type:"datetimerange","unlink-panels":"","value-format":"YYYY-MM-DDTHH:mm:ss[Z]"},null,8,["modelValue"]),u(m,{modelValue:s.model,"onUpdate:modelValue":t[1]||(t[1]=a=>s.model=a),class:"w-[180px]",clearable:"",filterable:"",placeholder:"所有模型"},{default:w(()=>[(i(!0),c($,null,Y(A.value,a=>(i(),Q(p,{key:a,label:a,value:a},null,8,["label","value"]))),128))]),_:1},8,["modelValue"]),u(m,{modelValue:s.apiKeyId,"onUpdate:modelValue":t[2]||(t[2]=a=>s.apiKeyId=a),class:"w-[220px]",clearable:"",filterable:"",placeholder:"所有 API Key"},{default:w(()=>[(i(!0),c($,null,Y(B.value,a=>(i(),Q(p,{key:a.id,label:a.name||a.id,value:a.id},null,8,["label","value"]))),128))]),_:1},8,["modelValue"]),u(m,{modelValue:s.sortOrder,"onUpdate:modelValue":t[3]||(t[3]=a=>s.sortOrder=a),class:"w-[140px]",placeholder:"排序"},{default:w(()=>[u(p,{label:"时间降序",value:"desc"}),u(p,{label:"时间升序",value:"asc"})]),_:1},8,["modelValue"]),u(k,{onClick:se},{default:w(()=>t[10]||(t[10]=[e("i",{class:"fas fa-undo mr-2"},null,-1),P(" 重置 ",-1)])),_:1,__:[10]}),u(k,{loading:S.value,type:"primary",onClick:le},{default:w(()=>t[11]||(t[11]=[e("i",{class:"fas fa-file-export mr-2"},null,-1),P(" 导出 CSV ",-1)])),_:1,__:[11]},8,["loading"])])]),e("div",je,[E.value?(i(),c("div",Ee,t[12]||(t[12]=[e("i",{class:"fas fa-spinner fa-spin mr-2"},null,-1),P(" 加载中... ",-1)]))):(i(),c("div",Fe,[V.value.length===0?(i(),c("div",Ue,t[13]||(t[13]=[e("i",{class:"fas fa-inbox text-2xl"},null,-1),e("p",null,"暂无记录",-1)]))):(i(),c("div",Me,[e("div",Ne,[e("table",Ae,[t[15]||(t[15]=e("thead",{class:"bg-gray-50 dark:bg-gray-800"},[e("tr",null,[e("th",{class:"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500 dark:text-gray-300"}," 时间 "),e("th",{class:"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500 dark:text-gray-300"}," API Key "),e("th",{class:"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500 dark:text-gray-300"}," 模型 "),e("th",{class:"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500 dark:text-gray-300"}," 输入 "),e("th",{class:"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500 dark:text-gray-300"}," 输出 "),e("th",{class:"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500 dark:text-gray-300"}," 缓存(创/读) "),e("th",{class:"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500 dark:text-gray-300"}," 总 Token "),e("th",{class:"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500 dark:text-gray-300"}," 费用 "),e("th",{class:"px-4 py-3 text-right text-xs font-medium uppercase tracking-wider text-gray-500 dark:text-gray-300"}," 操作 ")])],-1)),e("tbody",Be,[(i(!0),c($,null,Y(V.value,a=>(i(),c("tr",{key:a.timestamp+a.model},[e("td",He,r(T(a.timestamp)),1),e("td",qe,[e("div",Le,[e("span",Ge,r(a.apiKeyName||a.apiKeyId||"未知 Key"),1),e("span",Je," ID: "+r(a.apiKeyId),1)])]),e("td",Qe,r(a.model),1),e("td",We,r(g(x)(a.inputTokens)),1),e("td",Ze,r(g(x)(a.outputTokens)),1),e("td",Xe,r(g(x)(a.cacheCreateTokens))+" / "+r(g(x)(a.cacheReadTokens)),1),e("td",et,r(g(x)(a.totalTokens)),1),e("td",tt,r(a.costFormatted||D(a.cost)),1),e("td",at,[u(k,{size:"small",onClick:v=>G(a)},{default:w(()=>t[14]||(t[14]=[P("详情",-1)])),_:2,__:[14]},1032,["onClick"])])]))),128))])])]),e("div",st,[(i(!0),c($,null,Y(V.value,a=>(i(),c("div",{key:a.timestamp+a.model,class:"rounded-lg border border-gray-200 bg-white p-4 shadow-sm dark:border-gray-800 dark:bg-gray-900"},[e("div",ot,[e("div",null,[e("p",rt,r(a.apiKeyName||a.apiKeyId||"未知 Key"),1),e("p",lt," ID: "+r(a.apiKeyId)+" · "+r(T(a.timestamp)),1),e("p",nt," 渠道:"+r(H.value),1)]),u(k,{size:"small",onClick:v=>G(a)},{default:w(()=>t[16]||(t[16]=[P("详情",-1)])),_:2,__:[16]},1032,["onClick"])]),e("div",dt,[e("div",null,"模型:"+r(a.model),1),e("div",null,"总 Token:"+r(g(x)(a.totalTokens)),1),e("div",null,"输入:"+r(g(x)(a.inputTokens)),1),e("div",null,"输出:"+r(g(x)(a.outputTokens)),1),e("div",null," 缓存创/读:"+r(g(x)(a.cacheCreateTokens))+" / "+r(g(x)(a.cacheReadTokens)),1),e("div",it," 费用:"+r(a.costFormatted||D(a.cost)),1)])]))),128))]),e("div",ct,[e("div",pt," 共 "+r(n.totalRecords)+" 条记录 ",1),u(_,{background:"","current-page":n.currentPage,layout:"prev, pager, next, sizes","page-size":n.pageSize,"page-sizes":[20,50,100,200],total:n.totalRecords,onCurrentChange:te,onSizeChange:ae},null,8,["current-page","page-size","total"])])]))]))]),u(me,{record:U.value,show:F.value,onClose:oe},null,8,["record","show"])])}}};export{ft as default};
|