Browse Source

bug修改

liurongli 1 tháng trước cách đây
mục cha
commit
f030a8863b

+ 2 - 2
src/api/analysis.ts

@@ -239,8 +239,8 @@ export const findCardListNew = (data: any): Promise<ApiResponse> => {
 export const getStudentPaperCardInfo = (data: any): Promise<ApiResponse> => {
   return request({
     url: "/api/v1/ai_analysis/find_student_card",
-    method: "post",
-    data,
+    method: "get",
+    params: data,
   });
 };
 //编辑采分点

+ 7 - 0
src/components/ModuleTab.vue

@@ -40,6 +40,13 @@ const TabChange = (item: Object) => {
     state.tabActive = item.value;
     emit('TabChange', item)
 }
+// 6. 暴露方法
+const ChangeTabActive = (value: string | number) => {
+    state.tabActive = value;
+}
+defineExpose({
+    ChangeTabActive
+})
 </script>
 
 <style lang="scss" scoped>

+ 10 - 7
src/components/QuestionPoint.vue

@@ -12,6 +12,11 @@
 import { ref, reactive, watch, onMounted, onBeforeUnmount, nextTick } from 'vue';
 import { throttle, debounce } from 'lodash';
 import { editSamplingPoint } from '@/api/analysis';
+import iconAllWrong from "@/assets/icon/icon_all_wrong.svg";
+import iconAllRight from "@/assets/icon/icon_all_right.svg";
+import iconHalfRight from "@/assets/icon/icon_half_right.svg";
+import model2 from "@/assets/icon/model_2.png";
+import model1 from "@/assets/icon/model_1.png";
 
 // 定义类型接口
 interface PaperImageItem {
@@ -298,12 +303,10 @@ const redrawCanvas = () => {
     // 绘制优秀答案 //0:普通   1:优秀答案   2:典型错误
     const modelImage = new Image();
     if (item.model == 1) {
-      // 注意:在 Vite/Webpack 中,require 可能需要替换为 import 或 new URL()
-      // 这里假设构建工具能处理 require,或者你需要预先导入这些图片
-      modelImage.src = require('../assets/tool/model_1.png');
+      modelImage.src = model1;
     }
     if (item.model == 2) {
-      modelImage.src = require('../assets/tool/model_2.png');
+      modelImage.src = model2;
     }
     
     if (item.model === 1 || item.model === 2) {
@@ -321,13 +324,13 @@ const redrawCanvas = () => {
 
     if (scoreNum == fullScoreNum) {
       // 等于满分
-      iconImage.src = require('../assets/icon/icon_all_right.png');
+      iconImage.src = iconAllWrong;
     } else if (scoreNum == 0) {
       // 全错
-      iconImage.src = require('../assets/icon/icon_all_wrong.png');
+      iconImage.src = iconAllWrong;
     } else {
       // 半对
-      iconImage.src = require('../assets/icon/icon_half_right.png');
+      iconImage.src = iconHalfRight;
     }
 
     iconImage.onload = () => {

+ 19 - 5
src/components/ReportModule.vue

@@ -59,7 +59,9 @@
           :current-page="currentPage"
           :page-size="pageSize"
           :page-sizes="pageSizes"
-          :layout="total > pageSize ? 'total,sizes,prev,pager,next' : 'total,sizes'"
+          :layout="
+            total > pageSize ? 'total,sizes,prev,pager,next' : 'total,sizes'
+          "
           :total="total"
           @size-change="ChangePageSize"
           @current-change="ChangeCurrentPage"
@@ -320,12 +322,11 @@ defineExpose({
           font-size: 14px;
         }
       }
-      td{
-        &.is-left{
-          .cell{
+      td {
+        &.is-left {
+          .cell {
             text-align: left;
           }
-          
         }
       }
       .cell {
@@ -424,6 +425,19 @@ defineExpose({
       background-position: 100% 50%;
       background-repeat: no-repeat;
     }
+    // 最大值颜色
+    :deep(.max_color) {
+      color: #3ba272;
+    }
+
+    // 最小值颜色
+    :deep(.min_color) {
+      color: #ee6666;
+    }
+    // 最小值颜色
+    :deep(.normal_color) {
+      color: #2e64fa;
+    }
   }
 
   .module_qita {

+ 0 - 1
src/components/StudentPaper.vue

@@ -193,7 +193,6 @@ const GetStudentPaperInfo = () => {
   currentPaperUrl.value = "";
   if (props.paperInfo?.examPaperId && props.paperInfo?.platformNumber != null) {
     isLoading.value = true;
-    
     getStudentPaperCardInfo(props.paperInfo).then((res: any) => {
       if (res.code == 200 && res.data) {
         paperImageList.value = res.data.pageVOS || [];

+ 10 - 1
src/views/analysis/classComparison.vue

@@ -8,7 +8,7 @@
     :showDescribe="false"
   >
     <template #module_qita>
-      <ModuleTab :tabList="state.tabList" @TabChange="TabChange"></ModuleTab>
+      <ModuleTab ref="moduleTabRef" :tabList="state.tabList" @TabChange="TabChange"></ModuleTab>
     </template>
   </ReportModule>
   <ReportModule
@@ -495,6 +495,7 @@ interface PageState {
 // ================= 组件引用 & Store =================
 
 const reportModuleRef = ref<InstanceType<typeof ReportModule> | null>(null);
+const moduleTabRef = ref<InstanceType<typeof ModuleTab> | null>(null);
 const analysisStore = useAnalysisStore();
 const filterObject = computed(() => analysisStore.filterObject || {});
 const schoolLevel = computed(() => analysisStore.filterObject.schoolLevel);
@@ -1385,6 +1386,14 @@ const pageInit = () => {
 watch(
   () => filterObject.value,
   () => {
+    if(state.tabActive == 'rateAll') {
+      moduleTabRef.value?.ChangeTabActive?.('0');
+      state.tabActive = '0';
+      state.groupTitle = "平均分";
+      state.sortValue = "1";
+      state.analysisData.pageNum = 1;
+      state.rankType = 1;
+    }
     pageInit();
   },
   { deep: true },

+ 1 - 7
src/views/analysis/levelDistribution.vue

@@ -76,13 +76,7 @@
       </div>
     </template>
     <template #module_describe>
-      说明:信度是反应考试一致性或可靠性的指标,信度高,表示考试成绩较为准确,误差较小;
-      信度低,表明误差大;信度低的考试无法正确评价考生的知识水平与智能素质。
-      效度是指测验的有效性或正确性,即测验能否准确测量出其所要测量的内容。效度高的测验能够确保测验内容与测验目的的一致性,反映测验的正确性和准确性。
-      分析试题的难度和区分度可以确保试题的质量和有效性,从而更好地评估学生的知识掌握程度和区分不同水平的学生。
-      难度指试题的难易程度,通常用P值表示。计算方式为P=X/M(P为难度,X为试题平均得分,M为试题满分)。P值在0到1之间,值越大表示试题越简单,试题通常分为容易题(P≥0.7)、中等题(0.4至0.7之间)和难题(P≤0.4)。
-      区分度是衡量试题对不同水平考生的区分能力,通常用D值表示。通过计算高分组和低分组在某一试题上的通过率之差,得到试题区分度。区分度高的试题能将不同水平的考生区分开来,水平高的学生得高分,水平低的学生得低分。D值的取值范围介于-1至1之间,D值越高,区分的效果越好。D≥0.4表明此题的区分度很好,属于优秀;0.3≤D<0.4表明此题的区分度较好,属于良好;0.2≤D<0.4表明此题的区分度一般;D<0.2表明此题的区分度较低。
-      图中展示了各科的命题分析明细,点击科目的柱可在下方查看该科所有小题的命题分析。
+      说明:分数段指的是对成绩进行分数的分段统计。可以直观的反映学生成绩的分布情况。柱图代表当前分数段的实际人数,其中绿色的柱图代表≥80%满分的人数,黄色为<80%满分且≥60%满分的人数,红色为<60%满分的人数;折线图代表当前分数段的占比情况;其中分数段水平分布中显示正态分布辅助线(-2α、-α、μ、α、2α),以帮助了解学生分布合理性,μ表示平均分,α表示标准差,人数分布符合正态分布,则说明本次成绩较为理想。超出标准差之外的数据为异常值,需重点关注。
     </template>
   </ReportAssistant>
   <ReportAssistant

+ 5 - 1
src/views/analysis/optionAnalysis.vue

@@ -321,7 +321,11 @@
               label="考号"
               width="80"
               show-overflow-tooltip
-            ></el-table-column>
+            >
+              <template #default="{ row }">
+                {{ row.examCode || "-" }}
+              </template>
+            </el-table-column>
             <el-table-column
               align="center"
               property="className"

+ 5 - 5
src/views/analysis/propositionAnalysis.vue

@@ -267,7 +267,7 @@
         <el-table-column
           prop="questionCode"
           label="题号"
-          min-width="120"
+          min-width="80"
           align="center"
           show-overflow-tooltip
         >
@@ -318,7 +318,7 @@
           align="center"
           show-overflow-tooltip
         />
-        <el-table-column
+        <!-- <el-table-column
           prop="maxScore"
           label="最高分"
           min-width="100"
@@ -331,7 +331,7 @@
           min-width="100"
           align="center"
           show-overflow-tooltip
-        />
+        /> -->
         <el-table-column
           prop="scoreRate"
           label="得分率"
@@ -341,13 +341,13 @@
         >
           <template #default="scope"> {{ scope.row.scoreRate }}% </template>
         </el-table-column>
-        <el-table-column
+        <!-- <el-table-column
           prop="standardDeviation"
           label="标准差"
           min-width="100"
           align="center"
           show-overflow-tooltip
-        />
+        /> -->
       </el-table>
     </template>
   </ReportModule>

+ 2 - 1
src/views/analysis/questionAnalysis.vue

@@ -686,11 +686,12 @@ const GetQuestionAnalysisData = () => {
         const { data } = res;
         const questionList = data.questionList || [];
         const changeHeaderList = data.changeHeaderList || []; //柱状图折线图 班级名称
+        const headerListData = data.headerList || [];
         state.problemAnalysisData.groupList = [];
         state.problemAnalysisData.groupTableList = [];
         state.problemAnalysisData.questionList = questionList;
         state.problemAnalysisData.questionTableList = cloneDeep(questionList);
-        state.problemAnalysisData.headerList = data.headerList || [];
+        state.problemAnalysisData.headerList = headerListData.filter((item: any) => item.prop != "knowledge");//不显示知识点
         state.problemAnalysisData.changeHeaderList = changeHeaderList;
         state.problemAnalysisData.childHeaderList = data.childHeaderList || [];
 

+ 2 - 2
src/views/analysis/score.vue

@@ -67,7 +67,7 @@
           align="center"
           width="70"
           label="序号"
-          fixed="left"
+          :fixed="state.checkList.length ? 'left' : null"
         ></el-table-column>
         <el-table-column
           v-for="item in state.staticHeaderData"
@@ -75,7 +75,7 @@
           :prop="item.prop"
           :label="item.label"
           min-width="80"
-          fixed="left"
+          :fixed="state.checkList.length ? 'left' : null"
         >
           <template #default="scope">
             <span

+ 3 - 0
src/views/choice/index.vue

@@ -86,7 +86,9 @@ import { ElMessage, ElMessageBox } from 'element-plus'
 import { getCourseBgColor } from '@/utils/common' 
 import { useRouter } from 'vue-router' 
 import { useExamStore } from '@/store/exam'
+import { useAnalysisStore } from '@/store/analysis'
 const examStore = useExamStore()
+const analysisStore = useAnalysisStore()
 const router = useRouter()
 const showAddExam = ref(false)
 // 新增:用于存储当前编辑的数据,null 表示新增模式
@@ -305,6 +307,7 @@ const GotoExam=(item:any) => {
   try {
     // localStorage.setItem('current_exam_info', JSON.stringify(item));
     examStore.setExamInfo(item)
+    analysisStore.removeLocalStorage()//清空分析信息
     console.log('将当前的考试信息存储到本地:', item)
   } catch (error) {
     console.error('存储考试信息失败:', error)

+ 16 - 0
src/views/exam/scanList.vue

@@ -201,11 +201,13 @@
 <script lang="ts" setup>
 import { useExamStore } from '@/store/exam'
 import { useUserStore } from '@/store/user'
+import { useAnalysisStore } from '@/store/analysis'
 import { useRouter } from 'vue-router'
 import { onMounted ,ref,computed,onUnmounted,nextTick } from 'vue';
 import ScanButton from './components/scanButton.vue'//扫描按钮
 import UploadImage from './components/UploadImage.vue'//导入扫描图片
 import {setExamNumberPosition,finishScanned,getExamScoreSummary,hasImportStudent,getBatchList,getCurrentBatchNo,deleteBatch,updateScanCount,setExamScanSetting,saveChooseCode} from '@/api/exam'
+import { queryQuestionGroupByAiId } from '@/api/analysis'
 import scanCommon from '@/utils/scanCommon';
 import { ElMessageBox, ElMessage } from 'element-plus'
 import { formatTimestamp } from '@/utils/common';
@@ -215,6 +217,7 @@ import WebSocketManager from '@/utils/webSocket'//后端websocket链接js
 // 实例化 Store
 const examStore = useExamStore()
 const userStore = useUserStore()
+const analysisStore = useAnalysisStore()
 
 const router = useRouter()
 
@@ -239,6 +242,7 @@ const examSubjectCode=computed(() => {
 const currentUserName=computed(() => {
     return userStore.userName;
 })
+const isShowGroupAnalysis = computed(() => analysisStore?.isShowGroupAnalysis || false);
 //查询是否导入了学生名单
 const HasImportStudent = async () => { 
     const params = {
@@ -472,6 +476,18 @@ const FinishScanned= async () =>{
             {
                 ElMessage.success("完成成功!")
                 finishLoading.value=false;
+                //显示成绩查询
+                const stepFlow=examStore.currentExam?.stepFlow < 2;
+                if(stepFlow){
+                    examStore.setExamInfo({
+                        ...examStore.currentExam,
+                        stepFlow:2,
+                    })
+                }
+                //是否显示分组分析
+                const res = await queryQuestionGroupByAiId(examSubjectId.value);
+                const isShow = res.code === 200;
+                analysisStore.setIsShowGroupAnalysis(isShow);
             }
             else
             {