|
|
@@ -13,16 +13,16 @@
|
|
|
</div>
|
|
|
<div class="right_user_tab" v-else>
|
|
|
<!-- 按考场 1 按班级 2 -->
|
|
|
- <div class="tab_system_user" :class="activeName == 1?'select_cur':''" @click="OnExam(1)" >
|
|
|
+ <div class="tab_system_user" :class="activeName == 1?'select_cur':''" @click="ChangeRoomType(1)" >
|
|
|
按考场
|
|
|
</div>
|
|
|
- <div class="tab_temporay_user" :class="activeName == 2?'select_cur':''" @click="OnClass(2)">
|
|
|
+ <div class="tab_temporay_user" :class="activeName == 2?'select_cur':''" @click="ChangeRoomType(2)">
|
|
|
按班级
|
|
|
</div>
|
|
|
</div>
|
|
|
<div class="page_jg_20"></div>
|
|
|
<div class="left_tree page_tree" v-if="markType==0 || showUploadReview==0">
|
|
|
- <el-tree :highlight-current="true" :data="treeData" default-expand-all :props="defaultProps" :default-expanded-keys="defaultExKey" node-key="id" ref="classTree" @node-click="TreeHandleNodeClick"></el-tree>
|
|
|
+ <el-tree :highlight-current="true" class="filter-tree" :data="treeData" default-expand-all :props="defaultProps" :default-expanded-keys="defaultExKey" node-key="id" ref="classTree" @node-click="TreeHandleNodeClick"></el-tree>
|
|
|
|
|
|
</div>
|
|
|
<div v-else class="left_question">
|
|
|
@@ -62,13 +62,13 @@
|
|
|
<el-table-column align="center" type="index" width="50" label="序号" :index="HandleIndexMethod"></el-table-column>
|
|
|
<el-table-column align="center" prop="studentBatch" label="扫描批次" v-if="scanState == 3"></el-table-column>
|
|
|
<el-table-column align="center" prop="studentCode" label="学号"></el-table-column>
|
|
|
- <el-table-column align="center" prop="exCode" label="考号"></el-table-column>
|
|
|
+ <el-table-column align="center" prop="examCode" label="考号"></el-table-column>
|
|
|
<el-table-column align="center" prop="studentName" label="姓名"></el-table-column>
|
|
|
<el-table-column align="center" prop="adminClassName" label="行政班"></el-table-column>
|
|
|
<el-table-column align="center" prop="teachingClassName" label="教学班"></el-table-column>
|
|
|
<el-table-column align="center" prop="registrationTypeName" label="学生类型"></el-table-column>
|
|
|
<el-table-column align="center" label="考场">
|
|
|
- <template slot-scope="scope">
|
|
|
+ <template #default="scope">
|
|
|
<!-- 提的bug 沒没有考场显示行政班 -->
|
|
|
<span v-if="scope.row.examRoomName">{{scope.row.examRoomName}}</span>
|
|
|
<span v-else>{{scope.row.adminClassName}}</span>
|
|
|
@@ -76,7 +76,7 @@
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
<el-table-column align="center" label="填涂标记" v-if="scanState==2">
|
|
|
- <template slot-scope="scope">
|
|
|
+ <template #default="scope">
|
|
|
|
|
|
<div class="miss_img" v-if="scope.row.paperUrl">
|
|
|
<img :src="scope.row.paperUrl" alt="">
|
|
|
@@ -85,7 +85,7 @@
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
<el-table-column align="center" prop="scannedStatus" label="状态" key="scannedStatus">
|
|
|
- <template v-slot="scope">
|
|
|
+ <template #default="scope">
|
|
|
<div class="table_row_scan_state" v-if="scanState == 0">
|
|
|
<div class="state_no_scan"></div>未扫描
|
|
|
</div>
|
|
|
@@ -100,7 +100,7 @@
|
|
|
|
|
|
|
|
|
<el-table-column align="center" label="操作" width="160" >
|
|
|
- <template v-slot="scope">
|
|
|
+ <template #default="scope">
|
|
|
<!-- 未扫描 -->
|
|
|
<div class="table_row_option" v-if="scanState == 0">
|
|
|
<span class="option_button_editor" @click="OpenMissExam(scope)">标记为缺考</span>
|
|
|
@@ -124,7 +124,7 @@
|
|
|
@current-change="ChangePage"
|
|
|
background
|
|
|
|
|
|
- :page-sizes="[20,50,100]"
|
|
|
+ :page-sizes="[10,50,100]"
|
|
|
layout="sizes,prev, pager, next"
|
|
|
@size-change="HandleSizeChange"
|
|
|
:current-page="pageInfo.pageNum"
|
|
|
@@ -220,7 +220,7 @@
|
|
|
</div>
|
|
|
<div class="item_image">
|
|
|
<!-- <img :src="item.url" alt=""> -->
|
|
|
- <MarkScore :drawData="reviewQuestionScoreList" :fullScore="reviewQuestionScore" :score="item.score" :paperImgUrl="item.url" @GetClickItem="(score) => GetClickItem(score,item, index)"></MarkScore>
|
|
|
+ <!-- <MarkScore :drawData="reviewQuestionScoreList" :fullScore="reviewQuestionScore" :score="item.score" :paperImgUrl="item.url" @GetClickItem="(score) => GetClickItem(score,item, index)"></MarkScore> -->
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
@@ -320,11 +320,14 @@
|
|
|
</template>
|
|
|
<script lang="ts" setup>
|
|
|
import { useExamStore } from '@/store/exam'
|
|
|
+import { useUserStore } from '@/store/user'
|
|
|
import { useRouter } from 'vue-router'
|
|
|
-import { onMounted ,ref} from 'vue';
|
|
|
+import { onMounted ,ref,nextTick,onUnmounted,computed, watch} from 'vue';
|
|
|
+import { getExamStudentList } from '@/api/exam';
|
|
|
|
|
|
// 实例化 Store
|
|
|
const examStore = useExamStore()
|
|
|
+const userStore = useUserStore()
|
|
|
const router = useRouter()
|
|
|
|
|
|
// 定义 Props
|
|
|
@@ -348,23 +351,83 @@ const props = defineProps({
|
|
|
}, // 答案
|
|
|
})
|
|
|
|
|
|
+//监听props变化
|
|
|
+watch(() => props.scanState, (newState) => {
|
|
|
+
|
|
|
+ console.log("扫描状态变更为",newState);
|
|
|
+ pageInfo.value.pageNum=1;
|
|
|
+ GetExamStudentList();//获取考生列表
|
|
|
+});
|
|
|
+
|
|
|
+// 考试科目 ID
|
|
|
+const examSubjectId = computed(() => {
|
|
|
+ return examStore.currentExam?.id
|
|
|
+})//计算属性
|
|
|
+
|
|
|
+//考试科目code
|
|
|
+const examSubjectCode=computed(() => {
|
|
|
+ return examStore.currentExam?.examSubjectCode
|
|
|
+})
|
|
|
+//当前登录人姓名
|
|
|
+const currentUserName=computed(() => {
|
|
|
+ return userStore.userName;
|
|
|
+})
|
|
|
+
|
|
|
const showUploadReview = ref(0)//0 考生详情 1 复查识别
|
|
|
const showReviewType=ref(0);//复查题目类型 0-客观题 1-主观题
|
|
|
|
|
|
const activeName = ref(1);//1 按考场 2 按班级
|
|
|
const markType=ref(0)//0 网阅卡 1 手阅卡
|
|
|
const reviewQuestionIndex=ref('');//当前选择的题目索引
|
|
|
-const treeData=ref([]);//树形结构数据
|
|
|
+
|
|
|
+// 修改后:显式声明类型为 any[],或者定义具体的 Interface
|
|
|
+interface TreeNode {
|
|
|
+ id: string | number;
|
|
|
+ label: string;
|
|
|
+ children?: TreeNode[];
|
|
|
+ studentList?: any[];
|
|
|
+ [key: string]: any; // 允许其他属性
|
|
|
+}
|
|
|
+
|
|
|
+const treeData = ref<TreeNode[]>([]); // 树形结构数据
|
|
|
+const defaultExKey=ref(['all']);//
|
|
|
+const selectNodeId=ref('all');//选择的节点id
|
|
|
+const defaultProps={
|
|
|
+ children: 'children',
|
|
|
+ label: 'label'
|
|
|
+};
|
|
|
|
|
|
const keyWord=ref('');//搜索关键词
|
|
|
const reviewKeyWord=ref('');//复查搜索关键词
|
|
|
|
|
|
const multiSelection=ref([]);//多选数据
|
|
|
const isLoading=ref(false);//表格加载状态
|
|
|
-const studentTableData=ref([]);//学生表格数据
|
|
|
-const pageInfo=ref({ pageNum: 1, pageSize: 20, total: 0 });//分页信息
|
|
|
+// 学生表格数据(前端分页处理)
|
|
|
+const studentTableData = computed(() => {
|
|
|
+
|
|
|
+ if(keyWord.value=='')
|
|
|
+ {
|
|
|
+ const start = (pageInfo.value.pageNum - 1) * pageInfo.value.pageSize;
|
|
|
+ const end = start + pageInfo.value.pageSize;
|
|
|
+ return studentList.value.slice(start, end);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return studentList.value.filter(student=>{
|
|
|
+ return (
|
|
|
+ student.studentName.toLowerCase().includes(keyWord.value.toLowerCase())
|
|
|
+ ||
|
|
|
+ student.exCode.toLowerCase().includes(keyWord.value.toLowerCase())
|
|
|
+ );
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+});
|
|
|
+
|
|
|
+const pageInfo=ref({ pageNum: 1, pageSize: 10, total: 0 });//分页信息
|
|
|
const studentPaperList=ref([]);//学生试卷列表
|
|
|
-const studentList=ref([]);//学生列表数据
|
|
|
+const allStudentList=ref([]);//所有学生列表数据存储
|
|
|
+const studentList=ref<any[]>([]);//学生列表数据
|
|
|
|
|
|
const reviewObjectClassCode=ref('');//班级代码
|
|
|
const reviewObjectClassList=ref([]);//班级列表
|
|
|
@@ -378,18 +441,46 @@ const scoreOptions=ref([]);//分数选项
|
|
|
const reviewLoading=ref(false);//复查加载状态
|
|
|
|
|
|
const reviewStudentList=ref([]);//复查学生列表
|
|
|
+const tableHeight=ref(200);//学生表格高度
|
|
|
const subjectReviewTableHeight=ref(200);//主观题复查表格高度
|
|
|
const tableKey=ref(0);//表格key
|
|
|
|
|
|
+
|
|
|
+const SelectCheckAll=()=>{
|
|
|
+
|
|
|
+}
|
|
|
+const HandleSelectionChange=(selection:any)=>{
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+const TreeHandleNodeClick=(node:any)=>{
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+const ChangeUploadShow=(show:number)=>{
|
|
|
+ showUploadReview.value=show
|
|
|
+}
|
|
|
+
|
|
|
+const ChangeRoomType=(type:number)=>{
|
|
|
+ activeName.value=type
|
|
|
+ GetExamStudentList();
|
|
|
+}
|
|
|
+
|
|
|
+const ChangeReviewType=(type:number)=>{
|
|
|
+ showReviewType.value=type
|
|
|
+}
|
|
|
+
|
|
|
//切换分页
|
|
|
const ChangePage=(pageNum:number)=>{
|
|
|
-
|
|
|
+ pageInfo.value.pageNum=pageNum;
|
|
|
}
|
|
|
|
|
|
|
|
|
//设置每页显示数量
|
|
|
const HandleSizeChange=(size:number)=>{
|
|
|
-
|
|
|
+ pageInfo.value.pageSize=size;
|
|
|
}
|
|
|
//序号自定义方法
|
|
|
const HandleIndexMethod=(index:number)=>{
|
|
|
@@ -400,6 +491,86 @@ const HandleIndexMethod=(index:number)=>{
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+//获取学生列表
|
|
|
+const GetExamStudentList=async()=>{
|
|
|
+ isLoading.value=true
|
|
|
+ const params={
|
|
|
+ examSubjectId:examSubjectId.value,
|
|
|
+ type:activeName.value,
|
|
|
+ scannedStatus:props.scanState,
|
|
|
+ review:0,
|
|
|
+ schoolId:0,
|
|
|
+ };
|
|
|
+ let res=await getExamStudentList(params)
|
|
|
+ console.log("打印获取的扫描学生结果",res)
|
|
|
+ isLoading.value=false
|
|
|
+ if(res.code==200)
|
|
|
+ {
|
|
|
+ let childrenData:any[]=[];
|
|
|
+ let allDatalist:any[]=[]; //全部学生列表
|
|
|
+ let examInfoCount={
|
|
|
+ unScanned:res.data.unScanned,
|
|
|
+ examMissNum:res.data.examMissNum,
|
|
|
+ scannedNum:res.data.scannedNum,
|
|
|
+ abnormalNum:res.data.abnormalNum,
|
|
|
+ examTotal:res.data.totalNum,
|
|
|
+ };
|
|
|
+ examStore.setExamInfoCount(examInfoCount);//设置扫描数据信息
|
|
|
+ if(res.data.examRoomTypeTblVOS?.length>0)
|
|
|
+ {
|
|
|
+ res.data.examRoomTypeTblVOS.forEach((item:any)=> {
|
|
|
+ let obj={
|
|
|
+ id:'index_'+item.examRoomCode, //考场id
|
|
|
+ label:item.examRoomName+'('+item.totalStudentNum+'人)', //考场名称
|
|
|
+ studentList:item.scannedStudentTblVOS || [],//学生列表
|
|
|
+
|
|
|
+ };
|
|
|
+ allDatalist.push(...item.scannedStudentTblVOS);
|
|
|
+ childrenData.push(obj);
|
|
|
+ });
|
|
|
+ reviewObjectClassList.value=res.data.examRoomTypeTblVOS || [];
|
|
|
+ }
|
|
|
+ let oneTreeData={
|
|
|
+ id:'all',
|
|
|
+ label:'全部'+'('+allDatalist.length+'人)',
|
|
|
+ children:childrenData,
|
|
|
+ studentList:allDatalist,
|
|
|
+ };
|
|
|
+ treeData.value=[oneTreeData];
|
|
|
+ if(selectNodeId.value=='all')
|
|
|
+ {
|
|
|
+ studentList.value=allDatalist;
|
|
|
+ pageInfo.value.total=allDatalist.length;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+
|
|
|
+ }
|
|
|
+ console.log("打印获取的树形结构数据",treeData.value)
|
|
|
+
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+//计算高度的函数
|
|
|
+const CalculateTableHeight = () => {
|
|
|
+ // nextTick 确保 DOM 更新后再获取尺寸
|
|
|
+ nextTick(() => {
|
|
|
+ // window.innerHeight 是浏览器可视区域高度
|
|
|
+
|
|
|
+ // 简单算法:视窗高度 - 固定占用高度
|
|
|
+ let computedHeight = window.innerHeight - 270;
|
|
|
+
|
|
|
+ // 限制最小高度,防止太矮
|
|
|
+ if(computedHeight < 200)
|
|
|
+ {
|
|
|
+ computedHeight = 200;
|
|
|
+ }
|
|
|
+
|
|
|
+ tableHeight.value = computedHeight;
|
|
|
+ });
|
|
|
+};
|
|
|
|
|
|
|
|
|
onMounted(() => {
|
|
|
@@ -408,11 +579,21 @@ onMounted(() => {
|
|
|
console.warn('当前没有选中的考试信息')
|
|
|
// 可选:如果没有数据,可以重定向回列表页或提示用户
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
+ CalculateTableHeight()//计算表格高度
|
|
|
+ GetExamStudentList();
|
|
|
+ // 监听窗口大小变化
|
|
|
+ window.addEventListener('resize', CalculateTableHeight);
|
|
|
})
|
|
|
+// 卸载时移除监听,防止内存泄漏
|
|
|
+onUnmounted(() => {
|
|
|
+ window.removeEventListener('resize', CalculateTableHeight);
|
|
|
+});
|
|
|
+
|
|
|
</script>
|
|
|
|
|
|
<style lang="scss" scoped>
|
|
|
-
|
|
|
+.content_main
|
|
|
+{
|
|
|
+ height: 100% !important;
|
|
|
+}
|
|
|
</style>
|