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