2 lines
5.0 KiB
JavaScript
2 lines
5.0 KiB
JavaScript
"use strict";const e=require("../../common/vendor.js"),t=require("../../utils/store.js"),a=require("../../utils/date.js"),u=require("../../utils/money.js");Math||(n+r)();const n=()=>"../../components/SectionCard.js",r=()=>"../../components/AppTabBar.js",o={__name:"index",setup(n){const r=t.useAppStore(),o=e.ref(a.toMonthKey()),l=e.ref(!1),i=e.computed((()=>"dark"===r.state.settings.theme?"theme-dark":"")),c=e.computed((()=>o.value.slice(0,7))),s=e.computed((()=>a.formatMonthLabel(c.value))),m=e.computed((()=>o.value)),d=e.computed((()=>r.state.bills.filter((e=>a.isSameMonth(e.date,c.value))))),p=e.computed((()=>d.value.filter((e=>"expense"===e.type)))),f=e.computed((()=>p.value.reduce(((e,t)=>e+Number(t.amount)),0))),v=e.computed((()=>d.value.filter((e=>"income"===e.type)).reduce(((e,t)=>e+Number(t.amount)),0))),b=e.computed((()=>{const e=Math.max(f.value,1);return r.state.categories.expense.map((t=>{const a=p.value.filter((e=>e.categoryId===t.id)).reduce(((e,t)=>e+Number(t.amount)),0);return{...t,total:a,percentLabel:u.formatPercent(a/e),percentWidth:u.clampPercent(a/e)}})).filter((e=>e.total>0)).sort(((e,t)=>t.total-e.total))})),h=e.computed((()=>{const[e,t]=c.value.split("-").map(Number),u=a.toDateKey(),n=new Date(e,t,0),r=a.toMonthKey(u)===c.value?new Date:n,o=a.getRecentDateKeys(7,r),l=Math.max(1,...o.map((e=>p.value.filter((t=>t.date===e)).reduce(((e,t)=>e+Number(t.amount)),0))));return o.map((e=>{const t=p.value.filter((t=>t.date===e)).reduce(((e,t)=>e+Number(t.amount)),0);return{date:e,label:e.slice(5),value:Number(t.toFixed(2)),height:`${Math.max(8,t/l*100)}%`}}))})),x=e.computed((()=>{const e=a.getMonthSeries(6,c.value),t=Math.max(1,...e.map((e=>r.state.bills.filter((t=>"expense"===t.type&&a.isSameMonth(t.date,e))).reduce(((e,t)=>e+Number(t.amount)),0)))),u=Math.max(1,...e.map((e=>r.state.bills.filter((t=>"income"===t.type&&a.isSameMonth(t.date,e))).reduce(((e,t)=>e+Number(t.amount)),0))));return e.map((e=>{const n=r.state.bills.filter((t=>"expense"===t.type&&a.isSameMonth(t.date,e))).reduce(((e,t)=>e+Number(t.amount)),0),o=r.state.bills.filter((t=>"income"===t.type&&a.isSameMonth(t.date,e))).reduce(((e,t)=>e+Number(t.amount)),0);return{month:e,label:e.slice(5),expense:n,income:o,expenseWidth:`${Math.max(8,n/t*100)}%`,incomeWidth:`${Math.max(8,o/u*100)}%`}}))}));function y(e){o.value=String(e.detail.value).slice(0,7)}function g(e){var t;return(null==(t=(r.state.categories[e.type]||[]).find((t=>t.id===e.categoryId)))?void 0:t.name)||"未分类"}function M(e){var t;return(null==(t=r.state.accounts.find((t=>t.id===e.accountId)))?void 0:t.name)||"未知账户"}function C(e){const t=String(e??"");return/[",\n]/.test(t)?`"${t.replace(/"/g,'""')}"`:t}function $(){const t=d.value.map((e=>[C(e.date),C("income"===e.type?"收入":"支出"),C(g(e)),C(M(e)),C(Number(e.amount).toFixed(2)),C(e.note||"")].join(",")));!function(t,a,u){if(void 0!==e.wx$1&&e.wx$1.getFileSystemManager){const n=`${e.wx$1.env.USER_DATA_PATH}/${t}`;e.wx$1.getFileSystemManager().writeFile({filePath:n,data:a,encoding:"utf8",success:()=>{e.index.showModal({title:u,content:`文件已生成:${n}`,showCancel:!1})},fail:()=>{e.index.setClipboardData({data:a})}})}else e.index.setClipboardData({data:a})}(`账单-${c.value}.csv`,["\ufeff日期,类型,分类,账户,金额,备注",...t].join("\n"),"CSV 导出成功")}function S(){const t=`${s.value},支出 ${u.formatCurrency(f.value)},收入 ${u.formatCurrency(v.value)},结余 ${u.formatCurrency(v.value-f.value)}。`;e.index.setClipboardData({data:t})}return e.onShareAppMessage((()=>({title:`${s.value}收支摘要`,path:"/pages/stats/index"}))),(t,a)=>e.e({a:e.t(s.value),b:m.value,c:e.o(y),d:e.t(e.unref(u.formatCurrency)(f.value)),e:e.t(e.unref(u.formatCurrency)(v.value)),f:e.t(e.unref(u.formatCurrency)(v.value-f.value)),g:e.p({title:"报表总览",subtitle:"按月份查看收支分布、消费趋势和月度对比"}),h:b.value.length},b.value.length?{i:e.f(b.value,((t,a,n)=>({a:t.color,b:e.t(t.name),c:e.t(e.unref(u.formatCurrency)(t.total)),d:e.t(t.percentLabel),e:t.percentWidth,f:t.color,g:t.id})))}:{},{j:e.p({title:"支出分类",subtitle:"查看本月主要消费去向与占比结构"}),k:e.f(h.value,((t,a,u)=>({a:t.height,b:e.t(t.label),c:e.t(0===t.value?"-":t.value),d:t.date}))),l:e.p({title:"近 7 日趋势",subtitle:"观察近一周消费变化,便于发现异常高峰"}),m:e.f(x.value,((t,a,n)=>({a:e.t(t.label),b:t.expenseWidth,c:t.incomeWidth,d:e.t(e.unref(u.formatCurrency)(t.expense)),e:e.t(e.unref(u.formatCurrency)(t.income)),f:t.month}))),n:e.p({title:"月度对比",subtitle:"最近 6 个月收入与支出走势一目了然"}),o:e.o($),p:e.o((e=>l.value=!0)),q:e.p({title:"导出与分享",subtitle:"支持导出当月 CSV 账单与生成分享文案"}),r:l.value},l.value?{s:e.o((e=>l.value=!1)),t:e.t(s.value),v:e.t(e.unref(u.formatCurrency)(f.value)),w:e.t(e.unref(u.formatCurrency)(v.value)),x:e.t(e.unref(u.formatCurrency)(v.value-f.value)),y:e.o(S),z:e.o((e=>l.value=!1)),A:e.o((()=>{}))}:{},{B:e.p({current:"stats"}),C:e.n(i.value)})}},l=e._export_sfc(o,[["__scopeId","data-v-7cab36fb"]]);o.__runtimeHooks=2,wx.createPage(l);
|