2 lines
10 KiB
JavaScript
Executable File
2 lines
10 KiB
JavaScript
Executable File
import{H as f,L as g,P as e,M as o,O as d,Y as E,Z as c,F as H,ab as W,X as F,ag as r,e as w,j as K,k as j,a3 as Q,u as h,V as ee,I as P,m as te,c as T,ay as se,ah as ae,R as O}from"./vue-Gs2e-20-.js";import{u as q,S as oe,C as ne}from"./CategoryPieChart-DcwJBwPs.js";import{u as le}from"./records-rp0LN8a-.js";import{_ as G,a as ie}from"./index-jY687wPe.js";import{f as ce,a as re}from"./date-CWsjnySd.js";import{a as Y}from"./element-plus-JbJMPIks.js";import{i as de,L as ue}from"./echarts-Bn9PLWWT.js";const me={class:"balance-card gradient-card breathe-animation"},_e={class:"card-header"},pe={class:"header-info"},fe={class:"balance-amount mono-number"},ve={key:0,class:"user-sections"},ye=["onClick"],he={class:"user-avatar"},ge={class:"user-info"},be={class:"user-name"},xe={class:"user-value mono-number"},Se={class:"dialog-content"},$e={class:"balance-icon-wrapper"},Ce={class:"input-wrapper"},we={class:"dialog-footer"},ke={__name:"BalanceCard",props:{balance:{type:Number,default:0},userBalances:{type:Array,default:()=>[]}},setup(C){const m=q(),i=w(!1),l=w(null),_=w(0),x=w(!1);function v(u){return(u||0).toLocaleString("zh-CN",{minimumFractionDigits:2,maximumFractionDigits:2})}function b(u){l.value=u,_.value=u.initial_balance,i.value=!0}async function y(){x.value=!0;try{await m.updateUserInitialBalance(l.value.user,_.value),Y.success(`${l.value.user} 的初始余额已更新`),i.value=!1}catch(u){Y.error(u.message)}finally{x.value=!1}}return(u,a)=>{var z;const k=r("InfoFilled"),S=r("el-icon"),t=r("el-tooltip"),s=r("Edit"),$=r("Wallet"),B=r("el-input-number"),D=r("el-button"),L=r("el-dialog");return f(),g("div",me,[e("div",_e,[e("div",pe,[a[3]||(a[3]=e("span",{class:"label"},"当前总余额",-1)),o(t,{content:"初始余额 + 收入 - 支出",placement:"top"},{default:d(()=>[o(S,{class:"info-icon"},{default:d(()=>[o(k)]),_:1})]),_:1})]),a[4]||(a[4]=e("div",{class:"currency"},"CNY",-1))]),e("div",fe,[a[5]||(a[5]=e("span",{class:"symbol"},"¥",-1)),E(c(v(C.balance)),1)]),C.userBalances&&C.userBalances.length>0?(f(),g("div",ve,[(f(!0),g(H,null,W(C.userBalances,p=>(f(),g("div",{key:p.user,class:"user-item",onClick:V=>b(p)},[e("div",he,c(p.user.charAt(0).toUpperCase()),1),e("div",ge,[e("div",be,c(p.user),1),e("div",xe,"¥"+c(v(p.balance)),1)]),o(S,{class:"edit-hint"},{default:d(()=>[o(s)]),_:1})],8,ye))),128))])):F("",!0),o(L,{modelValue:i.value,"onUpdate:modelValue":a[2]||(a[2]=p=>i.value=p),title:`调整 ${(z=l.value)==null?void 0:z.user} 的初始余额`,width:"360px",class:"modern-balance-dialog","align-center":"","destroy-on-close":"","append-to-body":""},{footer:d(()=>[e("div",we,[o(D,{round:"",size:"large",onClick:a[1]||(a[1]=p=>i.value=!1),class:"cancel-btn"},{default:d(()=>[...a[7]||(a[7]=[E("暂不修改",-1)])]),_:1}),o(D,{round:"",size:"large",type:"primary",class:"confirm-btn",onClick:y,loading:x.value},{default:d(()=>[...a[8]||(a[8]=[E(" 确认保存 ",-1)])]),_:1},8,["loading"])])]),default:d(()=>[e("div",Se,[e("div",$e,[o(S,null,{default:d(()=>[o($)]),_:1})]),a[6]||(a[6]=e("p",{class:"dialog-tip"},"请设置该用户的初始资金基数,系统将以此为起点,结合后续账单自动为您计算最新余额。",-1)),e("div",Ce,[o(B,{modelValue:_.value,"onUpdate:modelValue":a[0]||(a[0]=p=>_.value=p),precision:2,step:100,"controls-position":"right",size:"large",class:"amount-input"},null,8,["modelValue"])])])]),_:1},8,["modelValue","title"])])}}},De=G(ke,[["__scopeId","data-v-a942667d"]]),Be={__name:"TrendChart",props:{data:{type:Array,default:()=>[]},title:{type:String,default:"支出趋势"},users:{type:Array,default:()=>[]}},setup(C){const m=C,i=w(null);let l=null;const _=["#409eff","#67c23a","#e6a23c","#9b59b6","#1abc9c"];function x(){if(!i.value)return;l||(l=de(i.value));const v=new Set;m.data.forEach(t=>{t.type==="expense"&&v.add(t.date)});const b=[...v].sort(),y={};m.data.forEach(t=>{t.type==="expense"&&(y[t.date]=(y[t.date]||0)+t.total)});const u=m.users.map(t=>t.name),a={};u.forEach(t=>{a[t]={}}),m.data.forEach(t=>{t.type==="expense"&&t.user&&a[t.user]&&(a[t.user][t.date]=(a[t.user][t.date]||0)+t.total)});const k=["总计",...u],S=[{name:"总计",type:"line",data:b.map(t=>y[t]||0),smooth:!0,symbol:"circle",symbolSize:6,lineStyle:{color:"#f56c6c",width:2},itemStyle:{color:"#f56c6c"},areaStyle:{color:new ue(0,0,0,1,[{offset:0,color:"rgba(245,108,108,0.25)"},{offset:1,color:"rgba(245,108,108,0.03)"}])}},...u.map((t,s)=>({name:t,type:"line",data:b.map($=>a[t][$]||0),smooth:!0,symbol:"circle",symbolSize:5,lineStyle:{color:_[s%_.length],width:1.5,type:"dashed"},itemStyle:{color:_[s%_.length]}}))];l.setOption({title:{text:m.title,left:"center",textStyle:{fontSize:14,color:"#606266"}},tooltip:{trigger:"axis",confine:!0,axisPointer:{type:"shadow"},formatter:t=>{let s=`${t[0].axisValue}<br/>`;return t.forEach($=>{s+=`${$.seriesName}: ¥${($.value||0).toFixed(2)}<br/>`}),s}},legend:{data:k,bottom:0,textStyle:{fontSize:11}},grid:{left:60,right:20,bottom:40,top:40},xAxis:{type:"category",data:b.map(t=>t.slice(5)),axisLabel:{fontSize:11}},yAxis:{type:"value",axisLabel:{formatter:"¥{value}"}},series:S})}return K(()=>[m.data,m.users],x,{deep:!0}),j(()=>{x(),window.addEventListener("resize",()=>l==null?void 0:l.resize())}),Q(()=>{l==null||l.dispose(),window.removeEventListener("resize",()=>l==null?void 0:l.resize())}),(v,b)=>(f(),g("div",{class:"trend-chart card",ref_key:"chartRef",ref:i,style:{height:"320px"}},null,512))}},ze={class:"dashboard app-page"},Ve={class:"header-section"},Ee={class:"greeting"},Fe={class:"current-month"},Le={class:"page-section"},Me={class:"page-section"},Re={class:"page-section"},Ae={class:"today-summary-grid"},Ue={class:"today-card income"},Ne={class:"today-icon"},Ie={class:"today-info"},Pe={class:"today-amount mono-number"},Te={class:"today-card expense"},Oe={class:"today-icon"},Ye={class:"today-info"},He={class:"today-amount mono-number"},We={class:"charts-row page-section"},je={class:"card chart-container"},qe={class:"card chart-container"},Ge={class:"card page-section records-section"},Xe={class:"section-header"},Ze={class:"table-wrapper hidden-sm-and-down"},Je={class:"record-info-cell"},Ke={class:"record-main"},Qe={class:"record-category"},et={class:"record-date"},tt={key:0,class:"record-note"},st={class:"user-pills-small"},at={class:"mobile-record-list hidden-md-and-up"},ot={class:"item-left"},nt={class:"item-category"},lt={class:"item-sub"},it={class:"item-user"},ct={class:"item-date"},rt={key:0,class:"item-note"},dt={class:"item-right"},ut={__name:"Dashboard",setup(C){const m=se(),i=q(),l=le(),_=ce(),x=re(),v=w([]),b=w([]),y=te({income:0,expense:0}),u=T(()=>{const t=new Date().getHours();return t<6?"凌晨好":t<9?"早安":t<12?"上午好":t<14?"中午好":t<18?"下午好":"晚上好"}),a=T(()=>{const t=new Date;return`${t.getFullYear()}年 ${t.getMonth()+1}月`});j(async()=>{const[,,t,s]=await Promise.all([i.fetchBalance(),i.fetchMonthlyStats(_),ie.getAll(),i.fetchDailyStats(x)]);b.value=t,s&&(y.income=s.income||0,y.expense=s.expense||0),await k()});async function k(){await l.fetchByMonth(_),v.value=l.records.slice(0,10)}function S(t){const s=new Date(t);return`${s.getMonth()+1}-${s.getDate()}`}return(t,s)=>{var M,R,A,U,N;const $=r("Plus"),B=r("el-icon"),D=r("el-button"),L=r("Top"),z=r("Bottom"),p=r("ArrowRight"),V=r("el-table-column"),X=r("el-table"),Z=r("el-empty"),J=ae("loading");return f(),g("div",ze,[e("div",Ve,[e("div",Ee,[e("h2",null,c(u.value),1),e("p",Fe,c(a.value),1)]),o(D,{type:"primary",round:"",class:"quick-add-btn",onClick:s[0]||(s[0]=n=>h(m).push("/input"))},{default:d(()=>[o(B,null,{default:d(()=>[o($)]),_:1}),s[2]||(s[2]=e("span",null,"记一笔",-1))]),_:1})]),e("div",Le,[o(De,{balance:h(i).balanceInfo.current_balance,"user-balances":h(i).balanceInfo.userBalances||[]},null,8,["balance","user-balances"])]),e("div",Me,[s[3]||(s[3]=e("div",{class:"section-label"},"本月概览",-1)),o(oe,{income:((M=h(i).monthlyStats)==null?void 0:M.income)||0,expense:((R=h(i).monthlyStats)==null?void 0:R.expense)||0,"user-stats":((A=h(i).monthlyStats)==null?void 0:A.userStats)||{}},null,8,["income","expense","user-stats"])]),e("div",Re,[s[6]||(s[6]=e("div",{class:"section-label"},"今日收支",-1)),e("div",Ae,[e("div",Ue,[e("div",Ne,[o(L)]),e("div",Ie,[s[4]||(s[4]=e("span",{class:"today-label"},"今日收入",-1)),e("span",Pe,"¥"+c(y.income.toFixed(2)),1)])]),e("div",Te,[e("div",Oe,[o(z)]),e("div",Ye,[s[5]||(s[5]=e("span",{class:"today-label"},"今日支出",-1)),e("span",He,"¥"+c(y.expense.toFixed(2)),1)])])])]),e("div",We,[e("div",je,[o(Be,{data:((U=h(i).monthlyStats)==null?void 0:U.dailyData)||[],users:b.value,title:"本月趋势"},null,8,["data","users"])]),e("div",qe,[o(ne,{data:((N=h(i).monthlyStats)==null?void 0:N.categories)||[],title:"分类构成"},null,8,["data"])])]),e("div",Ge,[e("div",Xe,[s[8]||(s[8]=e("h3",{class:"section-title"},"最近记录",-1)),o(D,{link:"",type:"primary",onClick:s[1]||(s[1]=n=>h(m).push("/statistics"))},{default:d(()=>[s[7]||(s[7]=E(" 查看全部 ",-1)),o(B,null,{default:d(()=>[o(p)]),_:1})]),_:1})]),e("div",Ze,[ee((f(),P(X,{data:v.value,"row-class-name":"record-row",style:{width:"100%"}},{default:d(()=>[o(V,{label:"交易信息","min-width":"140"},{default:d(({row:n})=>[e("div",Je,[e("div",Ke,[e("span",Qe,c(n.category_name),1),e("span",et,c(S(n.date)),1)]),n.note?(f(),g("div",tt,c(n.note),1)):F("",!0)])]),_:1}),o(V,{label:"用户",width:"80",align:"center"},{default:d(({row:n})=>{var I;return[e("span",st,c(((I=n.user)==null?void 0:I.charAt(0))||"U"),1)]}),_:1}),o(V,{label:"金额",width:"120",align:"right"},{default:d(({row:n})=>[e("span",{class:O(["mono-number amount-cell",n.type==="income"?"text-income":"text-expense"])},c(n.type==="income"?"+":"-")+"¥"+c(n.amount.toFixed(2)),3)]),_:1})]),_:1},8,["data"])),[[J,h(l).loading]])]),e("div",at,[(f(!0),g(H,null,W(v.value,n=>(f(),g("div",{key:n.id,class:"mobile-record-item"},[e("div",ot,[e("div",nt,c(n.category_name),1),e("div",lt,[e("span",it,c(n.user),1),e("span",ct,c(S(n.date)),1)]),n.note?(f(),g("div",rt,c(n.note),1)):F("",!0)]),e("div",dt,[e("div",{class:O(["item-amount mono-number",n.type==="income"?"text-income":"text-expense"])},c(n.type==="income"?"+":"-")+"¥"+c(n.amount.toFixed(2)),3)])]))),128)),v.value.length===0?(f(),P(Z,{key:0,description:"暂无记录","image-size":40})):F("",!0)])])])}}},gt=G(ut,[["__scopeId","data-v-4da23829"]]);export{gt as default};
|