|
|
import{$t as e,C as t,D as n,O as r,P as i,W as a,Y as o,_t as s,at as c,b as l,ct as ee,d as te,g as u,in as d,k as ne,m as f,q as p,w as m,x as h}from"./vue.runtime.esm-bundler-OsdSFvn7.js";import{C as re,S as ie,b as g,x as ae}from"./api-Cy3G2Clw.js";import{l as _,o as oe,s as se,y as v}from"./index-BtGUeLzV.js";import{t as y}from"./_plugin-vue_export-helper-CXTkFu_Z.js";import{t as ce}from"./ApplicationSignupDetailFields-Dq5yaMO1.js";var le={class:`container-fluid p-3 p-md-4 reviewer-detail-page`},ue={class:`d-flex justify-content-between align-items-center flex-wrap gap-2 mb-3`},de={class:`d-flex align-items-center gap-2 flex-wrap`},fe={key:0,class:`alert alert-warning py-2 small`,role:`alert`},pe={key:1,class:`small text-secondary`},me={key:2,class:`card mb-4 border-0 shadow-sm`},he={class:`card-body pb-4`},ge={class:`row g-3 mt-1`},_e={class:`col-12`},ve={key:0,class:`form-control-plaintext border rounded px-3 py-2 mb-0 bg-light small text-secondary`},ye={key:1,class:`form-control-plaintext border rounded px-3 py-2 mb-0 bg-light small text-secondary`},be={class:`col-12`},xe={key:0,class:`list-unstyled mb-0 border rounded px-3 py-2 bg-light small`},Se=[`onClick`],Ce={key:1,class:`form-control-plaintext border rounded px-3 py-2 mb-0 bg-light small text-secondary`},we={class:`col-12`},b={class:`form-control-plaintext border rounded px-3 py-2 mb-0 bg-light small text-secondary`},x={class:`text-secondary ms-2`},S={class:`col-12 pt-3 mt-2 border-top d-flex flex-wrap gap-2 align-items-center reviewer-score-action-bar`},C=[`disabled`],w={key:0,class:`small text-danger`},T={key:1,class:`small text-secondary`},E={id:`reviewerPledgeModal`,class:`modal fade`,tabindex:`-1`,"aria-labelledby":`reviewerPledgeDocHeading`,"aria-hidden":`true`},D={class:`modal-dialog modal-dialog-centered modal-dialog-scrollable reviewer-detail-modal reviewer-detail-modal--pledge`},O={class:`modal-content promise-sign-sheet`},k={class:`modal-body pt-2`},Te={key:0,class:`promise-doc-paper`},Ee={id:`reviewerPledgeDocHeading`,class:`promise-doc-heading text-center`},De={class:`promise-doc-scroll`},Oe=[`innerHTML`],ke={key:1,class:`promise-doc-body promise-doc-body--rich`},Ae={key:0,class:`promise-doc-signblock`},je={class:`reviewer-pledge-sig-row`},Me=[`src`],Ne={key:1,class:`small text-secondary`},Pe={class:`promise-doc-daterow`},Fe={class:`promise-doc-dateline`},Ie={id:`reviewerScoreModal`,class:`modal fade`,tabindex:`-1`,"aria-labelledby":`reviewerScoreModalLabel`,"aria-hidden":`true`},Le={class:`modal-dialog modal-dialog-centered modal-dialog-scrollable reviewer-detail-modal reviewer-detail-modal--score`},Re={class:`modal-content`},ze={class:`modal-header scoring-modal-header`},Be={id:`reviewerScoreModalLabel`,class:`modal-title scoring-modal-title w-100 text-center`},Ve={class:`modal-body`},He={key:0,class:`small text-danger mb-3 text-center`,role:`alert`},Ue={class:`table-responsive scoring-sheet-wrap`},We={class:`table table-bordered align-middle mb-0 scoring-sheet-table`},Ge={class:`text-center text-secondary`},Ke=[`rowspan`],qe={class:`text-center fw-semibold scoring-indicator`},Je={class:`small text-secondary scoring-criteria`},Ye={class:`text-center`},Xe={class:`scoring-score-cell text-center`},A=[`onUpdate:modelValue`,`max`,`aria-label`,`onBlur`],Ze={key:0,class:`invalid-feedback d-block text-center`},Qe={class:`scoring-total-row`},$e={class:`text-center text-secondary`},et={class:`text-center fw-semibold`},tt={class:`modal-footer flex-wrap gap-2`},nt=[`disabled`],j=y(ne({__name:`ReviewerApplicationDetailView`,setup(ne){let y=oe(),j=se(),M=l(()=>String(y.params.slug??``).trim()),N=l(()=>String(y.params.id??``).trim()),rt=i(`reviewerCompetitionName`,s(``)),it=l(()=>{let e=rt.value.trim();return e?`${e} 赛事承诺书`:`赛事承诺书`});function at(e){let t=(e??``).trim();if(!t)return`—`;let n=t.match(/^(\d{4})-(\d{1,2})-(\d{1,2})/);if(n)return`${parseInt(n[1],10)}年${parseInt(n[2],10)}月${parseInt(n[3],10)}日`;let r=new Date(t.includes(` `)?t.replace(/-/g,`/`):t);return Number.isNaN(r.getTime())?t:`${r.getFullYear()}年${r.getMonth()+1}月${r.getDate()}日`}let P=s(null),F=s(!1),I=s(``),L=l(()=>at(P.value?.promise_signed_at)),R=s({}),z=s(!1),B=s({}),V=s(!1);function ot(e){if(!e)return{};let t=e.scores;return t&&typeof t==`object`&&!Array.isArray(t)?t:e}function H(){let e=P.value,t=e?.scoring_sheet?.items;if(!t?.length){R.value={},B.value={},V.value=!1;return}let n=ot(e?.my_review_score?.payload_json),r={};for(let e of t){let t=n[e.key];typeof t==`number`&&Number.isFinite(t)?r[e.key]=String(t):typeof t==`string`&&t.trim()!==``?r[e.key]=t.trim():r[e.key]=``}R.value=r,B.value={},V.value=!1}c(P,()=>H(),{deep:!0});function U(e){return e.replace(/\.?0+$/,``)}function W(e){return U(Number(e).toFixed(4))}let G=l(()=>P.value?.scoring_sheet?.items??[]),st=l(()=>{let e=G.value,t=[],n=0;for(;n<e.length;){let r=e[n].category,i=1;for(;n+i<e.length&&e[n+i].category===r;)i+=1;for(let r=0;r<i;r++)t.push({item:e[n+r],idx:n+r,categoryRowspan:r===0?i:0});n+=i}return t});function K(e){let t=String(R.value[e.key]??``).trim();if(t===``)return V.value||B.value[e.key]?`请填写得分`:null;let n=Number(t);return Number.isFinite(n)?n<0?`不能小于 0`:n>e.max_score?`不得超过 ${W(e.max_score)} 分`:null:`须为数字`}function ct(e){B.value={...B.value,[e]:!0}}let q=l(()=>{let e=0,t=G.value.length>0;for(let n of G.value){let r=String(R.value[n.key]??``).trim();if(r===``){t=!1;continue}let i=Number(r);if(!Number.isFinite(i)||i<0||i>n.max_score){t=!1;continue}e+=i}return{sum:e,allValid:t}}),lt=l(()=>{if(!P.value?.scoring_allowed||!G.value.length)return!1;for(let e of G.value){let t=String(R.value[e.key]??``).trim();if(t===``)return!1;let n=Number(t);if(!Number.isFinite(n)||n<0||n>e.max_score)return!1}return!0}),J=l(()=>{if(!G.value.length)return``;let e=0,t=0;for(let n of G.value){let r=String(R.value[n.key]??``).trim();if(r===``){e+=1;continue}let i=Number(r);(!Number.isFinite(i)||i<0||i>n.max_score)&&(t+=1)}let n=[];return V.value&&e>0&&n.push(`${e} 项未填写`),t>0&&n.push(`${t} 项超出分值或无效`),n.join(`,`)}),ut=l(()=>{let e=P.value;return e?`项目编号:${e.project_code} · ${e.score_display}`:``}),Y=l(()=>P.value?.files.find(e=>e.kind===`plan`)??null),X=l(()=>P.value?.files.filter(e=>e.kind===`supporting`)??[]),Z=l(()=>{let e=P.value?.promise_signature;if(e==null||typeof e!=`string`)return``;let t=e.trim();return t===``?``:t.startsWith(`data:`)?t:`data:image/png;base64,${t}`});async function Q(){let e=N.value,t=M.value,{token:n}=g();if(!/^\d+$/.test(e)||!t||!n){I.value=`参数无效或未登录`,P.value=null;return}F.value=!0,I.value=``;try{let r=ae(parseInt(e,10),t),i=await fetch(r,{headers:{Authorization:`Bearer ${n}`,Accept:`application/json`}});if(!i.ok){let e=await i.json().catch(()=>({}));I.value=(typeof e==`object`&&e&&`message`in e?String(e.message??``):``)||`加载失败(${i.status})`,P.value=null;return}P.value=(await i.json()).data??null}catch{I.value=`网络错误`,P.value=null}finally{F.value=!1}}c([N,M],()=>void Q()),a(()=>void Q());function dt(){let e=M.value;e?j.push({name:`reviewer-projects`,params:{slug:e}}):j.push(`/c`)}async function $(e){let t=N.value,n=M.value,{token:r}=g();if(!/^\d+$/.test(t)||!n||!r){_.warning(`未登录或参数无效`);return}let i=ie(parseInt(t,10),e.id,n);try{let t=await fetch(i,{headers:{Authorization:`Bearer ${r}`,Accept:`*/*`}});if(!t.ok){_.error(`下载失败`);return}let n=await t.blob(),a=URL.createObjectURL(n),o=document.createElement(`a`);o.href=a,o.download=e.original_name?.trim()?e.original_name:`download`,o.rel=`noopener`,document.body.appendChild(o),o.click(),o.remove(),URL.revokeObjectURL(a)}catch{_.error(`网络错误,无法下载`)}}function ft(){let e={};for(let t of G.value){let n=Number(String(R.value[t.key]??``).trim());e[t.key]=Number.isFinite(n)?n:0}return{scores:e}}function pt(){if(typeof document>`u`)return;let e=document.getElementById(`reviewerScoreModal`);e&&v.getOrCreateInstance(e).hide()}function mt(){if(!P.value?.scoring_allowed){_.warning(P.value?.scoring_blocked_reason||`该赛道未配置打分表,暂不可评审`);return}if(V.value=!1,typeof document>`u`)return;let e=document.getElementById(`reviewerScoreModal`);e&&v.getOrCreateInstance(e).show()}async function ht(){let e=N.value,t=M.value,{token:n}=g();if(!/^\d+$/.test(e)||!t||!n){_.warning(`未登录或参数无效`);return}if(!P.value?.scoring_allowed||!G.value.length){_.warning(P.value?.scoring_blocked_reason||`该赛道未配置打分表,暂不可评审`);return}if(!lt.value){V.value=!0,_.warning(J.value||`请为每一项填写得分(可为 0,且不得超过该项分值)`);return}z.value=!0;try{let r=ft(),i=re(parseInt(e,10)),a=await fetch(i,{method:`POST`,headers:{Authorization:`Bearer ${n}`,Accept:`application/json`,"Content-Type":`application/json`},body:JSON.stringify({competition_slug:t,payload:r})}),o=await a.json().catch(()=>({}));if(!a.ok){let e=o,t=e.errors?.payload?.[0],n=typeof t==`string`&&t?t:typeof e.message==`string`?e.message:`提交失败(${a.status})`;_.error(n);return}let s=o.data;P.value&&s&&(s.my_review_score!==void 0&&(P.value.my_review_score=s.my_review_score),typeof s.score_display==`string`&&(P.value.score_display=s.score_display),typeof s.score_is_pending==`boolean`&&(P.value.score_is_pending=s.score_is_pending)),H(),_.success(typeof o.message==`string`?String(o.message):`提交成功`),pt()}catch{_.error(`网络错误,提交失败`)}finally{z.value=!1}}return(i,a)=>(p(),m(`div`,le,[h(`div`,ue,[a[1]||=h(`h5`,{class:`mb-0 section-title`},`项目详情`,-1),h(`div`,de,[P.value?(p(),m(`span`,{key:0,class:e([`status-pill`,P.value.score_is_pending?`status-pending`:`status-pass`])},d(ut.value),3)):t(``,!0),h(`button`,{type:`button`,class:`btn btn-sm btn-outline-secondary event-back-btn`,onClick:dt},` 返回列表 `)])]),I.value?(p(),m(`p`,fe,d(I.value),1)):F.value?(p(),m(`p`,pe,`加载中…`)):P.value?(p(),m(`div`,me,[h(`div`,he,[r(ce,{detail:P.value},null,8,[`detail`]),h(`div`,ge,[h(`div`,_e,[a[2]||=h(`label`,{class:`form-label`},`商业计划书`,-1),Y.value?(p(),m(`p`,ve,[h(`a`,{role:`button`,href:`#`,class:`text-danger text-decoration-none`,onClick:a[0]||=f(e=>$(Y.value),[`prevent`])},d(Y.value.original_name),1)])):(p(),m(`p`,ye,`—`))]),h(`div`,be,[a[3]||=h(`label`,{class:`form-label`},`其他佐证材料`,-1),X.value.length?(p(),m(`ul`,xe,[(p(!0),m(u,null,o(X.value,e=>(p(),m(`li`,{key:e.id},[h(`a`,{role:`button`,href:`#`,class:`text-danger text-decoration-none`,onClick:f(t=>$(e),[`prevent`])},d(e.original_name),9,Se)]))),128))])):(p(),m(`p`,Ce,`—`))]),h(`div`,we,[a[5]||=h(`label`,{class:`form-label`},`参赛承诺书`,-1),h(`p`,b,[P.value.promise_signed?(p(),m(u,{key:0},[a[4]||=h(`button`,{type:`button`,class:`btn btn-link btn-sm p-0 align-baseline text-danger`,"data-bs-toggle":`modal`,"data-bs-target":`#reviewerPledgeModal`},` 已签署 · 查看承诺书与签名 `,-1),h(`span`,x,`日期:`+d(L.value),1)],64)):(p(),m(u,{key:1},[n(`未签署`)],64))])]),h(`div`,S,[h(`button`,{type:`button`,class:`btn btn-primary px-4`,style:{"background-color":`var(--primary, #052d62)`,"border-color":`var(--primary, #052d62)`},disabled:!P.value.scoring_allowed,onClick:mt},d(P.value.score_is_pending?`项目评分`:`修改项目评分`),9,C),P.value.scoring_allowed?P.value.my_review_score?(p(),m(`span`,T,`最近保存:`+d(P.value.my_review_score.updated_at)+` · 项目得分 `+d(U(Number(P.value.my_review_score.line_total).toFixed(4)))+` 分`,1)):t(``,!0):(p(),m(`span`,w,d(P.value.scoring_blocked_reason||`该赛道未配置打分表,暂不可评审`),1))])])])])):t(``,!0),h(`div`,E,[h(`div`,D,[h(`div`,O,[h(`div`,k,[P.value?(p(),m(`div`,Te,[h(`h1`,Ee,d(it.value),1),h(`div`,De,[P.value.pledge_content_html?.trim()?(p(),m(`div`,{key:0,class:`promise-doc-body promise-doc-body--rich`,innerHTML:P.value.pledge_content_html},null,8,Oe)):(p(),m(`div`,ke,[...a[6]||=[h(`p`,{class:`text-secondary mb-0`},`本场赛事未配置承诺书正文(可在管理端赛事中心维护)。`,-1)]]))]),P.value.promise_signed?(p(),m(`div`,Ae,[h(`div`,je,[a[7]||=h(`span`,{class:`promise-doc-signlabel`},`参赛人签名:`,-1),Z.value?(p(),m(`img`,{key:0,src:Z.value,alt:``,class:`reviewer-promise-sig-img`,loading:`lazy`},null,8,Me)):(p(),m(`span`,Ne,`暂无`))]),h(`div`,Pe,[h(`span`,Fe,[a[8]||=n(`日期:`,-1),h(`strong`,null,d(L.value),1)])])])):t(``,!0)])):t(``,!0),a[9]||=h(`div`,{class:`promise-sign-actions`},[h(`button`,{type:`button`,class:`btn btn-light notice-cancel-btn`,"data-bs-dismiss":`modal`},`关闭`)],-1)])])])]),h(`div`,Ie,[h(`div`,Le,[h(`div`,Re,[h(`div`,ze,[h(`h5`,Be,d(P.value?.scoring_sheet?.title||`项目评分`),1),a[10]||=h(`button`,{type:`button`,class:`btn-close scoring-modal-close`,"data-bs-dismiss":`modal`,"aria-label":`关闭`},null,-1)]),h(`div`,Ve,[a[14]||=h(`p`,{class:`small text-secondary mb-2 text-center`},` 请为每一项填写得分(可为 0);单项不得超过「分值」上限;提交后自动汇总为项目得分。 `,-1),J.value?(p(),m(`p`,He,d(J.value),1)):t(``,!0),h(`div`,Ue,[h(`table`,We,[a[12]||=h(`colgroup`,null,[h(`col`,{class:`col-seq`}),h(`col`,{class:`col-category`}),h(`col`,{class:`col-indicator`}),h(`col`,{class:`col-criteria`}),h(`col`,{class:`col-max`}),h(`col`,{class:`col-score`})],-1),a[13]||=h(`thead`,null,[h(`tr`,null,[h(`th`,{class:`text-nowrap text-center`},`序号`),h(`th`,{class:`text-nowrap text-center`},`指标分类`),h(`th`,{class:`text-nowrap text-center`},`评审指标`),h(`th`,{class:`text-center`},`核心评审要素(评委打分依据)`),h(`th`,{class:`text-nowrap text-center`},`分值`),h(`th`,{class:`text-nowrap text-center`},`得分`)])],-1),h(`tbody`,null,[(p(!0),m(u,null,o(st.value,n=>(p(),m(`tr`,{key:n.item.key},[h(`td`,Ge,d(n.item.sort||n.idx+1),1),n.categoryRowspan>0?(p(),m(`td`,{key:0,rowspan:n.categoryRowspan,class:`text-center scoring-category`},d(n.item.category),9,Ke)):t(``,!0),h(`td`,qe,d(n.item.title),1),h(`td`,Je,d(n.item.criteria||`—`),1),h(`td`,Ye,d(W(n.item.max_score)),1),h(`td`,Xe,[ee(h(`input`,{"onUpdate:modelValue":e=>R.value[n.item.key]=e,class:e([`form-control form-control-sm text-center scoring-score-input`,{"is-invalid":!!K(n.item)}]),type:`number`,min:`0`,max:n.item.max_score,step:`any`,required:``,autocomplete:`off`,"aria-label":`${n.item.title}得分`,onBlur:e=>ct(n.item.key)},null,42,A),[[te,R.value[n.item.key]]]),K(n.item)?(p(),m(`div`,Ze,d(K(n.item)),1)):t(``,!0)])]))),128)),h(`tr`,Qe,[a[11]||=h(`td`,{colspan:`4`,class:`text-end fw-semibold`},`项目得分`,-1),h(`td`,$e,d(P.value?.scoring_sheet?.full_score??100),1),h(`td`,et,d(q.value.allValid?U(q.value.sum.toFixed(4)):`—`),1)])])])])]),h(`div`,tt,[a[15]||=h(`button`,{type:`button`,class:`btn btn-secondary`,"data-bs-dismiss":`modal`},`取消`,-1),h(`button`,{type:`button`,class:`btn btn-primary`,style:{"background-color":`var(--primary, #052d62)`,"border-color":`var(--primary, #052d62)`},disabled:z.value,onClick:ht},d(z.value?`提交中…`:`确认提交`),9,nt)])])])])]))}}),[[`__scopeId`,`data-v-a84c187b`]]);export{j as default}; |