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
12 KiB

import{$t as e,C as t,D as n,Et as r,O as i,P as ee,Q as te,S as a,T as o,Y as s,Z as c,_ as l,_t as u,at as d,ct as f,in as p,k as m,q as h,st as g,w as _,x as v}from"./vue.runtime.esm-bundler-CACvpnko.js";import{h as y,m as b}from"./index-D5exsJys.js";import{t as x}from"./_plugin-vue_export-helper-CXTkFu_Z.js";import{s as S}from"./competitions-Cv_Vb4Fy.js";import{r as C}from"./signupOptionCodes-CvTkOKn_.js";import{i as w,n as T,r as E,t as ne}from"./competitionAdmins-CEFNkWBF.js";import{a as D,c as re,n as ie,o as ae,r as oe,s as O,t as se}from"./reviewerScopes-CAv40o5e.js";var ce={class:`manage-reviewers-wrap`},le={class:`proto-reviewer-page admin-desktop-page`},ue={key:1,class:`reviewer-manage-shell`},de={class:`reviewer-track-panel`},fe={class:`reviewer-track-tabs`},pe=[`onClick`],me={class:`reviewer-track-tab-name`},he={class:`reviewer-track-tab-count`},ge={class:`reviewer-editor-panel`},_e={class:`reviewer-editor-head`},ve={class:`btn-group btn-group-sm mb-2`,role:`group`,"aria-label":`人员类型`},ye={class:`reviewer-track-title`},be={class:`reviewer-track-meta mb-0`},xe={class:`reviewer-editor-actions`},k={class:`table-responsive`},A={class:`table table-sm align-middle mb-0 reviewer-manage-table`},j={key:0},M={key:0},Se={class:`text-end reviewer-row-actions`},Ce=[`onClick`],we=[`onClick`],Te={key:1},Ee={key:0},De={class:`text-end reviewer-row-actions`},Oe=[`onClick`],ke=[`onClick`],N=x(m({__name:`ManagePeopleView`,setup(m){let x=ee(`manageCompetitionId`,u(null)),N=C.map(e=>({code:e.value,title:`${e.label}赛区`})),P=u(N[0]?.code??`shanghai`),F=u(`reviewer`),I=u([]),L=u({}),R=u({}),z=u([]),B=u([]),V=u(!1),H=u(!1),U=u(!1),W=u(`create`),G=u(!1),K=u(null),q=u(null),J=u(),Y=u({name:``,mobile:``,username:``,password:``}),Ae={name:[{required:!0,message:`请填写姓名`,trigger:`blur`}],username:[{required:!0,message:`请填写账户`,trigger:`blur`},{pattern:/^[A-Za-z0-9._-]+$/,message:`仅字母、数字、点、横线或下划线`,trigger:`blur`}],password:[{validator:(e,t,n)=>{if(W.value===`create`&&(!t||String(t).trim()===``)){n(Error(`请填写密码`));return}if(t&&String(t).trim().length>0&&String(t).length<6){n(Error(`密码不少于 6 位`));return}n()},trigger:`blur`}]},je=v(()=>N.find(e=>e.code===P.value)?.title??``),X=v(()=>F.value===`reviewer`?`评审员`:`项目管理员`),Z=v(()=>{let e=new Set,t=[];for(let n of z.value)e.has(n.reviewer_id)||(e.add(n.reviewer_id),t.push(n));return t}),Me=v(()=>F.value===`reviewer`?`已配置 ${Z.value.length} 名评审员 · 覆盖全部赛道`:`已配置 ${B.value.length} 名项目管理员`),Ne=v(()=>F.value===`reviewer`?L.value:R.value);function Pe(e){return e.reviewer?.password_display??`—`}function Fe(e){let t=e.reviewer?.mobile;return t&&String(t).trim()!==``?String(t):`—`}function Ie(e){return e.password_display??(e.password_set?`········`:`—`)}function Le(e){return e.mobile&&String(e.mobile).trim()!==``?String(e.mobile):`—`}async function Re(){let e=x.value;if(!e){I.value=[];return}I.value=(await S(e)).filter(e=>e.is_enabled).sort((e,t)=>e.sort-t.sort)}async function ze(){let e=x.value;if(!e){z.value=[],L.value={};return}H.value=!0;try{z.value=(await D({competition_id:e,event_location:P.value,page:1,per_page:500})).data,L.value=await oe(e)}catch(e){z.value=[],y.error(e instanceof Error?e.message:`加载失败`)}finally{H.value=!1}}async function Be(){let e=x.value;if(!e){B.value=[],R.value={};return}H.value=!0;try{let[t,n]=await Promise.all([E(e,{page:1,per_page:100,event_location:P.value}),E(e,{page:1,per_page:100})]);B.value=t.data;let r={};for(let e of n.data){let t=e.event_location||``;t&&(r[t]=(r[t]??0)+1)}R.value=r}catch(e){B.value=[],y.error(e instanceof Error?e.message:`加载失败`)}finally{H.value=!1}}async function Q(){F.value===`reviewer`?await ze():await Be()}async function Ve(){V.value=!0;try{await Re(),await Q()}catch(e){y.warning(e instanceof Error?e.message:`加载失败`)}finally{V.value=!1}}function $(e){P.value=e}function He(){W.value=`create`,K.value=null,q.value=null,Y.value={name:``,mobile:``,username:``,password:``},U.value=!0}function Ue(e){W.value=`edit`,K.value=e.reviewer_id,q.value=null;let t=e.reviewer;Y.value={name:t?.name??``,mobile:t?.mobile??``,username:t?.username??``,password:``},U.value=!0}function We(e){W.value=`edit`,q.value=e.id,K.value=null,Y.value={name:e.name,mobile:e.mobile??``,username:e.username,password:``},U.value=!0}async function Ge(){if(!J.value)return;let e=x.value;e&&await J.value.validate(async t=>{if(t){G.value=!0;try{F.value===`reviewer`?await Ke(e):await qe(e),U.value=!1,await Q()}catch(e){y.error(e instanceof Error?e.message:`保存失败`)}finally{G.value=!1}}})}async function Ke(e){if(W.value===`create`){if(!I.value.length)throw Error(`本场暂无启用中的赛道,请先配置赛道后再新增评审员`);let t=await ae({name:Y.value.name.trim(),username:Y.value.username.trim(),password:Y.value.password,mobile:Y.value.mobile.trim()||null});try{for(let n of I.value)await se({reviewer_id:t.id,competition_id:e,track_code:n.track_code,event_location:P.value})}catch(e){try{await O(t.id)}catch{}throw e instanceof Error?e:Error(`绑定赛区失败`)}y.success(`人员信息已更新`);return}let t=K.value;t&&(await re(t,{name:Y.value.name.trim(),username:Y.value.username.trim(),mobile:Y.value.mobile.trim()||null,...Y.value.password.trim()?{password:Y.value.password.trim()}:{}}),y.success(`人员信息已更新`))}async function qe(e){if(W.value===`create`){await ne(e,{name:Y.value.name.trim(),username:Y.value.username.trim(),password:Y.value.password,mobile:Y.value.mobile.trim()||null,event_location:P.value,status:`active`}),y.success(`人员信息已更新`);return}let t=q.value;t&&(await w(e,t,{name:Y.value.name.trim(),username:Y.value.username.trim(),mobile:Y.value.mobile.trim()||null,event_location:P.value,...Y.value.password.trim()?{password:Y.value.password.trim()}:{}}),y.success(`人员信息已更新`))}async function Je(e){let t=e.reviewer?.name??`该评审员`;try{await b.confirm(`确定删除评审员“${t}”吗?`,`确认删除`,{type:`warning`,confirmButtonText:`确定删除`,cancelButtonText:`取消`})}catch{return}try{let t=z.value.filter(t=>t.reviewer_id===e.reviewer_id);for(let e of t)await ie(e.id);try{(await D({competition_id:x.value??0,reviewer_id:e.reviewer_id,page:1,per_page:1})).meta.total===0&&await O(e.reviewer_id)}catch{}y.success(`已删除`),await Q()}catch(e){y.error(e instanceof Error?e.message:`删除失败`)}}async function Ye(e){try{await b.confirm(`确定删除项目管理员“${e.name}”吗?`,`确认删除`,{type:`warning`,confirmButtonText:`确定删除`,cancelButtonText:`取消`})}catch{return}let t=x.value;if(t)try{await T(t,e.id),y.success(`已删除`),await Q()}catch(e){y.error(e instanceof Error?e.message:`删除失败`)}}return d(x,()=>{Ve()},{immediate:!0}),d([P,F],()=>{Q()}),(ee,u)=>{let d=c(`el-alert`),m=c(`el-input`),v=c(`el-form-item`),y=c(`el-col`),b=c(`el-row`),S=c(`el-form`),C=c(`el-button`),w=c(`el-dialog`),T=te(`loading`);return h(),o(`div`,ce,[a(`div`,le,[u[15]||=a(`div`,{class:`rev-head`},[a(`div`,null,[a(`h5`,{class:`section-title mb-1`},`人员管理`),a(`p`,{class:`text-secondary small mb-0`},` 评审员与项目管理员均按赛区配置,评审员可评审所属赛区的全部赛道项目。 `)])],-1),r(x)?f((h(),o(`div`,ue,[a(`aside`,de,[u[8]||=a(`div`,{class:`reviewer-track-panel-title`},`赛区配置`,-1),a(`div`,fe,[(h(!0),o(l,null,s(r(N),t=>(h(),o(`button`,{key:t.code,type:`button`,class:e([`reviewer-track-tab`,{active:P.value===t.code}]),onClick:e=>$(t.code)},[a(`span`,me,p(t.title),1),a(`span`,he,p(Ne.value[t.code]??0)+` 人`,1)],10,pe))),128))])]),a(`section`,ge,[a(`div`,_e,[a(`div`,null,[a(`div`,ve,[a(`button`,{type:`button`,class:e([`btn`,F.value===`reviewer`?`btn-primary`:`btn-outline-primary`]),onClick:u[0]||=e=>F.value=`reviewer`},` 评审员 `,2),a(`button`,{type:`button`,class:e([`btn`,F.value===`manager`?`btn-primary`:`btn-outline-primary`]),onClick:u[1]||=e=>F.value=`manager`},` 项目管理员 `,2)]),a(`h6`,ye,p(je.value||`—`),1),a(`p`,be,p(Me.value),1)]),a(`div`,xe,[a(`button`,{type:`button`,class:`prm-btn-outline`,onClick:He},`新增`+p(X.value),1)])]),f((h(),o(`div`,k,[a(`table`,A,[u[11]||=a(`thead`,null,[a(`tr`,null,[a(`th`,{style:{width:`18%`}},`姓名`),a(`th`,{style:{width:`22%`}},`电话`),a(`th`,{style:{width:`24%`}},`账户`),a(`th`,{style:{width:`24%`}},`密码`),a(`th`,{class:`text-end`,style:{width:`12%`}},`操作`)])],-1),F.value===`reviewer`?(h(),o(`tbody`,j,[Z.value.length?_(``,!0):(h(),o(`tr`,M,[...u[9]||=[a(`td`,{colspan:`5`,class:`text-center text-secondary py-4`},`暂无评审员`,-1)]])),(h(!0),o(l,null,s(Z.value,e=>(h(),o(`tr`,{key:e.reviewer_id},[a(`td`,null,p(e.reviewer?.name??`—`),1),a(`td`,null,p(Fe(e)),1),a(`td`,null,p(e.reviewer?.username??`—`),1),a(`td`,null,p(Pe(e)),1),a(`td`,Se,[a(`button`,{type:`button`,class:`prm-btn-outline sm`,onClick:t=>Ue(e)},`修改`,8,Ce),a(`button`,{type:`button`,class:`prm-btn-light sm`,onClick:t=>Je(e)},`删除`,8,we)])]))),128))])):(h(),o(`tbody`,Te,[B.value.length?_(``,!0):(h(),o(`tr`,Ee,[...u[10]||=[a(`td`,{colspan:`5`,class:`text-center text-secondary py-4`},`暂无项目管理员`,-1)]])),(h(!0),o(l,null,s(B.value,e=>(h(),o(`tr`,{key:e.id},[a(`td`,null,p(e.name),1),a(`td`,null,p(Le(e)),1),a(`td`,null,p(e.username),1),a(`td`,null,p(Ie(e)),1),a(`td`,De,[a(`button`,{type:`button`,class:`prm-btn-outline sm`,onClick:t=>We(e)},`修改`,8,Oe),a(`button`,{type:`button`,class:`prm-btn-light sm`,onClick:t=>Ye(e)},`删除`,8,ke)])]))),128))]))])])),[[T,H.value]]),u[12]||=a(`p`,{class:`footnote`},`正式环境仅存密码摘要;列表中为占位符而非明文密码。`,-1)])])),[[T,V.value]]):(h(),t(d,{key:0,type:`warning`,"show-icon":``,closable:!1,class:`rev-alert`,title:`赛事信息加载失败,请检查链接 slug。`})),i(w,{modelValue:U.value,"onUpdate:modelValue":u[7]||=e=>U.value=e,title:`${W.value===`create`?`新增`:`修改`}${X.value}`,width:`520px`,"destroy-on-close":``,class:`rev-dialog`},{footer:g(()=>[i(C,{onClick:u[6]||=e=>U.value=!1},{default:g(()=>[...u[13]||=[n(`取消`,-1)]]),_:1}),i(C,{type:`primary`,loading:G.value,onClick:Ge},{default:g(()=>[...u[14]||=[n(`确定`,-1)]]),_:1},8,[`loading`])]),default:g(()=>[i(S,{ref_key:`formRef`,ref:J,model:Y.value,rules:Ae,"label-position":`top`,class:`rev-form`},{default:g(()=>[i(b,{gutter:12},{default:g(()=>[i(y,{span:12},{default:g(()=>[i(v,{label:`姓名`,prop:`name`,required:``},{default:g(()=>[i(m,{modelValue:Y.value.name,"onUpdate:modelValue":u[2]||=e=>Y.value.name=e,maxlength:`64`,placeholder:`必填`},null,8,[`modelValue`])]),_:1})]),_:1}),i(y,{span:12},{default:g(()=>[i(v,{label:`电话`,prop:`mobile`},{default:g(()=>[i(m,{modelValue:Y.value.mobile,"onUpdate:modelValue":u[3]||=e=>Y.value.mobile=e,maxlength:`20`,placeholder:`可选`},null,8,[`modelValue`])]),_:1})]),_:1}),i(y,{span:12},{default:g(()=>[i(v,{label:`账户`,prop:`username`,required:``},{default:g(()=>[i(m,{modelValue:Y.value.username,"onUpdate:modelValue":u[4]||=e=>Y.value.username=e,maxlength:`64`,autocomplete:`off`,placeholder:`必填`},null,8,[`modelValue`])]),_:1})]),_:1}),i(y,{span:12},{default:g(()=>[i(v,{label:W.value===`create`?`密码`:`密码(不修改请留空)`,prop:`password`},{default:g(()=>[i(m,{modelValue:Y.value.password,"onUpdate:modelValue":u[5]||=e=>Y.value.password=e,type:`password`,"show-password":``,maxlength:`255`,autocomplete:`new-password`,placeholder:W.value===`create`?`必填`:`留空表示不修改`},null,8,[`modelValue`,`placeholder`])]),_:1},8,[`label`])]),_:1})]),_:1})]),_:1},8,[`model`])]),_:1},8,[`modelValue`,`title`])])])}}}),[[`__scopeId`,`data-v-6b94a8f2`]]);export{N as default};