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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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,w as ae,x as g}from"./api-rQwE0AaH.js";import{S as _,f as v,l as oe,u as se}from"./index-hRul7OAA.js";import{t as y}from"./_plugin-vue_export-helper-CXTkFu_Z.js";import{t as ce}from"./ApplicationSignupDetailFields-n14nwASN.js";import{i as b,n as x,r as le,t as ue}from"./listPageState-DCKW-cgV.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=ie(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=re(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=ae(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};