Browse Source

扫描异常处理 未扫描 缺考 已上传更新

dengshaobo 3 weeks ago
parent
commit
ec5ebae025

+ 876 - 0
src/styles/common.scss

@@ -2357,9 +2357,11 @@ body {
   .el-dialog__header {
     display: none;
   }
+  
   .el-dialog
   {
     border-radius: 0;
+
   }
   //饿了么内容样式覆盖
   .el-dialog__body {
@@ -3487,4 +3489,878 @@ body {
     color: #2E64FA;
   }
 
+}
+
+
+
+// 异常详情页样式
+.abnormal_detail
+{
+    width: 100%;
+    height: 100%;
+    background-color:#F0F4FB;
+    .detail_header
+    {
+        width: 100%;
+        height: 80px;
+        background-color: #fff;
+   
+        display: flex;
+        justify-content:flex-start;
+        align-items: center;
+        padding: 0 20px;
+        box-sizing: border-box;
+        .go_back
+        {
+            width: 120px;
+            height: 36px;
+            background-color: #fff;
+            border-radius: 4px 4px 4px 4px;
+            border: 1px solid #DCDFE6;
+
+            text-align: center;
+            line-height: 36px;
+            font-size: 14px;
+            font-weight: 500;
+            color: #666666;
+            display: flex;
+            justify-content: center;
+            align-items: center;
+            gap: 5px;
+            cursor: pointer;
+        }
+
+        //未扫描
+        .scan_button_unscanned {
+            width: 210px;
+            height: 100%;
+            height: 56px;
+            border-radius: 8px 8px 8px 8px;
+            border: 1px solid #e4e7ed;
+        }
+
+        .scan_button_list {
+            width: auto;
+            height: 100%;
+            margin-left: 40px;
+            display: flex;
+            align-items: center;
+
+            .button_item {
+                min-width: 230px;
+                height: 56px;
+                margin-right: 20px;
+                border-radius: 8px 8px 8px 8px;
+                border: 1px solid #e4e7ed;
+
+                background-size: 40px 40px;
+                background-position: 12px 50%;
+                background-repeat: no-repeat;
+
+                font-weight: 400;
+                font-size: 20px;
+                color: #999999;
+                line-height: 56px;
+                text-indent: 64px;
+                cursor: pointer;
+                white-space: nowrap; // 添加这一行防止换行
+            }
+
+            .item_no_scan {
+                background-image: url("../assets/icon/no_scan_icon.png");
+                border: 1px solid #2e64fa;
+                color: #2e64fa;
+            }
+
+            .item_no_scan_active {
+                background-color: rgba(46, 100, 250, 0.1);
+                background-image: url("../assets/icon/no_scan_icon_hover.png");
+                color: #2e64fa;
+                box-shadow: 4px 2px 10px #2E64FA;
+                border: 1px solid #2e64fa;
+                font-weight: 600;
+            }
+
+            .item_miss_exam {
+                background-image: url("../assets/icon/miss_exam.png");
+                border: 1px solid #FB9F34;
+                color: #FB9F34;
+            }
+
+            .item_miss_exam_active {
+                background-color: rgba(251, 159, 52, 0.1);
+                background-image: url("../assets/icon/miss_exam_hover.png");
+                color: #FB9F34;
+                box-shadow: 4px 2px 10px #FB9F34;
+                border: 1px solid #FB9F34;
+                font-weight: 600;
+            }
+
+            .item_abnormal {
+                background-image: url("../assets/icon/abnormal_icon.png");
+                border: 1px solid #F56C6C;
+                color: #f56c6c;
+            }
+
+            .item_abnormal_active {
+                background-color: rgba(245, 108, 108, 0.1);
+                background-image: url("../assets/icon/abnormal_icon_hover.png");
+                color: #f56c6c;
+                border: 1px solid #F56C6C;
+                box-shadow: 4px 2px 10px #F56C6C;
+                font-weight: 600;
+            }
+
+            .item_sucess_upload {
+                background-image: url("../assets/icon/sucess_upload.png");
+                border: 1px solid #2BC644;
+                color: #2BC644;
+            }
+
+            .item_sucess_upload_active {
+                background-color: rgba(43, 198, 68, 0.1);
+                background-image: url("../assets/icon/sucess_upload_hover.png");
+                border: 1px solid #2BC644;
+                box-shadow: 4px 2px 10px #2BC644;
+                font-weight: 600;
+            }
+        }
+
+    }
+
+    .detail_content 
+    {
+        width: calc(100% - 40px);
+        margin: auto;
+        height: calc(100vh - 80px);
+        background-color: transparent;
+        margin: auto;
+
+        .content_main {
+          width: 100%;
+          height: calc(100% - 40px);
+          padding: 20px 0;
+          display: flex;
+          justify-content: space-between;
+
+        .scan_content_left {
+            width: 200px;
+            height: 100%;
+            background-color: #ffffff;
+            border-radius: 10px;
+
+            .left_tree {
+            width: calc(100% - 40px);
+            height: calc(100% - 96px);
+            margin: auto;
+
+            .kc_list {
+                height: auto;
+                text-align: center;
+
+                .kc_list_item {
+                width: 100%;
+                height: 36px;
+                line-height: 36px;
+                border-radius: 4px 4px 4px 4px;
+                font-weight: 400;
+                font-size: 14px;
+                color: #666666;
+                cursor: pointer;
+                }
+
+                .kc_list_item:hover {
+                font-weight: 400;
+                font-size: 14px;
+                color: #666666;
+                background: #f0f2f5;
+                border-radius: 4px 4px 4px 4px;
+                }
+
+                .select_kc {
+                font-weight: 400;
+                font-size: 14px;
+                color: #2e64fa;
+                background: #eaf0ff;
+                border-radius: 4px 4px 4px 4px;
+                }
+            }
+            }
+        }
+
+        .scan_content_right {
+            width: calc(100% - 200px - 20px);
+            height: 100%;
+            background-color: #ffffff;
+            border-radius: 10px;
+
+            .right_search {
+            width: calc(100% - 40px);
+            margin: auto;
+            height: 76px;
+            display: flex;
+            justify-content: space-between;
+            align-items: center;
+
+            .search_input {
+                width: auto;
+            }
+
+            .search_button {
+
+                width: auto;
+                display: flex;
+                justify-content: flex-end;
+                // gap: 10px;
+            }
+            }
+
+            .right_table {
+            width: calc(100% - 40px);
+            margin: auto;
+            }
+        }
+
+        .scan_content_rights {
+            width: calc(100% - 200px - 20px);
+            height: 100%;
+
+            border-radius: 10px;
+            display: flex;
+            justify-content: space-between;
+
+            .rights_center {
+            width: calc(100% - 380px);
+            height: 100%;
+
+            .main_container {
+                width: 100%;
+                height: 100%;
+
+                .no_paper_url {
+                height: 100%;
+                display: flex;
+                justify-content: center;
+                align-items: center;
+                }
+            }
+
+            .center_image {
+                width: 100%;
+                height: calc(100% - 180px);
+                margin-bottom: 20px;
+            }
+
+            .center_images {
+                width: 100%;
+                height: calc(100% - 100px);
+                margin-bottom: 20px;
+            }
+
+            .center_search {
+                width: 100%;
+                height: 60px;
+                background: #FFFFFF;
+                border-radius: 10px 10px 10px 10px;
+                padding: 0 16px;
+                box-sizing: border-box;
+
+            }
+
+            .center_list {
+                width: 100%;
+                height: calc(100% - 120px);
+                overflow-y: auto;
+            }
+
+
+
+
+
+            }
+
+            .rights_right {
+            width: 360px;
+            height: 100%;
+            background-color: #ffffff;
+            border-radius: 10px;
+            position: relative;
+            }
+
+            .right_title {
+            width: 100%;
+            height: 50px;
+            line-height: 60px;
+            font-weight: 600;
+            font-size: 16px;
+            color: #333333;
+            display: flex;
+            justify-content: space-between;
+            }
+
+            .right_button {
+            width: 100%;
+            height: 76px;
+            position: absolute;
+            bottom: 0px;
+            left: 0px;
+            display: flex;
+            justify-content: center;
+            align-items: center;
+
+            .bottom_button_item {
+                width: calc(100% - 40px);
+                margin: auto;
+                // display: flex;
+                // justify-content: center;
+                // align-items: center;
+                height: 36px;
+            }
+            }
+
+        }
+
+        .abnormal_left {
+            width: calc(100% - 360px - 20px);
+            height: 100%;
+            background-color: transparent;
+
+            .left_nav {
+            width: 100%;
+            height: 60px;
+            border-radius: 10px;
+            background-color: #ffffff;
+            display: flex;
+            justify-content: space-between;
+            align-items: center;
+
+            .nav_list {
+                display: flex;
+                justify-content: flex-start;
+                align-items: center;
+
+                .nav_item {
+                width: 111px;
+                height: 36px;
+                line-height: 36px;
+                text-align: center;
+                background: #ffffff;
+                border-radius: 4px 4px 4px 4px;
+                border: 1px solid #dcdfe6;
+
+                font-weight: 400;
+                font-size: 16px;
+                color: #666666;
+                margin-left: 20px;
+                cursor: pointer;
+                position: relative;
+
+                .nav_number {
+                    position: absolute;
+                    right: -10px;
+                    top: -10px;
+                    width: 25px;
+                    height: 25px;
+                    line-height: 25px;
+                    text-align: center;
+                    border-radius: 50%;
+                    background: #f56c6c;
+                    font-weight: 400;
+                    font-size: 12px;
+                    color: #ffffff;
+                    white-space: nowrap; // 添加这一行防止换行
+                }
+                }
+
+                .item_active {
+                background: #2e64fa;
+                border-radius: 4px 4px 4px 4px;
+                font-weight: 500;
+                font-size: 16px;
+                color: #ffffff;
+                border: 1px solid #2e64fa;
+                }
+            }
+
+            .nav_button {
+                display: flex;
+                justify-content: flex-end;
+                margin-right: 20px;
+
+                .el-button {
+                margin-left: 20px;
+                }
+
+                .is_draw_data {
+                width: 80px;
+                height: 34px;
+                font-size: 14px;
+                color: #333333;
+                border: 1px solid #dcdfe6;
+                line-height: 34px;
+                text-align: center;
+                border-radius: 4px;
+                cursor: pointer;
+                }
+
+                .is_draw_active {
+                width: 80px;
+                height: 34px;
+                font-size: 14px;
+                color: #333333;
+                border: 1px solid #dcdfe6;
+                line-height: 34px;
+                text-align: center;
+                border-radius: 4px;
+                cursor: pointer;
+                background-color: #2E64FA;
+                color: #fff;
+                }
+
+                .el-input__inner {
+                width: 100%;
+                height: 36px !important;
+                }
+
+            }
+            }
+
+            .left_image {
+            width: 100%;
+            height: calc(100% - 60px - 80px - 10px);
+
+            .img_canvas_content {
+                display: flex;
+                justify-content: space-between;
+                align-items: center;
+                width: 100%;
+                height: 100%;
+                // background-color: red;
+            }
+
+            //定位异常区
+            .position_abnormal_content {
+
+                width: 100%;
+                height: 100%;
+                display: flex;
+                justify-content: space-between;
+
+                //标准模板区域
+                .template_content {
+                width: calc(50% - 20px);
+                height: 100%;
+
+                }
+
+                .paper_content {
+                width: calc(50% - 20px);
+                height: 100%;
+
+                }
+
+                .content_header {
+                width: 100%;
+                height: 44px;
+                line-height: 44px;
+                display: flex;
+                justify-content: space-between;
+
+                .header_left {
+                    width: auto;
+                    color: #666;
+                    font-size: 16px;
+                    line-height: 44px;
+                }
+
+                .header_right {
+                    width: auto;
+                    display: flex;
+                    justify-content: flex-end;
+                    align-content: center;
+                    align-items: center;
+                    gap: 20px;
+
+                    .page_num_item {
+                    width: 40px;
+                    height: 24px;
+                    background: #fff;
+                    text-align: center;
+                    line-height: 24px;
+                    font-size: 14px;
+                    color: #666;
+                    border-radius: 4px;
+                    cursor: pointer;
+                    }
+
+                    .page_num_active {
+                    width: 40px;
+                    height: 24px;
+                    background: #2E64FA;
+                    text-align: center;
+                    line-height: 24px;
+                    font-size: 14px;
+                    color: #fff;
+                    border-radius: 4px;
+                    cursor: pointer;
+                    }
+
+                    i {
+                    font-size: 30px;
+                    color: #666;
+                    cursor: pointer;
+
+                    }
+
+                    i:hover {
+                    color: #2E64FA;
+                    }
+                }
+                }
+
+                .content_canvas {
+                width: 100%;
+                height: calc(100% - 54px);
+                background-color: #E6EAF2;
+                border-radius: 10px;
+                }
+
+            }
+
+            .img_canvas_center {
+                display: flex;
+                justify-content: center;
+                align-items: center;
+                width: 100%;
+                height: calc(100% - 10px);
+
+                position: relative;
+                overflow: hidden;
+                /* 超出部分隐藏 */
+                background-color: #E6EAF2;
+                // background-color: red;
+                border-radius: 10px;
+
+                .main_container {
+                width: calc(100% - 20px);
+
+                height: calc(100% - 10px);
+                position: relative;
+                background: transparent;
+                user-select: none;
+                overflow: hidden;
+                display: flex;
+                justify-content: center;
+                align-items: center;
+                // border:1px solid red;
+
+                .paper_template {
+                    position: absolute;
+                }
+                }
+
+
+            }
+
+            .mark_list_center {
+                width: 100%;
+                height: calc(100% - 10px);
+
+                .mark_list {
+                width: 100%;
+                height: 100%;
+                overflow-y: auto;
+                }
+            }
+
+            //标准模板区域
+            .img_template {
+                width: 50%;
+                height: 100%;
+                // background-color: #08C2B3;
+
+                .template_name {
+                width: 100%;
+                font-weight: 500;
+                font-size: 16px;
+                color: #666666;
+                line-height: 25px;
+                margin-top: 15px;
+                text-align: center;
+                }
+
+                .template_container {
+                width: 100%;
+                margin: auto;
+                height: calc(100% - 40px);
+                border-radius: 4px;
+                position: relative;
+                overflow: hidden;
+                // background-color: red;
+                }
+            }
+
+            //切飞试卷区域
+            .img_paper {
+                width: 50%;
+                height: 100%;
+
+                .paper_name {
+                width: 100%;
+                font-weight: 500;
+                font-size: 16px;
+                color: #666666;
+                line-height: 25px;
+                margin-top: 15px;
+                text-align: center;
+                }
+
+                .paper_container {
+                width: 100%;
+                margin: auto;
+                height: calc(100% - 40px);
+                border-radius: 4px;
+                position: relative;
+                overflow: hidden;
+                }
+            }
+            }
+
+            .left_image_height_1 {
+            height: calc(100% - 60px - 80px - 10px);
+            }
+
+            .left_image_height_2 {
+            height: calc(100% - 60px);
+            }
+
+        }
+
+        .abnormal_right {
+            width: 360px;
+            border-radius: 10px;
+            height: 100%;
+            background-color: #ffffff;
+            position: relative;
+
+            .height_132 {
+            height: 132px;
+            }
+
+            .height_76 {
+            height: 76px;
+            }
+
+            .right_bottom_button {
+            position: absolute;
+            right: 0;
+            bottom: 0;
+            width: 100%;
+
+            z-index: 999;
+
+            .bottom_button_item {
+                width: 100%;
+                // display: flex;
+                // justify-content: center;
+                // align-items: center;
+                height: 56px;
+            }
+
+            .bottom_button_two {
+                width: calc(100% - 40px);
+                margin: auto;
+                display: flex;
+                justify-content: space-between;
+                margin-bottom: 20px;
+            }
+            }
+
+            .right_title {
+            width: 100%;
+            height: 50px;
+            line-height: 60px;
+            font-weight: 600;
+            font-size: 16px;
+            color: #333333;
+            display: flex;
+            justify-content: space-between;
+            }
+
+            .right_search {
+            margin-bottom: 12px;
+            display: flex;
+            justify-content: space-between;
+            align-items: center;
+            }
+        }
+
+        .left_bottom {
+            width: 100%;
+            height: 80px;
+            display: flex;
+            justify-content: space-between;
+
+            .draggable_width_100 {
+            width: 100%;
+            }
+
+            .draggable_width_auto {
+            width: calc(100% - 256px - 20px);
+            }
+
+            .bottom_draggable {
+            background: rgba(9, 9, 9, 0.1);
+            border-radius: 10px 10px 10px 10px;
+            cursor: pointer;
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            gap: 20px;
+
+            .bottom_img_item {
+                width: auto;
+                height: 70px;
+                position: relative;
+                display: flex;
+                justify-content: center;
+                align-items: center;
+                object-fit: cover; //保持图片比例;
+                max-width: 120px;//设置图片最大宽度
+
+                .bottom_img_item_number {
+                position: absolute;
+                left: 45%;
+                top: 40%;
+                font-weight: 400;
+                font-size: 24px;
+                color: #666666;
+                line-height: 22px;
+                }
+            }
+
+            .img_item_cur {
+                background: rgba(46, 100, 250, 0.2);
+                border-radius: 4px 4px 4px 4px;
+                border: 2px solid #2e64fa;
+            }
+
+            .move_container {
+                width: 100%;
+
+                background-color: red;
+
+                display: flex;
+                justify-content: center;
+                align-items: center;
+                gap: 20px;
+                width: 100%;
+                height: 80px;
+                background-color: rgba(9, 9, 9, 0.1);
+                border-radius: 10px;
+            }
+            }
+
+            .bottom_tool {
+            width: 256px;
+            height: 80px;
+
+            background: #ffffff;
+            border-radius: 10px 10px 10px 10px;
+            border: 1px solid #e4e7ed;
+            display: flex;
+            justify-content: space-around;
+            align-items: center;
+
+            .tool_btn_item {
+                width: auto;
+                height: auto;
+
+                cursor: pointer;
+
+                // 逆时针旋转
+                .counterclockwise_icon {
+                width: 100%;
+                height: 30px;
+                background-image: url("../assets/icon/counterclockwise_icon.png");
+                background-position: 50% 50%;
+                background-size: 22px 20px;
+                background-repeat: no-repeat;
+                }
+
+                // 顺时针旋转
+                .clockwise_icon {
+                width: 100%;
+                height: 30px;
+                background-image: url("../assets/icon/clockwise_icon.png");
+                background-position: 50% 50%;
+                background-size: 22px 20px;
+                background-repeat: no-repeat;
+                }
+
+                // 放大
+                .enlarge_icon {
+                width: 100%;
+                height: 30px;
+                background-image: url("../assets/icon/enlarge_icon.png");
+                background-position: 50% 50%;
+                background-size: 22px 20px;
+                background-repeat: no-repeat;
+                }
+
+                // 缩小
+                .shrink_icon {
+                width: 100%;
+                height: 30px;
+                background-image: url("../assets/icon/shrink_icon.png");
+                background-position: 50% 50%;
+                background-size: 22px 20px;
+                background-repeat: no-repeat;
+                }
+
+                .btn_text {
+                font-weight: 400;
+                font-size: 14px;
+                color: #666666;
+                text-align: center;
+                }
+            }
+            }
+        }
+        }
+
+        .left_question {
+        width: calc(100% - 40px);
+        margin: auto;
+        height: calc(100% - 80px);
+        overflow-y: auto;
+        }
+
+        .question_item {
+        width: 100%;
+        height: 30px;
+        line-height: 30px;
+
+        display: flex;
+        justify-content: space-between;
+        font-size: 14px;
+        color: #666666;
+        padding: 0px 16px;
+        box-sizing: border-box;
+        cursor: pointer;
+        margin-bottom: 3px;
+        }
+
+        .question_item:hover {
+        background: #F0F2F5;
+        border-radius: 4px 4px 4px 4px;
+        }
+
+        .question_item_cur {
+        background: rgba(46, 100, 250, 0.1);
+        border-radius: 4px 4px 4px 4px;
+        color: #2E64FA;
+
+        }
+    }
 }

+ 6 - 0
src/styles/element.scss

@@ -162,4 +162,10 @@ button:focus, button:focus-visible {
 }
 .el-pagination.is-background .el-pager li.is-active {
   background: #2E64FA;
+}
+
+//全屏弹窗
+.el-dialog.is-fullscreen
+{
+  padding: 0 !important;
 }

+ 0 - 0
src/views/abnormal/考试异常处理.txt


+ 570 - 0
src/views/exam/abnormal/abnormal.vue

@@ -0,0 +1,570 @@
+<template>
+ <!-- 异常处理   -->
+  <div class="content_main">
+    <div class="abnormal_left">
+        <div class="left_nav">
+            <div class="nav_list">
+                <!-- abnormalType:2,//页面异常类型   2-定位异常 3-考号异常 4-客观题异常 5-选做题异常 6-空白卷异常  7 缺页异常 -->
+                <div class="nav_item" :class="abnormalType==2?'item_active':''" @click="AbnormalChanage(2)">
+                    <div class="nav_number" v-if="abnormalObj.locationErrorNum>0">{{ abnormalObj.locationErrorNum }}</div>
+                    定位异常
+                </div>
+                <div class="nav_item" :class="abnormalType==3?'item_active':''" @click="AbnormalChanage(3)">
+                    <div class="nav_number"  v-if="abnormalObj.examNumberErrorNum>0">{{ abnormalObj.examNumberErrorNum }}</div>
+                    考号异常
+                </div>
+                <div class="nav_item" :class="abnormalType==7?'item_active':''" @click="AbnormalChanage(7)">
+                    <div class="nav_number"  v-if="abnormalObj.losePageErrorNum>0">{{ abnormalObj.losePageErrorNum }}</div>
+                    缺页异常
+                </div>
+                <div class="nav_item" :class="abnormalType==4?'item_active':''" @click="AbnormalChanage(4)">
+                    <div class="nav_number"  v-if="abnormalObj.objectErrorNum>0">{{ abnormalObj.objectErrorNum }}</div>
+                    客观题异常
+                </div>
+                <div class="nav_item" :class="abnormalType==5?'item_active':''" @click="AbnormalChanage(5)">
+                    <div class="nav_number"  v-if="abnormalObj.choiceErrorNum>0">{{ abnormalObj.choiceErrorNum }}</div>
+                    选做题异常
+                </div>
+                <div class="nav_item" :class="abnormalType==6?'item_active':''" @click="AbnormalChanage(6)" v-if="markType==1">
+                    <div class="nav_number"  v-if="abnormalObj.subjectiveErrorNum>0">{{ abnormalObj.subjectiveErrorNum }}</div>
+                    划分异常
+                </div>
+            </div>
+            <div class="nav_button el_button">
+                <div :class="isShowDraw?'is_draw_data':'is_draw_active'" @click="ShowDrawData()" v-if="abnormalType==4">显示画框</div>
+                <el-select  v-if="abnormalType==6" style="width: 100px;" v-model="isShowDrawType" placeholder="显示类型" @change="SubjectDataChange()">
+                    <el-option label="答题卡" value="1"></el-option>
+                    <el-option label="划分区" value="2"></el-option>
+                </el-select>
+                <el-button class="refresh_btn" @click="RefreshAbnormalList()"><i class="iconfont icon_shuaxin"></i>刷新</el-button>
+                <el-button class="fit_screen_btn" @click="FitScreen()">适应屏幕</el-button>
+            </div>
+        </div>
+        <div class="left_image" :class="abnormalType==6 && isShowDrawType==2?'left_image_height_2':'left_image_height_1'">
+            <!-- 定位异常试卷区 -->
+            <div class="page_jg_10"></div>
+            <div v-if="abnormalType==2" class="position_abnormal_content">
+                <div class="template_content">
+                    <div class="content_header">
+                        <div class="header_left">
+                            标准模板
+                        </div>
+                        <div class="header_right">
+                            <div :class="item.pageNum==currentTemplatePageIndex?'page_num_active':'page_num_item'"  v-for="(item,index) in currentTemplateList" :key="'template_'+index" @click="ChangeTemplatePage(item)">{{item.pageNum}}</div>
+                        </div>
+                    </div>
+                    <div class="content_canvas">
+                        <PositionCanvas ref="PositionCanvas" :usedCardType="usedCardType" :positionList="sourcePoints"  :paperImgUrl="currentTemplateUrl" @GetCutPosition="GetCutTemaplatePosition" :paperType="usedCardType==1?'template':'student'"   v-if="currentTemplateUrl"> </PositionCanvas>
+                    </div>
+                </div>
+                <div class="paper_content">
+                    <div class="content_header">
+                        <div class="header_left">
+                            答题卡
+                            <span v-if="currentImagePageNo==''" style="color:red;">(当前图片页码未保存)</span>
+                            <span v-else style="color:green;">(当前图片页码已设置为:{{currentImagePageNo}})</span>
+                        </div>
+                        <div class="header_right el_button">
+                            <i class="iconfont icon_nishizhen" @click="AnticlockwiseImage()"></i>
+                            <i class="iconfont icon_shunshizhen" @click="ClockwiseImage()"></i>
+                            <el-button type="primary" class="right_button_editor" @click="MarkBlankPage()">标记为空白页</el-button>
+                            <el-button type="primary" class="right_button_editor" style="margin-left: 0px;" @click="SavePositionImage()">保存</el-button>
+                        </div>
+                    </div>
+                    <div class="content_canvas">
+                        <PositionCanvas ref="PaperCanvas" :usedCardType="usedCardType" :positionList="targetPoints"  :paperImgUrl="currentPaperUrl"  @GetCutPosition="GetCutStudentPosition" paperType="student" v-if="currentPaperUrl"> </PositionCanvas>
+                    </div>
+                </div>
+
+            </div>
+            <!-- 考号异常试卷区 -->
+            <!-- abnormalType:2,//页面异常类型   2-定位异常 3-考号异常 4-客观题异常 5-选做题异常 6-空白卷异常  7 缺页异常 -->
+            <!-- <div v-if="abnormalType==3  || abnormalType ==6 || abnormalType ==7" class="img_canvas_center">
+                <ImageCavasShow :paperImgUrl="currentPaperUrl"></ImageCavasShow>
+            </div> -->
+            <!-- <div v-if="abnormalType ==4 " class="img_canvas_center">
+                <ImageCanvas :currentPaperInfo="currentPaperInfo" > </ImageCanvas>
+            </div> -->
+            <div v-if="abnormalType==3 || abnormalType ==7 || abnormalType ==4 || abnormalType ==5" class="img_canvas_center">
+                <ActionImage ref="ActionCanvas" :isDrag="true" :paperInfo="currentPageInfo"  :paperImgUrl="currentPaperUrl" :drawData="currentDrawData" :isAbnormal="true"></ActionImage>
+            </div>
+            <!-- 划分异常试卷区 -->
+            <div v-if="abnormalType==6" :class="isShowDrawType==1?'img_canvas_center':'mark_list_center'">
+                <template v-if="isShowDrawType==1">
+                    <ActionImage ref="ActionCanvas" :isDrag="true" :paperInfo="currentPageInfo"  :paperImgUrl="currentPaperUrl" :drawData="currentDrawData" :isAbnormal="true"></ActionImage>
+                </template>
+                <template v-else> 
+                    
+                    <div class="mark_score_center mark_list" ref="abnormalList" v-if="isShowAbnormalQuestion">
+                        <div class="center_item" :id="`student-${item.id}`"  :class="subjectStudentIndex==item.subjectiveIndex?'center_item_cur':''" v-for="(item,index) in subjectStudentAbnormal" :key="index">
+                            <div class="item_header">
+                                <div class="header_student_name">
+                                    <span>{{item.questionName}} </span>
+                                </div>
+                                <div class="header_student_score">得分:{{item.score}}</div>
+                            </div>
+                            <div class="item_image">
+                                <MarkScore :drawData="item.reviewQuestionScoreList" :fullScore="item.fullScore" :score="item.score" :paperImgUrl="item.url" @GetClickItem="(score) => GetMarkScoreClickItem(score,item, index)"></MarkScore>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="mark_score_center mark_list" ref="allList" v-else>
+                        <div class="center_item" :id="`student-${item.id}`"  :class="subjectStudentIndex==item.subjectiveIndex?'center_item_cur':''" v-for="(item,index) in subjectStudentQuestion" :key="index">
+                            <div class="item_header">
+                                <div class="header_student_name">
+                                    <span>{{item.questionName}} </span>
+                                </div>
+                                <div class="header_student_score">得分:{{item.score}}</div>
+                            </div>
+                            <div class="item_image">
+                                <MarkScore :drawData="item.reviewQuestionScoreList" :fullScore="item.fullScore" :score="item.score" :paperImgUrl="item.url" @GetClickItem="(score) => GetMarkScoreClickItem(score,item, index)"></MarkScore>
+                            </div>
+                        </div>
+                    </div>
+                </template>
+            </div>
+        </div>
+        <div class="page_jg"></div>
+        <div class="left_bottom" v-if="!(abnormalType==6 && isShowDrawType==2)">
+            <div class="bottom_draggable draggable_width_100" >
+                <div v-for="(item,index) in studentPaperList" class="bottom_img_item"  :class="currentPaperIndex == index?'img_item_cur':''" @click="ChanageCurrentPaperUrl(index, item)" :key="'paper_'+index">
+                    <img style="width: 100%;height: 100%" :src="item.recognizeUrl" alt="" >
+                    <div class="bottom_img_item_number" v-if="abnormalType==2">{{index+1}}</div>
+                    <div class="bottom_img_item_number" v-else>
+                        <span v-if="item.pageNo>0">{{item.pageNo}}</span>
+                        <span v-else></span>
+                    </div>
+                </div>  
+            </div>
+        </div>
+    </div>
+    <div class="abnormal_right">
+        <!-- 定位异常区域 -->
+        <div class="right_center" v-show="abnormalType==2">
+            <div class="page_jg_20" ></div>
+            <div class="right_table">   
+                <el-table @row-click="PendingListRowClick" :row-class-name="TableRowClassName"  border  :data="positionData.pendingList" style="width:100%;"   :height="tableHeightRight" align="left" >
+                    <el-table-column align="center" width="40" type="index" label="序号"></el-table-column>  
+                    <!-- <el-table-column align="center" prop="batchNo" width="45" label="批次"></el-table-column> -->
+                    <el-table-column align="center"  width="65" label="批次">
+                        <template v-slot="scope">
+                        {{GetPositionSelNumber(scope.row)}}
+                        
+                        </template>
+                    </el-table-column>
+                    <el-table-column align="center" prop="studentName" label="姓名">
+                        <template v-slot="scope">
+                            <span v-if="scope.row.studentName">{{scope.row.studentName}} </span>
+                            <span v-else>-</span>
+                        </template>
+                    </el-table-column>  
+                    <el-table-column align="center" prop="cardNumber" label="考号">
+                        <template v-slot="scope">
+                            <span v-if="scope.row.cardNumber">{{scope.row.cardNumber}} </span>
+                            <span v-else>-</span>
+                        </template>
+                    </el-table-column>
+                    <!-- <el-table-column align="center" prop="examDate" label="班级"></el-table-column> -->
+                </el-table>
+                
+            </div>
+            <div class="right_bottom_button el_button">
+                <div class="page_jg_20"></div>
+                <div class="bottom_button_two">
+                    <el-button @click="ReCutPaper()" class="re_cut_btn" :loading="reCutLoading">
+                        {{reCutText}}
+                    </el-button>
+                    <el-button @click="DeleteCurrentPaper()" class="delete_paper_btn">删除当前试卷</el-button>
+                </div>
+                <!-- <div class="bottom_button_item">
+                    <el-button @click="recyleMethod" class="recycle_bin_btn">回收站</el-button>
+                </div> -->
+            </div>
+        </div>
+        <!-- 考号异常区域 -->
+        <div class="right_center" v-show="abnormalType==3">
+            
+            <div class="right_table">   
+                <div class="right_title">
+                    考号异常处理
+                </div>
+
+                <!-- abnormalType 0-正常 1-考号未识别出来 2-无此考生 3-考号重复(1,2,3都代表考号异常) 4-定位异常 5-缺页异常  -->
+                <el-table ref="numberPendingTable" @row-click="PendingListRowClick" :row-class-name="TableRowClassName" :data="numberData.pendingList" max-height="300" border  stripe>
+                    <el-table-column align="center" type="index" width="40" label="序号">
+                    </el-table-column>
+                    <!-- <el-table-column align="center" prop="batchNo" width="45" label="批次"></el-table-column> -->
+                    <el-table-column align="center"  width="65" label="批次">
+                        <template v-slot="scope">
+                        {{GetPositionSelNumber(scope.row)}}
+                        
+                        </template>
+                    </el-table-column>
+                    <el-table-column align="center" prop="studentName"  width="80" label="姓名">
+                        <template v-slot="scope">
+                            <div v-if="scope.row.studentName" class="table_row_value">
+                            <span class="card_number_repeat" v-if="scope.row.abnormalType==3">重</span> {{scope.row.studentName}} 
+                            </div>
+                            <span v-else>-</span>
+                        </template>
+                    </el-table-column>
+                    <el-table-column align="center" prop="cardNumber" label="考号">
+                        <template v-slot="scope">
+                            <span v-if="scope.row.cardNumber" :class="scope.row.abnormalType==2?'card_number_error':''">{{scope.row.cardNumber}} </span>
+                            <span v-else>-</span>
+                        </template>
+                    </el-table-column>
+                    <!-- <el-table-column align="center" prop="schoolClassName"  label="班级"></el-table-column> -->
+                </el-table>
+                <!-- <el-table   :data="numberData.processedList"  border max-height="150"  v-if="rightTab=='processed'">
+                    <el-table-column align="center" type="index" width="60" label="序号">
+                    </el-table-column>
+                    <el-table-column align="center"  prop="studentName"  label="姓名"></el-table-column>
+                    <el-table-column align="center" prop="exCode"  label="考号"></el-table-column>
+                    <el-table-column align="center" prop="schoolClassName"  label="班级"></el-table-column>
+                </el-table> -->
+                <div class="right_title">
+                    查询学生进行认领
+                </div>
+                <div  class="right_search el_button">
+                    <el-input type="text" style="width: 220px;" @keyup.enter.native="GetSearchStudent" v-model="searchContent" @input="GetSearchStudent" placeholder="学生姓名、考号" >
+                        <el-button slot="append" icon="el-icon-search" style="width:68px;"  @click="GetSearchStudent"></el-button>
+                    </el-input>
+                    <el-button  class="editor_item" @click="OpenAddStudentDialog" >新增考生</el-button>
+                </div>
+                <el-table  :data="searchStudetList" border :max-height="searchTableHeight" stripe style="width: 100%;">
+                <el-table-column align="center"  prop="studentName" width="70"  label="姓名">
+                        <template v-slot="scope">
+                            <div class="table_row_value" :title="scope.row.studentName">
+                                {{scope.row.studentName}}
+                            </div>
+                        </template>
+                </el-table-column>
+                <el-table-column align="center" prop="cardNumber"  label="考号" show-overflow-tooltip></el-table-column>
+                <el-table-column align="center" prop="pageNum"  label="页数" width="70" >
+                        <template v-slot="scope">
+                            <div class="table_row_value" >
+                                {{ GetPaperPageNum(scope.row) }}
+                            </div>
+                        </template>
+                </el-table-column>
+                <!-- <el-table-column align="center" prop="adminClassName" width="40"   label="班级"></el-table-column> -->
+                <!-- <el-table-column align="center"  width="60" label="状态">
+                        <template v-slot="scope">
+                            <div class="row_scan_status">
+                                <div class="no_scan_btn" v-if="scope.row.scannedStatus == 0">
+                                    未扫描
+                                </div>
+                                <div class="yes_scan_btn" v-if="scope.row.scannedStatus == 1">
+                                    已扫描
+                                </div>
+                                <div class="repeat_scan_btn" v-if="scope.row.scannedStatus == 7">
+                                    重号
+                                </div>
+                            </div>
+                        </template>
+                </el-table-column> -->
+                <el-table-column align="center"  width="90"   label="操作">
+                        <template v-slot="scope">
+                            <div class="row_scan_status">
+                                <div class="claim_scan_btn" v-if="scope.row.scanPictureVOS" @click="OpenViewPaper(scope.row)" >
+                                    查看
+                                </div>
+                                <div class="disable_view_btn" v-else>
+                                    查看
+                                </div>
+                                <div class="claim_scan_btn"  @click="KaohaoClaimConfirm(scope)">
+                                    认领
+                                </div>
+                            </div>
+                        </template>
+                </el-table-column>
+            </el-table>
+                
+            </div>
+            <div class="right_bottom_button el_button">
+                <div class="page_jg_20"></div>
+                <div class="bottom_button_two">
+                    <!-- <el-button  class="re_cut_btn" @click="OpenAddStudentDialog" >新增考生</el-button> -->
+                    <el-button @click="MarkPositionAbnormal" class="abnormal_other_btn">标记定位异常</el-button>
+                    <el-button @click="DeleteCurrentPaper()" class="delete_paper_btn">删除当前试卷</el-button>
+                </div>
+                
+            </div>
+        </div>
+        <!-- 缺页异常区域 -->
+        <div class="right_center" v-show="abnormalType==7">
+            <div class="page_jg_20" ></div>
+            <div class="right_table">   
+                <el-table @row-click="PendingListRowClick" :row-class-name="TableRowClassName"  border  :data="losePageData.pendingList" stripe  :height="losePagetableHeight" align="left" >
+                    <el-table-column align="center" width="60" type="index" label="序号"></el-table-column>  
+                    <el-table-column align="center"  width="55" label="批次">
+                        <template v-slot="scope">
+                        {{GetPositionSelNumber(scope.row)}}
+                        </template>
+                    </el-table-column>
+                    <el-table-column align="center" prop="studentName" width="70" label="姓名">
+                        <template v-slot="scope">
+                            <span v-if="scope.row.studentName">{{scope.row.studentName}} </span>
+                            <span v-else>-</span>
+                        </template>
+                    </el-table-column>  
+                    <el-table-column align="center" prop="cardNumber" label="考号">
+                        <template v-slot="scope">
+                            <span v-if="scope.row.cardNumber">{{scope.row.cardNumber}} </span>
+                            <span v-else>-</span>
+                        </template>
+                    </el-table-column>
+                    <el-table-column align="center" prop="examDate" width="40" label="页数">
+                        <template v-slot="scope">
+                            <span v-if="scope.row.scanPictureVOS">{{scope.row.scanPictureVOS.length}} </span>
+                            <span v-else>-</span>
+                        </template>
+                    </el-table-column>
+                </el-table>
+                
+            </div>
+            <div class="right_bottom_button el_button">
+                <div class="page_jg_20"></div>
+                <div class="bottom_button_two">
+                    <el-button @click="MarkPositionAbnormal" class="abnormal_other_btn">标记定位异常</el-button>
+                    <el-button @click="MarkExamNumberAbnormal" class="abnormal_other_btn">标记考号异常</el-button>
+                </div>
+                <div class="bottom_button_item">
+                    <!-- <el-button @click="recyleMethod" class="recycle_bin_btn">回收站</el-button> -->
+                    <!-- 缺页异常删除 需要用delete_batch_pic 接口 -->
+                    <el-button @click="LosePageDelete()" class="delete_paper_btn_100">删除当前试卷</el-button>
+                </div>
+            </div>
+        </div>
+        <!-- 客观题异常区域 -->
+        <div class="right_center" v-show="abnormalType==4">
+            <!-- 已处理未开发完成 暂时先屏蔽切换 -->
+            <div class="right_user_tab">
+                <div class="tab_system_user" :class="rightTab == 'pending'?'select_cur':''" @click="ChangeTab('pending')">
+                    待处理({{objectData.pendingList.length}})
+                </div>
+                <div class="tab_temporay_user" :class="rightTab == 'processed'?'select_cur':''" @click="ChangeTab('processed')">
+                    已处理({{objectData.processedList.length}})
+                </div>
+            </div>
+            <div class="page_jg_20"></div>
+            <div class="right_table" ref="objectQuestionTable">   
+                <el-table @row-click="PendingListRowClick" :row-class-name="TableRowClassName" :data="objectData.pendingList" max-height="238" border v-show="rightTab=='pending'">
+                    <el-table-column align="center" type="index" label="序号" width="40"></el-table-column>  
+                    <el-table-column align="center"  width="55" label="批次">
+                        <template v-slot="scope">
+                            {{GetPositionSelNumber(scope.row)}}
+                        </template>
+                    </el-table-column>
+                    <el-table-column align="center" prop="studentName" width="70"  label="姓名" show-overflow-tooltip></el-table-column>
+                    <el-table-column align="center" prop="exCode"  label="考号" show-overflow-tooltip></el-table-column>
+                    <el-table-column align="center" prop="adminClassName" width="65" label="班级"></el-table-column>
+                </el-table>
+                <el-table @row-click="PendingListRowClick" :row-class-name="TableRowClassName"  :data="objectData.processedList"  border max-height="238"  v-show="rightTab=='processed'">
+                    <el-table-column align="center" type="index" width="40" label="序号">
+                    </el-table-column>
+                    <el-table-column align="center"  width="55" label="批次">
+                        <template v-slot="scope">
+                        {{GetPositionSelNumber(scope.row)}}
+                        </template>
+                    </el-table-column>
+                    <el-table-column align="center"  prop="studentName" width="70"  label="姓名" show-overflow-tooltip></el-table-column>
+                    <el-table-column align="center" prop="exCode"  label="考号" show-overflow-tooltip></el-table-column>
+                    <el-table-column align="center" prop="adminClassName" width="65"  label="班级" show-overflow-tooltip></el-table-column>
+                </el-table>
+                <div class="right_title">
+                    <div >客观题异常处理
+                        <span @click="ClearValue()"  class="clear_value">清空</span>
+                    </div>
+                    
+                    <div ><el-checkbox v-model="isShowAbnormalQuestion" >只显示异常题</el-checkbox></div>
+                </div>
+            </div>
+            <div class="answer_table">
+                <el-table :data="questionTableData" :height="objectTableHeight" border  :row-class-name="ObjectTableClassName" :key="tableKey" >
+                    <el-table-column align="center" prop="objectiveName" label="题号" width="90"></el-table-column>  
+                    <el-table-column align="center" prop="studentName"  label="选项">
+                        <template v-slot="scope">
+                            <div class="table_row_answer_choose" v-if="scope.row.questionType==3">
+                                <div class="answer_item" @click="ChooseAnswer(scope.row,GetLetterToNumberTF(item))" :class="IsCunzai(scope.row.selectValue,GetLetterToNumberTF(item))?'choose':''" v-for="(item,index) in scope.row.optionNum" :key="index">
+                                    {{GetLetterToNumberTF(item)}}
+                                </div>
+                            </div>
+                            <div class="table_row_answer_choose" v-else>
+                                <div class="answer_item" @click="ChooseAnswer(scope.row,GetLetterToNumber(item))" :class="IsCunzai(scope.row.selectValue,GetLetterToNumber(item))?'choose':''" v-for="(item,index) in scope.row.optionNum" :key="index">
+                                    {{GetLetterToNumber(item)}}
+                                </div>
+                            </div>
+                        </template>
+                    </el-table-column>
+                </el-table> 
+            </div>
+        
+            <!-- <answerPaper :questionList="currentQuestionList" @selectClick="selectClick"></answerPaper> -->
+        
+            <div class="right_bottom_button el_button">
+                <div class="bottom_button_two">
+                    <el-button @click="MarkPositionAbnormal" class="abnormal_other_btn">标记定位异常</el-button>
+                    <el-button @click="ObjectiveCheck" class="re_cut_btn" :loading="correctionLoading">校正完成</el-button>
+                </div>
+            </div>
+        </div>
+        <!-- 选做题异常区域 -->
+        <div class="right_center" v-show="abnormalType==5">
+
+            <!-- 已处理未开发完成 暂时先屏蔽切换 -->
+            <div class="right_user_tab">
+                <div class="tab_system_user" :class="rightTab == 'pending'?'select_cur':''" @click="ChangeTab('pending')">
+                    待处理({{choiceData.pendingList.length}})
+                </div>
+                <div class="tab_temporay_user" :class="rightTab == 'processed'?'select_cur':''" @click="ChangeTab('processed')">
+                    已处理({{choiceData.processedList.length}})
+                </div>
+            </div>
+            <div class="page_jg_20" ></div>
+            <div class="right_table">   
+                <el-table  @row-click="PendingListRowClick" :row-class-name="TableRowClassName" border :data="choiceData.pendingList" max-height="238"   stripe v-show="rightTab=='pending'">
+                    <el-table-column align="center" width="60" type="index" label="序号"></el-table-column>  
+                    <!-- <el-table-column align="left"  prop="examName" label="批次"></el-table-column> -->
+                    <el-table-column align="center" prop="studentName" label="姓名"></el-table-column>  
+                    <el-table-column align="center" prop="exCode" label="考号"></el-table-column>
+                    <el-table-column align="center" prop="adminClassName" label="班级"></el-table-column>
+                </el-table>
+                <el-table  @row-click="PendingListRowClick" :data="choiceData.processedList" :row-class-name="TableRowClassName" border  v-show="rightTab=='processed'"  max-height="238" stripe >
+                    <el-table-column align="center" type="index" width="60" label="序号">
+                    </el-table-column>
+                    <el-table-column align="center"  prop="studentName"  label="姓名"></el-table-column>
+                    <el-table-column align="center" prop="exCode"  label="考号"></el-table-column>
+                    <el-table-column align="center" prop="adminClassName"  label="班级"></el-table-column>
+                </el-table>
+                <div class="right_title">
+                    <div>选做题异常处理</div>
+                    <!-- <div ><el-checkbox v-model="isShowAbnormalQuestion" @change="ChanageObjectQuestionShow">只显示异常题</el-checkbox></div> -->
+                </div>
+                
+            </div>
+            <div class="answer_table">
+                <el-table :data="choiceData.choiceQuestion"  border  :row-class-name="ObjectTableClassName" :key="tableKey" width="100%">
+                    <el-table-column align="center" prop="topicName" label="题号" ></el-table-column>  
+                    <el-table-column align="center" :label="'选做'+choice" v-for="(choice,index) in choiceHeader" :key="index" >
+                        <template v-slot="scope">
+                            <div class="table_row_answer_choose" style="justify-content:center !important;">
+                                <!-- <div class="answer_item"  :class="scope.row.selectValue==scope.row.answerVOS[index].option?'choose':''" @click="ChoiceAnswer(scope.row,scope.row.answerVOS[index].option)">
+                                    {{GetLetterToNumber(scope.row.answerVOS[index].option)}}
+                                </div> -->
+                                <!-- 添加判断,确保 answerVOS[index] 存在 -->
+                                <div v-if="scope.row.answerVOS && scope.row.answerVOS[index]" 
+                                    class="answer_item"  
+                                    :class="scope.row.selectValue==scope.row.answerVOS[index].option?'choose':''" 
+                                    @click="ChoiceAnswer(scope.row,scope.row.answerVOS[index].option)">
+                                    {{GetLetterToNumber(scope.row.answerVOS[index].option)}}
+                                </div>
+                                <div v-else>-</div> <!-- 当没有对应选项时显示占位符 -->
+                            
+                            </div>
+                        </template>
+                    </el-table-column>
+                </el-table> 
+            </div>
+            <div class="right_bottom_button el_button">
+                <div class="bottom_button_two">
+                    <el-button @click="MarkPositionAbnormal" class="abnormal_other_btn">标记定位异常</el-button>
+                    <el-button @click="ChoiceCheck" class="re_cut_btn" :loading="correctionLoading">校正完成</el-button>
+                </div>
+            </div>
+        </div>
+        <!-- 划分异常区域 -->
+        <div class="right_center" v-show="abnormalType==6">
+            <!-- 已处理未开发完成 暂时先屏蔽切换 -->
+            <div class="right_user_tab">
+                <div class="tab_system_user" :class="rightTab == 'pending'?'select_cur':''" @click="ChangeTab('pending')">
+                    待处理({{subjectiveData.pendingList.length}})
+                </div>
+                <div class="tab_temporay_user" :class="rightTab == 'processed'?'select_cur':''" @click="ChangeTab('processed')">
+                    已处理({{subjectiveData.processedList.length}})
+                </div>
+            </div>
+            <div class="page_jg_20" ></div>
+            <div class="right_table" ref="subjectiveQuestionTable">   
+                <el-table   @row-click="PendingListRowClick" :row-class-name="TableRowClassName" border :data="subjectiveData.pendingList" style="width:100%;" max-height="238" v-show="rightTab=='pending'"  stripe align="left">
+                    
+                    <el-table-column align="center" type="index" label="序号" width="40"></el-table-column>  
+                    <el-table-column align="center"  width="55" label="批次">
+                        <template v-slot="scope">
+                            {{GetPositionSelNumber(scope.row)}}
+                        </template>
+                    </el-table-column>
+                    <el-table-column align="center" prop="studentName" width="70"  label="姓名" show-overflow-tooltip></el-table-column>
+                    <el-table-column align="center" prop="exCode"  label="考号" show-overflow-tooltip></el-table-column>
+                    <el-table-column align="center" prop="adminClassName" width="65" label="班级"></el-table-column>
+                </el-table>
+                <el-table @row-click="PendingListRowClick" :row-class-name="TableRowClassName"  :data="subjectiveData.processedList"  border max-height="238"  v-show="rightTab=='processed'">
+                    <el-table-column align="center" type="index" width="40" label="序号">
+                    </el-table-column>
+                    <el-table-column align="center"  width="55" label="批次">
+                        <template v-slot="scope">
+                        {{GetPositionSelNumber(scope.row)}}
+                        </template>
+                    </el-table-column>
+                    <el-table-column align="center"  prop="studentName" width="70"  label="姓名" show-overflow-tooltip></el-table-column>
+                    <el-table-column align="center" prop="exCode"  label="考号" show-overflow-tooltip></el-table-column>
+                    <el-table-column align="center" prop="adminClassName" width="65"  label="班级" show-overflow-tooltip></el-table-column>
+                </el-table>
+                <div class="right_title">
+                    <div>
+                        划分异常处理
+                        <!-- <span @click="ClearValue()"  class="clear_value">清空</span> -->
+                    </div>
+                    
+                    <div v-if="rightTab == 'pending'"><el-checkbox v-model="isShowAbnormalQuestion" @change="SubjectDataChange">只显示异常题</el-checkbox></div>
+                </div>
+            </div>
+            <div class="answer_table">
+                <el-table :data="subjectiveTableData" :height="subjectiveTableHeight" border  :row-class-name="ObjectTableClassName" :key="tableKey" >
+                    <el-table-column align="center" prop="subjectiveName" label="题号" width="90"></el-table-column>  
+                    <el-table-column align="center" prop="score"  label="得分">
+                        <template v-slot="scope">
+                            <el-input v-model="scope.row.score" :class="parseFloat(scope.row.score)>parseFloat(scope.row.subjectiveScore)?'input_error':''" placeholder=""  maxlength="5" @change="ChangeSubjectScore()">
+                                <!-- <div slot="append" class="score_count_append">
+                                    {{scope.row.questionScore || 10.5}}
+                                </div> -->
+                            </el-input>
+                        </template>
+                    </el-table-column>
+                </el-table> 
+            </div>
+            <div class="right_bottom_button  el_button">
+                <div class="bottom_button_two">
+                    <el-button @click="MarkPositionAbnormal" class="abnormal_other_btn">标记定位异常</el-button>
+                    <el-button @click="SubjectiveCheck" class="re_cut_btn" :loading="correctionLoading">校正完成</el-button>
+                </div>
+            </div>
+        </div>
+    </div>
+  </div>
+</template>
+<script lang="ts" setup>
+import { useExamStore } from '@/store/exam'
+import { useRouter } from 'vue-router'
+import { onMounted ,ref} from 'vue';
+
+// 实例化 Store
+const examStore = useExamStore()
+const router = useRouter()
+
+
+onMounted(() => {
+  
+    if (!examStore.currentExam) {
+        console.warn('当前没有选中的考试信息')
+        // 可选:如果没有数据,可以重定向回列表页或提示用户
+    }
+    
+  
+})
+</script>
+ 
+<style lang="scss" scoped>
+
+</style>

+ 418 - 0
src/views/exam/abnormal/tableList.vue

@@ -0,0 +1,418 @@
+<template>
+ <!-- 未扫描  缺考  已上传  列表页面  -->
+  <div class="content_main">
+    <div class="scan_content_left">
+        <div class="right_tab_underline" v-if="scanState == 1">
+            
+            <div class="tab_item" :class="showUploadReview == 0?'tab_item_cur':''" @click="ChangeUploadShow(0)" >
+                考生详情
+            </div>
+            <div class="tab_item" :class="showUploadReview == 1?'tab_item_cur':''" @click="ChangeUploadShow(1)">
+                复查识别
+            </div>
+        </div>
+        <div class="right_user_tab" v-else>
+            <!-- 按考场 1  按班级 2 -->
+            <div class="tab_system_user" :class="activeName == 1?'select_cur':''" @click="OnExam(1)" >
+                按考场
+            </div>
+            <div class="tab_temporay_user" :class="activeName == 2?'select_cur':''" @click="OnClass(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>
+
+        </div>
+        <div v-else class="left_question">
+            <!-- 手阅卡下拉列表 -->
+            <div class="question_item" :class="reviewQuestionIndex=='objectiveIndex'?'question_item_cur':''" @click="ReviewObject()">
+                客观题
+            </div>
+            <div class="question_item" :class="reviewQuestionIndex==item.subjectiveIndex?'question_item_cur':''" v-for="(item,index) in reviewQuestionList" :key="index" @click="ReviewChangeQuestion(item)">
+                <div>  {{item.subjectiveName}} </div>
+                <div>  {{item.subjectiveScore}}分 </div>
+            </div>
+        </div>
+    </div>
+    <!-- 列表界面 -->
+    <div class="scan_content_right" v-if="showUploadReview == 0">
+        <div class="right_search">
+            <div class="search_input">
+                <el-input type="text" v-model="keyWord" placeholder="学生姓名、考号" >
+                    <el-button slot="append" icon="el-icon-search" ></el-button>
+                </el-input>
+            </div>
+            <div class="search_button el_button">
+                <el-button class="refresh_btn" @click="RefreshList()" ><i class="iconfont icon_shuaxin"></i>刷新</el-button>
+                <el-button class="marke_miss_exam_btn" @click="AllMarkedMiss()" v-if="scanState == 0" >全部标缺</el-button>
+                <el-button  class="refresh_btn" @click="ExportData()"><i class="iconfont icon_export" style="margin-right: 5px;"></i>导出</el-button>
+                <el-button style="padding:0px 10px;"  @click="OpenReldentify()" v-if="scanState == 1">重新识别客观题</el-button>
+                <el-button :class="multiSelection.length>0?'marke_normal_btn':'marke_normal_btn_disable'" @click="MarkStudent(2)"  v-if="scanState == 2" :disabled="!multiSelection.length">标记为正常</el-button>
+                <el-button :class="multiSelection.length>0?'marke_anomaly_btn':'marke_anomaly_btn_disable'" @click="MarkCardNumberAbnormal()"  v-if="scanState == 1" :disabled="!multiSelection.length>0">标记为异常</el-button>
+                <el-button :class="multiSelection.length>0?'delete_btn':'delete_btn_disable'"  @click="MarkStudent(4)" v-if="scanState == 1" :disabled=" !multiSelection.length"> 批量删除</el-button>
+            </div>
+        </div>
+        <div class="page_table table_row_42" style="width: calc(100% - 40px); margin: auto;" v-loading="isLoading" element-loading-text="加载中……" element-loading-spinner="el-icon-loading" element-loading-background="#ffffff">
+            <el-table ref="popupTable" :key="scanState" @select-all="SelectCheckAll" @selection-change="HandleSelectionChange"  :data="studentTableData" :height="tableHeight" stripe >
+                <el-table-column align="center" 
+                        
+                    type="selection" width="50" v-if="scanState != 0" ></el-table-column>
+                <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="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">
+                        <!-- 提的bug  沒没有考场显示行政班 -->
+                        <span v-if="scope.row.examRoomName">{{scope.row.examRoomName}}</span>
+                        <span v-else>{{scope.row.adminClassName}}</span>
+
+                    </template>
+                </el-table-column>
+                <el-table-column align="center"  label="填涂标记" v-if="scanState==2">
+                    <template slot-scope="scope">
+                        
+                        <div class="miss_img" v-if="scope.row.paperUrl">
+                        <img :src="scope.row.paperUrl"  alt="">
+                        </div>
+                        <span v-else>-</span>
+                    </template>
+                </el-table-column>
+                <el-table-column align="center" prop="scannedStatus" label="状态" key="scannedStatus">
+                    <template v-slot="scope">
+                        <div class="table_row_scan_state" v-if="scanState == 0">
+                            <div class="state_no_scan"></div>未扫描
+                        </div>
+                        <div class="table_row_scan_state" v-if="scanState == 2">
+                            <div class="state_miss_exam"></div>缺考
+                        </div>
+                        <div class="table_row_scan_state" v-if="scanState == 1">
+                            <div class="state_success_upload"></div>已上传
+                        </div>
+                    </template>
+                </el-table-column>
+                
+                
+                <el-table-column align="center" label="操作" width="160" >
+                    <template v-slot="scope">
+                            <!-- 未扫描 -->
+                        <div class="table_row_option" v-if="scanState == 0">
+                            <span class="option_button_editor" @click="OpenMissExam(scope)">标记为缺考</span>
+                        </div>
+                        <!-- 缺考 -->
+                        <div class="table_row_option" v-if="scanState == 2">
+                            <span class="el_button_editor"  @click="OptionView(scope.row)" v-if="scope.row.paperUrl">查看</span>
+                            <span class="option_button_editor"  @click="MarkToNormal(scope)">标记为正常</span>
+                        </div>
+                        <!-- 已上传 -->
+                        <div class="table_row_option" v-if="scanState == 1">
+                            <span class="el_button_editor"  @click="OptionView(scope.row)">查看</span>
+                            <span class="el_button_delete" @click="UploadDelete(scope.row)">删除</span>
+                        </div>
+                    </template>
+                </el-table-column>
+                
+            </el-table>
+            <div class="page_pagination" v-show="studentList.length>10">
+                <el-pagination
+                    @current-change="ChangePage"
+                    background
+                    
+                    :page-sizes="[20,50,100]"
+                    layout="sizes,prev, pager, next"
+                    @size-change="HandleSizeChange"
+                    :current-page="pageInfo.pageNum"
+                    :total="pageInfo.total">
+                </el-pagination>
+            </div>
+        </div>
+    </div>
+    <div class="scan_content_rights" v-else>
+        <!-- 复查界面 -->
+        <div class="rights_center page_search" v-if="showReviewType==0">
+
+            <div class="center_search search_content" v-if="markType==1">
+                <div class="content_left">
+                    <div class="search_item">
+                        班级:  
+                        <el-select  v-model="reviewObjectClassCode" placeholder="请选择"  style="width: 120px;" @change="ChangeObjectClassCode()">
+                            <el-option value="" label="全部班级"></el-option>
+                            <el-option v-for="(item,index) in reviewObjectClassList" :key="index" :value="item.examRoomCode" :label="item.examRoomName"></el-option>
+                        </el-select>
+                        
+                    </div>
+                    
+                </div>
+                <div class="content_right">
+                    <el-input type="text" style="width: 100%;" @keyup.enter.native="GetObjectSearchStudent" v-model="searchContent" @input="GetObjectSearchStudent" placeholder="学生姓名、考号" >
+                        <el-button slot="append" icon="el-icon-search" style="width:68px;"  @click="GetObjectSearchStudent"></el-button>
+                    </el-input>
+                </div>
+                
+            </div>
+            <div class="page_jg_20" v-if="markType==1">
+            </div>
+            <!-- 客观题复查 -->
+            <div :class="markType==1?'center_image':'center_images'" >   
+                <!-- <ActionImage ref="ActionCanvas" :isDrag="true" :paperInfo="currentPageInfo"  :paperImgUrl="currentImageUrl" :drawData="currentDrawData"></ActionImage> -->
+            </div>
+            
+            <div class="left_bottom">
+                <div class="bottom_draggable draggable_width_100" >
+                    <!-- <draggable class="move_container" v-model="myArray"  chosenClass="chosen" forceFallback="true" group="people" animation="1000" > -->
+                        <div v-for="(item,index) in studentPaperList" class="bottom_img_item"  :class="currentImageUrl == item.recognizeUrl?'img_item_cur':''" @click="StudentChanageCurrentPaperUrl(index, item)" :key="'paper_'+index">
+                            
+                            <img style="width: 100%;height: 100%" :src="item.recognizeUrl" alt="" >
+                            <div class="bottom_img_item_number" v-if="abnormalType==2">{{index+1}}</div>
+                            <div class="bottom_img_item_number" v-else>
+                                <span v-if="item.pageNo>0">{{item.pageNo}}</span>
+                                <span v-else></span>
+                            </div>
+                        </div>  
+                    <!-- </draggable> -->
+                </div>
+            
+            </div>
+        </div>
+        <!-- 主观题复查 -->
+        <div class="rights_center page_search"  v-else>
+            <div class="center_search search_content">
+                <div class="content_left">
+                    <div class="search_item">
+                        班级:  
+                        <el-select  v-model="reviewClassIdCode" placeholder="请选择"  style="width: 120px;" @change="ChangeScoreSearch()">
+                            <el-option value="" label="全部班级"></el-option>
+                            <el-option v-for="(item,index) in reviewClassList" :key="index" :value="item.value" :label="item.label"></el-option>
+                        </el-select>
+                        
+                    </div>
+                    <div class="search_item">
+                        分数区间: 
+                        <el-select  v-model="reviewMinScore" placeholder="请选择"  style="width: 100px;margin-right: 6px;"  @change="ChangeScoreSearch()">
+                            <el-option v-for="(i,index) in scoreOptions" :key="index" :value="index" :label="i"></el-option>
+                        </el-select>至
+                        <el-select  v-model="reviewMaxScore" placeholder="请选择" style="width: 100px;margin-left: 5px;"  @change="ChangeScoreSearch()">
+                            <el-option v-for="(i,index) in scoreOptions" :key="index" :value="index" :label="i"></el-option>
+                        </el-select>
+                    </div>
+                </div>
+                <div class="content_right">
+                    <el-input placeholder="学生姓名、考号"  v-model="reviewKeyWord" @input="ChangeScoreSearch" @change="ChangeScoreSearch()" class="input_width">
+                        <el-button @click="GetMarkReviewStudentList()"  slot="append" icon="el-icon-search"></el-button>
+                    </el-input>
+                </div>
+            </div>
+            <div class="center_list mark_score_center" ref="reviewList" v-loading="reviewLoading" element-loading-text="加载中……" element-loading-spinner="el-icon-loading" element-loading-background="#ffffff">
+                <div class="center_item" :id="`student-${item.id}`" :class="reviewStudentId==item.id?'center_item_cur':''" v-for="(item,index) in reviewStudentList" :key="index">
+                    <div class="item_header">
+                        <div class="header_student_name">
+                            <span>{{HandleIndexMethod(index)}}.{{item.studentName}} ({{item.exCode}})</span>
+                            <span>{{item.adminClassName}}</span>
+                            <span class="view_paper" @click="OptionScorePaper(item)">查看答题卡</span>
+                        </div>
+                        <div class="header_student_score">得分:{{item.score}}</div>
+                    </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>
+                    </div>
+                </div>
+            </div>
+            <div class="page_score_pagination" >
+                <el-pagination
+                    @current-change="ChangeReviewPage"
+                    background
+                    
+                    :page-sizes="[20,50,100]"
+                    layout="total,sizes,prev, pager, next"
+                    @size-change="HandleSizeReviewChange"
+                    :current-page="pageInfo.pageNum"
+                    :total="pageInfo.total">
+                </el-pagination>
+            </div>
+        </div>
+        <div class="rights_right" v-if="showReviewType==0">
+            <div class="page_jg_20" v-if="markType==0"></div>
+            <div  class="right_search el_button" style="width: calc(100% - 40px); margin: auto;" v-if="markType==0">
+                <el-input type="text" style="width: 100%;" @keyup.enter.native="GetObjectSearchStudent" v-model="searchContent" @input="GetObjectSearchStudent" placeholder="学生姓名、考号" >
+                    <el-button slot="append" icon="el-icon-search" style="width:68px;"  @click="GetObjectSearchStudent"></el-button>
+                </el-input>
+                
+            </div>
+            <div class="page_jg_20"></div>
+            <div class="right_table" ref="objectQuestionTables">   
+                <el-table ref="studentTable" @row-click="RightStudentRowClick" :row-class-name="StudentTableClassName" :data="objectTableData" max-height="238" border >
+                    <el-table-column align="center" type="index" label="序号" width="50">
+                        
+                    </el-table-column>  
+                    <el-table-column align="center"  prop="studentName"   label="姓名" show-overflow-tooltip></el-table-column>
+                    <el-table-column align="center" prop="exCode"  label="考号" show-overflow-tooltip></el-table-column>
+                    <el-table-column align="center" width="50" prop="adminClassName"  label="班级"></el-table-column>
+                </el-table>
+                <div class="right_title">
+                    <div>
+                    客观题复查 <span @click="ClearValue()"  class="clear_value">清空</span>
+                    </div> 
+                </div>
+            </div>
+            <div class="answer_table">
+                <el-table :data="currentQuestionList" :height="objectTableHeights" border  :row-class-name="ObjectTableClassName" :key="tableKey" >
+                    <el-table-column align="center" prop="objectiveName" label="题号" width="90"></el-table-column>  
+                    <el-table-column align="center" prop="studentName"  label="选项">
+                        <template v-slot="scope">
+                            <div class="table_row_answer_choose" v-if="scope.row.questionType==3">
+                                <!-- 判断题 -->
+                                <div class="answer_item" @click="ChooseAnswer(scope.row,GetLetterToNumberTF(item))" :class="IsCunzai(scope.row.selectValue,GetLetterToNumberTF(item))?'choose':''" v-for="(item,index) in scope.row.optionNum" :key="index">
+                                    {{GetLetterToNumberTF(item)}}
+                                </div>
+                            </div>
+                            <div class="table_row_answer_choose" v-else>
+                                <div class="answer_item" @click="ChooseAnswer(scope.row,GetLetterToNumber(item))" :class="IsCunzai(scope.row.selectValue,GetLetterToNumber(item))?'choose':''" v-for="(item,index) in scope.row.optionNum" :key="index">
+                                    {{GetLetterToNumber(item)}}
+                                </div>
+                            </div>
+                        </template>
+                    </el-table-column>
+                </el-table> 
+            </div>
+            <div class="right_button el_button">
+                <div class="bottom_button_item">
+                    <!-- <el-button @click="MarkPositionAbnormal" class="abnormal_other_btn">标记定位异常</el-button> -->
+                    <el-button @click="StudentObjectiveCheck" class="re_cut_btn_100">校正完成</el-button>
+                </div>
+            </div>
+        </div>
+        <div class="rights_right" v-else>
+            <!-- 主观题校正 -->
+            <div class="page_jg_20"></div>
+            <div class="answer_table">
+                <el-table ref="subjectReviewTable" :data="reviewStudentList" :height="subjectReviewTableHeight" border  :row-class-name="ObjectTableClassName" :key="tableKey" >
+                    <el-table-column align="center" type="index" label="序号" width="60">
+                        <template slot-scope="scope">
+                            <span v-text="HandleIndexMethod(scope.$index)"></span>
+                        </template>
+                    </el-table-column>
+                    <el-table-column align="center" prop="studentName"  label="姓名">
+
+                    </el-table-column>
+                    <el-table-column align="center" prop="score"  label="得分">
+                        <template v-slot="scope">
+                            <el-input v-model="scope.row.score" @focus="ScoreFocus(scope.row)" :class="parseFloat(scope.row.score)>parseFloat(reviewQuestionScore)?'input_error':''" placeholder=""  maxlength="5"></el-input>
+                        </template>
+                    </el-table-column>
+                </el-table> 
+            </div>
+            <div class="right_button el_button">
+                <div class="bottom_button_item">
+                    <!-- <el-button @click="MarkPositionAbnormal" class="abnormal_other_btn">标记定位异常</el-button> -->
+                    <el-button @click="SubjectiveReviewCheck()" :loading="correctionLoading" class="re_cut_btn_100">校正完成</el-button>
+                </div>
+            </div>
+        </div>
+    </div>
+  </div>
+</template>
+<script lang="ts" setup>
+import { useExamStore } from '@/store/exam'
+import { useRouter } from 'vue-router'
+import { onMounted ,ref} from 'vue';
+
+// 实例化 Store
+const examStore = useExamStore()
+const router = useRouter()
+
+// 定义 Props
+const props = defineProps({
+  
+  scanState: {
+    type: Number,
+    default: 0,
+  }, // 状态 状态  0  未扫描  1 已上传 2  缺考  3 异常
+  showTool: {
+    type: Boolean,
+    default: false,
+  }, // 是否显示工具栏
+  showDraw: {
+    type: Boolean,
+    default: false,
+  }, // 是否显示绘图框
+  answerData: {
+    type: Object,
+    default: () => ({}),
+  }, // 答案
+})
+
+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([]);//树形结构数据
+
+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 studentPaperList=ref([]);//学生试卷列表
+const studentList=ref([]);//学生列表数据
+
+const reviewObjectClassCode=ref('');//班级代码
+const reviewObjectClassList=ref([]);//班级列表
+const searchContent=ref('');//搜索内容
+const currentImageUrl=ref('');//当前试卷图片url
+const reviewClassIdCode=ref('');//班级代码
+const reviewClassList=ref([]);//班级列表
+const reviewMinScore=ref('');//分数区间最小值
+const reviewMaxScore=ref('');//分数区间最大值
+const scoreOptions=ref([]);//分数选项
+const reviewLoading=ref(false);//复查加载状态
+
+const reviewStudentList=ref([]);//复查学生列表
+const subjectReviewTableHeight=ref(200);//主观题复查表格高度
+const tableKey=ref(0);//表格key
+
+//切换分页
+const ChangePage=(pageNum:number)=>{
+    
+}
+
+
+//设置每页显示数量
+const HandleSizeChange=(size:number)=>{
+
+}
+//序号自定义方法
+const HandleIndexMethod=(index:number)=>{
+    if(activeName.value==1){
+        return index+1
+    }else{
+        return index+1
+    }
+}
+
+
+
+onMounted(() => {
+  
+    if (!examStore.currentExam) {
+        console.warn('当前没有选中的考试信息')
+        // 可选:如果没有数据,可以重定向回列表页或提示用户
+    }
+    
+  
+})
+</script>
+ 
+<style lang="scss" scoped>
+
+</style>

+ 42 - 42
src/views/exam/abnormalDetail.vue

@@ -1,6 +1,33 @@
 <template>
     <el-dialog title="" v-model="showDialog" class="page_full_dialog" :modal-append-to-body="false"  append-to-body fullscreen height="100%">
-
+        <div class="abnormal_detail">
+            <div class="detail_header">
+                <div class="go_back" @click="CloseDialog()">
+                    <i class="iconfont icon_return"></i>返回扫描
+                </div>
+                <div class="scan_button_list">
+                    <!-- 状态  0  未扫描  1 已上传 2  缺考  3 异常 -->
+                    <div class="button_item item_no_scan"  :class="scanState==0?'item_no_scan_active':''" @click="ScanStateChange(0)">
+                        未扫描({{scanDataInfo.unScanned}}人)
+                    </div>
+                    <div class="button_item item_miss_exam"  :class="scanState==2?'item_miss_exam_active':''" @click="ScanStateChange(2)">
+                        缺考({{ scanDataInfo.examMissNum }}人)
+                    </div>
+                    <div class="button_item item_abnormal"  :class="scanState==3?'item_abnormal_active':''" @click="ScanStateChange(3)">
+                        异常({{ scanDataInfo.abnormalNum }}份)
+                    </div>
+                    <div class="button_item item_sucess_upload"  :class="scanState==1?'item_sucess_upload_active':''" @click="ScanStateChange(1)">
+                        已上传({{ scanDataInfo.scannedNum }}人)
+                    </div>
+                </div>
+            </div>
+            <div class="detail_content">
+                <!-- 异常 -->
+                <!-- <Abnormal v-if="scanState == 3"></Abnormal> -->
+                <!-- 状态  0  未扫描  1 已上传 2  缺考  3 异常 -->
+                <TableList ></TableList>
+            </div>
+        </div>
 
     </el-dialog>
 </template>
@@ -12,6 +39,9 @@ import { onMounted ,ref,computed,onUnmounted,nextTick } from 'vue';
 import { hasImportStudent,getBatchList,getCurrentBatchNo,deleteBatch,updateScanCount } from '@/api/exam'
 import { ElMessageBox, ElMessage } from 'element-plus'
 
+import TableList from './abnormal/tableList.vue'
+import Abnormal from './abnormal/abnormal.vue'
+
 // 实例化 Store
 const examStore = useExamStore()
 const userStore = useUserStore()
@@ -94,6 +124,8 @@ const scanIdentifyList=[
 
 const isImportStudent=ref(false);//是否导入了学生名单
 const showSelectStudent=ref(false);//是否显示选择学生名单弹窗
+
+const scanState=ref(0);//扫描状态 0 未扫描 1 已上传 2 缺考 3 异常
 const scanDataInfo=ref({
     abnormalNum:0,//异常数量
     examMissNum:0,//缺考数量
@@ -124,6 +156,9 @@ const Refresh = () => {
     GetScanBatchList();
 }
 
+const ScanStateChange=(state:number)=>{
+    scanState.value=state;
+}
 //重新识别弹窗
 const OpenReIdentify=() => {
 
@@ -208,6 +243,12 @@ const OpenScan = () => {
     }
 }
 
+//关闭弹窗
+const CloseDialog = () => {
+    showDialog.value = false;
+}
+
+
 //获取批次字符串
 const GetBatchStr=(batchId:any,batChNo:any)=>{
     const batchNoValue = batchId.substring(batchId.length - 5);
@@ -644,47 +685,6 @@ onUnmounted(() => {
  
 <style lang="scss" scoped>
 
-.page_list
-{
-    width: 100%;
-    height: 100%;
-    padding: 20px;
-    background-color: #fff;
-    border-radius: 4px;
-    box-sizing: border-box;
-
-}
-
-.scan_state_title
-{
-    font-size: 14px;
-    color:#333;
-    font-weight: 400;
-
-}
-.scan_state_open
-{   margin-left: 5px;
-    font-size: 14px;
-    font-weight: 400;
-    color: #2BC644;
-     i
-    {
-        margin-right: 5px;
-    }
-}
-
-.scan_state_close
-{
-    font-size: 14px;
-    font-weight: 400;
-    margin-left: 5px;
-    color:#F56C6C;
-    i
-    {
-        margin-right: 5px;
-    }
-    
-}
 
 
 </style>