|
|
import{A as e,C as t,Dt as n,F as r,G as i,J as a,O as o,S as s,T as c,X as l,_ as u,an as d,en as f,k as ee,ot as p,vt as m,w as h,x as g}from"./vue.runtime.esm-bundler-Dt_AyShc.js";import{A as te,M as ne,j as re,k as _}from"./api-Dpfxb1ca.js";import{E as v,f as ie,g as y,p as ae}from"./index-D9t8QC7c.js";import{t as b}from"./_plugin-vue_export-helper-CXTkFu_Z.js";import{r as oe,t as se}from"./downloadFeedback-D30DNvds.js";import{a as ce,i as le,n as ue,r as de,t as x}from"./scoreFormat-By5dDjGK.js";import{t as fe}from"./PledgeViewSheet-Bb-l73jt.js";import{t as pe}from"./ApplicationSignupDetailFields-DDT4XvTq.js";import{i as me,t as he}from"./listPageState-CRQ3rD3Z.js";var ge={class:`container-fluid p-3 p-md-4 reviewer-detail-page`},_e={class:`d-flex justify-content-between align-items-center flex-wrap gap-2 mb-3`},ve={class:`d-flex align-items-center gap-2 flex-wrap`},ye={key:0,class:`alert alert-warning py-2 small`,role:`alert`},be={key:1,class:`small text-secondary`},xe={key:2,class:`card mb-4 border-0 shadow-sm`},Se={class:`card-body pb-4`},Ce={class:`row g-3 mt-1`},we={class:`col-12`},Te={key:0,class:`form-control-plaintext border rounded px-3 py-2 mb-0 bg-light small d-flex flex-wrap align-items-center gap-2`},Ee={class:`text-secondary text-break`},S=[`disabled`],C=[`disabled`],w={key:1,class:`form-control-plaintext border rounded px-3 py-2 mb-0 bg-light small text-secondary`},T={class:`col-12`},E={key:0,class:`list-unstyled mb-0 border rounded px-3 py-2 bg-light small`},D={class:`text-secondary text-break`},De=[`disabled`,`onClick`],Oe=[`disabled`,`onClick`],ke={key:1,class:`form-control-plaintext border rounded px-3 py-2 mb-0 bg-light small text-secondary`},Ae={class:`col-12`},je={class:`form-control-plaintext border rounded px-3 py-2 mb-0 bg-light small text-secondary`},Me={class:`text-secondary ms-2`},Ne={class:`col-12 pt-3 mt-2 border-top d-flex flex-wrap gap-2 align-items-center reviewer-score-action-bar`},Pe=[`disabled`],Fe={key:0,class:`small text-danger`},Ie={key:1,class:`small text-secondary`},Le={id:`reviewerPledgeModal`,class:`modal fade`,tabindex:`-1`,"aria-label":`赛事承诺书`,"aria-hidden":`true`},Re={class:`modal-dialog modal-dialog-centered reviewer-detail-modal reviewer-detail-modal--pledge`},ze={class:`modal-content promise-sign-sheet`},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={class:`table-responsive scoring-sheet-wrap`},qe={class:`table table-bordered align-middle mb-0 scoring-sheet-table`},Je={class:`text-center text-secondary`},Ye=[`rowspan`],Xe={class:`text-center fw-semibold scoring-indicator`},Ze={class:`small text-secondary scoring-criteria`},Qe={class:`text-center`},$e={class:`scoring-score-cell`},et=[`aria-label`,`value`,`onInput`,`onBlur`],tt={key:0,class:`invalid-feedback d-block`},nt={class:`scoring-total-block`},rt={class:`scoring-total-row-inner`},it={class:`scoring-total-value`},at={class:`scoring-total-full small text-secondary`},ot={key:0,class:`invalid-feedback d-block`},st={class:`modal-footer flex-wrap gap-2`},ct=[`disabled`],lt=100,O=b(e({__name:`ReviewerApplicationDetailView`,setup(e){let b=ie(),O=ae(),k=g(()=>String(b.params.slug??``).trim()),A=g(()=>String(b.params.id??``).trim()),ut=r(`reviewerCompetitionName`,m(``)),dt=g(()=>{let e=ut.value.trim();return e?`${e} 赛事承诺书`:`赛事承诺书`});function ft(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 j=m(null),M=m(!1),N=m(``),P=g(()=>ft(j.value?.promise_signed_at)),F=m({}),I=m({}),L=m(!1),R=m(!1),pt=g(()=>Number(j.value?.scoring_sheet?.full_score??100)||100),z=g(()=>j.value?.scoring_sheet?.items??[]);function B(e){return e.replace(/\.?0+$/,``)}function V(e){return B(Number(e).toFixed(2))}function mt(e,t){F.value={...F.value,[e]:de(t)}}function H(){let e={};for(let t of z.value)e[t.key]=``;let t=j.value?.my_review_score?.payload_json?.scores;if(t&&typeof t==`object`&&!Array.isArray(t)){let n=t;for(let t of z.value){let r=n[t.key];if(r==null||String(r).trim()===``)continue;let i=Number(r);e[t.key]=Number.isFinite(i)?B(i.toFixed(2)):``}}F.value=e,I.value={},R.value=!1}p(j,()=>H(),{deep:!0});let ht=g(()=>{let e=z.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 U(e){let t=String(F.value[e.key]??``).trim(),n=R.value||!!I.value[e.key];if(t===``)return n?`请填写「${e.title}」得分`:null;if(t===`-`||t===`.`||t===`-.`)return`「${e.title}」得分须为数字`;if(ue(t))return`「${e.title}」得分最多保留两位小数`;let r=Number(t);if(!Number.isFinite(r))return`「${e.title}」得分须为数字`;if(r<0)return`「${e.title}」得分不能小于 0`;let i=Number(e.max_score);return Number.isFinite(i)&&r>i?`「${e.title}」得分不能高于该项分值 ${V(e.max_score)}`:null}function W(){for(let e of z.value){let t=U(e);if(t)return t}return null}let G=g(()=>{if(!z.value.length)return null;let e=0;for(let t of z.value){let n=String(F.value[t.key]??``).trim();if(n===``||U(t))return null;let r=Number(n);if(!Number.isFinite(r))return null;e+=r}return Math.round(e*100)/100});function K(){if(!z.value.length)return null;let e=W();if(e)return e;if(z.value.some(e=>String(F.value[e.key]??``).trim()===``||U(e)!==null))return R.value?`请为每一项填写有效得分`:null;let t=G.value;return t==null?R.value?`请为每一项填写有效得分`:null:t<0?`项目总分不能小于 0`:t>lt?`项目总分不能大于 100`:null}let gt=g(()=>!j.value?.scoring_allowed||!z.value.length||G.value==null?!1:z.value.every(e=>U(e)===null)&&K()===null),_t=g(()=>{let e=j.value;return e?`项目编号:${e.project_code} · ${e.score_display}`:``}),q=g(()=>j.value?.files.find(e=>e.kind===`plan`)??null),J=g(()=>j.value?.files.filter(e=>e.kind===`supporting`)??[]),vt=g(()=>{let e=j.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=A.value,t=k.value,{token:n}=_();if(!/^\d+$/.test(e)||!t||!n){N.value=`参数无效或未登录`,j.value=null;return}M.value=!0,N.value=``;try{let r=te(parseInt(e,10),t),i=await fetch(r,{headers:{Authorization:`Bearer ${n}`,Accept:`application/json`}});if(!i.ok){let e=await i.json().catch(()=>({}));N.value=(typeof e==`object`&&e&&`message`in e?String(e.message??``):``)||`加载失败(${i.status})`,j.value=null;return}j.value=(await i.json()).data??null}catch{N.value=`网络错误`,j.value=null}finally{M.value=!1}}p([A,k],()=>void Y()),i(()=>void Y());function yt(){let e=k.value;if(!e){O.push(`/c`);return}O.push({name:`reviewer-projects`,params:{slug:e},query:me(he(`reviewer-projects`,e),b.query)})}let X=m(null);async function Z(e,t){if(X.value!=null){y.warning(t===`preview`?`附件正在打开中,请稍候`:`附件正在下载中,请勿重复点击`);return}let n=A.value,r=k.value,{token:i}=_();if(!/^\d+$/.test(n)||!r||!i){y.warning(`未登录或参数无效`);return}let a=e.original_name?.trim()||`附件`,o=se(a,e.size,t===`preview`?`打开`:`下载`);if(!o)return;X.value=e.id;let s=re(parseInt(n,10),e.id,r);try{let n=await fetch(s,{headers:{Authorization:`Bearer ${i}`,Accept:`application/json,*/*`}});if(!n.ok){let e=t===`preview`?`打开附件失败`:`下载附件失败`;try{let t=await n.json();typeof t.message==`string`&&t.message.trim()&&(e=t.message.trim())}catch{}y.error(e);return}let r=await n.blob();if(t===`preview`){o.setText(`正在打开「${a}」…`),le(r,a,e.mime);return}o.setText(`正在保存「${a}」…`),ce(r,a===`附件`?`download`:a),oe()}catch{y.error(t===`preview`?`网络错误,无法打开`:`网络错误,无法下载`)}finally{o.close(),X.value=null}}function Q(){let e={};for(let t of z.value)e[t.key]=Math.round(Number(String(F.value[t.key]??``).trim())*100)/100;return{scores:e}}function $(){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 bt(){return new Promise(e=>{if(typeof document>`u`){e();return}let t=document.getElementById(`reviewerScoreModal`);if(!t){$(),e();return}let n=!1,r=()=>{n||(n=!0,t.removeEventListener(`hidden.bs.modal`,i),$(),e())},i=()=>r();t.addEventListener(`hidden.bs.modal`,i),(v.getInstance(t)??v.getOrCreateInstance(t)).hide(),window.setTimeout(r,450)})}function xt(){if(!j.value?.scoring_allowed){y.warning(j.value?.scoring_blocked_reason||`该赛道未配置打分表,暂不可评审`);return}if(R.value=!1,$(),typeof document>`u`)return;let e=document.getElementById(`reviewerScoreModal`);e&&v.getOrCreateInstance(e).show()}async function St(){let e=A.value,t=k.value,{token:n}=_();if(!/^\d+$/.test(e)||!t||!n){y.warning(`未登录或参数无效`);return}if(!j.value?.scoring_allowed||!z.value.length){y.warning(j.value?.scoring_blocked_reason||`该赛道未配置打分表,暂不可评审`);return}if(!gt.value){R.value=!0,y.warning(W()||K()||`请为每一项填写 0~该项分值的得分`);return}L.value=!0;try{let r=Q(),i=ne(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})`;y.error(n);return}await bt();let s=o.data;j.value&&s&&(s.my_review_score!==void 0&&(j.value.my_review_score=s.my_review_score),typeof s.score_display==`string`&&(j.value.score_display=s.score_display),typeof s.score_is_pending==`boolean`&&(j.value.score_is_pending=s.score_is_pending)),H(),y.success(typeof o.message==`string`?String(o.message):`提交成功`)}catch{y.error(`网络错误,提交失败`)}finally{L.value=!1}}return(e,r)=>(a(),c(`div`,ge,[s(`div`,_e,[r[2]||=s(`h5`,{class:`mb-0 section-title`},`项目详情`,-1),s(`div`,ve,[j.value?(a(),c(`span`,{key:0,class:f([`status-pill`,j.value.score_is_pending?`status-pending`:`status-pass`])},d(_t.value),3)):h(``,!0),s(`button`,{type:`button`,class:`btn btn-sm btn-outline-secondary event-back-btn`,onClick:yt},` 返回列表 `)])]),N.value?(a(),c(`p`,ye,d(N.value),1)):M.value?(a(),c(`p`,be,`加载中…`)):j.value?(a(),c(`div`,xe,[s(`div`,Se,[ee(pe,{detail:j.value,"show-recommend":!1},null,8,[`detail`]),s(`div`,Ce,[s(`div`,we,[r[3]||=s(`label`,{class:`form-label`},`商业计划书`,-1),q.value?(a(),c(`p`,Te,[s(`span`,Ee,d(q.value.original_name),1),s(`button`,{type:`button`,class:`btn btn-link btn-sm p-0`,disabled:X.value!=null,onClick:r[0]||=e=>Z(q.value,`preview`)},` 查看 `,8,S),s(`button`,{type:`button`,class:`btn btn-link btn-sm p-0`,disabled:X.value!=null,onClick:r[1]||=e=>Z(q.value,`download`)},d(X.value===q.value.id?`处理中…`:`下载`),9,C)])):(a(),c(`p`,w,`—`))]),s(`div`,T,[r[4]||=s(`label`,{class:`form-label`},`其他佐证材料`,-1),J.value.length?(a(),c(`ul`,E,[(a(!0),c(u,null,l(J.value,e=>(a(),c(`li`,{key:e.id,class:`d-flex flex-wrap align-items-center gap-2`},[s(`span`,D,d(e.original_name),1),s(`button`,{type:`button`,class:`btn btn-link btn-sm p-0`,disabled:X.value!=null,onClick:t=>Z(e,`preview`)},` 查看 `,8,De),s(`button`,{type:`button`,class:`btn btn-link btn-sm p-0`,disabled:X.value!=null,onClick:t=>Z(e,`download`)},d(X.value===e.id?`处理中…`:`下载`),9,Oe)]))),128))])):(a(),c(`p`,ke,`—`))]),s(`div`,Ae,[r[6]||=s(`label`,{class:`form-label`},`参赛承诺书`,-1),s(`p`,je,[j.value.promise_signed?(a(),c(u,{key:0},[r[5]||=s(`button`,{type:`button`,class:`btn btn-link btn-sm p-0 align-baseline text-danger`,"data-bs-toggle":`modal`,"data-bs-target":`#reviewerPledgeModal`},` 已签署 · 查看承诺书与签名 `,-1),s(`span`,Me,`日期:`+d(P.value),1)],64)):(a(),c(u,{key:1},[o(`未签署`)],64))])]),s(`div`,Ne,[s(`button`,{type:`button`,class:`btn btn-primary px-4`,style:{"background-color":`var(--primary, #109bd3)`,"border-color":`var(--primary, #109bd3)`},disabled:!j.value.scoring_allowed,onClick:xt},d(j.value.score_is_pending?`项目评分`:`修改项目评分`),9,Pe),j.value.scoring_allowed?j.value.my_review_score?(a(),c(`span`,Ie,`最近保存:`+d(j.value.my_review_score.updated_at)+` · 项目得分 `+d(n(x)(j.value.my_review_score.line_total))+` 分`,1)):h(``,!0):(a(),c(`span`,Fe,d(j.value.scoring_blocked_reason||`该赛道未配置打分表,暂不可评审`),1))])])])])):h(``,!0),s(`div`,Le,[s(`div`,Re,[s(`div`,ze,[j.value?(a(),t(fe,{key:0,heading:dt.value,"body-html":j.value.pledge_content_html,"empty-body-text":`本场赛事未配置承诺书正文(可在管理端赛事中心维护)。`,"signature-url":vt.value,"signed-date":j.value.promise_signed?P.value:``},null,8,[`heading`,`body-html`,`signature-url`,`signed-date`])):h(``,!0),r[7]||=s(`div`,{class:`promise-sign-actions pledge-view-actions`},[s(`button`,{type:`button`,class:`btn btn-light notice-cancel-btn`,"data-bs-dismiss":`modal`},`关闭`)],-1)])])]),s(`div`,Be,[s(`div`,Ve,[s(`div`,He,[s(`div`,Ue,[s(`h5`,We,d(j.value?.scoring_sheet?.title||`项目评分`),1),r[8]||=s(`button`,{type:`button`,class:`btn-close scoring-modal-close`,"data-bs-dismiss":`modal`,"aria-label":`关闭`},null,-1)]),s(`div`,Ge,[r[12]||=s(`p`,{class:`small text-secondary mb-2 text-center scoring-modal-hint`},` 请为每一项打分(0~该项分值,最多两位小数)。项目总分为各项得分之和,无需填写。 `,-1),s(`div`,Ke,[s(`table`,qe,[r[9]||=s(`colgroup`,null,[s(`col`,{class:`col-seq`}),s(`col`,{class:`col-category`}),s(`col`,{class:`col-indicator`}),s(`col`,{class:`col-criteria`}),s(`col`,{class:`col-max`}),s(`col`,{class:`col-score`})],-1),r[10]||=s(`thead`,null,[s(`tr`,null,[s(`th`,{class:`text-nowrap text-center`},`序号`),s(`th`,{class:`text-nowrap text-center`},`指标分类`),s(`th`,{class:`text-nowrap text-center`},`评审指标`),s(`th`,{class:`text-center`},`核心评审要素(评委打分依据)`),s(`th`,{class:`text-nowrap text-center`},`分值`),s(`th`,{class:`text-nowrap text-center`},`得分`)])],-1),s(`tbody`,null,[(a(!0),c(u,null,l(ht.value,e=>(a(),c(`tr`,{key:e.item.key},[s(`td`,Je,d(e.item.sort||e.idx+1),1),e.categoryRowspan>0?(a(),c(`td`,{key:0,rowspan:e.categoryRowspan,class:`text-center scoring-category`},d(e.item.category),9,Ye)):h(``,!0),s(`td`,Xe,d(e.item.title),1),s(`td`,Ze,d(e.item.criteria||`—`),1),s(`td`,Qe,d(V(e.item.max_score)),1),s(`td`,$e,[s(`input`,{class:f([`form-control form-control-sm text-center scoring-item-input`,{"is-invalid":!!U(e.item)}]),type:`text`,inputmode:`decimal`,autocomplete:`off`,"aria-label":`${e.item.title}得分`,value:F.value[e.item.key]??``,onInput:t=>mt(e.item.key,t.target.value),onBlur:t=>I.value={...I.value,[e.item.key]:!0}},null,42,et),U(e.item)?(a(),c(`div`,tt,d(U(e.item)),1)):h(``,!0)])]))),128))])])]),s(`div`,nt,[s(`div`,rt,[r[11]||=s(`span`,{class:`form-label mb-0 fw-semibold`},`项目总分`,-1),s(`strong`,it,d(G.value==null?`—`:n(x)(G.value)),1),s(`span`,at,`满分 `+d(V(pt.value)),1)]),K()?(a(),c(`div`,ot,d(K()),1)):h(``,!0)])]),s(`div`,st,[r[13]||=s(`button`,{type:`button`,class:`btn btn-secondary`,"data-bs-dismiss":`modal`},`取消`,-1),s(`button`,{type:`button`,class:`btn btn-primary`,style:{"background-color":`var(--primary, #109bd3)`,"border-color":`var(--primary, #109bd3)`},disabled:L.value,onClick:St},d(L.value?`提交中…`:`确认提交`),9,ct)])])])])]))}}),[[`__scopeId`,`data-v-2a1e58e2`]]);export{O as default}; |