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