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
13 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{I as e,N as t,V as n,Y as r,_ as i,d as a,f as o,i as s,it as c,kt as l,l as u,nt as d,p as f,u as p,v as m,y as h,z as g}from"./runtime-core.esm-bundler-CnFWH3R5.js";import{t as _}from"./message-Dh9377vh.js";import{n as v}from"./http-BWP--XXK.js";import{i as y}from"./index-CLnpIFlv.js";var ee={class:`dashboard-wrap`},te={class:`stats-cards-flow`},ne={class:`stat-card-mini`},re={class:`stat-card-mini__value`},ie={class:`stat-card-mini`},ae={class:`stat-card-mini__value`},oe={class:`stat-card-mini`},se={class:`stat-card-mini__value`},b={class:`stat-card-mini`},ce={class:`stat-card-mini__value`},le={class:`stat-card-mini`},ue={class:`stat-card-mini__value stat-card-mini__value--orange`},de={class:`stats-cards-flow stats-cards-flow--dense`},fe={class:`stat-card-mini stat-card-mini--accent`},pe={class:`stat-card-mini__value`},me={class:`tg-title-row`},he={class:`tg-subtitle`},ge={class:`stats-cards-flow stats-cards-flow--tg`},_e={class:`stat-card-mini stat-card-mini--tg stat-card-mini--tg-blue`},x={class:`stat-card-mini__value`},S={class:`stat-card-mini stat-card-mini--tg stat-card-mini--tg-green`},C={class:`stat-card-mini__value`},w={class:`stat-card-mini stat-card-mini--tg stat-card-mini--tg-gold`},T={class:`stat-card-mini__value`},E={class:`stat-card-mini stat-card-mini--tg stat-card-mini--tg-rose`},D={class:`stat-card-mini__value stat-card-mini__value--sm`},O={class:`tg-three-col`},k={class:`tg-box`},A={key:0,class:`tg-highlight-line`},j={key:1,class:`tg-muted`},M={key:2,class:`tg-highlight-line`},N={class:`tg-highlight-line`},P={class:`tg-box`},F={key:0,class:`tg-muted`},I={class:`tg-box`},ve={key:0,class:`tg-muted`},ye={class:`tg-footer`},L=y(h({__name:`Dashboard`,setup(h){let y=c(!1),L=c(!1),R=c([]);function z(){let e=new Date;return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,`0`)}-${String(e.getDate()).padStart(2,`0`)}`}let B=d({venue_id:void 0,activity_id:void 0,dateRange:void 0}),V=c([]),be=[{label:`今天`,value:()=>{let e=new Date,t=`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,`0`)}-${String(e.getDate()).padStart(2,`0`)}`;return[t,t]}},{label:`本月`,value:()=>{let e=new Date;return[`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,`0`)}-01`,`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,`0`)}-${String(new Date(e.getFullYear(),e.getMonth()+1,0).getDate()).padStart(2,`0`)}`]}},{label:`近三月`,value:()=>{let e=new Date,t=new Date;return t.setMonth(t.getMonth()-3),[`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,`0`)}-${String(t.getDate()).padStart(2,`0`)}`,`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,`0`)}-${String(e.getDate()).padStart(2,`0`)}`]}},{label:`今年`,value:()=>{let e=new Date;return[`${e.getFullYear()}-01-01`,`${e.getFullYear()}-12-31`]}},{label:`去年`,value:()=>{let e=new Date().getFullYear()-1;return[`${e}-01-01`,`${e}-12-31`]}}],H=c({scope:{role:``,venue_id:void 0,activity_id:void 0,start_date:``,end_date:``},summary:{active_venue_count:0,activity_sessions:0,ticket_grab_sessions:0,user_count:0,blacklisted_unique:0},activity_stats:{total_view_count:0},activity_stats_venues:[]}),U=c([]),W=c(!1),G=d({eventId:void 0,date:z()}),K=c(null),q=u(()=>K.value?.hourly_matrix?.hours??[]);async function J(){y.value=!0;try{let e=B.dateRange,t=Array.isArray(e)&&e.length>=2&&!!e[0]&&!!e[1],n={venue_id:B.venue_id||void 0};t&&(n.start_date=e[0],n.end_date=e[1],B.activity_id!=null&&(n.activity_id=B.activity_id));let{data:r}=await v.get(`/dashboard/stats`,{params:n});H.value={...H.value,...r,summary:r.summary??H.value.summary,activity_stats:r.activity_stats??H.value.activity_stats,activity_stats_venues:Array.isArray(r.activity_stats_venues)?r.activity_stats_venues:[]}}catch(e){_.error(e?.response?.data?.message??`加载统计失败`)}finally{y.value=!1}}async function Y(){let{data:e}=await v.get(`/me`);L.value=e?.full_admin_access===!0,L.value?R.value=(await v.get(`/venues`)).data:R.value=e?.venues||[]}async function X(){try{let e={page:1,page_size:100};B.venue_id&&(e.venue_id=B.venue_id);let{data:t}=await v.get(`/activities`,{params:e}),n=t?.data??t?.items??t?.list??t;V.value=(Array.isArray(n)?n:[]).map(e=>({id:e.id,title:e.title}))}catch{V.value=[]}}function xe(){J()}function Se(){X(),J()}async function Z(){try{let{data:e}=await v.get(`/ticket-grab-events`,{params:{page:1,page_size:100}}),t=e?.data??e?.items??e?.list??e;U.value=(Array.isArray(t)?t:[]).map(e=>({id:e.id,title:e.title})),!G.eventId&&U.value.length===1&&(G.eventId=U.value[0].id)}catch{U.value=[]}}async function Q(){if(!G.eventId){K.value=null;return}W.value=!0;try{let{data:e}=await v.get(`/dashboard/ticket-grab-stats`,{params:{ticket_grab_event_id:G.eventId,date:G.date}});K.value=e}catch(e){K.value=null,_.error(e?.response?.data?.message??`加载抢票统计失败`)}finally{W.value=!1}}function Ce(){Q()}return t(async()=>{await Y(),await X(),await J(),await Z(),G.eventId&&await Q()}),(t,c)=>{let u=n(`a-option`),d=n(`a-select`),h=n(`a-range-picker`),_=n(`a-button`),v=n(`a-space`),z=n(`a-card`),Y=n(`a-table-column`),X=n(`a-table`),Z=n(`a-tag`),Q=n(`a-date-picker`),$=n(`a-empty`),we=n(`a-spin`);return e(),f(`div`,ee,[m(z,{class:`query-card`,bordered:!1,title:`工作台 / 数据看板`},{default:r(()=>[m(v,{wrap:``},{default:r(()=>[L.value?(e(),a(d,{key:0,modelValue:B.venue_id,"onUpdate:modelValue":c[0]||=e=>B.venue_id=e,style:{width:`220px`},"allow-clear":``,placeholder:`筛选场馆`},{default:r(()=>[(e(!0),f(s,null,g(R.value,t=>(e(),a(u,{key:t.id,value:t.id},{default:r(()=>[i(l(t.name),1)]),_:2},1032,[`value`]))),128))]),_:1},8,[`modelValue`])):o(``,!0),m(h,{modelValue:B.dateRange,"onUpdate:modelValue":c[1]||=e=>B.dateRange=e,"value-format":`YYYY-MM-DD`,shortcuts:be,style:{width:`260px`}},null,8,[`modelValue`]),m(_,{type:`primary`,loading:y.value,onClick:Se},{default:r(()=>[...c[5]||=[i(`查询`,-1)]]),_:1},8,[`loading`]),m(_,{loading:y.value,onClick:J},{default:r(()=>[...c[6]||=[i(`刷新统计`,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1}),p(`div`,te,[p(`div`,ne,[c[7]||=p(`div`,{class:`stat-card-mini__title`},`活跃场馆数`,-1),p(`div`,re,l(H.value.summary.active_venue_count),1)]),p(`div`,ie,[c[8]||=p(`div`,{class:`stat-card-mini__title`},`活动场次`,-1),p(`div`,ae,l(H.value.summary.activity_sessions),1)]),p(`div`,oe,[c[9]||=p(`div`,{class:`stat-card-mini__title`},`抢票场次`,-1),p(`div`,se,l(H.value.summary.ticket_grab_sessions),1)]),p(`div`,b,[c[10]||=p(`div`,{class:`stat-card-mini__title`},`用户数`,-1),p(`div`,ce,l(H.value.summary.user_count),1)]),p(`div`,le,[c[11]||=p(`div`,{class:`stat-card-mini__title`},`黑名单人数(去重)`,-1),p(`div`,ue,l(H.value.summary.blacklisted_unique),1)])]),c[27]||=p(`div`,{class:`summary-scope-hint`},`以上五项为当前账号可见场馆范围内的全量累计(不参与上方日期与筛选场馆)。用户数:参与过活动预约或抢票预约的微信用户去重。`,-1),m(z,{class:`panel-card`,bordered:!1,title:`活动统计`},{extra:r(()=>[...c[12]||=[p(`span`,{class:`panel-hint`},`请先选择上方统计日期活动统计仅汇总浏览量H5 详情累计)`,-1)]]),default:r(()=>[m(v,{style:{"margin-bottom":`16px`},wrap:``},{default:r(()=>[m(d,{modelValue:B.activity_id,"onUpdate:modelValue":c[2]||=e=>B.activity_id=e,"allow-clear":``,"allow-search":``,placeholder:`全部活动(按日期范围与场馆权限)`,style:{"min-width":`320px`},onChange:xe},{default:r(()=>[(e(!0),f(s,null,g(V.value,t=>(e(),a(u,{key:t.id,value:t.id},{default:r(()=>[i(l(t.title),1)]),_:2},1032,[`value`]))),128))]),_:1},8,[`modelValue`])]),_:1}),p(`div`,de,[p(`div`,fe,[c[13]||=p(`div`,{class:`stat-card-mini__title`},`浏览数`,-1),p(`div`,pe,l(H.value.activity_stats.total_view_count),1)])]),m(z,{class:`inner-panel activity-venue-table`,bordered:!1,title:`按场馆`},{default:r(()=>[m(X,{data:H.value.activity_stats_venues,pagination:!1,"row-key":`venue_id`,size:`small`,scroll:{x:400}},{columns:r(()=>[m(Y,{title:`场馆`,"data-index":`venue_name`,width:200,fixed:`left`}),m(Y,{title:`浏览数`,"data-index":`total_view_count`,width:120})]),_:1},8,[`data`])]),_:1})]),_:1}),m(z,{class:`panel-card ticket-grab-panel`,bordered:!1},{title:r(()=>[p(`div`,me,[c[14]||=p(`span`,null,`抢票统计`,-1),K.value?.overview?.remaining_badge?(e(),a(Z,{key:0,color:`arcoblue`,size:`small`},{default:r(()=>[i(l(K.value.overview.remaining_badge),1)]),_:1})):o(``,!0)])]),extra:r(()=>[...c[15]||=[p(`span`,{class:`panel-hint`},`需先选择抢票活动与统计日期(默认当天)`,-1)]]),default:r(()=>[m(v,{wrap:``,style:{"margin-bottom":`16px`}},{default:r(()=>[m(d,{modelValue:G.eventId,"onUpdate:modelValue":c[3]||=e=>G.eventId=e,"allow-search":``,placeholder:`选择抢票活动`,style:{width:`280px`}},{default:r(()=>[(e(!0),f(s,null,g(U.value,t=>(e(),a(u,{key:t.id,value:t.id},{default:r(()=>[i(l(t.title),1)]),_:2},1032,[`value`]))),128))]),_:1},8,[`modelValue`]),m(Q,{modelValue:G.date,"onUpdate:modelValue":c[4]||=e=>G.date=e,"value-format":`YYYY-MM-DD`,style:{width:`160px`}},null,8,[`modelValue`]),m(_,{type:`primary`,loading:W.value,disabled:!G.eventId,onClick:Ce},{default:r(()=>[...c[16]||=[i(`查询`,-1)]]),_:1},8,[`loading`,`disabled`])]),_:1}),m(we,{loading:W.value,style:{width:`100%`}},{default:r(()=>[K.value?.overview?(e(),f(s,{key:0},[p(`div`,he,l(K.value.date)+` 数据统计 · `+l(K.value.event?.title),1),p(`div`,ge,[p(`div`,_e,[c[18]||=p(`div`,{class:`stat-card-mini__title`},`总放票数`,-1),p(`div`,x,[i(l(K.value.overview.total_released),1),c[17]||=p(`span`,{class:`stat-card-mini__unit`},``,-1)])]),p(`div`,S,[c[20]||=p(`div`,{class:`stat-card-mini__title`},`已抢票数`,-1),p(`div`,C,[i(l(K.value.overview.total_grabbed),1),c[19]||=p(`span`,{class:`stat-card-mini__unit`},``,-1)])]),p(`div`,w,[c[22]||=p(`div`,{class:`stat-card-mini__title`},`剩余票数`,-1),p(`div`,T,[i(l(K.value.overview.total_remaining),1),c[21]||=p(`span`,{class:`stat-card-mini__unit`},``,-1)])]),p(`div`,E,[c[23]||=p(`div`,{class:`stat-card-mini__title`},`抢完耗时`,-1),p(`div`,D,l(K.value.overview.sellout_duration_label),1)])]),p(`div`,O,[p(`div`,k,[c[24]||=p(`div`,{class:`tg-box-title`},`关键亮点`,-1),K.value.highlights?.fastest_sellout?(e(),f(`div`,A,` 最快抢完:`+l(K.value.highlights.fastest_sellout.venue_name)+``+l(K.value.highlights.fastest_sellout.duration_label)+` `,1)):(e(),f(`div`,j,`暂无「已全部抢完」的场馆`)),K.value.highlights?.max_release_venue?(e(),f(`div`,M,` 单馆最多放票:`+l(K.value.highlights.max_release_venue.venue_name)+``+l(K.value.highlights.max_release_venue.released)+` 张) `,1)):o(``,!0),p(`div`,N,l(K.value.highlights?.summary),1)]),p(`div`,P,[c[25]||=p(`div`,{class:`tg-box-title`},`票种(人次)`,-1),(K.value.ticket_types?.length??0)===0?(e(),f(`div`,F,`暂无数据`)):(e(!0),f(s,{key:1},g(K.value.ticket_types,(t,n)=>(e(),f(`div`,{key:`tt-`+n,class:`tg-list-line`},l(t.label)+``+l(t.people_count)+``,1))),128))]),p(`div`,I,[c[26]||=p(`div`,{class:`tg-box-title`},`年龄段分布`,-1),(K.value.age_groups?.length??0)===0?(e(),f(`div`,ve,`非学龄活动或未采集证件`)):(e(!0),f(s,{key:1},g(K.value.age_groups,(t,n)=>(e(),f(`div`,{key:`ag-`+n,class:`tg-list-line`},l(t.label)+``+l(t.people_count)+``,1))),128))])]),m(z,{class:`inner-panel`,bordered:!1,title:`明细(场馆维度)`},{default:r(()=>[m(X,{data:K.value.venues??[],pagination:!1,"row-key":`venue_id`,size:`small`},{columns:r(()=>[m(Y,{title:`场馆`,"data-index":`venue_name`,"min-width":200}),m(Y,{title:`放票`,"data-index":`released`,width:100}),m(Y,{title:`已抢`,"data-index":`grabbed`,width:100}),m(Y,{title:`剩余`,"data-index":`remaining`,width:100}),m(Y,{title:`耗时`,"data-index":`duration_label`,width:140}),m(Y,{title:`状态`,"data-index":`status`,width:100})]),_:1},8,[`data`])]),_:1}),q.value.length>0?(e(),a(z,{key:0,class:`inner-panel`,bordered:!1,title:`分时抢票数(行:场馆,列:小时,单元格:该小时张数 / 该馆当日已抢占比)`},{default:r(()=>[m(X,{data:K.value.hourly_matrix?.rows??[],pagination:!1,"row-key":`venue_id`,size:`small`,scroll:{x:120+q.value.length*100}},{columns:r(()=>[m(Y,{title:`场馆`,"data-index":`venue_name`,width:200,fixed:`left`}),(e(!0),f(s,null,g(q.value,t=>(e(),a(Y,{key:`h-`+t,title:t+`:00`,width:108},{cell:r(({record:e})=>[i(l(e.cells?.find(e=>e.hour===t)?.display??`-`),1)]),_:2},1032,[`title`]))),128)),m(Y,{title:`当日合计/占活动`,width:160,fixed:`right`},{cell:r(({record:e})=>[i(l(e.day_share_display),1)]),_:1})]),_:1},8,[`data`,`scroll`])]),_:1})):o(``,!0),p(`div`,ye,`数据更新时间:`+l(K.value.data_updated_at)+` · 江苏有线苏州分公司提供技术支撑`,1)],64)):!W.value&&G.eventId?(e(),a($,{key:1,description:`暂无抢票统计数据`})):W.value?o(``,!0):(e(),a($,{key:2,description:`请选择抢票活动后查询`}))]),_:1},8,[`loading`])]),_:1})])}}}),[[`__scopeId`,`data-v-4833f0bd`]]);export{L as default};