function viewStats(){ const dock=document.getElementById('pagerDock'); if(dock) dock.innerHTML=''; const ready=new Set((cache.accounts||[]).filter(a=>a && (a.status==='ready'||a.status==='authenticated')).map(a=>a.id)); const subs=(cache.subs||[]).filter(s=>s && ready.has(s.account_id)); const now=Date.now(); const week=now+7*86400000; const status={}, sku={}, due=[]; const accountsWith=new Set(); subs.forEach(s=>{ accountsWith.add(s.account_id); const st=s.status||'-'; status[st]=(status[st]||0)+1; if(st==='active'){ const key=(s.package||'-')+' / '+(s.sku||'-'); sku[key]=(sku[key]||0)+1; let exp=Number(s.expiry||0); if(exp && exp<1e11) exp*=1000; if(exp && exp<=week){ due.push({email:((cache.accounts||[]).find(a=>a.id===s.account_id)||{}).email||('#'+s.account_id), sku:key, exp:exp, past:expa.exp-b.exp); const bars=(obj,color,label)=>{ const rows=Object.keys(obj).map(k=>[k,obj[k]]).sort((a,b)=>b[1]-a[1]); const max=Math.max(1, ...rows.map(r=>r[1])); if(!rows.length) return '
没有数据
'; return '
'+rows.map(([k,n])=>'
'+esc(label?label(k):k)+'
'+n+'
').join('')+'
'; }; const dueRows=due.slice(0,80).map(d=>''+esc(d.email)+''+esc(d.sku)+''+fmtUnix(d.exp, true)+(d.past?' · 已到期':'')+'').join(''); $('#app').innerHTML= '
'+ '
有效账号'+ready.size+'
'+ '
有订阅'+accountsWith.size+'
'+ '
有效订阅'+(status.active||0)+'
'+ '
一周内到期'+due.length+'
'+ '
'+ '

订阅状态

'+bars(status,'#2563eb',k=>statusName(k)||k)+'
'+ '

有效订阅的 SKU

'+bars(sku,'#16a34a')+'
'+ '

临期 · 一周内到期或已到期仍有效

'+ '
'+ (dueRows||'')+ '
账号SKU到期
没有临期订阅。
'+(due.length>80?'
只显示最近 80 条,共 '+due.length+' 条
':'')+ '
'; }