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
16 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{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};