Files
FootPrint/sync-server/www/assets/AssessmentPage-Dvd34CqC.js
T

14 lines
17 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import{d as de,f as Y,r as L,ai as ue,aj as me,j as i,S as pe,B as $,ah as fe,af as te,ag as he,v as ge,M as xe}from"./index-DhGFbjWw.js";import{R as be,P as ye}from"./rotate-ccw-DGANt55P.js";const ve={politics:{中共党员:3,中共预备党员:2.5,入党积极分子:2,共青团员:1.5,群众:1},conductDefault:8,integrityDefault:2,sportsFactor:.025,gpaFactor:10,table2:{国家级:{一等奖:3,二等奖:2,三等奖:1,优秀奖:.5},省市级:{一等奖:2,二等奖:1,三等奖:.5,优秀奖:.2},区县级:{一等奖:1,二等奖:.5,三等奖:.2,优秀奖:.1},校级:{一等奖:.5,二等奖:.2,三等奖:.1,优秀奖:.05},二级学院:{一等奖:.2,二等奖:.1,三等奖:.05,优秀奖:0}},table4:{校级:{干部:4,干事:2,社团干部:1,学工助理:2},院级:{干部:3,干事:1.5,支部委员:1.5,支部组长:1,班长:1,团支书:1,班委:.5,社团干部:1,学工助理:2}},publicGood:{无偿献血:.5,捐献骨髓:3,国家级:1.5,省市级:1,区县级:.5,校级:.2,二级学院:.1},rewards:{荣誉称号:{院级:.3,校级:.5,区级:1,市级:1.5,国家级:2},英语等级:{三级:.5,四级:1,六级:2},计算机等级:{一级:.5,二级:1,三级:2},职业资格:{从业资格:.5,初级:1,中级:2,高级:3}},penalties:{留校察看:5,记过:4,严重警告:3,警告:2,通报批评:1}};function H(c){const o=/^(\d{4})-(\d{4})$/.exec(c);return o?[o[1]+"-09-01",o[2]+"-09-01"]:null}function se(c,o){const f=/^(\d{4})-/.exec(c),h=/^(\d{4})/.exec(o??"");if(!f||!h)return c+" 学年";const u=Number(f[1])-Number(h[1])+1;return(["大一","大二","大三","大四","大五"][u-1]??u+"年级")+"("+c+" 学年)"}function we(c,o){if(!o)return!0;const f=(c??"").slice(0,10);return f>=o[0]&&f<o[1]}function D(c){const o=(c??"").trim();return o?o.includes("国家")?"国家级":o.includes("省")||o.includes("市")?"省市级":o.includes("区")?"区县级":o.includes("院")||o.includes("二级")?"二级学院":o.includes("校")?"校级":null:null}function re(c){const o=(c??"").trim();return o?/特等|一等|冠军|第1名|第一名/.test(o)?"一等奖":/二等|亚军|第2名|第3名|第二名|第三名/.test(o)?"二等奖":/三等|第[4-6]名|第四名|第五名|第六名/.test(o)?"三等奖":/优秀|优胜|第[7-9]名|第七名/.test(o)?"优秀奖":null:null}const j=c=>Math.round(c*100)/100;function ne(c,o,f){var u;return!o||!f?null:((u=c.table2[o])==null?void 0:u[f])??null}function je(c){var J,V,X,ee;const{year:o,records:f,semesters:h,bands:u,weights:p,profile:w,rules:r,ov:m}=c,b=o==="all"?null:H(o),y=f.filter(e=>e.status!=="draft"&&we(e.start_date??e.created_at,b)),g=e=>{var t;return(t=m.itemOverrides)==null?void 0:t[e]},z=(e,t,s,l,_,M)=>{const v=g(e),ce=(v==null?void 0:v.score)??l??0;return{itemKey:e,title:t,source:s,score:ce,overridden:(v==null?void 0:v.score)!=null,note:_,fromRecord:M}},S=(e,t,s,l)=>({key:e,label:t,cap:s,items:l,subtotal:j(l.reduce((_,M)=>_+M.score,0))}),x=[],O=w.political??"",F=Object.keys(r.politics).find(e=>O.includes(e)),G=F?r.politics[F]:1,Z=m.conduct??r.conductDefault,T=m.integrity??r.integrityDefault;x.push(S("conduct","品行素质",13,[{itemKey:"politics",title:"思想政治基础分("+(O||"群众")+")",source:"个人信息 · 政治面貌",score:G},{itemKey:"conduct",title:"操行考评成绩",source:"辅导员考评(可修改)",score:Z,overridden:m.conduct!=null},{itemKey:"integrity",title:"诚信分",source:"默认满分(可修改)",score:T,overridden:m.integrity!=null}]));const R=[];for(const e of h){if(b&&!H(e.term))continue;const t=H(e.term);(b===null||t&&!(t[1]<=b[0]||t[0]>=b[1]))&&R.push(...e.courses)}let C=null;const A=e=>{if(e.grade_point!=null)return e.grade_point;if(u&&e.score!=null){const t=u.find(s=>e.score>=s.min&&(e.score<s.max||s.max>=100&&e.score<=s.max));if(t&&t.gp!=null){if(t.gpTop!=null){const s=t.max>=100?t.max:t.max-1,l=(t.gpTop-t.gp)/Math.max(1,s-t.min);return j(t.gp+(e.score-t.min)*l)}return t.gp}}return null},Q=e=>p?p[e.category??"其他"]??p.其他??1:1,I=R.map(e=>({...e,grade_point:A(e)})).filter(e=>e.grade_point!=null&&e.credit>0);if(I.length){const e=I.reduce((t,s)=>t+s.credit,0);C=j(I.reduce((t,s)=>t+s.grade_point*Q(s)*s.credit,0)/e)}const n=C!=null?Math.min(j(C*r.gpaFactor),60):0;x.push(S("academic","学业成绩",60,[{itemKey:"gpa",title:"平均学分绩点 "+(C!=null?C.toFixed(2):"—")+" × 10",source:"成绩模块 · "+R.length+" 门课程",score:n,note:C==null?"该学期暂无课程成绩":void 0}]));const a=R.filter(e=>/体育/.test(e.course_name)),d=j(a.reduce((e,t)=>e+(t.score??0),0)*r.sportsFactor),N=[];a.length&&N.push({itemKey:"sports",title:"体育成绩("+a.length+" 学期体育课)",source:"体育课成绩之和 × "+r.sportsFactor,score:Math.min(d,5)});const K=[];for(const e of y.filter(t=>t.type_name==="文体活动")){const t=ne(r,D(e.level),re(e.award_grade));t==null&&!((J=g("w"+e.id))!=null&&J.score)||K.push(z("w"+e.id,e.title,e.type_name+" · "+(e.level??"")+" "+(e.award_grade??""),t,void 0,e.id))}const q=j(Math.min(K.reduce((e,t)=>e+t.score,0),5));x.push(S("sports","文体素质",10,[...N,{itemKey:"wcap",title:"文体类加分(上限 5 分)",source:K.length+" 条记录",score:q,note:K.map(e=>e.title+" "+e.score+"分").join(";")||"无匹配记录"}]));const E=[];for(const e of y.filter(t=>t.type_name==="竞赛"||t.type_name==="科研")){const t=ne(r,D(e.level),re(e.award_grade));t==null&&!((V=g("c"+e.id))!=null&&V.score)||E.push(z("c"+e.id,e.title,e.type_name+" · "+(e.level??"")+" "+(e.award_grade??""),t,void 0,e.id))}const U=j(Math.min(E.reduce((e,t)=>e+t.score,0),10)),B=[];for(const e of y.filter(t=>t.type_name==="学生工作")){const t=D(e.level)??"院级",s=(e.role??"")+" "+e.title,l=r.table4[t==="国家级"||t==="省市级"||t==="区县级"?"校级":t]??r.table4.院级;let _=null;for(const[M,v]of Object.entries(l))if(s.includes(M)){_=v;break}_==null&&!((X=g("k"+e.id))!=null&&X.score)||B.push(z("k"+e.id,e.title,"学生工作 · "+(e.level??"院级")+" "+(e.role??""),_,_==null?"请手动填写分值":void 0,e.id))}const oe=j(Math.min(B.reduce((e,t)=>e+t.score,0),4)),P=[];for(const e of y.filter(t=>t.type_name==="志愿公益")){const t=D(e.level),s=/献血/.test(e.title);let l=s?r.publicGood.无偿献血:t?r.publicGood[t]??null:null;l==null&&!((ee=g("g"+e.id))!=null&&ee.score)||P.push(z("g"+e.id,e.title,"公益 · "+(s?"无偿献血":e.level??"校级"),l,void 0,e.id))}const ae=j(Math.min(P.reduce((e,t)=>e+t.score,0),3));x.push(S("expand","拓展性素质",17,[{itemKey:"ccap",title:"竞赛获奖(上限 10 分)",source:E.length+" 条记录",score:U,note:E.map(e=>e.title+" "+e.score+"分").join(";")||"无匹配记录"},{itemKey:"kcap",title:"担任学生工作(上限 4 分)",source:B.length+" 条记录",score:oe,note:B.map(e=>e.title+" "+e.score+"分").join(";")||"无匹配记录"},{itemKey:"gcap",title:"公益活动(上限 3 分)",source:P.length+" 条记录",score:ae,note:P.map(e=>e.title+" "+e.score+"分").join(";")||"无匹配记录"}]));const W=[];for(const e of y.filter(t=>t.type_name==="荣誉惩处"||t.type_name==="证书技能")){const t=g("h"+e.id),s=e.title+" "+(e.award_grade??"");if(/综合测评奖学金/.test(s))continue;let l=null,_=e.type_name;if(/留校察看/.test(s))l=-r.penalties.留校察看;else if(/记过/.test(s))l=-r.penalties.记过;else if(/严重警告/.test(s))l=-r.penalties.严重警告;else if(/警告/.test(s))l=-r.penalties.警告;else if(/通报批评/.test(s))l=-r.penalties.通报批评;else if(/六级|专八/.test(s))l=r.rewards.英语等级.六级;else if(/四级|专四/.test(s))l=r.rewards.英语等级.四级;else if(/三级/.test(s)&&/英语/.test(s))l=r.rewards.英语等级.三级;else if(/计算机/.test(s)&&/三级/.test(s))l=r.rewards.计算机等级.三级;else if(/计算机/.test(s)&&/二级/.test(s))l=r.rewards.计算机等级.二级;else if(/计算机/.test(s)&&/一级/.test(s))l=r.rewards.计算机等级.一级;else if(/高级/.test(s))l=r.rewards.职业资格.高级;else if(/中级/.test(s))l=r.rewards.职业资格.中级;else if(/初级/.test(s))l=r.rewards.职业资格.初级;else if(/从业|资格证|教师资格|普通话|驾驶证|软考/.test(s))l=r.rewards.职业资格.从业资格;else{const M=D(e.level),v=M==="省市级"?"市级":M==="区县级"?"区级":M==="二级学院"?"院级":M;v&&r.rewards.荣誉称号[v]!=null&&(l=r.rewards.荣誉称号[v],_="荣誉 · "+v)}l==null&&!(t!=null&&t.score)||W.push(z("h"+e.id,e.title,_,l,void 0,e.id))}const ie=j(Math.max(Math.min(W.reduce((e,t)=>e+t.score,0),5),-5));x.push(S("rewards","奖惩分",5,[{itemKey:"hcap",title:"奖惩合计(±5 分)",source:W.length+" 条记录",score:ie,note:W.map(e=>e.title+" "+e.score+"分").join(";")||"无匹配记录"}]));for(const e of m.manual??[]){const t=x.find(s=>s.label===e.section)??x[x.length-1];t.items.push({itemKey:"m"+e.title+e.score,title:e.title,source:"手动添加",score:e.score}),t.subtotal=j(t.items.reduce((s,l)=>s+l.score,0))}const le=j(x.reduce((e,t)=>{const s=t.key==="rewards"?t.subtotal:Math.min(t.subtotal,t.cap);return e+s},0));return{sections:x,total:le,gpa:C}}function k(c){return String(c??"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function Ne(c,o){var u;const f="----=_fp_zongce",h=[];h.push("--"+f+`\r
Content-Type: text/html; charset="utf-8"\r
Content-Transfer-Encoding: 8bit\r
\r
`+c+`\r
`);for(const p of o){const w=p.dataUri.indexOf(","),r=p.dataUri.slice(0,w),m=p.dataUri.slice(w+1),b=((u=/data:([^;]+)/.exec(r))==null?void 0:u[1])??"image/png";h.push("--"+f+`\r
Content-Type: `+b+`\r
Content-Transfer-Encoding: base64\r
Content-Location: `+p.name+`\r
\r
`+m+`\r
`)}return h.push("--"+f+`--\r
`),new Blob([h.join("")],{type:'multipart/related; type="text/html"; boundary="'+f+'"'})}function _e(c,o,f,h){const u=o.sections.map(m=>{const b=m.key==="rewards"?m.subtotal:Math.min(m.subtotal,m.cap),y=m.items.map(g=>'<tr><td style="padding:3pt 6pt;border:0.75pt solid #999">'+k(g.title)+'</td><td style="padding:3pt 6pt;border:0.75pt solid #999;font-size:10pt;color:#555">'+k(g.note||g.source)+'</td><td style="padding:3pt 6pt;border:0.75pt solid #999;text-align:right;width:70pt">'+k(g.score)+"</td></tr>").join("");return'<h2 style="font-size:13pt;margin:12pt 0 5pt">'+k(m.label)+"(上限 "+k(m.cap)+" 分,小计 "+k(b)+' 分)</h2><table style="width:100%;border-collapse:collapse;font-size:11pt">'+y+"</table>"}).join(""),p=[],w=h.map(m=>{let b="";return m.images.forEach((y,g)=>{const z="ev"+m.recordId+"_"+g;p.push({name:z,dataUri:y}),b+='<div style="font-size:10pt;color:#555">图 '+(g+1)+'</div><img src="'+z+'" style="width:300pt">'}),'<div style="margin-bottom:10pt"><b style="font-size:11pt">'+k(m.title)+"</b>"+b+"</div>"}).join(""),r='<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word"><head><meta charset="utf-8"><title>综合素质测评</title></head><body style="font-family:SimSun,Calibri,sans-serif;margin:36pt;color:#222"><h1 style="text-align:center;font-size:18pt;margin:0 0 6pt">学生综合素质测评</h1><div style="text-align:center;color:#555;font-size:11pt">'+k(f.name??"")+" · "+k(f.className??"")+" · 统计周期:"+k(c)+'</div><p style="text-align:center;font-size:13pt;background:#f2f2f2;padding:6pt"><b>综合素质总分:'+k(o.total)+" 分</b></p>"+u+(w?'<h2 style="font-size:13pt;margin:16pt 0 6pt">附:证明材料</h2>'+w:"")+'<table style="width:100%;border-collapse:collapse;margin-top:24pt;font-size:11pt"><tr><td style="width:33%">学生签名:______</td><td style="width:33%">辅导员签名:______</td><td>日期:______</td></tr></table></body></html>';return Ne(r,p)}function Ce(){var C,A,Q,I;const c=de(),o=Y({queryKey:["profile"],queryFn:he}),f=Y({queryKey:["zc-records"],queryFn:()=>ge({page:1,page_size:500})}),h=Y({queryKey:["grades"],queryFn:xe}),u=(C=o.data)==null?void 0:C.content,p={...(u==null?void 0:u.info)??{}},w=((A=u==null?void 0:u.zongce)==null?void 0:A.rules)??ve,[r,m]=L.useState(""),[b,y]=L.useState({}),[g,z]=L.useState([]);L.useEffect(()=>{var a,d;if(!u)return;y(((a=u.zongce)==null?void 0:a.overrides)??{});const n=Array.from(new Set((((d=h.data)==null?void 0:d.semesters)??[]).map(N=>N.term.slice(0,7))));!r&&n.length&&m(n[0])},[u,h.data]);const S=((Q=f.data)==null?void 0:Q.items)??[],x=b[r]??{},O=L.useMemo(()=>{var n,a,d;return je({year:r||"all",records:S,semesters:((n=h.data)==null?void 0:n.semesters)??[],bands:(a=h.data)==null?void 0:a.bands,weights:(d=h.data)==null?void 0:d.weights,profile:p,rules:w,ov:x})},[S,h.data,p,w,x,r]),F=L.useMemo(()=>{const n=[];return O.sections.forEach(a=>a.items.forEach(d=>{d.fromRecord&&n.push(d.fromRecord)})),n},[O]);L.useEffect(()=>{let n=!0;return(async()=>{const a=[];for(const d of F){const N=S.find(K=>K.id===d);try{const K=await ue(d),q=[];for(const E of K.items.filter(U=>U.id).slice(0,3)){const U=await me(E.id);U.data_b64&&q.push("data:"+(E.mime==="image/jpeg"?"image/jpeg":"image/webp")+";base64,"+U.data_b64)}q.length&&a.push({recordId:d,title:(N==null?void 0:N.title)??"记录 "+d,images:q})}catch{}}n&&z(a)})(),()=>{n=!1}},[F.join(",")]);const G=n=>{y(a=>({...a,[r]:n})),te({info:p,zongce:{rules:w,overrides:{...b,[r]:n}}}).catch(a=>c("error",a.message))},Z=()=>{const n={...b};delete n[r],y(n),te({info:p,zongce:{rules:w,overrides:n}}).then(()=>c("success","已恢复自动计算")).catch(a=>c("error",a.message))},T=r==="all"?"全部学年":se(r,p.eduStart),R=()=>{const n=_e(T,O,p,g),a=URL.createObjectURL(n),d=document.createElement("a");d.href=a,d.download="综合素质测评_"+T+".doc",d.click(),setTimeout(()=>URL.revokeObjectURL(a),6e4),c("success","综测材料已导出"+(g.length?"(含 "+g.length+" 条证明材料图片)":""))};return i.jsxs("div",{className:"mx-auto max-w-[1080px] px-3 py-4 sm:px-6 sm:py-5",children:[i.jsxs("div",{className:"no-print mb-4 flex flex-wrap items-center justify-between gap-2",children:[i.jsx("h2",{className:"text-[15px] font-semibold text-ink-1",children:"综合测评(按学年自动计算)"}),i.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[i.jsx(pe,{className:"w-[190px]",value:r,onChange:n=>m(n.target.value),options:[...Array.from(new Set((((I=h.data)==null?void 0:I.semesters)??[]).map(n=>n.term.slice(0,7)))).map(n=>({value:n,label:se(n,p.eduStart)})),{value:"all",label:"全部学年"}]}),i.jsxs($,{variant:"secondary",onClick:Z,children:[i.jsx(be,{size:13})," 恢复自动"]}),i.jsxs($,{variant:"secondary",onClick:R,children:[i.jsx(fe,{size:13})," 导出材料"]}),i.jsxs($,{variant:"primary",onClick:()=>window.print(),children:[i.jsx(ye,{size:13})," 打印"]})]})]}),i.jsxs("div",{className:"print-sheet mx-auto w-full max-w-[794px] rounded-lg border border-line bg-white p-5 shadow-card sm:p-8",children:[i.jsx("h1",{className:"text-center text-[18px] font-bold text-neutral-900",children:"学生综合素质测评"}),i.jsxs("div",{className:"mt-1 text-center text-[12px] text-neutral-500",children:[p.name??""," · ",p.className??""," · 统计周期:",T]}),i.jsxs("div",{className:"mt-5 rounded-md bg-neutral-100 px-4 py-2 text-center text-[15px] font-bold text-neutral-900",children:["综合素质总分:",i.jsx("span",{className:"num",children:O.total})," 分"]}),O.sections.map(n=>i.jsxs("div",{className:"mt-5",children:[i.jsxs("div",{className:"flex items-baseline justify-between border-b-2 border-neutral-800 pb-1",children:[i.jsxs("span",{className:"text-[13.5px] font-bold text-neutral-900",children:[n.label,"(上限 ",n.cap," 分)"]}),i.jsxs("span",{className:"num text-[12.5px] text-neutral-600",children:["小计 ",n.key==="rewards"?n.subtotal:Math.min(n.subtotal,n.cap)," 分"]})]}),i.jsxs("div",{className:"mt-2 flex flex-col gap-1.5",children:[n.items.map(a=>i.jsxs("div",{className:"flex items-center gap-2 text-[12.5px]",children:[i.jsxs("span",{className:"min-w-0 flex-1",children:[i.jsx("span",{className:"text-neutral-900",children:a.title}),i.jsx("span",{className:"ml-2 text-[11px] text-neutral-400",children:a.source}),a.note&&i.jsx("div",{className:"text-[11px] text-neutral-400",children:a.note})]}),i.jsx("input",{type:"number",step:"0.1",className:"num w-[72px] rounded-sm border border-neutral-200 px-1 py-0.5 text-right text-[12px]",value:a.score,onChange:d=>{var N;if(a.itemKey==="conduct"||a.itemKey==="integrity")G({...x,[a.itemKey]:Number(d.target.value)});else{const K={...x.itemOverrides??{},[a.itemKey]:{...((N=x.itemOverrides)==null?void 0:N[a.itemKey])??{},score:Number(d.target.value)}};G({...x,itemOverrides:K})}}})]},a.itemKey)),!n.items.length&&i.jsx("div",{className:"text-[12px] text-neutral-400",children:"暂无数据"})]})]},n.key)),g.length>0&&i.jsxs("div",{className:"mt-6 border-t border-neutral-300 pt-4",children:[i.jsx("div",{className:"mb-3 text-[13.5px] font-bold text-neutral-900",children:"附:证明材料"}),g.map(n=>i.jsxs("div",{className:"mb-4",children:[i.jsx("div",{className:"text-[12px] font-semibold text-neutral-800",children:n.title}),i.jsx("div",{className:"mt-1.5 flex flex-wrap gap-3",children:n.images.map((a,d)=>i.jsx("img",{src:a,alt:"证明 "+(d+1),className:"max-h-[180px] rounded border border-neutral-200"},d))})]},n.recordId))]}),i.jsx("div",{className:"mt-6 border-t border-neutral-200 pt-3 text-[11px] leading-relaxed text-neutral-400",children:"计分依据:《计算机与网络安全学院学生综合素质测评评分细则》。自动匹配条目均可手动修正分值; 「恢复自动」清除本学年全部手动修正。导出材料前请核对每条加分记录与证明材料一致。"})]})]})}export{Ce as AssessmentPage};