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