14 lines
17 KiB
JavaScript
14 lines
17 KiB
JavaScript
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,"&").replace(/</g,"<").replace(/>/g,">")}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};
|