2 lines
8.7 KiB
JavaScript
Executable File
2 lines
8.7 KiB
JavaScript
Executable File
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"}},legend:{data:a,bottom:0,icon:"circle",textStyle:{color:"#64748b"}},grid:{left:40,right:10,bottom:60,top:20,containLabel:!0},xAxis:{type:"category",data:r.map(n=>n.slice(5)),axisLine:{lineStyle:{color:"#e2e8f0"}}},yAxis:{type:"value",axisLine:{show:!1},splitLine:{lineStyle:{type:"dashed",color:"#f1f5f9"}}},series:o},{notMerge:!0})}function P(){if(!N.value)return;if(f||(f=H(N.value)),!c.categories.length){f.clear();return}const l=(i.value?c.categories.map(e=>{var r;return{name:e.name,total:((r=(e.users||[]).find(v=>v.user===i.value))==null?void 0:r.total)||0}}).filter(e=>e.total>0):c.categories.map(e=>({name:e.name,total:e.total}))).sort((e,r)=>e.total-r.total);f.setOption({tooltip:{trigger:"axis",confine:!0},grid:{left:80,right:20,bottom:20,top:10},xAxis:{type:"value",splitLine:{show:!1},axisLabel:{show:!1},axisLine:{show:!1}},yAxis:{type:"category",data:l.map(e=>e.name),axisLine:{show:!1},axisTick:{show:!1}},series:[{type:"bar",data:l.map(e=>Number(e.total.toFixed(2))),itemStyle:{borderRadius:[0,4,4,0],color:"#2b59ff"},barWidth:16,label:{show:!0,position:"right",formatter:"{c}",color:"#64748b"}}]},{notMerge:!0})}function ie(l){return l.slice(5)}function X(){h==null||h.resize(),f==null||f.resize()}return _e(async()=>{I.value=await ve.getAll(),await M(),window.addEventListener("resize",X)}),ge(()=>{h==null||h.dispose(),f==null||f.dispose(),window.removeEventListener("resize",X)}),(l,e)=>{const r=g("el-icon"),v=g("el-option"),x=g("el-select"),p=g("el-radio-button"),b=g("el-radio-group"),a=g("el-date-picker"),o=g("el-table-column"),n=g("el-table"),E=we("loading");return _(),$("div",Le,[s("div",Ve,[e[5]||(e[5]=s("h2",{class:"page-title"},"数据报表",-1)),s("div",Ce,[u(x,{modelValue:i.value,"onUpdate:modelValue":e[0]||(e[0]=t=>i.value=t),placeholder:"全部成员",clearable:"",onChange:re,class:"user-select"},{prefix:d(()=>[u(r,null,{default:d(()=>[u(Ee(ue))]),_:1})]),default:d(()=>[u(v,{label:"全部成员",value:""}),(_(!0),$(ke,null,Me(I.value,t=>(_(),D(v,{key:t.name,label:t.name,value:t.name},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])])]),s("div",Re,[s("div",Ye,[u(b,{modelValue:m.value,"onUpdate:modelValue":e[1]||(e[1]=t=>m.value=t),onChange:M,size:"default",class:"dimension-tabs"},{default:d(()=>[u(p,{label:"daily"},{default:d(()=>[...e[6]||(e[6]=[F("日",-1)])]),_:1}),u(p,{label:"weekly"},{default:d(()=>[...e[7]||(e[7]=[F("周",-1)])]),_:1}),u(p,{label:"monthly"},{default:d(()=>[...e[8]||(e[8]=[F("月",-1)])]),_:1}),u(p,{label:"yearly"},{default:d(()=>[...e[9]||(e[9]=[F("年",-1)])]),_:1})]),_:1},8,["modelValue"]),s("div",Ue,[m.value==="daily"||m.value==="weekly"?(_(),D(a,{key:0,modelValue:k.value,"onUpdate:modelValue":e[2]||(e[2]=t=>k.value=t),type:"date","value-format":"YYYY-MM-DD",clearable:!1,onChange:M,class:"custom-picker"},null,8,["modelValue"])):m.value==="monthly"?(_(),D(a,{key:1,modelValue:C.value,"onUpdate:modelValue":e[3]||(e[3]=t=>C.value=t),type:"month","value-format":"YYYY-MM",clearable:!1,onChange:M,class:"custom-picker"},null,8,["modelValue"])):(_(),D(a,{key:2,modelValue:R.value,"onUpdate:modelValue":e[4]||(e[4]=t=>R.value=t),type:"year","value-format":"YYYY",clearable:!1,onChange:M,class:"custom-picker"},null,8,["modelValue"]))])])]),s("div",Fe,[u(pe,{income:te.value,expense:ae.value,"user-stats":c.userStats,"period-label":ee.value},null,8,["income","expense","user-stats","period-label"])]),s("div",Ae,[e[10]||(e[10]=s("div",{class:"section-title-small"},"收支趋势",-1)),s("div",{ref_key:"trendChartRef",ref:T,class:"chart-box"},null,512)]),s("div",Be,[s("div",Ie,[e[11]||(e[11]=s("div",{class:"section-title-small"},"分类占比",-1)),u(me,{data:c.categories,height:"280px"},null,8,["data"])]),s("div",Oe,[e[12]||(e[12]=s("div",{class:"section-title-small"},"支出排行",-1)),s("div",{ref_key:"rankChartRef",ref:N,class:"chart-box-small"},null,512)])]),s("div",Te,[e[13]||(e[13]=s("div",{class:"section-header"},[s("h3",{class:"section-title-small"},"交易明细")],-1)),s("div",Ne,[xe((_(),D(n,{data:se.value,"row-class-name":"record-row",style:{width:"100%"}},{default:d(()=>[u(o,{label:"交易信息","min-width":"140"},{default:d(({row:t})=>[s("div",$e,[s("div",ze,[s("span",{class:q(["cat-tag",t.type])},S(t.category_name),3),s("span",We,S(ie(t.date)),1)]),t.note?(_(),$("div",Pe,S(t.note),1)):De("",!0)])]),_:1}),u(o,{label:"用户",width:"80",align:"center"},{default:d(({row:t})=>{var j;return[s("span",Xe,S(((j=t.user)==null?void 0:j.charAt(0))||"U"),1)]}),_:1}),u(o,{label:"金额",width:"120",align:"right"},{default:d(({row:t})=>[s("span",{class:q(["mono-number amount-text",t.type==="income"?"text-income":"text-expense"])},S(t.type==="income"?"+":"-")+"¥"+S(t.amount.toFixed(2)),3)]),_:1})]),_:1},8,["data"])),[[E,B.value]])])])])}}},et=fe(je,[["__scopeId","data-v-462e5f0a"]]);export{et as default};
|