| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669 |
- <template>
- <!-- 学生报告 -->
- <BookFlip v-loading="loading" element-loading-spinner="el-icon-loading" element-loading-background="rgba(255, 255, 255, 0.5)" :element-loading-text="loadingText" :book-pages="bookPageImages" bookBg="student" :requestLoading="loading" :openLoading="openLoading" :coverTitle="`${stuClasName}${studentName}分析报告册`" subtitle="供参考学生使用" ref="bookFlipBox" @OpenBookImages="OpenBookImages" @PdfLoadEnd="PdfLoadEnd">
- <!-- 自定义每页内容 -->
- <template #default="slotProps">
- <template v-if="slotProps.type == 'web_mode'">
- <div class="area_page" style="position: absolute;top: -9999999px;z-index: -10;height: auto;min-height: 1285px;">
- <!-- 用于获取div的高度 默认隐藏不显示 -->
- <div class="area_title" ref="areaReportTitle">
- <p>{{ reportTitle }}</p>
- <p>{{ stuClasName }}{{ studentName }}分析报告</p>
- </div>
- <div class="area_module" ref="standardScoreChartDes">
- <div class="area_module_describe" v-if="multiSubjectData.maxSubject || multiSubjectData.minSubject" style="margin-top: 0;">
- 说明:从标准分情况来看,这次考试<template v-if="multiSubjectData.maxSubject"><span style="color: #3ba272">{{ multiSubjectData.maxSubject }}</span>表现突出,请继续保持</template><template v-if="multiSubjectData.minSubject">;<span style="color: #ee6666">{{ multiSubjectData.minSubject }}</span>标准分明显低于其他学科,可能会对总体排名造成影响,可结合错题梳理核心知识点,精准定位薄弱环节,制定针对性的提升计划,以实现各科均衡发展,进一步巩固整体成绩</template>。
- </div>
- </div>
- <div class="area_module" ref="multiSuggestionModule">
- <div class="area_module_title">总结建议</div>
- <div class="area_module_describe" style="margin-top: 0;" v-html="suggestionHtml"></div>
- <div class="pring_jg"></div>
- </div>
- <template v-for="(subject,subKey) in multiSubjectData.singleSubject">
- <div class="area_module" :ref="`singleSubjectSuggestion_${subKey}`" v-if="singleSubjectData?.[subKey]?.suggestionHtml">
- <div class="area_module_title">总结建议</div>
- <div class="area_module_describe" style="margin-top: 0;" v-html="singleSubjectData?.[subKey]?.suggestionHtml"></div>
- <div class="pring_jg"></div>
- </div>
- </template>
- <!-- 知识点分层 -->
- <template v-for="know in knowLedgeLayeringData">
- <div class="area_module" :ref="`knowLedgeLayering_${know.subjectCode}`">
- <div class="area_module_title">{{know.groupName}}分层分析</div>
- <div class="area_module_table">
- <ul class="student_know_paper">
- <li>
- <div class="li_left">
- <span>满分区</span>
- <span>(得满分的知识点)</span>
- </div>
- <div class="li_know">{{ know.knowLedgeLayering.fullScore }}{{ know.knowLedgeLayering.fullScore ? '。':'' }}</div>
- </li>
- <li>
- <div class="li_left">
- <span>突破升级区</span>
- <span>(得分率高于同层次,但低于上一层次平均水平的知识点)</span>
- </div>
- <div class="li_know">{{ know.knowLedgeLayering.breakThrough }}{{ know.knowLedgeLayering.breakThrough ? '。':'' }}</div>
- </li>
- <li>
- <div class="li_left">
- <span>就近发展区</span>
- <span>(得分率低于同层次平均水平的知识点)</span>
- </div>
- <div class="li_know">{{ know.knowLedgeLayering.develop }}{{ know.knowLedgeLayering.develop ? '。':'' }}</div>
- </li>
- </ul>
- </div>
- <div class="pring_jg"></div>
- </div>
- </template>
- </div>
- <div class="area_page web_area_page" v-for="page in pageCount" :key="`${pageKey}_${page}`">
- <template v-if="page == 1">
- <div class="area_title">
- <p>{{ reportTitle }}</p>
- <p>{{ stuClasName }}{{ studentName }}分析报告</p>
- </div>
- <div class="area_header bg_purple">
- <img :src="headerLeftIcon" class="header_icon_left" />
- 总分成绩分析
- <img :src="headerRightIcon" class="header_icon_right" />
- </div>
- <div class="pring_jg"></div>
- </template>
- <template v-for="(tableData,index) in multiSubjectData.tableList">
- <template v-for="(itemTable,itemIndex) in tableData">
- <div class="area_module" v-if="multiSubjectData.tablePagesNum[index][itemIndex] == page && itemTable.length > 0">
- <div class="area_module_title">成绩单</div>
- <div class="area_module_table">
- <el-table border :data="itemTable" stripe align="center">
- <el-table-column v-for="header in (multiSubjectData?.staticHeaderData ?? [])" align="center" :label="header.name" min-width="100" show-overflow-tooltip>
- <template slot-scope="scope">
- {{ scope.row?.[header.prop] || '-' }}
- </template>
- </el-table-column>
- <el-table-column v-for="header in (multiSubjectData?.headerList?.[index]?.[itemIndex] ?? [])" align="center" :label="header.name" min-width="100" show-overflow-tooltip>
- <template slot-scope="scope">
- <template v-if="header.prop == 'score'">
- <!-- * 1-得分显示分数,小题分显示分数,2-得分显示分数,小题分显示对错
- * 3-得分显示对错,小题分显示分数,4-得分显示对错,小题分显示对错
- * 5-得分显示等级,小题分显示分数,6-得分显示等级,小题分显示对错 -->
- <template v-if="multiSubjectData.studentOpenness == 3 || multiSubjectData.studentOpenness == 4">
- <template v-if="!isNaN(scope.row?.[header.prop])">
- <img class="right_or_wrong_icon" v-if="scope.row.fullScore == scope.row?.[header.prop]" src="@/assets/report/score_yes_icon.webp" />
- <img class="right_or_wrong_icon" v-else-if="scope.row?.[header.prop] == 0" src="@/assets/report/score_no_icon.webp" />
- <img class="right_or_wrong_icon" v-else src="@/assets/report/score_dimidiate_icon.webp" />
- </template>
- <template v-else>{{ scope.row?.[header.prop] ?? '-' }}</template>
- </template>
- <template v-else>{{ scope.row?.[header.prop] ?? '-' }}</template>
- </template>
- <template v-else-if="header.prop == 'groupClassRanks' || header.prop == 'groupClassMaxScoreList' || header.prop == 'groupClassAvgScoreList'">{{ GetGroupClassValue(scope.row?.[header.prop],header.prop,header.code)}}</template>
- <template v-else>{{ scope.row?.[header.prop] ?? '-' }}</template>
- </template>
- </el-table-column>
- </el-table>
- </div>
- </div>
- <template v-if="multiSubjectData.tablePagesNum[index][itemIndex] == page && itemTable.length > 0">
- <div class="pring_jg" style="height: 29px;border-bottom: 1px solid #F3F3F3;box-sizing: border-box;"></div>
- <div class="pring_jg"></div>
- </template>
- </template>
- </template>
- <div class="area_module" v-if="multiSubjectData.chartPagesNum==page && ((multiSubjectData.standardScoreAnalysisStatus === 0 && schoolType == 2) || schoolType == 1) && multiSubjectData.datay.length>0">
- <div class="area_module_title">标准分分析图</div>
- <div class="area_module_chart">
- <DifferenceChart v-if="multiSubjectData.datay.length" :datax="multiSubjectData.datax" unit="" :datay="multiSubjectData.datay" :isClick="false" :rate="0" :gridLeft="0" :gridRight="0" :gridTop="20" :fontSize="14" :fontColor="'#333333'" :showDataZoom="false" style="height: 270px !important;min-height: 270px !important;"></DifferenceChart>
- </div>
- <div class="area_module_describe" v-if="multiSubjectData.maxSubject || multiSubjectData.minSubject">
- 说明:从标准分情况来看,这次考试<template v-if="multiSubjectData.maxSubject"><span style="color: #3ba272">{{ multiSubjectData.maxSubject }}</span>表现突出,请继续保持</template><template v-if="multiSubjectData.minSubject">;<span style="color: #ee6666">{{ multiSubjectData.minSubject }}</span>标准分明显低于其他学科,可能会对总体排名造成影响,可结合错题梳理核心知识点,精准定位薄弱环节,制定针对性的提升计划,以实现各科均衡发展,进一步巩固整体成绩</template>。
- </div>
- <div class="pring_jg"></div>
- </div>
- <div class="area_module" v-if="historyExamData.pageNum==page && historyExamData.chartData.length > 0 && multiSubjectData.showHistory==1">
- <div class="area_module_title">历次标准分追踪分析图</div>
- <div class="area_module_chart">
- <LineChart v-if="historyExamData.datay.length>0" :datax="historyExamData.datax" :datay="historyExamData.datay" :title="historyExamData.title"
- :extraText="false" :showBackground="false" :isShowLabel="true" labelColor="#333333" :legendList="historyExamData.legendList" :tooltipData="historyExamData.tooltipData" :gridLeft="0" :gridRight="0" :gridTop="25" :fontSize="14" :fontColor="'#333333'" :showCheckBox="false" reportHeight="270px" style="min-height:270px!important;">
- </LineChart>
- </div>
- <div class="pring_jg"></div>
- </div>
- <div class="area_module" v-if="suggestionHtml && multiSuggestionPageNum == page">
- <div class="area_module_title">总结建议</div>
- <div class="area_module_describe" style="margin-top: 0;" v-html="suggestionHtml"></div>
- <div class="pring_jg"></div>
- </div>
- <!-- 单科 -->
- <template v-for="(subject,subKey) in multiSubjectData.singleSubject">
- <template v-if="singleSubjectData?.[subKey]?.titlePageNum == page">
- <div class="area_header bg_purple">
- <img :src="headerLeftIcon" class="header_icon_left" />
- {{subject.subjectName}}成绩分析
- <img :src="headerRightIcon" class="header_icon_right" />
- </div>
- <div class="pring_jg"></div>
- </template>
- <!-- 成绩单 -->
- <template v-for="(tableData,index) in (singleSubjectData?.[subKey]?.scrolTableList || [])">
- <template v-for="(itemTable,itemIndex) in tableData">
- <div class="area_module" v-if="singleSubjectData?.[subKey]?.scrolTablePagesNum?.[index]?.[itemIndex] == page && itemTable.length > 0">
- <div class="area_module_title">成绩单</div>
- <div class="area_module_table">
- <el-table border :data="itemTable" stripe align="center">
- <el-table-column v-for="header in (singleSubjectData?.[subKey]?.scrolHeaderList?.[index]?.[itemIndex] ?? [])" align="center" :label="header.name" min-width="100" show-overflow-tooltip>
- <template slot-scope="scope">
- <template v-if="header.prop=='score'">
- <!-- * 1-得分显示分数,小题分显示分数,2-得分显示分数,小题分显示对错
- * 3-得分显示对错,小题分显示分数,4-得分显示对错,小题分显示对错
- * 5-得分显示等级,小题分显示分数,6-得分显示等级,小题分显示对错 -->
- <template v-if="(scope.row.studentOpenness == 3 || scope.row.studentOpenness == 4) && scope.row?.score">
- <template v-if="!isNaN(scope?.row?.score)">
- <img class="right_or_wrong_icon" v-if="scope.row.fullScore == scope.row.score" src="@/assets/report/score_yes_icon.webp" />
- <img class="right_or_wrong_icon" v-else-if="scope.row.score === 0" src="@/assets/report/score_no_icon.webp" />
- <img class="right_or_wrong_icon" v-else src="@/assets/report/score_dimidiate_icon.webp" />
- </template>
- <template v-else>{{ scope.row.score }}</template>
- </template>
- <template v-else>{{ scope?.row?.[header.prop] ?? '-' }}</template>
- </template>
- <template v-else-if="header.prop == 'groupClassRanks' || header.prop == 'groupClassMaxScoreList' || header.prop == 'groupClassAvgScoreList'">{{ GetGroupClassValue(scope.row?.[header.prop],header.prop,header.code) }}</template>
- <template v-else>{{ scope?.row?.[header.prop] ?? '-' }}</template>
- </template>
- </el-table-column>
- </el-table>
- </div>
- </div>
- <template v-if="singleSubjectData?.[subKey]?.scrolTablePagesNum?.[index]?.[itemIndex] == page && itemTable.length > 0">
- <div class="pring_jg" style="height: 29px;border-bottom: 1px solid #F3F3F3;box-sizing: border-box;"></div>
- <div class="pring_jg"></div>
- </template>
- </template>
- </template>
- <!-- 小题分 大题 知识点 能力要素 自定义分组 -->
- <template v-for="group in (singleSubjectData?.[subKey]?.groupQuestionData || [])">
- <div class="area_module" v-if="group.chartPagesNum == page && group.datay.length > 0 && group.type!='smallQuestionData'">
- <div class="area_module_title">{{group.groupName}}分析图</div>
- <div class="area_module_chart" v-if="group.datay.length > 0">
- <BarChart v-if="group.type=='bigQuestionData'" :datax="group.datax" :datay="group.datay" unit="" typeName="" :showNuitY="false" :unit="'%'" :showTooltip="false" :isShowMarkLine="false" :gridLeft="0" :gridRight="0" :gridTop="20" :fontSize="14" :fontColor="'#333333'" :showDataZoom="false" style="height: 270px;"></BarChart>
- <RadarCharts v-else :showLegend="false" :reportHeight="`300px`" :showDataLabel="true" :showTooltip="false" :data="group.radarChartData" :unit="'%'" :legendList="[]" legendLeft="center" :showCheckBox="false" :openShowAllLegend="false" :showRadiusAxis="false" :fontSize="14" :fontColor="'#333333'" :style="{height: 'auto',minHeight:'100% !important'}"></RadarCharts>
- </div>
- <div class="pring_jg"></div>
- </div>
- <template v-for="(tableData,index) in group.tableList">
- <template v-for="(itemTable,itemIndex) in tableData">
- <div class="area_module" v-if="group.tablePagesNum[index][itemIndex] == page && itemTable.length > 0">
- <div class="area_module_title">{{group.groupName}}分析表</div>
- <div class="area_module_table">
- <el-table border :data="itemTable" stripe align="center">
- <el-table-column v-for="header in (group?.staticHeader ?? [])" align="center" :label="header.name" :min-width="header.prop=='smallQuestionNames'?120:90" show-overflow-tooltip>
- <template slot-scope="scope">
- {{ scope.row[header.prop] || '-' }}
- </template>
- </el-table-column>
- <el-table-column v-for="header in (group?.headerList?.[index]?.[itemIndex] ?? [])" align="center" :label="header.name" :min-width="header.prop=='smallQuestionNames'?120:90" show-overflow-tooltip>
- <template slot-scope="scope">
- <template v-if="header.prop == 'score'">
- <!-- * 1-得分显示分数,小题分显示分数,2-得分显示分数,小题分显示对错
- * 3-得分显示对错,小题分显示分数,4-得分显示对错,小题分显示对错
- * 5-得分显示等级,小题分显示分数,6-得分显示等级,小题分显示对错 -->
- <template v-if="group.studentOpenness == 2 || group.studentOpenness == 4 || group.studentOpenness == 6">
- <template v-if="!isNaN(scope?.row?.score)">
- <img class="right_or_wrong_icon" v-if="scope.row.fullScore == scope.row.score" src="@/assets/report/score_yes_icon.webp" />
- <img class="right_or_wrong_icon" v-else-if="scope.row.score == 0" src="@/assets/report/score_no_icon.webp" />
- <img class="right_or_wrong_icon" v-else src="@/assets/report/score_dimidiate_icon.webp" />
- </template>
- <template v-else>{{ scope?.row?.score ?? '-' }}</template>
- </template>
- <template v-else>{{ scope.row.score || '-' }}</template>
- </template>
- <!-- 包含小题 -->
- <template v-else-if="header.prop == 'smallQuestionNames' && scope?.row?.[header.prop] && Object.prototype.toString.call(scope.row[header.prop]) == '[object Array]'">
- {{ scope.row[header.prop].join('、') }}
- </template>
- <template v-else-if="header.prop=='scoreRateStr'">
- <template v-if="scope?.row?.scoreRate && !isNaN(scope?.row?.scoreRate)">
- <span style="color:#EE6666;" v-if="Number(scope?.row?.scoreRate) < 60">{{ scope?.row?.[header.prop] }}</span>
- <span style="color:#FAC858;" v-else-if="Number(scope?.row?.scoreRate) >= 60 && Number(scope?.row?.scoreRate) < 80">{{ scope?.row?.[header.prop] }}</span>
- <span style="color:#3BA272;" v-else-if="Number(scope?.row?.scoreRate) >= 80 && Number(scope?.row?.scoreRate) <= 100">{{ scope?.row?.[header.prop] }}</span>
- <span v-else>{{ scope?.row?.[header.prop] ?? '-'}}</span>
- </template>
- <template v-else>{{ scope?.row?.[header.prop] ?? '-'}}</template>
- </template>
- <template v-else-if="header.prop == 'difficultyName'">
- <span :class="GetDifficultyClass(scope.row[header.prop])"></span>
- <span>{{ GetDifficultyName(scope.row[header.prop]) }}</span>
- </template>
- <template v-else-if="header.prop == 'classGroupAvgScoreMap' || header.prop == 'classGroupScoreRateMap'">{{ scope.row?.[header.prop]?.[header.code] || '-' }}{{ scope.row?.[header.prop]?.[header.code]&&header.prop=='classGroupScoreRateMap'?'%':''}}</template>
- <template v-else>{{ scope.row[header.prop] || '-' }}</template>
- </template>
- </el-table-column>
- </el-table>
- </div>
- </div>
- <template v-if="group.tablePagesNum[index][itemIndex] == page && itemTable.length > 0">
- <div class="pring_jg" style="height: 29px;border-bottom: 1px solid #F3F3F3;box-sizing: border-box;"></div>
- <div class="pring_jg"></div>
- </template>
- </template>
- </template>
- <div class="area_module" v-if="group.type=='knowledgePointQuestionData' && group?.knowLedgeLayering && page == knowLedgeLayeringPageNum[subKey]">
- <div class="area_module_title">{{group.groupName}}分层分析</div>
- <div class="area_module_table">
- <ul class="student_know_paper">
- <li>
- <div class="li_left">
- <span>满分区</span>
- <span>(得满分的知识点)</span>
- </div>
- <div class="li_know">{{ group.knowLedgeLayering.fullScore }}{{ group.knowLedgeLayering.fullScore ? '。':'' }}</div>
- </li>
- <li>
- <div class="li_left">
- <span>突破升级区</span>
- <span>(得分率高于同层次,但低于上一层次平均水平的知识点)</span>
- </div>
- <div class="li_know">{{ group.knowLedgeLayering.breakThrough }}{{ group.knowLedgeLayering.breakThrough ? '。':'' }}</div>
- </li>
- <li>
- <div class="li_left">
- <span>就近发展区</span>
- <span>(得分率低于同层次平均水平的知识点)</span>
- </div>
- <div class="li_know">{{ group.knowLedgeLayering.develop }}{{ group.knowLedgeLayering.develop ? '。':'' }}</div>
- </li>
- </ul>
- </div>
- <div class="pring_jg"></div>
- </div>
- </template>
- <!-- 历次 -->
- <div class="area_module" v-if="singleSubjectData?.[subKey]?.historyExamData?.pageNum==page && singleSubjectData[subKey].historyExamData.chartData.length > 0 && singleSubjectData[subKey]?.showHistory==1">
- <div class="area_module_title">历次标准分追踪分析图</div>
- <div class="area_module_chart">
- <LineChart v-if="singleSubjectData?.[subKey]?.historyExamData?.datay.length>0" :datax="singleSubjectData[subKey].historyExamData.datax" :datay="singleSubjectData[subKey].historyExamData.datay" :title="singleSubjectData[subKey].historyExamData.title"
- :extraText="false" :showBackground="false" :isShowLabel="true" labelColor="#333333" :legendList="singleSubjectData[subKey].historyExamData.legendList" :tooltipData="singleSubjectData[subKey].historyExamData.tooltipData" :gridLeft="0" :gridRight="0" :gridTop="25" :fontSize="14" :fontColor="'#333333'" :showCheckBox="false" reportHeight="270px" style="min-height:270px!important;">
- </LineChart>
- </div>
- <div class="pring_jg"></div>
- </div>
- <div class="area_module" v-if="singleSubjectData?.[subKey]?.suggestionHtml && singleSubjectData?.[subKey]?.suggestionPageNum == page">
- <div class="area_module_title">总结建议</div>
- <div class="area_module_describe" style="margin-top: 0;" v-html="singleSubjectData?.[subKey]?.suggestionHtml"></div>
- <div class="pring_jg"></div>
- </div>
- <!-- 答题卡 -->
- <template v-for="(paperItem,paperIndex) in (singleSubjectData?.[subKey]?.paperImageList || [])">
- <div class="area_module area_module_img" v-if="singleSubjectData?.[subKey]?.paperImagePageNum?.[paperIndex] == page">
- <PaperImage v-if="paperItem.picUrl" :paperImgUrl="paperItem.picUrl" :usedCardType="singleSubjectData?.[subKey]?.usedCardType" :drawData="paperItem.questionVOS || []" :isDrag="false" :isWheel="false" :isShowContextMenu="false" rotateDeg="-90"></PaperImage>
- </div>
- </template>
- </template>
- <div class="area_page_number">第 {{ page }} 页</div>
- </div>
- </template>
- <template v-else>
- <!-- 生成翻书效果 -->
- <div class="gradient"></div>
- <img :src="slotProps.content" style="width: 100%;height: 100%;" />
- </template>
- </template>
- </BookFlip>
- </template>
- <script>
- import BookFlip from './components/bookFlip.vue';
- import BarChart from "@/views/analysisReport/components/dCharts/barChart"; //单柱状图组件
- import RadarCharts from "@/views/analysisReport/components/dCharts/radarCharts";//G10-G1雷达图
- import DifferenceChart from "@/views/analysisReport/components/dCharts/differenceChart"; //率差图
- import LineChart from "@/views/analysisReport/components/dCharts/lineChart";//折线图
- import PaperImage from '@/components/PaperImage.vue';//答题卡
- import { mapGetters } from "vuex";
- import {getApiName} from '@/utils/common';
- // import { jsPDF } from "jspdf";
- import html2canvas from "html2canvas";
- export default {
- components: { BookFlip, BarChart, RadarCharts, DifferenceChart, LineChart,PaperImage},
- data() {
- return {
- pageKey:1,
- headerLeftIcon: require("@/assets/report/header_left_student.webp"),
- headerRightIcon: require("@/assets/report/header_right_student.webp"),
- // 书页数据(长度为4,偶数页)
- colors: this.$global.getScorePerformanceAnalysis(),//按顺序显示的20个颜色值
- pageCount:15,//页数 第一页不处理
- printPageHeight:1245,//A4纸高度 去掉边距 40
- chartHeight:270,//echart 高度
- moduleHeightData:[],//每个模块的高度
- modulePageData:[],//每个模块对应的页码
- stuClasName:'',
- multiSubjectData: {
- tablePagesNum:[],
- tableList:[],
- headerList:[],
- staticHeaderData:[],
- singleSubject:[],
- standardScoreAnalysisStatus: 0,
- studentOpenness: '', //学生信息
- datax: [], //图数据
- datay: [], //图数据
- tooltipData: [],
- maxSubject: '',
- minSubject: '',
- showHistory:0
- },//总分成绩分析
- historyExamData: {
- pageNum:'',
- chartData: [],
- datax: [],
- datay: [],
- title: [],
- legendList: [],
- tooltipData:[]
- }, //总分历次信息(联考)
- suggestionHtml: null,//总结建议
- multiSuggestionPageNum:'',//总分 总结建议
- singleSubjectData:[],//单科数据
- knowLedgeLayeringData:[],//知识点分层
- knowLedgeLayeringPageNum:[],//知识点分层分页
- bookPageImages:[],//生成的图片地址
- // showReportLoading:false,
- targetProgress:0,
- timer:null,
- loading:true,
- loadingText:'拼命加载中(1%)……',
- openLoading:false,
- };
- },
- computed: {
- reportTitle() {
- return this?.$store?.state?.report?.examSelectItem?.examName ?? '';
- },
- reportParam() {
- return {
- examLevel: this.$store.state.report.examLevel, // 任务等级联考还是单校
- // schoolId: this.$store.state.report.studentReportFilterObject.schoolId, // 学校id
- // contrastExamIds: this.$store.state.report.lastExamSelectIds, //多次考试任务对比ID,不包含当前任务ID
- // examId: this.$store.state.report.examId, // 当前考试ID
- // subjectCode: this.$store.state.report.studentReportFilterObject.subjectCode, //科目code
- // subjectGroupType: this.$store.state.report.filterObject.subjectGroupType, // 科目是否为组合
- // isTotal: this.$store.state.report.filterObject.isTotal, //是否为总分科目 1为总分 0为非总分
- // classIdCode: this.$store.state.report.studentReportFilterObject.classIdCode, // 班级idcode
- // classGroupName: this.$store.state.report.studentReportFilterObject.classGroupName, // 班级名称
- // registrationName: this.$store.state.report.studentReportFilterObject.registrationName, // 学籍名称
- // studentName:this.$store.state.report.studentReportFilterObject.studentName, //学生名称
- // registrationCode:this.$store.state.report.studentReportFilterObject.registrationCode //学生学籍号
- examLevel: this.$store.state.report.filterObject.examLevel, //1-联考 2-单校
- contrastExamIds: this.$store.state.report.filterObject.contrastExamIds, //多次考试任务对比ID,不包含当前任务ID
- examId: this.$store.state.report.filterObject.examId, //考试id
- subjectCode: 0, //this.$store.state.report.filterObject.subjectCode 科目code
- subjectGroupType: this.$store.state.report.filterObject.subjectGroupType, //是否为组合科目 1为组合科目 0为非组合科目
- isTotal: this.$store.state.report.filterObject.isTotal //是否为总分科目 1为总分 0为非总分
- }
- },//分析报告公共参数变量
- ...mapGetters(["userInfo"]),
- studentName() {
- return this.userInfo.userName;
- },
- schoolType() {
- return sessionStorage.getItem('schoolType') //1:单校 2:联校
- },
- },
- watch: {
- // 监听 filterObject 对象变化(注意要开启深度监听)
- async reportParam() {
- // clearTimeout(this.timer); // 清除定时器,停止重复执行
- // this.timer = null;
- this.PageInit();//初始加载数据
- },//监听筛选数据变化
- },
- async created() {
- this.setHtmlFontSize();
- // 监听窗口缩放,实时更新
- window.addEventListener('resize', this.setHtmlFontSize);
- // 可选:监听页面加载完成后再设置一次(避免初始渲染问题)
- window.addEventListener('load', this.setHtmlFontSize);
- this.PageInit();//页面初始加载数据
- },
- destroyed(){
- // 根组件卸载时销毁监听
- window.removeEventListener('resize', this.setHtmlFontSize);
- document.documentElement.style.fontSize = '';
- },
- methods: {
- //初始化设置
- setHtmlFontSize(){
- // 设计稿宽度(根据实际设计稿调整,例如 1920px)
- const designWidth = 1920;
- // 设计稿中 1rem 对应的 px 值(例如 16px)
- const baseFontSize = 16;
- // 获取当前浏览器窗口宽度
- const windowWidth = document.documentElement.clientWidth || window.innerWidth;
- // 计算当前窗口下的 html font-size(按设计稿比例缩放)
- const htmlFontSize = (windowWidth / designWidth) * baseFontSize;
- // 应用到 html 元素
- document.documentElement.style.fontSize = `${htmlFontSize}px`;
- },
- async PageInit() {
- // let currentProgress = 1;
- // this.loadingText = `拼命加载中(1%)……`;
- // this.timer = setInterval(() => {
- // currentProgress++;
- // this.loadingText = `拼命加载中(${currentProgress}%)……`;
- // }, 500);
- this.loading = true;
- this.openLoading = false;
- this.bookPageImages = [];
- // this.targetProgress = 1;
- // this.showReportLoading = true;
- this.pageCount = 15;
- this.$nextTick(()=>{
- const titleHeight = this.$refs?.areaReportTitle?.offsetHeight || 0;
- const reportTitleHeight = titleHeight + 82;
- this.moduleHeightData = [reportTitleHeight];//每个模块的高度 初始标题高度
- })
- this.modulePageData = [1];
- this.multiSuggestionPageNum = '';//总分 总结建议
- this.singleSubjectData = [];//单科数据
- this.knowLedgeLayeringData = [];//知识点分层
- this.knowLedgeLayeringPageNum = [];//知识点分层分页
- this.pageKey += 1;
- //多科成绩总览 科目标准分分析
- await this.QueryMultiSubjectData();
- //学生端查询总分,多科历次信息(联考)
- await this.QueryHistoryExamData();
- // 学生端查询总分,多科总结建议信息(联考)
- await this.QuerySuggestionData();
- let index = 0;
- for (const element of this.multiSubjectData.singleSubject){
- //单科每个模块标题分页
- this.singleSubjectData.push({
- titlePageNum:this.SingleChartPage(82),
- scrolTablePagesNum:[],//成绩单
- scrolTableList:[],
- scrolHeaderList:[],
- groupQuestionData:[],//小题分组、大题分组、知识点、自定义分组
- historyExamData:{
- pageNum:'',
- chartData: [],
- datax: [],
- datay: [],
- title: [],
- legendList: [],
- tooltipData:[]
- },
- suggestionPageNum:'',//总结建议分页
- suggestionHtml: '',//总结建议
- paperImageList:[],//答题卡
- paperImagePageNum:[],//答题卡页码
- showHistory:0
- })
- await this.QueryOneSubjectData(element.subjectCode,index);
- await this.QueryOneSubjectSmallQuestionData(element.subjectCode,index);
- await this.QueryOneSubjectGroupQuestionData(element.subjectCode,index);
- await this.QueryOneSubjectCustomGroupQuestion(element.subjectCode,index);
- //学生端查询单科-历次查询(联考)
- await this.QueryOneSubjectHistoryExamData(element.subjectCode,index);
- await this.QueryOneSubjectSuggestionData(element.subjectCode,index);
- await this.FindStudentCard(element.subjectCode,index);
- index++; // 每次循环后索引+1
- }
- this.pageCount = this.modulePageData.length > 0 ? Math.max(...this.modulePageData) : 1;
- this.loading = false;
- this.$emit('isPdfDataLoadEnd');//是否显示下载pdf按钮
- console.log(this.pageCount,this.modulePageData,this.moduleHeightData,777777)
- // this.$nextTick(()=>{
- // setTimeout(()=>{
- // // clearTimeout(this.timer); // 清除定时器,停止重复执行
- // // this.GetPageImages(currentProgress);
- // this.GetPageImages();
- // },2000)
- // })
- },
- //下载预览图片
- OpenBookImages(){
- if(this.bookPageImages.length){
- this.$refs.bookFlipBox.showFullScreen()
- }else{
- this.openLoading = true;
- this.$nextTick(()=>{
- setTimeout(()=>{
- this.GetPageImages();
- },2000)
- })
- }
- },
- //获取图片
- async GetPageImages(){
- //获取所有的area_page 元素
- const elements = document.querySelectorAll(".web_mode .web_area_page");
- // const stepLens = elements?.length || 1;
- // const remainingProgress = 100 - progress;//剩余进度
- // const perStepProgress = Math.floor(remainingProgress / stepLens) || 1; // 每次增加的进度 向下取整
- // const pdf = new jsPDF("p", "pt", "a4"); // 'p'表示纵向,'a4'表示A4纸张尺寸
- // const pdfWidth = pdf.internal.pageSize.getWidth(); //获取pdf的宽度
- // const pdfHeight = pdf.internal.pageSize.getHeight(); //获取pdf的高度
- // let yPos = 0; //当前图像在pdf页面上的垂直位置的变量
- let i = 1;
- // let currentProgress = progress;
- for (const element of elements) {
- await html2canvas(element, {
- scale: 2, // 增加缩放比例
- useCORS: true, // 允许跨域
- logging: false, // 是否打印调试日志(开发时开启,生产关闭)
- letterRendering: true, // 文字抗锯齿 启用字母渲染
- }).then(async (canvas) => {
- // const imgData = canvas.toDataURL("image/png");
- const blob = await new Promise((resolve) => canvas.toBlob(resolve, "image/png"));
- const imgUrl = URL.createObjectURL(blob);
- console.log(imgUrl,89999)
- this.bookPageImages.push(imgUrl);
- // currentProgress = Math.min(Math.round((i / stepLens) * 100),100);
- // currentProgress = Math.min(progress + i * perStepProgress,100);
- // this.targetProgress = currentProgress
- // this.loadingText = `拼命加载中(${currentProgress}%)……`;
- // const imgProps = pdf.getImageProperties(imgData); // 获取图像的属性,包括宽度和高度
- // const imgWidth = imgProps.width;
- // const imgHeight = imgProps.height;
- // const ratio = Math.min(pdfWidth / imgWidth, pdfHeight / imgHeight); //计算图片的缩放比例
- // const adjustWidth = imgWidth * ratio;
- // const adjustHeight = imgHeight * ratio;
- // // 在添加每个图像之前,检查当前页面的高度是否足够。如果不够,则添加新页面,并将 yPos 重置为 0
- // if (yPos + adjustHeight > pdfHeight) {
- // pdf.addPage();
- // yPos = 0;
- // }
- // // 将图像添加到pdf中
- // pdf.addImage(imgData, "PNG", 0, yPos, adjustWidth, adjustHeight);
- // yPos += adjustHeight;
- // // 如果添加图像后剩余空间不足一页,则添加新页面
- // if (yPos > pdfHeight) {
- // pdf.addPage();
- // yPos = 0;
- // }
- i++;
- })
- }
- // if(currentProgress < 100){
- // this.loadingText = `拼命加载中(100%)……`;
- // }
- // 保存pdf文件
- // pdf.save("联校报告册.pdf");
- // this.showReportLoading = false;
- setTimeout(()=>{
- // this.loading = false;
- this.openLoading = false;
- this.$refs.bookFlipBox.showFullScreen()
- },500)
- },
- //总分成绩分析
- async QueryMultiSubjectData() {
- await this.$api.reportStudent[getApiName()].queryMultiSubjectData({
- ...this.reportParam,
- subjectGroupType: 1, // 科目是否为组合
- isTotal: 1, //是否为总分科目 1为总分 0为非总分
- }).then(res => {
- if (res.code == 200 && res.data) {
- const titleData = res?.data?.titleData || [];
- this.multiSubjectData.studentOpenness = res?.data?.studentOpenness ?? '';
- this.multiSubjectData.showHistory = res?.data?.showHistory || 0;
- const headerData = titleData.filter(item=>item.prop!='imgUrlList' && item.prop!='subjectName');
- const staticHeaderData = titleData.filter(item=>item.prop=='subjectName');
- const tableData = res?.data?.tableData || [];
- this.stuClasName = tableData?.find(item=>item.subjectCode==0)?.className || '';
- //表格分页
- const pageTableData = this.TableRowAndColumnPage(headerData,tableData,7,1);//8列一个表
- this.multiSubjectData.tablePagesNum = pageTableData.tablePagesNum;
- this.multiSubjectData.tableList = pageTableData.tableList;
- this.multiSubjectData.headerList = pageTableData.headerList;
- this.multiSubjectData.staticHeaderData = staticHeaderData;//静态表头
- //标准分分析图
- this.multiSubjectData.datax = []
- this.multiSubjectData.datay = []
- this.multiSubjectData.tooltipData = []
- this.multiSubjectData.standardScoreAnalysisStatus = res?.data?.standardScoreAnalysisStatus ?? 1;
- //总分
- const totalScore = tableData.filter(item => item.isTotal == 1)
- //组合
- const subjectGroup = tableData.filter(
- item => item.isTotal == 0 && item.subjectGroupType == 1
- )
- //单科
- const singleSubject = tableData.filter(
- item => item.isTotal == 0 && item.subjectGroupType == 0
- )
- this.multiSubjectData.singleSubject = singleSubject;//单科
- const chartData = [...totalScore, ...subjectGroup, ...singleSubject];
- let datax = [],datay = [];
- chartData.forEach(item => {
- this.multiSubjectData.datax.push(item?.subjectName ?? '-')
- this.multiSubjectData.datay.push(!item?.standardScore || item?.standardScore == '-' ? 0 : item?.standardScore)
- if (item.isTotal == 0 && item.subjectGroupType == 0) {
- datax.push(item?.subjectName ?? '')
- datay.push(item?.standardScore ?? 0)
- }
- })
- let maxSubject = [],minSubject = []
- datay.forEach((item, k) => {
- if (Number(item) > 0) {
- maxSubject.push(datax[k])
- }
- if (Number(item) < 0) {
- minSubject.push(datax[k])
- }
- })
- this.multiSubjectData.maxSubject = maxSubject.join('、')
- this.multiSubjectData.minSubject = minSubject.join('、')
- //标准分分析图分页
- this.$nextTick(()=>{
- if((this.multiSubjectData.standardScoreAnalysisStatus === 0 && this.schoolType == 2) || this.schoolType == 1){
- const desHeight = this.$refs?.standardScoreChartDes?.offsetHeight || 0;
- const divHeight = 383 + desHeight;
- this.multiSubjectData.chartPagesNum = this.SingleChartPage(this.multiSubjectData.datay.length > 0 ? divHeight : 0);
- }else{
- this.multiSubjectData.chartPagesNum = this.SingleChartPage(0);
- }
- // console.log(divHeight,desHeight,this.multiSubjectData.chartPagesNum,13322133)
- })
- } else {
- this.multiSubjectData.studentOpenness = '';
- this.multiSubjectData.showHistory = 0;
- this.multiSubjectData.tablePagesNum = [];
- this.multiSubjectData.tableList = [];
- this.multiSubjectData.headerList = [];
- this.multiSubjectData.singleSubject = [];
- // 标准分分析
- this.multiSubjectData.datax = []
- this.multiSubjectData.datay = []
- this.multiSubjectData.tooltipData = []
- this.multiSubjectData.standardScoreAnalysisStatus = 1;
- this.multiSubjectData.maxSubject = []
- this.multiSubjectData.minSubject = []
- this.multiSubjectData.chartPagesNum = '';//标准分分析图分页
- }
- })
- },
- //总分,多科历次信息
- async QueryHistoryExamData() {
- await this.$api.reportStudent[getApiName()].queryHistoryExamData({
- ...this.reportParam,
- subjectGroupType: 1, // 科目是否为组合
- isTotal: 1, //是否为总分科目 1为总分 0为非总分
- }).then(res => {
- if (res.code == 200 && res.data) {
- const detailData = (res.data?.detailData || []).reverse();
- this.historyExamData.chartData = detailData;
- const selectNames = res.data.selectNames || [];
- const selectVal = selectNames?.[0]?.prop ?? '';
- this.historyExamData.datax = [];
- let datay = [],tooltipData = [];
- detailData.forEach(item => {
- this.historyExamData.datax.push(item.examName)
- datay.push(item[selectVal])
- tooltipData.push({
- name: selectNames?.[0]?.name ?? '',
- value: item[selectVal]
- })
- })
- this.historyExamData.datay = [datay];
- this.historyExamData.tooltipData = [tooltipData];
- this.historyExamData.pageNum = this.SingleChartPage(this.historyExamData.chartData.length > 0 && this.multiSubjectData.showHistory==1 ? 363 : 0);
- } else {
- this.historyExamData.chartData = [];
- this.historyExamData.tooltipData = [];
- this.historyExamData.datax = [];
- this.historyExamData.datay = [];
- this.historyExamData.pageNum = '';
- }
- })
- },
- // 学生端查询总分,多科总结建议信息(联考)
- async QuerySuggestionData() {
- await this.$api.reportStudent[getApiName()].querySuggestionData({
- ...this.reportParam,
- subjectGroupType: 1, // 科目是否为组合
- isTotal: 1, //是否为总分科目 1为总分 0为非总分
- }).then(res => {
- if (res.code == 200 && res.data) {
- const data = res.data;
- const upSubjectList = data.upSubjectData || [];
- const downSubjectList = data.downSubjectData || [];
- const upSubjectData = upSubjectList.map(item => {
- if (data.studentOpenness == 1 || data.studentOpenness == 2) {
- return `${item.subjectName}(得分${item.score})`
- } else {
- return `${item.subjectName}(${item.score})`
- }}).join('、')
- const downSubjectData = downSubjectList.map(item => {
- if (data.studentOpenness == 1 || data.studentOpenness == 2) {
- return `${item.subjectName}(得分${item.score})`
- } else {
- return `${item.subjectName}(${item.score})`
- }}).join('、')
- if(data?.fullScore && data?.fullScore!='-'){
- const scoreText = data?.studentOpenness == 1 || data?.studentOpenness == 2 ? '总分' : '总分标准分为'
- const unit = data?.studentOpenness == 1 || data?.studentOpenness == 2 ? '分' : '';
- this.suggestionHtml = `${data?.studentName || ''}同学,本次考试${scoreText}<span style="color: #2e64fa">${data?.fullScore}</span>${unit},整体处于${data?.summarySuggestionLevel},`;
- if(upSubjectData){
- this.suggestionHtml += `<span style="color: #3ba272">${upSubjectData}</span>是你的优势学科,建议通过提分练习进行强化,继续保持这类学科的优势性${downSubjectData ? ';' : '。'}`;
- }
- if(downSubjectData){
- this.suggestionHtml += `<span style="color: #f56c6c">${downSubjectData}</span>是你的劣势学科,建议先加强学习,熟练掌握薄弱知识点的基础,然后通过提分练习进行巩固和强化,争取下次考试获得更优异的成绩!`;
- }
- }else{
- this.suggestionHtml = null
- }
- } else {
- this.suggestionHtml = null
- }
- this.$nextTick(()=>{
- const suggestionHeight = this.$refs?.multiSuggestionModule?.offsetHeight || 0;
- // console.log(suggestionHeight,99888)
- this.multiSuggestionPageNum = this.SingleChartPage(this.suggestionHtml?suggestionHeight:0);
- })
- })
- },
- //学生端查询单科-我的成绩
- async QueryOneSubjectData(subjectCode,index) {
- await this.$api.reportStudent[getApiName()].queryOneSubjectData({
- ...this.reportParam,
- subjectGroupType: 0, // 科目是否为组合
- isTotal: 0, //是否为总分科目 1为总分 0为非总分
- subjectCode:subjectCode
- }).then(res => {
- if (res.code == 200 && res.data) {
- const headData = [{
- name:'班级',
- prop:'className',
- display:true
- },{
- name:'原始分',
- prop:'score',
- display:res?.data?.scoreStatus === 0 //0-显示,1-不显示
- },{
- name:`赋分${res?.data?.schoolId=='620212977630539776'?'(标准分)':''}`,
- prop:'rateScore',
- display:res?.data?.rateScoreStatus === 0 //0-显示,1-不显示
- },{
- name:'班排',
- prop:'classRank',
- display:res?.data?.classRankStatus === 0
- },{
- name:'年排',
- prop:'schoolRank',
- display:res?.data?.schoolRankStatus === 0
- },{
- name:'联排',
- prop:'examRank',
- display:res?.data?.examRankStatus === 0 && this.reportParam.examLevel == 1 && this.schoolType == 2
- },{
- name:'区排',
- prop:'regionRank',
- display:res?.data?.regionRankStatus === 0
- },{
- name:'实考人数',
- prop:'examNum',
- display:res?.data?.examNumStatus === 0
- },{
- name:'赋分等级',
- prop:'rateScoreName',
- display:res?.data?.rateScoreNameStatus === 0
- },{
- name:'标准分',
- prop:'standardScore',
- display:(res?.data?.standardScoreStatus === 0 && this.schoolType == 2) || this.schoolType == 1
- },{
- name:'学业等级',
- prop:'gradeName',
- display:(res?.data?.gradeNameStatus === 0 && this.schoolType == 2) || this.schoolType == 1
- },{
- name:'得分率',
- prop:'scoreRate',
- display:res?.data?.scoreRateStatus === 0
- },{
- name:'班级最高分',
- prop:'classMaxScore',
- display:res?.data?.classMaxScoreStatus === 0 && this.schoolType == 2
- },{
- name:'年级最高分',
- prop:'gradeMaxScore',
- display:res?.data?.gradeMaxScoreStatus === 0 && this.schoolType == 2
- },{
- name:'联校最高分',
- prop:'examMaxScore',
- display:res?.data?.examMaxScoreStatus === 0 && this.reportParam.examLevel == 1 && this.schoolType == 2
- },{
- name:'班级均分',
- prop:'classAvgScore',
- display:res?.data?.classAvgScoreStatus === 0 && this.schoolType == 2
- },{
- name:'年级均分',
- prop:'gradeAvgScore',
- display:res?.data?.gradeAvgScoreStatus === 0 && this.schoolType == 2
- },{
- name:'联校均分',
- prop:'examAvgScore',
- display:res?.data?.examAvgScoreStatus === 0 && this.reportParam.examLevel == 1 && this.schoolType == 2
- }]
- const groupClassRanks = res.data.groupClassRanks || [];
- const groupClassMaxScoreList = res.data.groupClassMaxScoreList || [];
- const groupClassAvgScoreList = res.data.groupClassAvgScoreList || [];
- groupClassRanks.forEach(item=>{
- headData.push({
- name:`${item.classGroupName}排名`,
- prop:'groupClassRanks',
- code:item.classGroupCode,
- display:item.classGroupRankStatus === 1
- })
- })
- groupClassMaxScoreList.forEach(item=>{
- headData.push({
- name:`${item.classGroupName}最高分`,
- prop:'groupClassMaxScoreList',
- code:item.classGroupCode,
- display:item.classGroupResultScoreStatus === 1
- })
- })
- groupClassAvgScoreList.forEach(item=>{
- headData.push({
- name:`${item.classGroupName}均分`,
- prop:'groupClassAvgScoreList',
- code:item.classGroupCode,
- display:item.classGroupResultScoreStatus === 1
- })
- })
- const tableData = [res.data] || [];
- const headerList = headData.filter(item=>item.display);
- const pageTableData = this.TableRowAndColumnPage(headerList,tableData,8,1);//8列一个表
- this.singleSubjectData[index].scrolTablePagesNum = pageTableData.tablePagesNum;
- this.singleSubjectData[index].scrolTableList = pageTableData.tableList;
- this.singleSubjectData[index].scrolHeaderList = pageTableData.headerList;//表头
- this.singleSubjectData[index].showHistory = res?.data?.showHistory || 0;
- } else {
- this.singleSubjectData[index].scrolTablePagesNum = [];
- this.singleSubjectData[index].scrolTableList = [];
- this.singleSubjectData[index].scrolHeaderList = [];//表头
- this.singleSubjectData[index].showHistory = 0;
- }
- })
- },
- //学生端查询单科-小题分析(表格-图表)
- async QueryOneSubjectSmallQuestionData(subjectCode,index) {
- await this.$api.reportStudent[getApiName()].queryOneSubjectSmallQuestionData({
- ...this.reportParam,
- subjectGroupType: 0, // 科目是否为组合
- isTotal: 0, //是否为总分科目 1为总分 0为非总分
- subjectCode:subjectCode
- }).then(res => {
- if (res.code == 200 && res?.data?.tableData?.length > 0) {
- const tableData = res.data.tableData || [];
- const titleData = res.data.titleData || [];
- const studentOpenness = res.data?.studentOpenness ?? '';//控制得分显示对错或值
- this.TableChartData(tableData, titleData, studentOpenness, index,'smallQuestionData','小题',subjectCode);
- }
- })
- },
- //学生端查询单科-大题分析,知识点分析,能力要素分析(联考)
- async QueryOneSubjectGroupQuestionData(subjectCode,index) {
- await this.$api.reportStudent[getApiName()].queryOneSubjectGroupQuestionData({
- ...this.reportParam,
- subjectGroupType: 0, // 科目是否为组合
- isTotal: 0, //是否为总分科目 1为总分 0为非总分
- subjectCode:subjectCode
- }).then(async res => {
- if (res.code == 200 && res.data) {
- const { bigQuestion, knowledgePointQuestion, abilityQuestion } = res.data
- if (bigQuestion && bigQuestion?.tableData?.length > 0) {
- const tableData = bigQuestion.tableData || [];
- const titleData = bigQuestion.titleData || [];
- const studentOpenness = bigQuestion?.studentOpenness ?? '';
- this.TableChartData(tableData, titleData, studentOpenness, index,'bigQuestionData','大题',subjectCode);
- }
- if (knowledgePointQuestion && knowledgePointQuestion?.tableData?.length > 0) {
- const tableData = knowledgePointQuestion.tableData || [];
- const titleData = knowledgePointQuestion.titleData || [];
- const studentOpenness = knowledgePointQuestion?.studentOpenness ?? '';
- this.TableChartData(tableData, titleData, studentOpenness, index,'knowledgePointQuestionData','知识点',subjectCode);
- if(this.schoolType == 2){
- // 等待 DOM 更新完成后获取高度
- await this.$nextTick();
- await new Promise(resolve => setTimeout(resolve, 2000)); // 额外延迟确保浏览器挂载
- //处理知识点分层分页
- const refName = `knowLedgeLayering_${subjectCode}`;
- const domHeight = this.$refs[refName]?.[0]?.offsetHeight || 0;
- this.knowLedgeLayeringPageNum.push(this.SingleChartPage(domHeight));
- }
- }
- if (abilityQuestion && abilityQuestion?.tableData?.length > 0) {
- const tableData = abilityQuestion.tableData || [];
- const titleData = abilityQuestion.titleData || [];
- const studentOpenness = abilityQuestion?.studentOpenness ?? '';
- this.TableChartData(tableData, titleData, studentOpenness, index,'abilityQuestionData','能力要素',subjectCode);
- }
- }
- })
- },
- //学生端查询单科-自定义分组(联考)
- async QueryOneSubjectCustomGroupQuestion(subjectCode,index) {
- await this.$api.reportStudent[getApiName()].queryOneSubjectCustomGroupQuestion({
- ...this.reportParam,
- subjectGroupType: 0, // 科目是否为组合
- isTotal: 0, //是否为总分科目 1为总分 0为非总分
- subjectCode:subjectCode
- }).then(res => {
- if (res.code == 200 && res.data) {
- const customQuestionData = res?.data?.customQuestionData ?? []
- if (customQuestionData && customQuestionData.length > 0) {
- customQuestionData.forEach((item, key) => {
- const tableData = item?.questionData?.tableData || []
- const titleData = item?.questionData?.titleData || []
- const studentOpenness = res.data?.studentOpenness ?? ''
- this.TableChartData(tableData, titleData, studentOpenness, index,`customQuestionData${key}`,item.customName,subjectCode);
- })
- }
- }
- })
- },
- //学生端查询单科-历次查询(联考)
- async QueryOneSubjectHistoryExamData(subjectCode,index) {
- await this.$api.reportStudent[getApiName()].queryOneSubjectHistoryExamData({
- ...this.reportParam,
- subjectGroupType: 0, // 科目是否为组合
- isTotal: 0, //是否为总分科目 1为总分 0为非总分
- subjectCode:subjectCode
- }).then(res => {
- if (res.code == 200 && res.data) {
- const detailData = (res.data?.detailData || []).reverse();
- // console.log(this.singleSubjectData[index],98899)
- this.singleSubjectData[index].historyExamData.chartData = detailData;
- const selectNames = res.data.selectNames || [];
- const selectVal = selectNames?.[0]?.prop ?? '';
- this.singleSubjectData[index].datax = [];
- let datay = [],tooltipData = [];
- detailData.forEach(item => {
- this.singleSubjectData[index].historyExamData.datax.push(item.examName)
- datay.push(item[selectVal])
- tooltipData.push({
- name: selectNames?.[0]?.name ?? '',
- value: item[selectVal]
- })
- })
- this.singleSubjectData[index].historyExamData.datay = [datay];
- this.singleSubjectData[index].historyExamData.tooltipData = [tooltipData];
- this.singleSubjectData[index].historyExamData.pageNum = this.SingleChartPage(this.singleSubjectData[index].historyExamData.chartData.length > 0 && this.singleSubjectData[index]?.showHistory==1 ? 363 : 0);
- }
- })
- },
- //学生端查询单科-总结建议
- async QueryOneSubjectSuggestionData(subjectCode,index) {
- await this.$api.reportStudent[getApiName()].queryOneSubjectSuggestionData({
- ...this.reportParam,
- subjectGroupType: 0, // 科目是否为组合
- isTotal: 0, //是否为总分科目 1为总分 0为非总分
- subjectCode:subjectCode
- }).then(res => {
- if (res.code == 200 && res.data) {
- const data = res.data
- //* 1-得分显示分数,小题分显示分数,2-得分显示分数,小题分显示对错
- //* 3-得分显示对错,小题分显示分数,4-得分显示对错,小题分显示对错
- //* 5-得分显示等级,小题分显示分数,6-得分显示等级,小题分显示对错
- const upSubjectList = data?.upSubjectData || [];
- const downSubjectList = data?.downSubjectData || [];
- const upSubjectData = upSubjectList.map(item => {
- if (data.studentOpenness == 1 || data.studentOpenness == 2) {
- return `${item.subjectName}得分<span style="color: #3BA272;">${item.score}</span>分`
- } else {
- return `${item.subjectName}标准分为<span style="color: #3BA272;">${item.score}</span>`
- }
- }).join('、')
- const downSubjectData = downSubjectList.map(item => {
- if (data.studentOpenness == 1 || data.studentOpenness == 2) {
- return `${item.subjectName}得分<span style="color: #EE6666;">${item.score}</span>分`
- } else {
- return `${item.subjectName}标准分为<span style="color: #EE6666;">${item.score}</span>`
- }
- }).join('、')
- this.singleSubjectData[index].suggestionHtml = '';
- if (data.studentName && (upSubjectData || downSubjectData)) {
- this.singleSubjectData[index].suggestionHtml = `${data.studentName}同学,本次考试`
- }
- if (upSubjectData) {
- this.singleSubjectData[index].suggestionHtml += `${upSubjectData},是你的优势学科,建议通过提分练习进行强化,继续保持这类学科的优势性!`
- }
- if (downSubjectData) {
- this.singleSubjectData[index].suggestionHtml += `${downSubjectData},是你的劣势学科,建议先加强学习,熟练掌握薄弱知识点的基础,然后通过提分练习进行巩固和强化,争取下次考试获得更优异的成绩!`
- }
- this.$nextTick(()=>{
- const suggestionHeight = this.$refs?.[`singleSubjectSuggestion_${index}`]?.[0]?.offsetHeight || 0;
- // console.log(suggestionHeight,8999111)
- this.singleSubjectData[index].suggestionPageNum = this.SingleChartPage(this.singleSubjectData[index].suggestionHtml?suggestionHeight:0);
- })
- } else {
- this.singleSubjectData[index].suggestionHtml = ''
- }
- })
- },
- //答题卡
- async FindStudentCard(subjectCode,index){
- await this.$api.reportStudent[getApiName()].findStudentCard({
- examId:this.reportParam.examId,
- subjectCode:subjectCode,
- registrationCode:this.reportParam.registrationCode
- }).then(res => {
- if (res.code == 200 && res.data) {
- let paperImageList = res.data.pageVOS || [];
- //先添加总分数据
- let totalScore = {
- questionName: '总分',
- fullScore: res?.data?.fullScore || '',
- score: res?.data?.levelName ?? res?.data?.totalScore,
- displayType: res.data.displayType, //显示类型 0-分数 1-对错 2-等级
- displayName: res.data.displayName, //显示值
- correctType: res.data.correctType, //显示对错的时候 0-错 1-半对 2-全对
- questionAnswer: '',
- answer: '',
- samplingPosition: '{"x":195,"y":247,"page":1}'
- }
- if (paperImageList.length > 0 && paperImageList[0].questionVOS) {
- paperImageList[0].questionVOS.unshift(totalScore)
- }
- this.singleSubjectData[index].paperImageList = paperImageList;
- this.singleSubjectData[index].usedCardType = res?.data?.usedCardType ?? 1;
- for(let i = 0;i<paperImageList.length;i++){
- const pageNum = this.SingleChartPage(this.printPageHeight);
- this.singleSubjectData[index].paperImagePageNum.push(pageNum);
- }
- }
- })
- },
- //处理数据
- async TableChartData(tableData, titleData, studentOpenness, index,type,groupName,subjectCode) {
- //柱状图
- let datax = [],datay = [],radarChart = []
- tableData.forEach(item => {
- datax.push(item.questionName)
- const scoreRate = item?.scoreRate ?? ''
- datay.push(scoreRate)
- radarChart.push([item.questionName, scoreRate])
- })
- //雷达图
- const radarChartData = [['group', '得分率'], ...radarChart]
- let chartHeight = 0;//小题分析只显示table 不显示图
- if(type=='bigQuestionData'){
- chartHeight = datay.length > 0 ? 363 : 0; //柱状图
- }else if (type == 'smallQuestionData'){
- chartHeight = 0;
- } else{
- chartHeight = datay.length > 0 ? 393 : 0;//雷达图
- }
- const chartPagesNum = this.SingleChartPage(chartHeight);
- const HeadData = titleData.filter(item=>item.prop!='smallQuestionNames');
- const staticHeader = HeadData.slice(0,1);//固定表头
- const dynamicHeader = HeadData.slice(1);//动态分组标头
-
- const pageTableData = this.TableRowAndColumnPage(dynamicHeader,tableData,7,1);//8列一个表
- const tablePagesNum = pageTableData.tablePagesNum;
- const tableList = pageTableData.tableList;
- const headerList = pageTableData.headerList;//表头
- //查询单科-知识点分层分析表(联考)
- let knowLedgeLayering = null;
- if(type == 'knowledgePointQuestionData' && this.schoolType== 2){
- await this.$api.reportStudent[getApiName()].queryStudentKnowLedgeLayering({
- ...this.reportParam,
- subjectGroupType: 0, // 科目是否为组合
- isTotal: 0, //是否为总分科目 1为总分 0为非总分
- subjectCode:subjectCode
- }).then(res => {
- if (res.code == 200 && res.data) {
- const { breakThrough,develop,fullScore } = res.data;
- knowLedgeLayering = {
- breakThrough:breakThrough || '',
- develop:develop || '',
- fullScore:fullScore || ''
- }
- //知识点
- this.knowLedgeLayeringData.push({
- subjectCode:subjectCode,
- groupName:groupName,
- knowLedgeLayering:knowLedgeLayering
- })
- }else{
- knowLedgeLayering = null;
- }
- })
- }
- this.singleSubjectData[index].groupQuestionData.push({
- type:type,
- groupName:groupName,
- studentOpenness:studentOpenness,
- staticHeader:staticHeader,
- headerList:headerList,
- tableList:tableList,
- tablePagesNum:tablePagesNum,
- chartPagesNum:chartPagesNum,
- datax:datax,
- datay:datay,
- radarChartData:radarChartData,
- knowLedgeLayering:knowLedgeLayering
- })
- },
- //按照原始顺序累加,当总和超过A4高度1285时,将当前元素放入下一组
- groupByThreshold(arr, threshold) {
- const result = [];
- let currentGroup = [];
- let currentSum = 0;
- for (let i = 0; i < arr.length; i++) {
- const num = arr[i];
- // 如果当前组为空,直接添加
- if (currentGroup.length === 0) {
- currentGroup.push(num);
- currentSum += num;
- }
- // 如果加上当前元素会超过阈值,则创建新组
- else if (currentSum + num > threshold) {
- result.push(currentGroup);
- currentGroup = [num];
- currentSum = num;
- }
- // 否则添加到当前组
- else {
- currentGroup.push(num);
- currentSum += num;
- }
- }
- // 添加最后一组
- if (currentGroup.length > 0) {
- result.push(currentGroup);
- }
- return result;
- },
- /*
- *对表格横向和竖向分页
- *dynamicHeader 动态表头
- *tableData 表格数据
- *groupSize 动态表头分页大小
- *headNum 表头行数
- */
- TableRowAndColumnPage(dynamicHeader,tableData,groupSize,headNum){
- /*
- * 每个模块的高度
- */
- const tableTitle = 49;//表格标题高度
- const tableHeadHeight = 41;//表头高度
- const tableGap = 49;//表格和图表之间的间距
- //对表格横向分页
- const groupDynamicHeader = [];
- for (let i = 0; i < dynamicHeader.length; i += groupSize) {
- const group = dynamicHeader.slice(i, i + groupSize);
- //表格补充
- if(group.length > 0 && group.length!=groupSize && i > 0){
- const tdLens = groupSize - group.length;
- for(let j = 0; j < tdLens; j ++){
- group.push({})
- }
- }
- groupDynamicHeader.push(group)
- }
- let tablePagesNum = [],tableList = [],headerList = [];//当前模块所有table页码 表格 表格高度
- for (let i = 0; i < groupDynamicHeader.length; i ++) {
- let itemTablePagesNum = [],itemTableList = [],itemHeadder= [], moduleHeightData = [] ,isShowSplitLine = [];//每个table的页码 表格 表格高度 isShowSplitLine:表格是否显示分割线
- //计算最后一页模块的高度
- let lastPageDataSum = 0;
- const lastPageNum = this.modulePageData.length > 0 ? this.modulePageData[this.modulePageData.length - 1] : 1;//最后一页页码
- this.modulePageData.forEach((item,p)=>{
- if(item == lastPageNum){
- lastPageDataSum += this.moduleHeightData[p];
- }
- })
- const remainHeight = this.printPageHeight - lastPageDataSum - (tableHeadHeight * headNum) - tableTitle - 41;//41 是距离底部的边距
- const remainTableRow = Math.floor(remainHeight / 40);//剩余可放多少行
- if(remainTableRow > 1){
- const tableLens = tableData.length ?? 0;//表格行数量
- if(tableLens > remainTableRow){//判断第二页是否有值
- const pageTableHeight = this.printPageHeight - (tableHeadHeight * headNum) - tableTitle - 41;// 一页能放下的table的高度 41 是距离底部的边距
- const tableRowNum = Math.floor(pageTableHeight / 40);//一页可放多少行
- //第一页数据
- const firstTableData = tableData.slice(0,remainTableRow);
- itemTableList.push(firstTableData)
- itemHeadder.push(groupDynamicHeader[i])
- isShowSplitLine.push(false);//是否显示表格底部的分割线 第一页不显示
- //第一页页码
- // this.modulePageData.push(lastPageNum);
- //当前表格第一页页码
- itemTablePagesNum.push(lastPageNum);//图表分页页码
- // 第一页高度
- const tableHeight1 = firstTableData.length > 0 ? (tableHeadHeight * headNum) + tableTitle + tableGap + firstTableData.length * 40 : 0;
- moduleHeightData.push(tableHeight1)
- const otherTableData = tableData.slice(remainTableRow);//接取完上一页剩下的表格数据
- // 按步长遍历,每次截取 表格行数 元素
- for (let j = 0; j < otherTableData.length; j += tableRowNum) {
- const group = otherTableData.slice(j, j + tableRowNum);
- const key = j/tableRowNum;
- //表格数据
- itemTableList.push(group);
- itemHeadder.push(groupDynamicHeader[i])
- isShowSplitLine.push(false);//是否显示表格底部的分割线
- //页码
- // this.modulePageData.push(lastPageNum + key + 1);
- //当前表格分页页码
- itemTablePagesNum.push(lastPageNum + key + 1);
- //高度
- const tableHeight = group.length > 0 ? (tableHeadHeight * headNum) + tableTitle + tableGap + group.length * 40 : 0;
- moduleHeightData.push(tableHeight)
- }
- }else{
- const tableData1 = tableData.slice(0,remainTableRow);
- const tableData2 = tableData.slice(remainTableRow);
- itemTableList.push(tableData1,tableData2);
- itemHeadder.push(groupDynamicHeader[i],groupDynamicHeader[i])
- // this.modulePageData.push(lastPageNum,lastPageNum);
- //页码
- itemTablePagesNum.push(lastPageNum,lastPageNum)
- //高度
- const tableHeight1 = tableData1.length > 0 ? (tableHeadHeight * headNum) + tableTitle + tableGap + tableData1.length * 40 : 0;
- const tableHeight2 = tableData2.length > 0 ? (tableHeadHeight * headNum) + tableTitle + tableGap + tableData2.length * 40 : 0;
- moduleHeightData.push(tableHeight1,tableHeight2)
- }
- }else{
- const pageTableHeight = this.printPageHeight - (tableHeadHeight * headNum) - tableTitle - 41;// 一页能放下的table的高度 41 是距离底部的边距
- const tableRowNum = Math.floor(pageTableHeight / 40);//一页可放多少行
- // 按步长遍历,每次截取 表格行数 元素
- for (let j = 0; j < tableData.length; j += tableRowNum) {
- const group = tableData.slice(j, j + tableRowNum);
- const key = j/tableRowNum;
- //表格数据
- itemTableList.push(group);
- itemHeadder.push(groupDynamicHeader[i])
- // this.modulePageData.push(lastPageNum + key + 1);
- //页码
- itemTablePagesNum.push(lastPageNum + key + 1)
- //高度
- const tableHeight = group.length > 0 ? (tableHeadHeight * headNum) + tableTitle + tableGap + group.length * 40 : 0;
- moduleHeightData.push(tableHeight)
- }
- }
- this.modulePageData.push(...itemTablePagesNum);
- this.moduleHeightData.push(...moduleHeightData);
- // console.log(this.modulePageData,111333)
- tableList.push(itemTableList)
- headerList.push(itemHeadder)
- tablePagesNum.push(itemTablePagesNum);//当前模块表格的分页页码
- }
- return {headerList,tablePagesNum,tableList}
- },
- /*
- *单个图分页
- *chartHeight 图表高度
- */
- SingleChartPage(chartHeight){
- let chartPagesNum = '';//各分析图 高度
- const prevModuleLastPageNum = this.modulePageData.length > 0 ? this.modulePageData[this.modulePageData.length - 1] : 1;//上一模块 最后一页页码
- //上一模块最后一页高度 和 当前模块 echart高度
- let prevModuleLastPageHeight = [],moduleChartHeight = [];
- this.modulePageData.forEach((item,i)=>{
- if(item == prevModuleLastPageNum){
- prevModuleLastPageHeight.push(this.moduleHeightData[i])
- moduleChartHeight.push(this.moduleHeightData[i]);//最后一页高度
- }
- })
- // 将当前模块 echart高度
- this.moduleHeightData.push(chartHeight)
- moduleChartHeight.push(chartHeight)
- //进行分页 满足一页的高度放在一起
- const printPageGroup = this.groupByThreshold([...moduleChartHeight], this.printPageHeight);
- //每个模块对应的页码
- for (let i = 0; i < printPageGroup.length; i++) {
- const arr = printPageGroup[i]
- for (let j = 0; j < arr.length; j++) {
- if(i == 0){//第一页
- if(j > prevModuleLastPageHeight.length - 1){
- this.modulePageData.push(prevModuleLastPageNum)
- chartPagesNum = prevModuleLastPageNum
- }
- }else{
- this.modulePageData.push(prevModuleLastPageNum + i);
- chartPagesNum = prevModuleLastPageNum + i
- }
- }
- }
- return chartPagesNum
- },
- GetDifficultyClass(val) {
- if (val == 1) {
- return 'difficulty easy'
- } else if (val == 2) {
- return 'difficulty relatively_easy'
- } else if (val == 3) {
- return 'difficulty general'
- } else if (val == 4) {
- return 'difficulty more_difficult'
- } else if (val == 5) {
- return 'difficulty difficult'
- } else {
- return ''
- }
- },
- GetDifficultyName(val) {
- if (val == 1) {
- return '容易'
- } else if (val == 2) {
- return '较易'
- } else if (val == 3) {
- return '一般'
- } else if (val == 4) {
- return '较难'
- } else if (val == 5) {
- return '困难'
- } else {
- return '-'
- }
- },
- GetGroupClassValue(data,prop,code){
- const obj = data.find(item=>item.classGroupCode==code);
- const val = prop=='groupClassRanks'?obj?.classGroupRankRate:obj?.groupClassResultScore;
- return val ?? '-'
- },
- //点击顶部下载PDF按钮导出
- DownloadPdf(){
- if(this.$refs.bookFlipBox){
- this.$refs.bookFlipBox.DownloadPdfNew();
- }
- },
- //向父级页面传值关闭下载Pdf按钮loading
- PdfLoadEnd(){
- this.$emit('closePdfLoading')
- },
- }
- };
- </script>
- <style scoped lang="scss">
- .area_module_describe{
- margin-top: 20px;
- }
- .card-container {
- display: flex;
- flex-wrap: wrap;
- /* 允许换行 */
- /* 设置元素之间间隔 */
- gap: 10px;
- .card {
- // flex: 0 1 calc((100% - 240px) / 5);
- flex-grow: 1; /* 使每个div平分可用空间 */
- flex-basis: 0; /* 初始基础大小为0 */
- width: 20%;
- // max-width: 320px;
- // width: 238px;
- /* 每个卡片占据 18% 宽度,确保能在一行显示五个,考虑间隔 */
- // flex: 0 0 16.5%; /* 每个卡片占据 18% 宽度,确保能在一行显示五个,考虑间隔 */
- // border: 2px dashed #ccc;
- border-radius: 10px;
- padding: 12px 6px;
- box-sizing: border-box;
- text-align: center;
- color: #fff;
- /* 文字颜色可以根据背景调整 */
- background-size: cover;
- background-position: center;
- height: 70px;
- /* 可调整高度 */
- // margin-bottom: 20px; /* 卡片底部间距 */
- position: relative;
- }
- .background-image {
- position: absolute;
- top: 0;
- right: 0;
- /* 背景图片宽度 */
- width: 100%;
- height: 70px;
- background-size: contain;
- background-repeat: no-repeat;
- background-position: center right;
- z-index: 1;
- /* 确保背景图片在文本之下 */
- border-radius: 10px;
- }
- .statistic,.value {
- position: relative;
- z-index: 2;
- /* 确保文本在背景图片之上 */
- }
- .statistic {
- font-size: 13px;
- font-weight: 400;
- line-height: 22px;
- text-align: left;
- z-index: 2;
- }
- .value {
- font-size: 16px;
- font-weight: 600;
- line-height: 20px;
- text-align: left;
- margin-top: 5px;
- z-index: 2;
- }
- }
- .area_module{
- .area_module_content{
- display: flex;
- width: 100%;
- justify-content: space-between;
- .area_module_chart{
- width: 35% !important;
- }
- .area_module_table{
- width: 65% !important;
- }
- }
- .area_module_chart{
- &.justify_content{
- display: flex;
- gap: 0px 48px;
- flex-wrap: wrap;
- .item_progress{
- width: 170px;
- height: 180px;
- display: inline-flex;
- align-items: center;
- position: relative;
- :deep(.el-progress--circle) {
- .el-progress__text{
- font-size: 14px !important;
- color: #5470C6 !important;
- background: rgba(84,112,198,0.1);
- width: 120px;
- height: 120px;
- border-radius: 50%;
- position: absolute;
- left: 50%;
- top: 50%;
- transform: translate(-50%, -50%);
- display: flex;
- align-items: center;
- justify-content: center;
- padding-top: 30px;
- box-sizing: border-box;
- }
- }
- .item_progress_name{
- position: absolute;
- left: 50%;
- top: 37%;
- transform: translate(-50%,0);
- font-weight: 500;
- font-size: 16px !important;
- color: #5470C6 !important;
- }
- }
- }
- }
- .area_module_table{
- &.error{
- :deep() .el-table{
- .el-table__header-wrapper{
- .el-table__header{
- .is-group{
- tr{
- th.el-table__cell:nth-last-child(3){
- border-right: 1px solid #EBEEF5;
- }
- &:nth-child(2){
- display:none;
- }
- }
- }
- }
- }
- .el-table__cell{
- &.white_space_normal{
- .cell{
- white-space: normal;
- padding:10px 0 10px 10px !important;
- }
- }
- }
- // &.el-table--striped {
- // .el-table__body {
- // tr{
- // &.el-table__row--striped{
- // &.row_color_FFFFFF {
- // td.el-table__cell{
- // background: #FFFFFF;
- // }
- // }
- // }
- // }
- // }
- // }
- // &.el-table--striped .el-table__body tr.el-table__row.row_color_FAFAFA td.el-table__cell{
- // background: #FAFAFA;
- // }
- // &.el-table--striped .el-table__body tr.el-table__row--striped.row_color_FAFAFA td.el-table__cell{
- // background: #FAFAFA;
- // }
- // &.el-table--enable-row-hover .el-table__body tr.row_color_FFFFFF:hover > td {
- // background-color: transparent !important;
- // }
- }
- }
- .student_know_paper{
- width: 100%;
- box-sizing: border-box;
- display: flex;
- flex-direction: column;
- border-radius: 6px;
- border: 1px solid #EBEEF5;
- li{
- width: 100%;
- border-top: 1px solid #EBEEF5;
- box-sizing: border-box;
- display: inline-flex;
- &:first-child{
- border-top: 0;
- .li_left{
- background-color: #EEF1FB;
- span{
- color: #5470C6;
- }
- }
- }
- &:nth-child(2){
- .li_left{
- background-color: #ECF6F1;
- span{
- color: #3BA272;
- }
- }
- }
- &:nth-child(3){
- .li_left{
- background-color: #FFFAEF;
- span{
- color: #FAC858;
- }
- }
- }
- .li_left{
- width: 300px;
- padding: 24px;
- border-right: 1px solid #EBEEF5;
- box-sizing: border-box;
- display: inline-flex;
- flex-direction: column;
- justify-content: center;
- flex-shrink: 0;
- span{
- font-weight: 500;
- font-size: 20px;
- line-height: 28px;
- display: block;
- text-align: center;
- &:nth-child(2){
- margin-top: 4px;
- line-height: 20px;
- font-weight: 400;
- font-size: 14px;
- color: #999999;
- }
- }
- }
- .li_know{
- flex: 1;
- padding: 20px;
- box-sizing: border-box;
- font-weight: 400;
- font-size: 14px;
- color: #666666;
- line-height: 24px;
- text-align: justified;
- display: inline-flex;
- align-items: center;
- }
- }
- }
- }
- .difficulty {
- width: 6px;
- height: 6px;
- display: inline-flex;
- border-radius: 50%;
- margin-right: 4px;
- &.easy {
- background: #3ba272;
- }
- &.relatively_easy {
- background: #fac858;
- }
- &.general {
- background: #5470c6;
- }
- &.more_difficult {
- background: #ea7acb;
- }
- &.difficult {
- background: #ee6666;
- }
- }
- }
- </style>
|