|
|
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{S as _,f as v,l as oe,u as se}from"./index-BXj425qm.js";import{t as y}from"./_plugin-vue_export-helper-CXTkFu_Z.js";import{t as ce}from"./ApplicationSignupDetailFields-Dq5yaMO1.js";import{i as b,n as x,r as le,t as ue}from"./listPageState-CfnKcxSl.js";var de={class:`container-fluid p-3 p-md-4 reviewer-detail-page`},fe={class:`d-flex justify-content-between align-items-center flex-wrap gap-2 mb-3`},pe={class:`d-flex align-items-center gap-2 flex-wrap`},me={key:0,class:`alert alert-warning py-2 small`,role:`alert`},he={key:1,class:`small text-secondary`},ge={key:2,class:`card mb-4 border-0 shadow-sm`},_e={class:`card-body pb-4`},ve={class:`row g-3 mt-1`},ye={class:`col-12`},be={key:0,class:`form-control-plaintext border rounded px-3 py-2 mb-0 bg-light small text-secondary`},xe={key:1,class:`form-control-plaintext border rounded px-3 py-2 mb-0 bg-light small text-secondary`},Se={class:`col-12`},Ce={key:0,class:`list-unstyled mb-0 border rounded px-3 py-2 bg-light small`},we=[`onClick`],S={key:1,class:`form-control-plaintext border rounded px-3 py-2 mb-0 bg-light small text-secondary`},C={class:`col-12`},w={class:`form-control-plaintext border rounded px-3 py-2 mb-0 bg-light small text-secondary`},T={class:`text-secondary ms-2`},E={class:`col-12 pt-3 mt-2 border-top d-flex flex-wrap gap-2 align-items-center reviewer-score-action-bar`},D=[`disabled`],O={key:0,class:`small text-danger`},k={key:1,class:`small text-secondary`},Te={id:`reviewerPledgeModal`,class:`modal fade`,tabindex:`-1`,"aria-labelledby":`reviewerPledgeDocHeading`,"aria-hidden":`true`},Ee={class:`modal-dialog modal-dialog-centered modal-dialog-scrollable reviewer-detail-modal reviewer-detail-modal--pledge`},De={class:`modal-content promise-sign-sheet`},Oe={class:`modal-body pt-2`},ke={key:0,class:`promise-doc-paper`},Ae={id:`reviewerPledgeDocHeading`,class:`promise-doc-heading text-center`},je={class:`promise-doc-scroll`},Me=[`innerHTML`],Ne={key:1,class:`promise-doc-body promise-doc-body--rich`},Pe={key:0,class:`promise-doc-signblock`},Fe={class:`reviewer-pledge-sig-row`},Ie=[`src`],Le={key:1,class:`small text-secondary`},Re={class:`promise-doc-daterow`},ze={class:`promise-doc-dateline`},Be={id:`reviewerScoreModal`,class:`modal fade`,tabindex:`-1`,"aria-labelledby":`reviewerScoreModalLabel`,"aria-hidden":`true`},Ve={class:`modal-dialog modal-dialog-centered modal-dialog-scrollable reviewer-detail-modal reviewer-detail-modal--score`},He={class:`modal-content`},Ue={class:`modal-header scoring-modal-header`},We={id:`reviewerScoreModalLabel`,class:`modal-title scoring-modal-title w-100 text-center`},Ge={class:`modal-body`},Ke={key:0,class:`small text-danger mb-3 text-center`,role:`alert`},qe={class:`table-responsive scoring-sheet-wrap`},Je={class:`table table-bordered align-middle mb-0 scoring-sheet-table`},Ye={class:`text-center text-secondary`},Xe=[`rowspan`],A={class:`text-center fw-semibold scoring-indicator`},Ze={class:`small text-secondary scoring-criteria`},Qe={class:`text-center`},$e={class:`scoring-score-cell text-center`},et=[`onUpdate:modelValue`,`max`,`aria-label`,`onBlur`],tt={key:0,class:`invalid-feedback d-block text-center`},nt={class:`scoring-total-row`},rt={class:`text-center text-secondary`},it={class:`text-center fw-semibold`},at={class:`modal-footer flex-wrap gap-2`},ot=[`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()),st=i(`reviewerCompetitionName`,s(``)),ct=l(()=>{let e=st.value.trim();return e?`${e} 赛事承诺书`:`赛事承诺书`});function lt(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(()=>lt(P.value?.promise_signed_at)),R=s({}),z=s(!1),B=s({}),V=s(!1);function ut(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=ut(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??[]),dt=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 ft(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}}),pt=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(`,`)}),mt=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 ht(){let e=M.value;if(!e){j.push(`/c`);return}let t=b(y.query.page,0),n=b(y.query.per_page,0),r={};if(t>0)r=x({page:t,perPage:n>0?n:15});else{let t=le(ue(`reviewer-projects`,e));t&&(r=x(t))}j.push({name:`reviewer-projects`,params:{slug:e},query:r})}async function $(e){let t=N.value,n=M.value,{token:r}=g();if(!/^\d+$/.test(t)||!n||!r){v.warning(`未登录或参数无效`);return}let i=ie(parseInt(t,10),e.id,n);try{let t=await fetch(i,{headers:{Authorization:`Bearer ${r}`,Accept:`application/json,*/*`}});if(!t.ok){let e=`下载附件失败`;try{let n=await t.json();typeof n.message==`string`&&n.message.trim()&&(e=n.message.trim())}catch{}v.error(e);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{v.error(`网络错误,无法下载`)}}function gt(){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 _t(){if(typeof document>`u`)return;let e=document.getElementById(`reviewerScoreModal`);e&&_.getOrCreateInstance(e).hide()}function vt(){if(!P.value?.scoring_allowed){v.warning(P.value?.scoring_blocked_reason||`该赛道未配置打分表,暂不可评审`);return}if(V.value=!1,typeof document>`u`)return;let e=document.getElementById(`reviewerScoreModal`);e&&_.getOrCreateInstance(e).show()}async function yt(){let e=N.value,t=M.value,{token:n}=g();if(!/^\d+$/.test(e)||!t||!n){v.warning(`未登录或参数无效`);return}if(!P.value?.scoring_allowed||!G.value.length){v.warning(P.value?.scoring_blocked_reason||`该赛道未配置打分表,暂不可评审`);return}if(!pt.value){V.value=!0,v.warning(J.value||`请为每一项填写得分(可为 0,且不得超过该项分值)`);return}z.value=!0;try{let r=gt(),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})`;v.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(),v.success(typeof o.message==`string`?String(o.message):`提交成功`),_t()}catch{v.error(`网络错误,提交失败`)}finally{z.value=!1}}return(i,a)=>(p(),m(`div`,de,[h(`div`,fe,[a[1]||=h(`h5`,{class:`mb-0 section-title`},`项目详情`,-1),h(`div`,pe,[P.value?(p(),m(`span`,{key:0,class:e([`status-pill`,P.value.score_is_pending?`status-pending`:`status-pass`])},d(mt.value),3)):t(``,!0),h(`button`,{type:`button`,class:`btn btn-sm btn-outline-secondary event-back-btn`,onClick:ht},` 返回列表 `)])]),I.value?(p(),m(`p`,me,d(I.value),1)):F.value?(p(),m(`p`,he,`加载中…`)):P.value?(p(),m(`div`,ge,[h(`div`,_e,[r(ce,{detail:P.value},null,8,[`detail`]),h(`div`,ve,[h(`div`,ye,[a[2]||=h(`label`,{class:`form-label`},`商业计划书`,-1),Y.value?(p(),m(`p`,be,[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`,xe,`—`))]),h(`div`,Se,[a[3]||=h(`label`,{class:`form-label`},`其他佐证材料`,-1),X.value.length?(p(),m(`ul`,Ce,[(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,we)]))),128))])):(p(),m(`p`,S,`—`))]),h(`div`,C,[a[5]||=h(`label`,{class:`form-label`},`参赛承诺书`,-1),h(`p`,w,[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`,T,`日期:`+d(L.value),1)],64)):(p(),m(u,{key:1},[n(`未签署`)],64))])]),h(`div`,E,[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:vt},d(P.value.score_is_pending?`项目评分`:`修改项目评分`),9,D),P.value.scoring_allowed?P.value.my_review_score?(p(),m(`span`,k,`最近保存:`+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`,O,d(P.value.scoring_blocked_reason||`该赛道未配置打分表,暂不可评审`),1))])])])])):t(``,!0),h(`div`,Te,[h(`div`,Ee,[h(`div`,De,[h(`div`,Oe,[P.value?(p(),m(`div`,ke,[h(`h1`,Ae,d(ct.value),1),h(`div`,je,[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,Me)):(p(),m(`div`,Ne,[...a[6]||=[h(`p`,{class:`text-secondary mb-0`},`本场赛事未配置承诺书正文(可在管理端赛事中心维护)。`,-1)]]))]),P.value.promise_signed?(p(),m(`div`,Pe,[h(`div`,Fe,[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,Ie)):(p(),m(`span`,Le,`暂无`))]),h(`div`,Re,[h(`span`,ze,[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`,Be,[h(`div`,Ve,[h(`div`,He,[h(`div`,Ue,[h(`h5`,We,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`,Ge,[a[14]||=h(`p`,{class:`small text-secondary mb-2 text-center`},` 请为每一项填写得分(可为 0);单项不得超过「分值」上限;提交后自动汇总为项目得分。 `,-1),J.value?(p(),m(`p`,Ke,d(J.value),1)):t(``,!0),h(`div`,qe,[h(`table`,Je,[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(dt.value,n=>(p(),m(`tr`,{key:n.item.key},[h(`td`,Ye,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,Xe)):t(``,!0),h(`td`,A,d(n.item.title),1),h(`td`,Ze,d(n.item.criteria||`—`),1),h(`td`,Qe,d(W(n.item.max_score)),1),h(`td`,$e,[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=>ft(n.item.key)},null,42,et),[[te,R.value[n.item.key]]]),K(n.item)?(p(),m(`div`,tt,d(K(n.item)),1)):t(``,!0)])]))),128)),h(`tr`,nt,[a[11]||=h(`td`,{colspan:`4`,class:`text-end fw-semibold`},`项目得分`,-1),h(`td`,rt,d(P.value?.scoring_sheet?.full_score??100),1),h(`td`,it,d(q.value.allValid?U(q.value.sum.toFixed(4)):`—`),1)])])])])]),h(`div`,at,[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:yt},d(z.value?`提交中…`:`确认提交`),9,ot)])])])])]))}}),[[`__scopeId`,`data-v-9e9a8505`]]);export{j as default}; |