|
|
import{$ as e,A as t,C as n,Dt as r,G as i,J as a,O as o,Q as s,S as c,T as l,X as u,_ as d,an as f,ct as p,k as m,lt as h,ot as g,vt as _,w as ee,x as v}from"./vue.runtime.esm-bundler-EOeHqR7Z.js";import{C as y,h as b,s as x}from"./index-xGP6mfsH.js";import{t as S}from"./_plugin-vue_export-helper-BOai-rQB.js";import{a as C}from"./competitions-CSxsr1nH.js";import{t as te}from"./adminCompetition-ChmoocV-.js";import{t as ne}from"./datetimeShanghai-RQIrIJdg.js";import{t as re}from"./competitionAdminLabels-F73LDEIy.js";async function ie(e){let{data:t}=await x.get(`/competitions/${e}/dashboard`);if(!t||typeof t!=`object`)throw Error(`首页统计响应无效`);return t}var ae={class:`dashboard`},w={class:`dashboard-head`},T={class:`meta-line`},oe={class:`time-line`},se={class:`head-actions`},ce={class:`metric-grid`,"aria-label":`核心指标`},le={class:`metric-label`},ue={class:`metric-value`},de={class:`metric-hint`},E={class:`main-grid`},D={class:`panel`},O={class:`setup-list`},k={class:`setup-copy`},A={class:`panel`},j={class:`progress-kpis`},M={class:`main-grid main-grid--wide`},N={class:`panel`},P={class:`panel-head`},F={class:`panel-subtitle`},I={class:`panel`},L={class:`shortcut-list`},R=[`href`],z={key:1,class:`shortcut shortcut-button`,type:`button`,disabled:``},B={class:`panel`},V=S(t({__name:`AdminDashboardView`,setup(t){let x=te(),{competitions:S,selectedCompetitionId:V}=y(x),H=_(!1),U=_(null),fe=[{key:`published`,label:`赛事发布`,description:`对外报名和评审入口依赖发布状态`,routeName:`admin-competition-workspace`},{key:`signup_form_schema`,label:`报名表单`,description:`选手报名字段由 Schema 渲染`,routeName:`admin-competition-workspace`},{key:`tracks`,label:`赛道配置`,description:`评审范围和报名分组按赛道隔离`,routeName:`admin-competition-workspace`},{key:`pledge`,label:`承诺书`,description:`提交报名时需要签署的赛事文本`,routeName:`admin-competition-workspace`},{key:`review_form_schema`,label:`评审表单`,description:`未配置时评审端将使用系统默认表单`,routeName:`admin-competition-workspace`},{key:`reviewer_scopes`,label:`评审范围`,description:`评审员必须绑定赛事和赛道后才能看到项目`,routeName:`admin-reviewers-list`}],W=v(()=>U.value?.summary??null),G=v(()=>U.value?.competition??null),pe=v(()=>{let e=G.value;if(!e)return`未选择赛事`;let t=Date.now(),n=e.signup_open_at?new Date(e.signup_open_at).getTime():null,r=e.signup_close_at?new Date(e.signup_close_at).getTime():null;return e.published?n&&t<n?`报名未开始`:r&&t>r?e.status===`reviewing`?`评审中`:`报名已截止`:e.status===`reviewing`?`评审中`:e.status===`ended`?`已结束`:`报名中`:`未发布`}),me=v(()=>{let e=W.value;return[{label:`报名总数`,value:e?.applications_total??0,hint:`含草稿和已提交`},{label:`已提交`,value:e?.applications_submitted??0,hint:`可进入评审范围`},{label:`草稿`,value:e?.applications_draft??0,hint:`选手尚未正式提交`},{label:`待评项目`,value:e?.applications_pending_review??0,hint:`参与评审且暂无评分`},{label:`已评项目`,value:e?.applications_reviewed??0,hint:`至少已有一条评分`},{label:`评审记录`,value:e?.review_scores_total??0,hint:`累计提交评分数`}]}),he=v(()=>{let e=W.value;return!e||e.applications_submitted===0?0:Math.round(e.applications_reviewed/e.applications_submitted*100)}),K=v(()=>`/admin/`.endsWith(`/`)?`/admin/`.slice(0,-1):`/admin/`),q=v(()=>{let e=G.value?.slug;return e?`${K.value}/c/${encodeURIComponent(e)}/apply`:``}),J=v(()=>{let e=G.value?.slug;return e?`${K.value}/c/${encodeURIComponent(e)}/review`:``}),Y=v(()=>{let e=G.value?.slug;return e?`${K.value}/c/${encodeURIComponent(e)}/manage`:``});async function ge(){if(S.value.length>0)return;let e=await C({page:1,per_page:100});x.setCompetitionList(e.data)}async function X(){H.value=!0;try{await ge();let e=V.value;if(!e){U.value=null;return}U.value=await ie(e)}catch(e){U.value=null,b.error(e instanceof Error?e.message:`首页数据加载失败`)}finally{H.value=!1}}function Z(e){return e?ne(e,`未配置`):`未配置`}function Q(e){return e===`submitted`||e===`published`||e===`signup_open`?`success`:e===`draft`?`info`:e===`reviewing`?`primary`:e===`signup_closed`||e===`ended`?`warning`:`info`}function _e(e){return e===`submitted`?`已提交`:e===`draft`?`草稿`:e}async function $(e){if(e)try{await navigator.clipboard.writeText(`${window.location.origin}${e}`),b.success(`已复制完整链接`)}catch{b.error(`复制失败,请手动选择文本`)}}return g(V,()=>{X()}),i(()=>{X()}),(t,i)=>{let g=s(`el-tag`),_=s(`el-button`),v=s(`RouterLink`),y=s(`el-progress`),b=s(`el-table-column`),x=s(`el-table`),S=s(`el-empty`),C=e(`loading`);return h((a(),l(`div`,ae,[U.value&&G.value?(a(),l(d,{key:0},[c(`section`,w,[c(`div`,null,[i[3]||=c(`div`,{class:`eyebrow`},`运营工作台`,-1),c(`h1`,null,f(G.value.name),1),c(`div`,T,[m(g,{type:Q(G.value.status),effect:`plain`},{default:p(()=>[o(f(r(re)(G.value.status)),1)]),_:1},8,[`type`]),m(g,{type:G.value.published?`success`:`info`,effect:`plain`},{default:p(()=>[o(f(G.value.published?`已发布`:`未发布`),1)]),_:1},8,[`type`]),c(`span`,null,`当前阶段:`+f(pe.value),1),c(`span`,null,`slug:`+f(G.value.slug),1)]),c(`div`,oe,[c(`span`,null,`报名开始:`+f(Z(G.value.signup_open_at)),1),c(`span`,null,`报名截止:`+f(Z(G.value.signup_close_at)),1)])]),c(`div`,se,[m(v,{to:{name:`admin-competition-workspace`}},{default:p(()=>[m(_,{type:`danger`},{default:p(()=>[...i[4]||=[o(`赛事配置`,-1)]]),_:1})]),_:1}),m(v,{to:{name:`admin-competitions-list`}},{default:p(()=>[m(_,null,{default:p(()=>[...i[5]||=[o(`赛事列表`,-1)]]),_:1})]),_:1})])]),c(`section`,ce,[(a(!0),l(d,null,u(me.value,e=>(a(),l(`div`,{key:e.label,class:`metric-card`},[c(`div`,le,f(e.label),1),c(`div`,ue,f(e.value),1),c(`div`,de,f(e.hint),1)]))),128))]),c(`section`,E,[c(`div`,D,[i[7]||=c(`div`,{class:`panel-head`},[c(`h2`,null,`配置完整度`),c(`span`,{class:`panel-subtitle`},`影响报名、提交和评审流转`)],-1),c(`div`,O,[(a(),l(d,null,u(fe,e=>c(`div`,{key:e.key,class:`setup-row`},[m(g,{type:U.value.setup[e.key]?`success`:e.key===`review_form_schema`?`warning`:`danger`,effect:`plain`,size:`small`},{default:p(()=>[o(f(U.value.setup[e.key]?`已完成`:e.key===`review_form_schema`?`默认`:`待处理`),1)]),_:2},1032,[`type`]),c(`div`,k,[c(`strong`,null,f(e.label),1),c(`span`,null,f(e.description),1)]),m(v,{to:{name:e.routeName}},{default:p(()=>[m(_,{link:``,type:`danger`},{default:p(()=>[...i[6]||=[o(`处理`,-1)]]),_:1})]),_:1},8,[`to`])])),64))])]),c(`div`,A,[i[13]||=c(`div`,{class:`panel-head`},[c(`h2`,null,`评审进度`),c(`span`,{class:`panel-subtitle`},`仅统计已提交报名`)],-1),m(y,{percentage:he.value,"stroke-width":12,"show-text":!1},null,8,[`percentage`]),c(`div`,j,[c(`div`,null,[c(`strong`,null,f(W.value?.applications_reviewed??0),1),i[8]||=c(`span`,null,`已评项目`,-1)]),c(`div`,null,[c(`strong`,null,f(W.value?.applications_pending_review??0),1),i[9]||=c(`span`,null,`待评项目`,-1)]),c(`div`,null,[c(`strong`,null,f(W.value?.reviewers_active??0)+`/`+f(W.value?.reviewers_total??0),1),i[10]||=c(`span`,null,`启用评审员`,-1)]),c(`div`,null,[c(`strong`,null,f(W.value?.reviewer_scopes_total??0),1),i[11]||=c(`span`,null,`评审范围`,-1)])]),m(v,{to:{name:`admin-reviewers-list`}},{default:p(()=>[m(_,{type:`danger`,plain:``},{default:p(()=>[...i[12]||=[o(`管理评审员与范围`,-1)]]),_:1})]),_:1})])]),c(`section`,M,[c(`div`,N,[c(`div`,P,[i[14]||=c(`h2`,null,`赛道分布`,-1),c(`span`,F,` 已启用 `+f(W.value?.tracks_enabled??0)+` / `+f(W.value?.tracks_total??0),1)]),m(x,{data:U.value.track_stats,stripe:``,style:{width:`100%`}},{empty:p(()=>[...i[15]||=[c(`span`,{class:`muted`},`暂无赛道,请进入赛事配置维护。`,-1)]]),default:p(()=>[m(b,{prop:`track_title`,label:`赛道`,"min-width":`150`,"show-overflow-tooltip":``}),m(b,{prop:`track_code`,label:`代码`,"min-width":`100`,"show-overflow-tooltip":``}),m(b,{label:`状态`,width:`90`},{default:p(({row:e})=>[m(g,{type:e.is_enabled?`success`:`info`,size:`small`,effect:`plain`},{default:p(()=>[o(f(e.is_enabled?`启用`:`停用`),1)]),_:2},1032,[`type`])]),_:1}),m(b,{prop:`applications_count`,label:`报名`,width:`90`}),m(b,{prop:`submitted_count`,label:`已提交`,width:`90`}),m(b,{prop:`reviewer_scope_count`,label:`评审范围`,width:`100`})]),_:1},8,[`data`])]),c(`div`,I,[i[23]||=c(`div`,{class:`panel-head`},[c(`h2`,null,`常用入口`),c(`span`,{class:`panel-subtitle`},`按当前赛事生成`)],-1),c(`div`,L,[m(v,{to:{name:`admin-competition-workspace`},class:`shortcut`},{default:p(()=>[...i[16]||=[c(`strong`,null,`报名列表与赛事配置`,-1),c(`span`,null,`查看报名详情、附件、分数和赛事设置`,-1)]]),_:1}),m(v,{to:{name:`admin-public-source-channels`},class:`shortcut`},{default:p(()=>[...i[17]||=[c(`strong`,null,`公开来源渠道`,-1),c(`span`,null,`生成首页入口链接和来源归因`,-1)]]),_:1}),c(`button`,{class:`shortcut shortcut-button`,type:`button`,onClick:i[0]||=e=>$(q.value)},[i[18]||=c(`strong`,null,`复制报名链接`,-1),c(`span`,null,f(q.value||`当前赛事暂无 slug`),1)]),c(`button`,{class:`shortcut shortcut-button`,type:`button`,onClick:i[1]||=e=>$(J.value)},[i[19]||=c(`strong`,null,`复制评审链接`,-1),c(`span`,null,f(J.value||`当前赛事暂无 slug`),1)]),Y.value?(a(),l(`a`,{key:0,class:`shortcut`,href:Y.value,target:`_blank`,rel:`noopener noreferrer`},[i[20]||=c(`strong`,null,`打开项目管理端`,-1),c(`span`,null,f(Y.value),1)],8,R)):(a(),l(`button`,z,[...i[21]||=[c(`strong`,null,`打开项目管理端`,-1),c(`span`,null,`当前赛事暂无 slug`,-1)]])),c(`button`,{class:`shortcut shortcut-button`,type:`button`,onClick:i[2]||=e=>$(Y.value)},[i[22]||=c(`strong`,null,`复制项目管理链接`,-1),c(`span`,null,f(Y.value||`当前赛事暂无 slug`),1)])])])]),c(`section`,B,[i[26]||=c(`div`,{class:`panel-head`},[c(`h2`,null,`最近报名`),c(`span`,{class:`panel-subtitle`},`最近更新或提交的 8 条记录`)],-1),m(x,{data:U.value.recent_applications,stripe:``,style:{width:`100%`}},{empty:p(()=>[...i[25]||=[c(`span`,{class:`muted`},`暂无报名记录。`,-1)]]),default:p(()=>[m(b,{prop:`project_name`,label:`项目`,"min-width":`180`,"show-overflow-tooltip":``}),m(b,{prop:`player_name`,label:`负责人`,"min-width":`100`,"show-overflow-tooltip":``}),m(b,{prop:`track_title`,label:`赛道`,"min-width":`130`,"show-overflow-tooltip":``}),m(b,{label:`状态`,width:`100`},{default:p(({row:e})=>[m(g,{type:Q(e.status),size:`small`,effect:`plain`},{default:p(()=>[o(f(_e(e.status)),1)]),_:2},1032,[`type`])]),_:1}),m(b,{prop:`submitted_review_count`,label:`评分数`,width:`90`}),m(b,{label:`提交时间`,"min-width":`170`},{default:p(({row:e})=>[o(f(Z(e.submitted_at)),1)]),_:1}),m(b,{label:`操作`,width:`120`,fixed:`right`},{default:p(()=>[m(v,{to:{name:`admin-competition-workspace`}},{default:p(()=>[m(_,{type:`danger`,link:``},{default:p(()=>[...i[24]||=[o(`进入列表`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`data`])])],64)):H.value?ee(``,!0):(a(),n(S,{key:1,description:`暂无可管理的赛事`},{default:p(()=>[m(v,{to:{name:`admin-competition-new`}},{default:p(()=>[m(_,{type:`danger`},{default:p(()=>[...i[27]||=[o(`新建赛事`,-1)]]),_:1})]),_:1})]),_:1}))])),[[C,H.value]])}}}),[[`__scopeId`,`data-v-f91ed0a8`]]);export{V as default}; |