2 lines
8.7 KiB
JavaScript
2 lines
8.7 KiB
JavaScript
|
|
import{i as H}from"./echarts-Bn9PLWWT.js";import{a as ce,u as ue}from"./element-plus-JbJMPIks.js";import{u as de,S as pe,C as me}from"./CategoryPieChart-DcwJBwPs.js";import{_ as fe,a as ve,r as Y}from"./index-jY687wPe.js";import{a as ye,f as he,b as be}from"./date-CWsjnySd.js";import{e as y,k as _e,a3 as ge,H as _,L as $,P as s,M as u,O as d,I as D,V as xe,n as Z,ag as g,c as U,m as Se,ah as we,F as ke,ab as Me,u as Ee,Y as F,R as q,Z as S,X as De}from"./vue-Gs2e-20-.js";const Le={class:"statistics app-page"},Ve={class:"page-header"},Ce={class:"header-actions"},Re={class:"card page-section filter-card"},Ye={class:"filter-container"},Ue={class:"date-picker-wrapper"},Fe={class:"page-section"},Ae={class:"card page-section main-chart-card"},Be={class:"charts-grid page-section"},Ie={class:"card side-chart-card"},Oe={class:"card side-chart-card"},Te={class:"card page-section table-card"},Ne={class:"table-container"},$e={class:"record-info"},ze={class:"record-main"},We={class:"record-date"},Pe={key:0,class:"record-note"},Xe={class:"user-pill-small"},G="总收入",J="总支出",K="收入",Q="支出",je={__name:"Statistics",setup(He){const L=["#2b59ff","#f59e0b","#10b981","#6366f1","#f43f5e","#14b8a6"],w=de(),V=()=>({income:0,expense:0,balance:0,dailyData:[],monthlyData:[],categories:[],userStats:{}}),m=y("monthly"),A=new Date,k=y(ye(A)),C=y(he(A)),R=y(be(A)),B=y(!1),i=y(""),I=y([]),c=Se(V()),O=y([]),T=y(null),N=y(null);let h=null,f=null;const ee=U(()=>{switch(m.value){case"daily":return"当日";case"weekly":return"本周";case"monthly":return"本月";case"yearly":return"本年";default:return"本期"}}),te=U(()=>i.value&&c.userStats[i.value]?c.userStats[i.value].income||0:c.income),ae=U(()=>i.value&&c.userStats[i.value]?c.userStats[i.value].expense||0:c.expense),se=U(()=>i.value?O.value.filter(l=>l.user===i.value):O.value);function le(){return m.value==="yearly"?c.monthlyData:c.dailyData}function z(l){return Object.fromEntries(l.map(e=>[e,{}]))}function oe(l,e){const r=new Set,v={},x={},p=z(e),b=z(e);return l.forEach(a=>{const o=a.month||a.date;o&&(r.add(o),a.type==="income"?(v[o]=(v[o]||0)+a.total,a.user&&p[a.user]&&(p[a.user][o]=(p[a.user][o]||0)+a.total)):a.type==="expense"&&(x[o]=(x[o]||0)+a.total,a.user&&b[a.user]&&(b[a.user][o]=(b[a.user][o]||0)+a.total)))}),{xData:[...r].sort(),incomeMap:v,expenseMap:x,userIncomeMaps:p,userExpenseMaps:b}}function ne(){return m.value==="monthly"||m.value==="yearly"}async function M(){B.value=!0;try{let l=V(),e=[];switch(m.value){case"daily":l=await w.fetchDailyStats(k.value),e=await Y.getByDate(k.value);break;case"weekly":l=await w.fetchWeeklyStats(k.value),e=await Y.getByRange(l.startDate,l.endDate);break;case"monthly":l=await w.fetchMonthlyStats(C.value),l=w.monthlyStats||V(),e=await Y.getByMonth(C.value);break;case"yearly":l=await w.fetchYearlyStats(R.value),e=await Y.getByMonth(R.value);break}Object.assign(c,V(),l||{}),O.value=e,await Z(),W(),P()}catch(l){ce.error(l.message)}finally{B.value=!1}}function re(){Z(()=>{W(),P()})}function W(){if(!T.value)return;h||(h=H(T.value));const l=I.value.map(n=>n.name),e=l.filter(n=>!i.value||n===i.value),{xData:r,incomeMap:v,expenseMap:x,userIncomeMaps:p,userExpenseMaps:b}=oe(le(),l),a=[],o=[];ne()&&(a.push(G),o.push({name:G,type:"bar",data:r.map(n=>Number((v[n]||0).toFixed(2))),itemStyle:{color:"#10b981",borderRadius:[4,4,0,0]},barMaxWidth:20})),e.forEach((n,E)=>{a.push(`${n}${K}`),o.push({name:`${n}${K}`,type:"bar",data:r.map(t=>Number((p[n][t]||0).toFixed(2))),itemStyle:{color:L[E%L.length],borderRadius:[4,4,0,0]},barMaxWidth:20})}),a.push(J),o.push({name:J,type:"bar",data:r.map(n=>Number((x[n]||0).toFixed(2))),itemStyle:{color:"#f43f5e",borderRadius:[4,4,0,0]},barMaxWidth:20}),e.forEach((n,E)=>{a.push(`${n}${Q}`),o.push({name:`${n}${Q}`,type:"bar",data:r.map(t=>Number((b[n][t]||0).toFixed(2))),itemStyle:{color:L[(E+2)%L.length],borderRadius:[4,4,0,0]},barMaxWidth:20})}),h.setOption({tooltip:{trigger:"axis",confine:!0,backgroundColor:"rgba(255, 255, 255, 0.95)",borderWidth:0,shadowBlur:10,shadowColor:"rgba(0,0,0,0.1)",axisPointer:{type:"shadow"}
|