You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1 line
14 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import{n as e}from"./axios-CiYFffbI.js";import{I as t,N as n,Tt as r,V as i,Y as a,_ as o,d as s,f as c,i as l,it as u,kt as d,l as f,nt as p,p as m,u as h,v as g,y as _,z as v}from"./runtime-core.esm-bundler-CnFWH3R5.js";import{n as y}from"./http-LCi9aT1G.js";import{a as b,r as x}from"./index-BI6LL64u.js";import{n as S}from"./datetime-BxHRnH7A.js";var ee={class:`dashboard-wrap`},te={class:`stats-cards-flow`},ne={key:0,class:`stat-card-todo`},re={class:`stat-card-todo__cells`},ie={class:`stat-card-mini stat-card-mini--kpi stat-card-mini--kpi-act`},ae={class:`stat-card-mini__kpi-inner`},oe={class:`stat-card-mini__value stat-card-mini__value--kpi`},se={class:`stat-card-mini stat-card-mini--kpi stat-card-mini--kpi-tg`},ce={class:`stat-card-mini__kpi-inner`},le={class:`stat-card-mini__value stat-card-mini__value--kpi`},ue={class:`stat-card-mini stat-card-mini--kpi stat-card-mini--kpi-user`},de={class:`stat-card-mini__kpi-inner`},fe={class:`stat-card-mini__value stat-card-mini__value--kpi`},pe={class:`stat-card-mini stat-card-mini--kpi stat-card-mini--kpi-grey`},me={class:`stat-card-mini__kpi-inner`},he={class:`stat-card-mini__value stat-card-mini__value--kpi`},ge={class:`tg-title-row`},_e={class:`tg-subtitle`},ve={class:`stats-cards-flow stats-cards-flow--tg`},ye={class:`stat-card-mini stat-card-mini--tg stat-card-mini--tg-blue`},be={class:`stat-card-mini__value`},C={class:`stat-card-mini stat-card-mini--tg stat-card-mini--tg-green`},w={class:`stat-card-mini__value`},T={class:`stat-card-mini stat-card-mini--tg stat-card-mini--tg-gold`},E={class:`stat-card-mini__value`},D={class:`stat-card-mini stat-card-mini--tg stat-card-mini--tg-rose`},O={class:`stat-card-mini__value stat-card-mini__value--sm`},k={class:`tg-three-col`},A={class:`tg-box`},j={key:0,class:`tg-highlight-line`},M={key:1,class:`tg-muted`},N={key:2,class:`tg-highlight-line`},xe={class:`tg-highlight-line`},Se={class:`tg-box`},Ce={key:0,class:`tg-muted`},we={class:`tg-box`},Te={key:0,class:`tg-muted`},Ee={class:`daily-verify-header-row`},De={class:`verify-cell`},Oe={class:`verify-cell__pct`},ke={class:`verify-cell`},Ae={class:`verify-cell__pct`},P=b(_({__name:`Dashboard`,setup(_){let b=x(),P=u(!1),F=u(!1),I=u([]),L=p({venue_id:void 0}),R=u({scope:{role:``,venue_id:void 0,activity_id:void 0},summary:{activity_sessions:0,ticket_grab_sessions:0,user_count:0,blacklisted_unique:0},pending_audits:null,activity_stats:{total_view_count:0},activity_stats_activities:{data:[],total:0,page:1,page_size:500}}),z=p({current:1,pageSize:500});function je(e){let t=e.start_at?S(e.start_at):``,n=e.end_at?S(e.end_at):``;return t&&n?t===n?t:`${t} ~ ${n}`:t||n?t||n:`-`}let B=u([]),V=u(!1),H=p({eventId:void 0,date:void 0}),U=u(null),W=f(()=>U.value?.daily_verify_matrix?.date_labels??[]),Me=f(()=>U.value?.daily_verify_matrix?.rows??[]),G=u(!1),K=f(()=>R.value.pending_audits?.venues.count??0),q=f(()=>R.value.pending_audits?.activities.count??0);function J(){b.push({path:`/venues`,query:{audit_status:`pending`}})}function Ne(){b.push({path:`/activities`,query:{audit_status:`pending`}})}async function Y(){P.value=!0;try{let e={venue_id:L.venue_id||void 0,activity_stats_page:z.current,activity_stats_page_size:z.pageSize},{data:t}=await y.get(`/dashboard/stats`,{params:e}),n=t.activity_stats_activities;R.value={...R.value,...t,summary:t.summary??R.value.summary,pending_audits:t.pending_audits??null,activity_stats:t.activity_stats??R.value.activity_stats,activity_stats_activities:{data:Array.isArray(n?.data)?n.data:[],total:typeof n?.total==`number`?n.total:0,page:typeof n?.page==`number`?n.page:z.current,page_size:typeof n?.page_size==`number`?n.page_size:z.pageSize}},n&&typeof n.page==`number`&&(z.current=n.page)}catch(t){e.error(t?.response?.data?.message??`加载统计失败`)}finally{P.value=!1}}async function X(){let{data:e}=await y.get(`/me`);F.value=e?.full_admin_access===!0,F.value?I.value=(await y.get(`/venues`)).data:I.value=e?.venues||[]}function Pe(){z.current=1,Y()}function Fe(){z.current=1,Y()}function Ie(e){z.current=e,Y()}function Le(e){z.pageSize=e,z.current=1,Y()}async function Z(){try{let{data:e}=await y.get(`/ticket-grab-events`,{params:{page:1,page_size:100}}),t=e?.data??e?.items??e?.list??e;B.value=(Array.isArray(t)?t:[]).map(e=>({id:e.id,title:e.title})),!H.eventId&&B.value.length===1&&(H.eventId=B.value[0].id)}catch{B.value=[]}}async function Q(){if(!H.eventId){U.value=null;return}V.value=!0;try{let e={ticket_grab_event_id:H.eventId};H.date&&(e.date=H.date);let{data:t}=await y.get(`/dashboard/ticket-grab-stats`,{params:e});U.value=t}catch(t){U.value=null,e.error(t?.response?.data?.message??`加载抢票统计失败`)}finally{V.value=!1}}function Re(){Q()}function $(e){return!e||e.total<=0?{main:`0/0`,pct:`(0%)`}:{main:`${e.verified}/${e.total}`,pct:`(${e.pct}%)`}}async function ze(){if(H.eventId){G.value=!0;try{let t=(await y.get(`/dashboard/ticket-grab-daily-verify-export`,{params:{ticket_grab_event_id:H.eventId},responseType:`blob`,timeout:12e4})).data;if(t.type&&(t.type.includes(`json`)||t.type.includes(`text/html`))){let n=await t.text(),r=`导出失败`;try{let e=JSON.parse(n);e?.message&&(r=e.message)}catch{}e.error(r);return}let n=URL.createObjectURL(t),r=document.createElement(`a`);r.href=n,r.download=`每日核销统计-${H.eventId}-${new Date().toISOString().slice(0,10)}.xlsx`,r.click(),URL.revokeObjectURL(n),e.success(`已导出`)}catch(t){e.error(t?.response?.data?.message??`导出失败`)}finally{G.value=!1}}}return n(async()=>{await X(),await Y(),await Z(),H.eventId&&await Q()}),(e,n)=>{let u=i(`a-option`),f=i(`a-select`),p=i(`a-button`),_=i(`a-space`),y=i(`a-card`),b=i(`a-table-column`),x=i(`a-table`),S=i(`a-tag`),X=i(`a-date-picker`),Z=i(`a-empty`),Q=i(`a-spin`);return t(),m(`div`,ee,[g(y,{class:`query-card`,bordered:!1,title:`工作台 / 数据看板`},{default:a(()=>[g(_,{wrap:``},{default:a(()=>[F.value?(t(),s(f,{key:0,modelValue:L.venue_id,"onUpdate:modelValue":n[0]||=e=>L.venue_id=e,style:{width:`220px`},"allow-clear":``,"allow-search":``,placeholder:`筛选场馆`,onChange:Pe},{default:a(()=>[(t(!0),m(l,null,v(I.value,e=>(t(),s(u,{key:e.id,value:e.id},{default:a(()=>[o(d(e.name),1)]),_:2},1032,[`value`]))),128))]),_:1},8,[`modelValue`])):c(``,!0),g(p,{type:`primary`,loading:P.value,onClick:Fe},{default:a(()=>[...n[3]||=[o(`查询`,-1)]]),_:1},8,[`loading`]),g(p,{loading:P.value,onClick:Y},{default:a(()=>[...n[4]||=[o(`刷新统计`,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1}),h(`div`,te,[F.value&&R.value.pending_audits?(t(),m(`div`,ne,[n[9]||=h(`div`,{class:`stat-card-todo__header`},[h(`span`,{class:`stat-card-todo__title`},`待办事项`)],-1),n[10]||=h(`div`,{class:`stat-card-todo__divider`},null,-1),h(`div`,re,[h(`button`,{type:`button`,class:`stat-card-todo__cell stat-card-todo__cell--action`,onClick:J},[n[6]||=h(`div`,{class:`stat-card-todo__cell-label`},`场馆审核`,-1),h(`div`,{class:r([`stat-card-todo__cell-value`,{"stat-card-todo__cell-value--pending":K.value>0}])},[o(d(K.value),1),n[5]||=h(`span`,{class:`stat-card-todo__cell-unit`},``,-1)],2)]),h(`button`,{type:`button`,class:`stat-card-todo__cell stat-card-todo__cell--action`,onClick:Ne},[n[8]||=h(`div`,{class:`stat-card-todo__cell-label`},`活动审核`,-1),h(`div`,{class:r([`stat-card-todo__cell-value`,{"stat-card-todo__cell-value--pending":q.value>0}])},[o(d(q.value),1),n[7]||=h(`span`,{class:`stat-card-todo__cell-unit`},``,-1)],2)])])])):c(``,!0),h(`div`,ie,[h(`div`,ae,[n[11]||=h(`div`,{class:`stat-card-todo__title`},`活动场次`,-1),h(`div`,oe,d(R.value.summary.activity_sessions),1)])]),h(`div`,se,[h(`div`,ce,[n[12]||=h(`div`,{class:`stat-card-todo__title`},`抢票场次`,-1),h(`div`,le,d(R.value.summary.ticket_grab_sessions),1)])]),h(`div`,ue,[h(`div`,de,[n[13]||=h(`div`,{class:`stat-card-todo__title`},`用户数(参与预约的用户)`,-1),h(`div`,fe,d(R.value.summary.user_count),1)])]),h(`div`,pe,[h(`div`,me,[n[14]||=h(`div`,{class:`stat-card-todo__title`},`灰名单人数(去重)`,-1),h(`div`,he,d(R.value.summary.blacklisted_unique),1)])])]),g(y,{class:`panel-card`,bordered:!1,title:`活动统计`},{default:a(()=>[g(x,{class:`activity-stats-table`,data:R.value.activity_stats_activities.data,loading:P.value,"row-key":`id`,size:`small`,scroll:{x:1040},pagination:{current:z.current,pageSize:z.pageSize,total:R.value.activity_stats_activities.total,showTotal:!0,showPageSize:!0,pageSizeOptions:[20,50,100,200,500]},onPageChange:Ie,onPageSizeChange:Le},{columns:a(()=>[g(b,{title:`举办场馆`,"data-index":`venue_name`,width:300,ellipsis:!0,tooltip:!0}),g(b,{title:`活动名称`,"data-index":`title`,"min-width":200,ellipsis:!0,tooltip:!0}),g(b,{title:`活动日期`,width:280},{cell:a(({record:e})=>[o(d(je(e)),1)]),_:1}),g(b,{title:`浏览数`,"data-index":`view_count`,width:100})]),_:1},8,[`data`,`loading`,`pagination`])]),_:1}),g(y,{class:`panel-card ticket-grab-panel`,bordered:!1},{title:a(()=>[h(`div`,ge,[n[15]||=h(`span`,null,`抢票统计`,-1),U.value?.overview?.remaining_badge?(t(),s(S,{key:0,color:`arcoblue`,size:`small`},{default:a(()=>[o(d(U.value.overview.remaining_badge),1)]),_:1})):c(``,!0)])]),extra:a(()=>[...n[16]||=[h(`span`,{class:`panel-hint`},`需选择抢票活动;统计日期可选,未选时按当天`,-1)]]),default:a(()=>[g(_,{wrap:``,style:{"margin-bottom":`16px`}},{default:a(()=>[g(f,{modelValue:H.eventId,"onUpdate:modelValue":n[1]||=e=>H.eventId=e,"allow-search":``,placeholder:`选择抢票活动`,style:{width:`280px`}},{default:a(()=>[(t(!0),m(l,null,v(B.value,e=>(t(),s(u,{key:e.id,value:e.id},{default:a(()=>[o(d(e.title),1)]),_:2},1032,[`value`]))),128))]),_:1},8,[`modelValue`]),g(X,{modelValue:H.date,"onUpdate:modelValue":n[2]||=e=>H.date=e,"allow-clear":``,"value-format":`YYYY-MM-DD`,placeholder:`默认当天`,style:{width:`160px`}},null,8,[`modelValue`]),g(p,{type:`primary`,loading:V.value,disabled:!H.eventId,onClick:Re},{default:a(()=>[...n[17]||=[o(`查询`,-1)]]),_:1},8,[`loading`,`disabled`])]),_:1}),g(Q,{loading:V.value,style:{width:`100%`}},{default:a(()=>[U.value?.overview?(t(),m(l,{key:0},[h(`div`,_e,d(U.value.date)+` 数据统计 · `+d(U.value.event?.title),1),h(`div`,ve,[h(`div`,ye,[n[19]||=h(`div`,{class:`stat-card-mini__title`},`总放票数`,-1),h(`div`,be,[o(d(U.value.overview.total_released),1),n[18]||=h(`span`,{class:`stat-card-mini__unit`},``,-1)])]),h(`div`,C,[n[21]||=h(`div`,{class:`stat-card-mini__title`},`已抢票数`,-1),h(`div`,w,[o(d(U.value.overview.total_grabbed),1),n[20]||=h(`span`,{class:`stat-card-mini__unit`},``,-1)])]),h(`div`,T,[n[23]||=h(`div`,{class:`stat-card-mini__title`},`剩余票数`,-1),h(`div`,E,[o(d(U.value.overview.total_remaining),1),n[22]||=h(`span`,{class:`stat-card-mini__unit`},``,-1)])]),h(`div`,D,[n[24]||=h(`div`,{class:`stat-card-mini__title`},`抢完耗时`,-1),h(`div`,O,d(U.value.overview.sellout_duration_label),1)])]),h(`div`,k,[h(`div`,A,[n[25]||=h(`div`,{class:`tg-box-title`},`关键亮点`,-1),U.value.highlights?.fastest_sellout?(t(),m(`div`,j,` 最快抢完:`+d(U.value.highlights.fastest_sellout.venue_name)+``+d(U.value.highlights.fastest_sellout.duration_label)+` `,1)):(t(),m(`div`,M,`暂无「已全部抢完」的场馆`)),U.value.highlights?.max_release_venue?(t(),m(`div`,N,` 单馆最多放票:`+d(U.value.highlights.max_release_venue.venue_name)+``+d(U.value.highlights.max_release_venue.released)+` 张) `,1)):c(``,!0),h(`div`,xe,d(U.value.highlights?.summary),1)]),h(`div`,Se,[n[26]||=h(`div`,{class:`tg-box-title`},`票种(人次)`,-1),(U.value.ticket_types?.length??0)===0?(t(),m(`div`,Ce,`暂无数据`)):(t(!0),m(l,{key:1},v(U.value.ticket_types,(e,n)=>(t(),m(`div`,{key:`tt-`+n,class:`tg-list-line`},d(e.label)+``+d(e.people_count)+``,1))),128))]),h(`div`,we,[n[27]||=h(`div`,{class:`tg-box-title`},`年龄段分布`,-1),(U.value.age_groups?.length??0)===0?(t(),m(`div`,Te,`非学龄活动或未采集证件`)):(t(!0),m(l,{key:1},v(U.value.age_groups,(e,n)=>(t(),m(`div`,{key:`ag-`+n,class:`tg-list-line`},d(e.label)+``+d(e.people_count)+``,1))),128))])]),g(y,{class:`inner-panel`,bordered:!1,title:`抢票明细统计`},{default:a(()=>[g(x,{data:U.value.venues??[],pagination:!1,"row-key":`venue_id`,size:`small`},{columns:a(()=>[g(b,{title:`场馆`,"data-index":`venue_name`,"min-width":200}),g(b,{title:`放票`,"data-index":`released`,width:100}),g(b,{title:`已抢`,"data-index":`grabbed`,width:100}),g(b,{title:`剩余`,"data-index":`remaining`,width:100}),g(b,{title:`耗时`,"data-index":`duration_label`,width:140}),g(b,{title:`状态`,"data-index":`status`,width:100})]),_:1},8,[`data`])]),_:1}),g(y,{class:`inner-panel daily-verify-panel`,bordered:!1},{title:a(()=>[h(`div`,Ee,[n[29]||=h(`span`,{class:`daily-verify-header-row__title`},`每日核销统计`,-1),g(p,{type:`primary`,size:`small`,loading:G.value,disabled:!H.eventId,onClick:ze},{default:a(()=>[...n[28]||=[o(` 导出 Excel `,-1)]]),_:1},8,[`loading`,`disabled`])])]),default:a(()=>[W.value.length>0?(t(),s(x,{key:0,data:Me.value,pagination:!1,"row-key":`venue_id`,size:`small`,scroll:{x:200+W.value.length*104+148}},{columns:a(()=>[g(b,{title:`场馆`,"data-index":`venue_name`,width:200,fixed:`left`}),(t(!0),m(l,null,v(W.value,(e,n)=>(t(),s(b,{key:`dv-`+n,title:e,width:100},{cell:a(({record:e})=>[h(`div`,De,[h(`div`,null,d($(e.cells?.[n]).main),1),h(`div`,Oe,d($(e.cells?.[n]).pct),1)])]),_:2},1032,[`title`]))),128)),g(b,{title:`总人数和核销比`,width:132,fixed:`right`},{cell:a(({record:e})=>[h(`div`,ke,[h(`div`,null,d($(e.total_cell).main),1),h(`div`,Ae,d($(e.total_cell).pct),1)])]),_:1})]),_:1},8,[`data`,`scroll`])):(t(),s(Z,{key:1,description:`暂无每日核销数据`}))]),_:1})],64)):!V.value&&H.eventId?(t(),s(Z,{key:1,description:`暂无抢票统计数据`})):V.value?c(``,!0):(t(),s(Z,{key:2,description:`请选择抢票活动后查询`}))]),_:1},8,[`loading`])]),_:1})])}}}),[[`__scopeId`,`data-v-32167bb5`]]);export{P as default};