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,p as re,q as p,w as m,x as h}from"./vue.runtime.esm-bundler-OsdSFvn7.js";import{A as ie,M as ae,j as oe,k as g}from"./api-Dpfxb1ca.js";import{S as _,f as v,l as se,u as ce}from"./index-CpTiFmNV.js";import{t as y}from"./_plugin-vue_export-helper-CXTkFu_Z.js";import{r as le,t as ue}from"./downloadFeedback-CjBZS_vk.js";import{t as de}from"./ApplicationSignupDetailFields-CkGBLRcw.js";import{i as fe,t as pe}from"./listPageState-y2a2WJrd.js";var me={class:`container-fluid p-3 p-md-4 reviewer-detail-page`},he={class:`d-flex justify-content-between align-items-center flex-wrap gap-2 mb-3`},ge={class:`d-flex align-items-center gap-2 flex-wrap`},_e={key:0,class:`alert alert-warning py-2 small`,role:`alert`},ve={key:1,class:`small text-secondary`},ye={key:2,class:`card mb-4 border-0 shadow-sm`},be={class:`card-body pb-4`},xe={class:`row g-3 mt-1`},Se={class:`col-12`},Ce={key:0,class:`form-control-plaintext border rounded px-3 py-2 mb-0 bg-light small text-secondary`},we={key:1,class:`form-control-plaintext border rounded px-3 py-2 mb-0 bg-light small text-secondary`},Te={class:`col-12`},Ee={key:0,class:`list-unstyled mb-0 border rounded px-3 py-2 bg-light small`},De=[`onClick`],Oe={key:1,class:`form-control-plaintext border rounded px-3 py-2 mb-0 bg-light small text-secondary`},ke={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`},Ae={key:1,class:`small text-secondary`},je={id:`reviewerPledgeModal`,class:`modal fade`,tabindex:`-1`,"aria-labelledby":`reviewerPledgeDocHeading`,"aria-hidden":`true`},Me={class:`modal-dialog modal-dialog-centered modal-dialog-scrollable reviewer-detail-modal reviewer-detail-modal--pledge`},Ne={class:`modal-content promise-sign-sheet`},Pe={class:`modal-body pt-2`},Fe={key:0,class:`promise-doc-paper`},Ie={id:`reviewerPledgeDocHeading`,class:`promise-doc-heading text-center`},Le={class:`promise-doc-scroll`},Re=[`innerHTML`],ze={key:1,class:`promise-doc-body promise-doc-body--rich`},Be={key:0,class:`promise-doc-signblock`},Ve={class:`reviewer-pledge-sig-row`},He=[`src`],Ue={key:1,class:`small text-secondary`},We={class:`promise-doc-daterow`},Ge={class:`promise-doc-dateline`},Ke={id:`reviewerScoreModal`,class:`modal fade`,tabindex:`-1`,"aria-labelledby":`reviewerScoreModalLabel`,"aria-hidden":`true`},qe={class:`modal-dialog modal-dialog-centered modal-dialog-scrollable reviewer-detail-modal reviewer-detail-modal--score`},Je={class:`modal-content`},Ye={class:`modal-header scoring-modal-header`},Xe={id:`reviewerScoreModalLabel`,class:`modal-title scoring-modal-title w-100 text-center`},Ze={class:`modal-body`},Qe={key:0,class:`small text-danger mb-2 text-center`,role:`alert`},$e={class:`table-responsive scoring-sheet-wrap`},et={class:`table table-bordered align-middle mb-0 scoring-sheet-table`},tt={class:`text-center text-secondary`},nt=[`rowspan`],rt={class:`text-center fw-semibold scoring-indicator`},it={class:`small text-secondary scoring-criteria`},at={class:`text-center`},ot={class:`scoring-total-block`},st={class:`scoring-total-row-inner`},ct=[`onKeydown`],lt={class:`scoring-total-full small text-secondary`},T={key:0,class:`invalid-feedback d-block`},ut={class:`modal-footer flex-wrap gap-2`},dt=[`disabled`],ft=100,E=2,D=y(ne({__name:`ReviewerApplicationDetailView`,setup(ne){let y=se(),D=ce(),O=l(()=>String(y.params.slug??``).trim()),k=l(()=>String(y.params.id??``).trim()),pt=i(`reviewerCompetitionName`,s(``)),mt=l(()=>{let e=pt.value.trim();return e?`${e} 赛事承诺书`:`赛事承诺书`});function ht(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 A=s(null),j=s(!1),M=s(``),N=l(()=>ht(A.value?.promise_signed_at)),P=s(``),F=s(!1),I=s(!1),L=s(!1),gt=l(()=>Number(A.value?.scoring_sheet?.full_score??100)||100);function R(){return String(P.value??``).trim()}let z=l({get:()=>P.value,set:e=>{let t=(e==null?``:String(e)).replace(/[^\d.-]/g,``);t=t.replace(/(?!^)-/g,``),t=t.replace(/(\..*)\./g,`$1`),P.value=t}});function B(){let e=A.value;if(!e?.scoring_sheet?.items?.length){P.value=``,I.value=!1,L.value=!1;return}let t=e.my_review_score?.line_total,n=e.my_review_score?.payload_json?.line_total,r=t!=null&&String(t).trim()!==``?String(t):n!=null&&String(n).trim()!==``?String(n):``;if(r===``)P.value=``;else{let e=Number(r);P.value=Number.isFinite(e)?V(e.toFixed(E)):``}I.value=!1,L.value=!1}c(A,()=>B(),{deep:!0});function V(e){return e.replace(/\.?0+$/,``)}function H(e){return V(Number(e).toFixed(E))}function _t(e){return/\.\d{3,}/.test(e)}let U=l(()=>A.value?.scoring_sheet?.items??[]),vt=l(()=>{let e=U.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 W(){let e=R();if(e===``)return L.value||I.value?`请填写项目总分`:null;if(e===`-`||e===`.`||e===`-.`)return`须为数字`;if(_t(e))return`项目总分最多保留两位小数`;let t=Number(e);return Number.isFinite(t)?t<0?`项目总分不能为负数`:t>ft?`项目总分不能大于 100`:null:`须为数字`}function yt(){I.value=!0}let bt=l(()=>!A.value?.scoring_allowed||!U.value.length?!1:W()===null&&R()!==``),G=l(()=>{if(!U.value.length)return``;let e=W();return e&&(L.value||I.value||R()!==``)?e:``}),xt=l(()=>{let e=A.value;return e?`项目编号:${e.project_code} · ${e.score_display}`:``}),K=l(()=>A.value?.files.find(e=>e.kind===`plan`)??null),q=l(()=>A.value?.files.filter(e=>e.kind===`supporting`)??[]),J=l(()=>{let e=A.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 Y(){let e=k.value,t=O.value,{token:n}=g();if(!/^\d+$/.test(e)||!t||!n){M.value=`参数无效或未登录`,A.value=null;return}j.value=!0,M.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(()=>({}));M.value=(typeof e==`object`&&e&&`message`in e?String(e.message??``):``)||`加载失败(${i.status})`,A.value=null;return}A.value=(await i.json()).data??null}catch{M.value=`网络错误`,A.value=null}finally{j.value=!1}}c([k,O],()=>void Y()),a(()=>void Y());function St(){let e=O.value;if(!e){D.push(`/c`);return}D.push({name:`reviewer-projects`,params:{slug:e},query:fe(pe(`reviewer-projects`,e),y.query)})}let X=s(null);async function Z(e){if(X.value!=null){v.warning(`附件正在下载中,请勿重复点击`);return}let t=k.value,n=O.value,{token:r}=g();if(!/^\d+$/.test(t)||!n||!r){v.warning(`未登录或参数无效`);return}let i=e.original_name?.trim()||`附件`,a=ue(i,e.size);if(!a)return;X.value=e.id;let o=oe(parseInt(t,10),e.id,n);try{let e=await fetch(o,{headers:{Authorization:`Bearer ${r}`,Accept:`application/json,*/*`}});if(!e.ok){let t=`下载附件失败`;try{let n=await e.json();typeof n.message==`string`&&n.message.trim()&&(t=n.message.trim())}catch{}v.error(t);return}a.setText(`正在保存「${i}」…`);let t=await e.blob(),n=URL.createObjectURL(t),s=document.createElement(`a`);s.href=n,s.download=i===`附件`?`download`:i,s.rel=`noopener`,document.body.appendChild(s),s.click(),s.remove(),URL.revokeObjectURL(n),le()}catch{v.error(`网络错误,无法下载`)}finally{a.close(),X.value=null}}function Ct(){return{line_total:Number(R())}}function Q(){typeof document>`u`||(document.querySelectorAll(`.modal-backdrop`).forEach(e=>e.remove()),document.body.classList.remove(`modal-open`),document.body.style.removeProperty(`overflow`),document.body.style.removeProperty(`padding-right`))}function wt(){return new Promise(e=>{if(typeof document>`u`){e();return}let t=document.getElementById(`reviewerScoreModal`);if(!t){Q(),e();return}let n=!1,r=()=>{n||(n=!0,t.removeEventListener(`hidden.bs.modal`,i),Q(),e())},i=()=>r();t.addEventListener(`hidden.bs.modal`,i),(_.getInstance(t)??_.getOrCreateInstance(t)).hide(),window.setTimeout(r,450)})}function Tt(){if(!A.value?.scoring_allowed){v.warning(A.value?.scoring_blocked_reason||`该赛道未配置打分表,暂不可评审`);return}if(L.value=!1,I.value=!1,Q(),typeof document>`u`)return;let e=document.getElementById(`reviewerScoreModal`);e&&_.getOrCreateInstance(e).show()}async function $(){let e=k.value,t=O.value,{token:n}=g();if(!/^\d+$/.test(e)||!t||!n){v.warning(`未登录或参数无效`);return}if(!A.value?.scoring_allowed||!U.value.length){v.warning(A.value?.scoring_blocked_reason||`该赛道未配置打分表,暂不可评审`);return}if(!bt.value){L.value=!0,v.warning(W()||`请填写 0~100 之间的项目总分`);return}F.value=!0;try{let r=Ct(),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}await wt();let s=o.data;A.value&&s&&(s.my_review_score!==void 0&&(A.value.my_review_score=s.my_review_score),typeof s.score_display==`string`&&(A.value.score_display=s.score_display),typeof s.score_is_pending==`boolean`&&(A.value.score_is_pending=s.score_is_pending)),B(),v.success(typeof o.message==`string`?String(o.message):`提交成功`)}catch{v.error(`网络错误,提交失败`)}finally{F.value=!1}}return(i,a)=>(p(),m(`div`,me,[h(`div`,he,[a[2]||=h(`h5`,{class:`mb-0 section-title`},`项目详情`,-1),h(`div`,ge,[A.value?(p(),m(`span`,{key:0,class:e([`status-pill`,A.value.score_is_pending?`status-pending`:`status-pass`])},d(xt.value),3)):t(``,!0),h(`button`,{type:`button`,class:`btn btn-sm btn-outline-secondary event-back-btn`,onClick:St},` 返回列表 `)])]),M.value?(p(),m(`p`,_e,d(M.value),1)):j.value?(p(),m(`p`,ve,`加载中…`)):A.value?(p(),m(`div`,ye,[h(`div`,be,[r(de,{detail:A.value,"show-recommend":!1},null,8,[`detail`]),h(`div`,xe,[h(`div`,Se,[a[3]||=h(`label`,{class:`form-label`},`商业计划书`,-1),K.value?(p(),m(`p`,Ce,[h(`a`,{role:`button`,href:`#`,class:e([`text-danger text-decoration-none`,{"pe-none opacity-75":X.value!=null}]),onClick:a[0]||=f(e=>Z(K.value),[`prevent`])},d(X.value===K.value.id?`下载中… ${K.value.original_name}`:K.value.original_name),3)])):(p(),m(`p`,we,`—`))]),h(`div`,Te,[a[4]||=h(`label`,{class:`form-label`},`其他佐证材料`,-1),q.value.length?(p(),m(`ul`,Ee,[(p(!0),m(u,null,o(q.value,t=>(p(),m(`li`,{key:t.id},[h(`a`,{role:`button`,href:`#`,class:e([`text-danger text-decoration-none`,{"pe-none opacity-75":X.value!=null}]),onClick:f(e=>Z(t),[`prevent`])},d(X.value===t.id?`下载中… ${t.original_name}`:t.original_name),11,De)]))),128))])):(p(),m(`p`,Oe,`—`))]),h(`div`,ke,[a[6]||=h(`label`,{class:`form-label`},`参赛承诺书`,-1),h(`p`,b,[A.value.promise_signed?(p(),m(u,{key:0},[a[5]||=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(N.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, #109bd3)`,"border-color":`var(--primary, #109bd3)`},disabled:!A.value.scoring_allowed,onClick:Tt},d(A.value.score_is_pending?`项目评分`:`修改项目评分`),9,C),A.value.scoring_allowed?A.value.my_review_score?(p(),m(`span`,Ae,`最近保存:`+d(A.value.my_review_score.updated_at)+` · 项目得分 `+d(V(Number(A.value.my_review_score.line_total).toFixed(2)))+` 分`,1)):t(``,!0):(p(),m(`span`,w,d(A.value.scoring_blocked_reason||`该赛道未配置打分表,暂不可评审`),1))])])])])):t(``,!0),h(`div`,je,[h(`div`,Me,[h(`div`,Ne,[h(`div`,Pe,[A.value?(p(),m(`div`,Fe,[h(`h1`,Ie,d(mt.value),1),h(`div`,Le,[A.value.pledge_content_html?.trim()?(p(),m(`div`,{key:0,class:`promise-doc-body promise-doc-body--rich`,innerHTML:A.value.pledge_content_html},null,8,Re)):(p(),m(`div`,ze,[...a[7]||=[h(`p`,{class:`text-secondary mb-0`},`本场赛事未配置承诺书正文(可在管理端赛事中心维护)。`,-1)]]))]),A.value.promise_signed?(p(),m(`div`,Be,[h(`div`,Ve,[a[8]||=h(`span`,{class:`promise-doc-signlabel`},`参赛人签名:`,-1),J.value?(p(),m(`img`,{key:0,src:J.value,alt:``,class:`reviewer-promise-sig-img`,loading:`lazy`},null,8,He)):(p(),m(`span`,Ue,`暂无`))]),h(`div`,We,[h(`span`,Ge,[a[9]||=n(`日期:`,-1),h(`strong`,null,d(N.value),1)])])])):t(``,!0)])):t(``,!0),a[10]||=h(`div`,{class:`promise-sign-actions`},[h(`button`,{type:`button`,class:`btn btn-light notice-cancel-btn`,"data-bs-dismiss":`modal`},`关闭`)],-1)])])])]),h(`div`,Ke,[h(`div`,qe,[h(`div`,Je,[h(`div`,Ye,[h(`h5`,Xe,d(A.value?.scoring_sheet?.title||`项目评分`),1),a[11]||=h(`button`,{type:`button`,class:`btn-close scoring-modal-close`,"data-bs-dismiss":`modal`,"aria-label":`关闭`},null,-1)]),h(`div`,Ze,[a[15]||=h(`p`,{class:`small text-secondary mb-2 text-center scoring-modal-hint`},` 下表为评审参考;请在底部填写项目总分(0~100,最多两位小数,可为 0)。 `,-1),G.value?(p(),m(`p`,Qe,d(G.value),1)):t(``,!0),h(`div`,$e,[h(`table`,et,[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`})],-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`},`分值`)])],-1),h(`tbody`,null,[(p(!0),m(u,null,o(vt.value,e=>(p(),m(`tr`,{key:e.item.key},[h(`td`,tt,d(e.item.sort||e.idx+1),1),e.categoryRowspan>0?(p(),m(`td`,{key:0,rowspan:e.categoryRowspan,class:`text-center scoring-category`},d(e.item.category),9,nt)):t(``,!0),h(`td`,rt,d(e.item.title),1),h(`td`,it,d(e.item.criteria||`—`),1),h(`td`,at,d(H(e.item.max_score)),1)]))),128))])])]),h(`div`,ot,[a[14]||=h(`label`,{class:`form-label mb-1 fw-semibold`,for:`reviewer-total-score-input`},`项目总分`,-1),h(`div`,st,[ee(h(`input`,{id:`reviewer-total-score-input`,"onUpdate:modelValue":a[1]||=e=>z.value=e,class:e([`form-control scoring-total-input text-center`,{"is-invalid":!!W()}]),type:`text`,inputmode:`decimal`,autocomplete:`off`,placeholder:`请输入总分`,"aria-label":`项目总分`,onBlur:yt,onKeydown:re(f($,[`prevent`]),[`enter`])},null,42,ct),[[te,z.value]]),h(`span`,lt,`满分 `+d(H(gt.value)),1)]),W()?(p(),m(`div`,T,d(W()),1)):t(``,!0)])]),h(`div`,ut,[a[16]||=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, #109bd3)`,"border-color":`var(--primary, #109bd3)`},disabled:F.value,onClick:$},d(F.value?`提交中…`:`确认提交`),9,dt)])])])])]))}}),[[`__scopeId`,`data-v-75c810e2`]]);export{D as default};