Prechádzať zdrojové kódy

考号异常和客观题异常处理基本完成

Your Name 1 rok pred
rodič
commit
ee2fbf39e9

+ 18 - 1
src/api.js

@@ -149,6 +149,9 @@ export default {
     getPaperInfo: params => {
         return axios.get(`${baseURL}/api/admin/papers`, { params: params })
     },
+    getPaperQueInfo: params => {
+        return axios.get(`${baseURL}/api/admin/papers/queinfo`, { params: params })
+    },
     addPaperInfo: params => {
         return axios.post(`${baseURL}/api/admin/papers`, params)
     },
@@ -366,5 +369,19 @@ export default {
     // 更新主观题切片
     savePaperTplSubjectiveQue: params => {
         return axios.put(`${baseURL}/api/admin/papers/tpl/subjective/update`, params)
-    }
+    },
+    // 修改考号
+    saveModifyStudentNo: params => {
+        return axios.put(`${baseURL}/api/admin/papers/task/modify/studentno`, params)
+    },
+    //修改客观题答案
+    saveModifQueAns: params => {
+        return axios.put(`${baseURL}/api/admin/papers/task/modify/queans`, params)
+    },
+    // 搜索学生信息
+    searchStudents:params => {
+		return axios.get(`${baseURL}/api/admin/students/search`, {
+			params: params,
+		});
+    },
 }

+ 5 - 1
src/constant.js

@@ -47,5 +47,9 @@ export default{
         {label:"待上传",value:0},
         {label:"考号异常",value:-1},
         {label:"客观题异常",value:-2},
-    ]
+    ],
+    ansOptionIndex:{
+        "A":0,"B":1,"C":2,"D":3,"E":4,"F":5,"G":6,
+        0:"A",1:"B",2:"C",3:"D",4:"E",5:"F",6:"G"
+    }
 }

+ 8 - 1
src/router.js

@@ -145,7 +145,14 @@ export default new Router({
 				        import ('./views/tasks/stdAnalysis'),
 				    name: '成绩分析',
 					hide: 1,
-				},
+                },
+                {
+                    path: '/task/uploadPaper',
+                    component: () =>
+                        import ('./views/tasks/uploadPaper.vue'),
+                    name: '试卷上传',
+                    hide:1
+                }
             ]
         },
         {

+ 1 - 1
src/style/home.scss

@@ -117,7 +117,7 @@ $height: 64px;
         // padding: 20px !important;
         height: 100vh;
         margin: 0 !important;
-        height: calc(100vh - 100px);
+        // height: calc(100vh - 100px);
         box-shadow: 0px 4px 12px 0px rgba(0, 0, 0, 0.12);
         // overflow:scroll;
         &>h1 {

+ 12 - 7
src/views/papers/cutPaper.vue

@@ -108,7 +108,7 @@
     <!-- 客观题设置 -->
     <el-dialog title="客观题设置" :visible.sync="open" width="90%" append-to-body>
       <el-row :gutter="20">
-        <el-col :span="6">
+        <el-col :span="7">
           <h4>题号设置</h4>
           <!-- <div class="tag-group">
                   <span class="tag-group__title">填涂选项:</span>
@@ -123,16 +123,13 @@
                   </el-tag>
                 </div> -->
           <div style="margin-top:10px;" class="setScoreForm">
-            <!--<el-form :inline="true" v-model="addQueForm">
+            <el-form :inline="true" v-model="addQueForm">
               <el-form-item label="题号">
                 <el-input size="mini" v-model="addQueForm.fQno"></el-input>
               </el-form-item>
               <el-form-item label="至">
                 <el-input size="mini" v-model="addQueForm.tQno"></el-input>
               </el-form-item>
-              <el-form-item label="分数">
-                <el-input size="mini" v-model="addQueForm.score"></el-input>
-              </el-form-item>
               <el-form-item label="题型">
                 <el-select size="mini" v-model="addQueForm.qtype">
                   <el-option label="单选" value="1">单选</el-option>
@@ -142,7 +139,7 @@
               <el-form-item>
                 <el-button size="mini" type="primary" @click="addQues">设置</el-button>
               </el-form-item>
-            </el-form>-->
+            </el-form>
             <el-table :data="curStdQueList.slice((currentPage-1)*pageSize,currentPage*pageSize)">
               <el-table-column label="序号" prop="qno" width="60px"></el-table-column>
               <el-table-column label="题号" prop="qno">
@@ -150,6 +147,14 @@
                     <el-input size="mini" v-model="scope.row.qno" />
                 </template>
               </el-table-column>
+              <el-table-column label="题型" prop="qtype">
+                <template slot-scope="scope">
+                  <el-select v-model="scope.row.qtype">
+                    <el-option label="单选" value="1"></el-option>
+                    <el-option label="多选" value="2"></el-option>
+                  </el-select>
+                </template>
+              </el-table-column>
               <!--<el-table-column label="分数" prop="score"></el-table-column>
               <el-table-column label="题型" prop="qtype">
                 <template slot-scope="scope">
@@ -173,7 +178,7 @@
             </el-pagination>
           </div>
         </el-col>
-        <el-col :span="18">
+        <el-col :span="17">
           <h4>答题卡预览</h4>
           <!-- <el-image v-else :src="curAnsImg" v-loading="ansImgLoading"></el-image> -->
           <el-row>

+ 28 - 5
src/views/tasks/Index.vue

@@ -39,7 +39,6 @@
       </el-table-column>
       <el-table-column align="center" prop="date" label="操作" width="580">
         <template slot-scope="scope">
-
           <el-button @click="jump(
 	            '/task/markpaper?title=' +
 	              scope.row.name +
@@ -105,9 +104,17 @@
         <el-button @click="open = false">取 消</el-button>
       </div>
     </el-dialog>
+
     <!-- 预览识别结果 -->
     <el-dialog title="预览识别结果" :visible.sync="showAnsVisible" width="1080px" append-to-body>
-      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+      <el-form ref="form" :model="form" :rules="rules" label-width="120px" :inline="true">
+        <el-form-item label="修改考号:" v-if="activeName==-1">
+          <el-input v-model="curStudentNo" />
+        </el-form-item>
+        <el-form-item v-if="activeName==-1">
+          <el-button type="primary" @click="saveModifyStudentNo">保存</el-button>
+        </el-form-item>
+        <img :src="curStudentRecImg" id="myCanvasImg" style="display:none;" />
         <canvas id="myCanvas" ref="myCanvas" :width="srcImgWidth*canvasImgScale" :height="srcImgHeight*canvasImgScale"></canvas>
       </el-form>
       <div slot="footer" class="dialog-footer">
@@ -320,7 +327,8 @@
         srcImgWidth:null,
         srcImgHeight:null,
         canvasImgScale:1,
-        ctx:null
+        ctx:null,
+        curStudentNo:null
       };
     },
     methods: {
@@ -508,6 +516,9 @@
         this.openUploadPaper(this.curTaskId);
       },
       openUploadPaper(id) {
+        const routeData = this.$router.resolve({path:"/task/uploadPaper",query:{id:id}});
+        window.open(routeData.href, '_blank');
+        return 
         this.curTaskId = id
         this.uploadDialogVisible = true
         this.taskid = id
@@ -634,6 +645,8 @@
       showStudentImgs(row) {
         this.curStudentRecImg = JSON.parse(row.imgs)[0];
         this.showAnsVisible = true;
+        this.curStudentNo = row.student_no;
+        this.form.student_no = this.curStudentNo;
         let that = this;
 
         this.$nextTick(function () {
@@ -641,7 +654,7 @@
               that.canvas = document.getElementById("myCanvas");
               that.ctx = that.canvas.getContext("2d");
 
-              var image = new Image();
+              let image = new Image();
               image.src = that.curStudentRecImg;
 
               image.onload = function(){
@@ -659,11 +672,21 @@
                     that.ctx.fillText(iitem.ans, iitem.absX*that.canvasImgScale,iitem.absY*that.canvasImgScale);
                   })
                 })
+                
+              }
 
-            }
         })
 
       },
+      saveModifyStudentNo(){
+        let params = {
+          student_no:this.curStudentNo,
+          task_id:this.curTaskId
+        }
+        this.$api.saveModifyStudentNo(params).then(res=>{
+          console.log(res,1111111111111)
+        })
+      },
       showCurRecImg(row) {
         this.curStudentRecImg = row.ans_imgs.replace(".png", "_draw_ans.png");
         this.showAnsVisible = true;

+ 838 - 0
src/views/tasks/uploadPaper.vue

@@ -0,0 +1,838 @@
+<template>
+  <section class="content">
+    <div class="breadcrumb">
+      <el-breadcrumb separator="/">
+        <el-breadcrumb-item><a href="/">阅卷管理</a></el-breadcrumb-item>
+        <el-breadcrumb-item>上传试卷</el-breadcrumb-item>
+      </el-breadcrumb>
+    </div>
+    <!-- 上传试卷 -->
+    <el-row :gutter="20">
+        <el-col :span="24">
+          <!-- <el-row>
+            <el-col :span="6">参考人数:{{studentsList.length}}</el-col>
+            <el-col :span="6">已上传:{{studentsList.length}}</el-col>
+            <el-col :span="6">识别异常:</el-col>
+          </el-row> -->
+          <el-form :inline="true">
+            <el-form-item label="姓名">
+              <el-input size="mini" placeholder="请输入姓名/考号" v-model="queryName" clearable></el-input>
+            </el-form-item>
+            <!--<el-form-item label="识别异常">
+              <el-select v-model="queryMarkStatus" size="mini" clearable>
+                <el-option v-for="item in $const.recErrorList" :label="item.label" :value="item.value"></el-option>
+
+              </el-select>
+            </el-form-item>-->
+            <el-form-item>
+              <el-button type="primary" size="mini" @click="searchMarkData">搜索</el-button>
+              <el-button size="mini" @click="reSetMarkData">重置</el-button>
+              <el-button @click="downloadObjectiveResult(curTaskId)" type="warning" size="mini" icon="el-icon-download">
+                导出</el-button>
+              <el-button @click="reTryMark" size="mini" type="success" icon="el-icon-printer">重新识别</el-button>
+            </el-form-item>
+            <el-form-item>
+              <el-button size="mini" type="warning" icon="el-icon-printer">
+                试卷扫描</el-button>
+
+            </el-form-item>
+            <el-form-item>
+              <el-upload class="upload-demo" action="http://test.scxjc.club/api/admin/papers/uploadpaper"
+                :on-success="handleUploadSuccess" :data="{taskid:taskid}" :on-change="handleChange" list-type="picture"
+                multiple>
+                <el-button size="mini" type="primary" @click="openTaskImgList">点击上传</el-button>
+              </el-upload>
+            </el-form-item>
+          </el-form>
+          <el-row>
+            <el-col :span="24">
+              <el-tabs v-model="activeName" @tab-click="handleTabClick">
+                <el-tab-pane :label="'正确('+recSucTotal+')'" name="1"></el-tab-pane>
+                <el-tab-pane :label="'定位异常('+recKhErrTotal+')'" name="-5"></el-tab-pane>
+                <el-tab-pane :label="'考号异常('+recKhErrTotal+')'" name="-1"></el-tab-pane>
+                <el-tab-pane :label="'考号重复('+recKhErrTotal+')'" name="-3"></el-tab-pane>
+                <el-tab-pane :label="'缺考异常('+recKhErrTotal+')'" name="-4"></el-tab-pane>
+                <el-tab-pane :label="'客观题异常('+recObjErrTotal+')'" name="-2"></el-tab-pane>
+                <el-tab-pane :label="'待上传('+recWaitingErrTotal+')'" name="0"></el-tab-pane>
+              </el-tabs>
+            </el-col>
+          </el-row>
+          <el-table v-loading="loading" :data="studentsList" style="width: 100%; margin-top: 10px"
+            @selection-change="handleSelectionChange" height="60vh">
+            <el-table-column type="selection" width="45" v-if="activeName==100"></el-table-column>
+            <el-table-column align="center" prop="student_name" label="姓名" width="80" />
+            <el-table-column align="center" prop="student_no" label="考号" width="150">
+              <template slot-scope="scope">
+                <el-button type="text" @click="showStudentImgs(scope.row)" size="mini">{{scope.row.student_no}}
+                </el-button>
+              </template>
+            </el-table-column>
+            <el-table-column align="center" prop="objective_ans_str" label="客观题识别结果"/>
+            <el-table-column align="center" prop="objective_score" label="客观题得分" width="100" />
+            <el-table-column align="center" prop="mark_status_name" label="识别状态" width="80">
+              <template slot-scope="scope">
+                <span v-if="scope.row.mark_status<=0" style="color:#f78989;">{{scope.row.mark_status_name}}</span>
+                <span v-if="scope.row.mark_status==1" style="color:#85ce61;">正常</span>
+              </template>
+            </el-table-column>
+            <el-table-column align="center" prop="ctime" label="时间" width="140px">
+              <template slot-scope="scope">
+                <span style="font-size:12px;">{{scope.row.ctime}}</span>
+              </template>
+            </el-table-column>
+            <el-table-column align="center" prop="date" label="操作" fixed="right" width="160px">
+              <template slot-scope="scope">
+                <!--<el-button v-if="scope.row.mark_status!=0" @click="showCurRecImg(scope.row)" size="mini" type="text">查看
+                </el-button>
+                <el-button v-if="scope.row.mark_status!=0" @click="showCurRecKhImg(scope.row)" size="mini" type="text">
+                  考号</el-button>-->
+                <el-button @click="delStudents(scope.row.student_id,scope.$index,'delRec')" size="mini" type="text">删除识别结果
+                </el-button>
+                <el-button @click="delStudents(scope.row.student_id,scope.$index,'delStudent')" size="mini" type="text">删除学生
+                </el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+          <Page ref="pageButton" :current="recPage" :page_size="recPageSize" :total="recTotal"
+            @pageChange="goRecPage" />
+        </el-col>
+      </el-row>
+      <!-- 试卷上传预览 -->
+      <el-dialog title="试卷预览" :visible.sync="imgListVisible" width="750px" @close="closeTaskImgDialog" append-to-body>
+        <div style="text-align:right;">
+          <font>成功上传:{{taskImgTotal}}</font>&nbsp;&nbsp;&nbsp;&nbsp;
+          <el-button v-loading="loading" type="primary" size="mini" @click="startRecPaper">开始识别</el-button>
+        </div>
+        <div style="width:156px;display: inline-block;margin:10px;border:1px solid #ccc;"
+          v-for="(item,index) in fileList">
+          <el-image width="100px" alt="" :src="item.url" :preview-src-list="[item.url]"></el-image>
+        </div>
+        <Page ref="pageImgButton" :current="imgForm.page" :page_size="imgForm.page_size" :total="taskImgTotal" @pageChange="goTaskImg" />
+      </el-dialog>
+
+    <!-- 预览识别结果 -->
+    <el-dialog title="异常处理" :visible.sync="showAnsVisible" width="90%" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="120px" :inline="true">
+        <el-row :gutter="20">
+          <!--试卷预览-->
+          <el-col :span="16" style="border:1px solid #ccc;">
+            <img :src="curStudentRecImg" id="myCanvasImg" style="display:none;" />
+            <canvas id="myCanvas" ref="myCanvas" :width="srcImgWidth*canvasImgScale" :height="srcImgHeight*canvasImgScale"></canvas>
+          </el-col>
+          <!--异常处理-->
+          <el-col :span="8">
+            <!--考号异常-->
+            <el-row v-if="activeName==-1">
+              <el-col :span="20">
+                <el-form-item v-if="activeName==-1" label-width="80">
+                  <el-input v-model="curStudentNo" size="mini" />
+                </el-form-item>
+              </el-col>
+              <el-col :span="4">
+                <el-form-item v-if="activeName==-1">
+                  <el-button type="primary" @click="searchStudents" size="mini">搜索</el-button>
+                </el-form-item>
+              </el-col>
+            </el-row>
+            <!--客观题异常-->
+            <el-row v-if="activeName==-2">
+              <div class="kgtContainer">
+                <div class="topContainer">
+                  <div class="topItem">待处理:2</div>
+                  <div class="topItem">
+                    <el-button type="primary" size="mini" @click="saveModifQueAns">保存</el-button>
+                  </div>
+                </div>
+                <div class="kgtItem" v-for="oitem in objectiveRecResult">
+                  <span class="tag-group__title">{{oitem.qno}}、</span>
+                  <el-tag :effect="oitem.fillNum.indexOf(index)!=-1?'dark':'plain'" v-for="(item,index) in oitem.points.length" :key="item.label" type="success"
+                    @click="setStdAns(oitem,index)"
+                    size="small">
+                    {{ $const.ansOptionList[index]["label"] }}
+                  </el-tag>&nbsp;&nbsp;&nbsp;&nbsp;
+                  <el-tag effect="dark" size="small" :type="oitem.fillNum.length<1?'danger':'plain'">未涂</el-tag>
+                  <el-tag effect="dark" size="small" :type="oitem.fillNum.length>1 && oitem.qtype==1?'danger':'plain'">多涂</el-tag>
+                </div>
+              </div>
+            </el-row>
+            <el-row style="border:1px solid #ccc;padding:10px;" v-for="(item,index) in searchStudentsData">
+              <el-col :span="20">
+                <p>{{item.name}}</p>
+                <p>{{item.student_no}}</p>
+                <p>{{item.school_name}}{{item.grade_name}}{{item.class_name}}</p>
+              </el-col>
+              <el-col :span="4">
+                  <el-button type="primary" @click="saveModifyStudentNo" size="mini">确定</el-button>
+              </el-col>
+            </el-row>
+          </el-col>
+        </el-row>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="showAnsVisible = false">关 闭</el-button>
+      </div>
+    </el-dialog>
+    <!-- 重新识别 -->
+    <el-dialog title="重新识别" :visible.sync="remarkDialogVisible" width="60%" @close="closeRemarkDialog">
+      <el-form :inline="true">
+        <el-form-item label="考号噪声参数">
+          <el-input-number v-model="form.khVoiceNum" :min="1" :max="5"></el-input-number>
+        </el-form-item>
+        <el-form-item label="考号填涂比例阈值">
+          <el-input-number v-model="form.khFillRate" :min="1" :max="5"></el-input-number>
+        </el-form-item>
+        <el-form-item label="题目噪声参数">
+          <el-input-number v-model="form.tmVoiceNum" :min="1" :max="5"></el-input-number>
+        </el-form-item>
+        <el-form-item label="题目填涂比例阈值">
+          <el-input-number v-model="form.tmFillRate" :min="1" :max="5"></el-input-number>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="doReTryMark">确 定</el-button>
+      </div>
+    </el-dialog>
+    <!--阅卷设置-->
+    <MarkTaskSetDialog :remarkSetVisible="remarkSetVisible" :paperId="curPaperId" :taskId="curTaskId" @close="closeMarkTaskSet" />
+  </section>
+</template>
+<script>
+  import Page from "../../components/Page";
+  import MarkTaskSetDialog from "./components/MarkTaskSetDialog";
+  import Cropper from 'cropperjs'
+  export default {
+    components: {
+      Page,
+      MarkTaskSetDialog
+    },
+    data() {
+      return {
+        loading: false,
+        queryParams: {
+          page: 1,
+          page_size: 20
+        },
+        form: {
+          khVoiceNum: 5,
+          khFillRate: 3.0,
+          tmVoiceNum: 3,
+          tmFillRate: 1.8,
+          class_list: ["高三一班", "高三二班"],
+          checkList: []
+        },
+        imgForm:{
+          page:1,
+          page_size:20
+        },
+        form1: {},
+        form2: {},
+        list: [{}, {}],
+        total: 0,
+        imgTotal:0,
+        title: "新增用户",
+        open: false,
+        doctorList: [],
+        rules: {},
+        uploadDialogVisible: false,
+        remarkDialogVisible: false,
+        fileList: [],
+        papersList: [],
+        taskid: null,
+        timer: null,
+        timer2: null,
+        studentsList: [],
+        showAnsVisible: false,
+        curStudentRecImg: "",
+        activeName: "1",
+        curTaskId: null,
+        curPaperId:null,
+        recPage: 1,
+        recPageSize: 20,
+        recTotal: 0,
+        recParams: {},
+        recSucTotal: 0,
+        recKhErrTotal: 0,
+        recObjErrTotal: 0,
+        recWaitingErrTotal:0,
+        queryName: "",
+        queryMarkStatus: null,
+        selectException: [],
+        checkClassList: [],
+        schoolList: [],
+        gradeList: [],
+        classList: [],
+        imgListVisible: false,
+        taskImgTotal: 0,
+        remarkSetVisible: false,
+        activeSetName: "first",
+        addQueForm:{},
+        objectiveQueList:[],
+        subjectiveQueList:[],
+        subjectiveMarkTeacherList:[],
+        checkList:[],
+        srcImgWidth:null,
+        srcImgHeight:null,
+        canvasImgScale:1,
+        ctx:null,
+        curStudentNo:null,
+        searchStudentsData:[],
+        ansOptionList: [{
+              label: "A",
+              value: "A",
+              flag: 0
+            },
+            {
+              label: "B",
+              value: "B",
+              flag: 0
+            },
+            {
+              label: "C",
+              value: "C",
+              flag: 0
+            },
+            {
+              label: "D",
+              value: "D",
+              flag: 0
+            },
+            {
+              label: "E",
+              value: "E",
+              flag: 0
+            },
+            {
+              label: "F",
+              value: "F",
+              flag: 0
+            },
+            {
+              label: "G",
+              value: "G",
+              flag: 0
+            }
+          ],
+        objectiveRecResult:[]
+      };
+    },
+    methods: {
+      jump(url, id) {
+        id == 2 ? localStorage.setItem("sonNav", 2) : '';
+        if (url) {
+          this.$router.push(url);
+        }
+      },
+      submitUpload() {
+        this.$refs.upload.submit();
+      },
+      edit(row){
+        this.open = true;
+        this.form = row;
+        this.classList = row.class_id.split(",");
+      },
+      del(id) {
+        this.$confirm("确认删除?", "提示", {
+          type: "warning",
+        }).then(() => {
+          this.$api
+            .delMarkTask({
+              id: id,
+            })
+            .then((res) => {
+              if (!res.data.code) {
+                this.msgSuccess("删除成功");
+                this.getData();
+              } else {
+                this.$msgError(res.data.message);
+              }
+            });
+        });
+      },
+      gopage(size) {
+        if (size) {
+          this.queryParams.page_size = size;
+        }
+        this.queryParams.page = this.$refs.pageButton.page;
+        this.getData();
+      },
+      goTaskImg(page){
+        if (page) {
+          this.imgForm.page_size = size;
+        }
+        this.imgForm.page = this.$refs.pageImgButton.page;
+        let that = this;
+        that.$api.getTaskImgList({
+            task_id: that.curTaskId,
+            page:that.imgForm.page,
+            page_size:that.imgForm.page_size
+          }).then(res => {
+            that.fileList = res.data.data.list
+            that.taskImgTotal = res.data.data.total;
+          })
+      },
+      goRecPage(size) {
+        if (size) {
+          this.recPageSize = size;
+        }
+        this.recPage = this.$refs.pageButton.page;
+        this.recParams = {
+          task_id: this.curTaskId,
+          page: this.recPage,
+          page_size: this.recPageSize,
+          status: this.activeName,
+          name: this.queryName,
+          err_status: this.queryMarkStatus
+        }
+        window.clearInterval(this.timer);
+        this.getData(this.curTaskId)
+      },
+      searchMarkData() {
+        this.recParams.name = this.queryName;
+        this.recParams.errStatus = this.queryMarkStatus;
+        window.clearInterval(this.timer);
+        this.getData(this.curTaskId);
+      },
+      reSetMarkData() {
+        this.queryName = null;
+        this.queryMarkStatus = null;
+        this.queryParams.name = null;
+        this.queryParams.err_status = null;
+        window.clearInterval(this.timer);
+        this.getData(this.curTaskId);
+      },
+      getData() {
+        let id = this.$route.query.id;
+        this.curTaskId = id
+        this.uploadDialogVisible = true
+        this.taskid = id
+        let that = this;
+        this.loading = true;
+        this.recParams = {
+          task_id: id,
+          page: this.recPage,
+          page_size: this.recPageSize,
+          status: this.activeName,
+          name: this.queryName,
+          err_status: this.queryMarkStatus
+        }
+        this.$api.getMarkTaskStudents(this.recParams).then(res => {
+          this.studentsList = res.data.data.list;
+          this.studentsList.forEach(item => {
+            let mark_status = item.mark_status;
+            if (mark_status != 1) {
+              item.mark_status_name = this.$const.recErrorList.filter((ritem) => {
+                return ritem.value == mark_status;
+              })[0].label
+            } else {
+              item.mark_status_name = "正常"
+            }
+          })
+          this.recTotal = res.data.data.total;
+          this.recSucTotal = res.data.data.suc_total;
+          this.recKhErrTotal = res.data.data.kh_err_total;
+          this.recObjErrTotal = res.data.data.obj_err_cnt;
+          this.recWaitingErrTotal = res.data.data.waiting_cnt;
+          this.loading = false;
+        })
+        window.clearInterval(this.timer);
+        this.timer = setInterval(function () {
+          that.$api.getMarkTaskStudents(that.recParams).then(res => {
+            that.studentsList = res.data.data.list;
+            that.studentsList.forEach(item => {
+              let mark_status = item.mark_status;
+              if (mark_status != 1) {
+                item.mark_status_name = that.$const.recErrorList.filter((ritem) => {
+                  return ritem.value == mark_status;
+                })[0].label
+              } else {
+                item.mark_status_name = "正常"
+              }
+            })
+            that.recTotal = res.data.data.total;
+            that.recSucTotal = res.data.data.suc_total;
+            that.recKhErrTotal = res.data.data.kh_err_total;
+            that.recObjErrTotal = res.data.data.obj_err_cnt;
+            that.recWaitingErrTotal = res.data.data.waiting_cnt;
+          })
+        }, 4000)
+      },
+      closeRemarkDialog() {
+        this.remarkDialogVisible = false;
+        this.fileList = []
+      },
+      closeTaskImgDialog() {
+        this.imgListVisible = false;
+        window.clearInterval(this.timer2);
+      },
+      handlePreview(file) {
+        console.log(file);
+      },
+      handleChange(file, fileList) {},
+
+      openTaskImgList() {
+        let that = this;
+        this.imgListVisible = true
+        window.clearInterval(this.timer2);
+        this.timer2 = setInterval(function () {
+          that.$api.getTaskImgList({
+            task_id: that.curTaskId,
+            page:that.imgForm.page,
+            page_size:that.imgForm.page_size
+          }).then(res => {
+            that.fileList = res.data.data.list
+            that.taskImgTotal = res.data.data.total;
+          })
+        }, 2000)
+      },
+      handleUploadSuccess(res, file, fileList) {
+        if (!res.code) {
+          if (fileList.every(item => item.status == "success")) {
+            fileList.map(item => {
+              item.response && this.fileList.push({
+                "url": res.data.url,
+                "name": res.data.name
+              })
+            })
+          }
+        }
+      },
+      delStudents(id, index,action) {
+        this.$api.delMarkTaskStudents({
+          id: id,
+          action:action
+        }).then(res => {
+          this.msgSuccess("删除成功!");
+          this.studentsList.splice(index, 1)
+        })
+      },
+      handleRemove(e) {
+        console.log(e)
+      },
+      drawRect(x, y, lineW, lineY) {
+          //   开始绘制;
+          this.ctx.beginPath();
+          //   //设置线条颜色,必须放在绘制之前
+          this.ctx.strokeStyle = "red";
+          //   console.log("44444444");
+          //   // 线宽设置,必须放在绘制之前
+          this.ctx.lineWidth = 1;
+          //   console.log("5555555555");
+          // strokeRect参数:(左上角x坐标,y:左上角y坐标,绘画矩形的宽度,绘画矩形的高度)
+          this.ctx.strokeRect(x, y, lineW, lineY);
+          //   console.log("66666666666666");
+      },
+      showStudentImgs(row) {
+        this.curStudentRecImg = JSON.parse(row.imgs)[0];
+        this.showAnsVisible = true;
+        this.curStudentNo = row.student_no;
+        this.form.student_no = this.curStudentNo;
+        this.searchStudentsData = [];
+        let that = this;
+        let objective_result = row.objective_result;
+        let objective_ans = row.objective_ans;
+
+        // 获取试卷客观题标准填涂
+        let paper_id = row.paper_id;
+        that.objectiveRecResult = [];
+        this.$api.getPaperQueInfo({id:paper_id}).then(res=>{
+          let stdQueList = JSON.parse(res.data.data.stdQueList)
+          stdQueList.forEach(item=>{
+            that.objectiveRecResult = that.objectiveRecResult.concat(item);
+            console.log(objective_ans,222222222222222)
+            // 补全填涂答案
+            let rec_result = {}
+            let rec_result_num = {}
+            objective_ans.forEach(iitem=>{
+              let fillAns = iitem["ans"];
+              let fillNum = [];
+              fillAns.split(",").forEach(fans=>{
+                fillNum.push(this.$const.ansOptionIndex[fans])
+              })
+              rec_result[iitem["qno"]] = fillAns
+              rec_result_num[iitem["qno"]] = fillNum
+            })
+
+            that.objectiveRecResult.forEach(orr=>{
+              orr["fillAns"] = rec_result[orr["qno"]]?rec_result[orr["qno"]]:""
+              orr["fillNum"] = rec_result_num[orr["qno"]]?rec_result_num[orr["qno"]]:[]
+            })
+          })
+        })
+
+        this.$nextTick(function () {
+            
+              that.canvas = document.getElementById("myCanvas");
+              that.ctx = that.canvas.getContext("2d");
+
+              let image = new Image();
+              image.src = that.curStudentRecImg;
+
+              image.onload = function(){
+                that.srcImgWidth = image.width;
+                that.srcImgHeight = image.height;
+                that.canvasImgScale = 680/image.width;
+                that.ctx.drawImage(image, 0, 0, that.srcImgWidth, that.srcImgHeight, 0, 0, that.srcImgWidth*that.canvasImgScale, that
+                      .srcImgHeight*that.canvasImgScale)
+                console.log(objective_result,111111)
+                objective_result.forEach(item=>{
+                  item.forEach(iitem=>{
+                    that.drawRect(iitem.absX*that.canvasImgScale,iitem.absY*that.canvasImgScale,iitem.w*that.canvasImgScale,iitem.h*that.canvasImgScale);
+                    that.ctx.font = '12px Arial';
+                    that.ctx.fillStyle = 'red';
+                    that.ctx.fillText(iitem.ans, iitem.absX*that.canvasImgScale,iitem.absY*that.canvasImgScale);
+                  })
+                })
+                
+              }
+
+        })
+      },
+      saveModifQueAns(){
+        let params = {
+            task_id:this.curTaskId,
+            student_no:this.curStudentNo
+        }
+        let objective_ans = [];
+        this.objectiveRecResult.forEach(item=>{
+          if(item.fillNum.length>0){
+            objective_ans.push({
+              qno:item.qno,
+              ans:item.fillAns
+            })
+          }
+        })
+        params.objective_ans = objective_ans;
+        let that = this;
+        this.$api.saveModifQueAns(params).then(res=>{
+          if(!res.data.code){
+            this.msgSuccess("保存成功!");
+            this.showAnsVisible = false;
+          }else{
+            this.msgError(res.data.message);
+          }
+        })
+      },
+      setStdAns(oitem, index) {
+        //oitem表示每一题,index表示每一个选项
+        let fillNum = oitem.fillNum; //已识别的填涂选项
+        if(fillNum.indexOf(index)==-1){
+          fillNum.push(index)
+        }else{
+          fillNum.splice(fillNum.indexOf(index),1);
+        }
+        //重新计算fillAns
+        let fillAns = [];
+        fillNum.forEach(num=>{
+          if(num){
+            fillAns.push(this.$const.ansOptionIndex[num])
+          }
+        })
+        oitem.fillAns = fillAns.join();
+        this.$forceUpdate();
+      },
+      searchStudents(){
+        let params = {
+          student_no:this.curStudentNo
+        }
+        this.$api.searchStudents(params).then(res=>{
+          this.searchStudentsData = res.data.data;
+        })
+      },
+      saveModifyStudentNo(){
+        let params = {
+          student_no:this.curStudentNo,
+          task_id:this.curTaskId
+        }
+        this.$api.saveModifyStudentNo(params).then(res=>{
+          console.log(res,1111111111111)
+          this.showAnsVisible = false;
+        })
+      },
+      showCurRecImg(row) {
+        this.curStudentRecImg = row.ans_imgs.replace(".png", "_draw_ans.png");
+        this.showAnsVisible = true;
+      },
+      showCurRecKhImg(row) {
+        let ext = row.ans_imgs.split("/").pop()
+        if (ext) {
+          ext = "." + ext.split(".")[1]
+        }
+        this.curStudentRecImg = row.ans_imgs.replace("_ans" + ext, "_sno" + ext);
+        this.showAnsVisible = true;
+      },
+
+      handleTabClick(tab, event) {
+        this.activeName = tab.name;
+        this.recPage = 1;
+        this.recParams = {
+          task_id: this.curTaskId,
+          page: this.recPage,
+          page_size: this.recPageSize,
+          status: this.activeName,
+          name: this.queryName,
+          err_status: this.queryMarkStatus
+        }
+        window.clearInterval(this.timer);
+        this.getData(this.curTaskId)
+      },
+      downloadObjectiveResult(task_id) {
+        this.$api
+          .downloadObjectiveResult({
+            task_id: task_id
+          })
+          .then((res) => {
+            var elink = document.createElement("a");
+            let blob = new Blob([res.data], {
+              type: "application/vnd.ms-excel,charset=UTF-8",
+            });
+            let objUrl = URL.createObjectURL(blob);
+            let file_name = decodeURIComponent(
+              res.headers["content-disposition"].split("=")[1]
+            );
+            elink.download = file_name;
+            elink.style.display = "none";
+            elink.href = objUrl;
+            document.body.appendChild(elink);
+            elink.click();
+            document.body.removeChild(elink);
+            this.download_loading = false;
+          });
+      },
+      handleSelectionChange(val) {
+        this.selectException = [];
+        if (val.length > 0) {
+          val.forEach(item => {
+            let task_img = item.task_id + ";;" + item.imgs + ";;" + item.id;
+            this.selectException.push(task_img);
+          })
+          window.clearInterval(this.timer);
+        }
+      },
+      reTryMark() {
+        if (this.selectException.length < 1) {
+          this.msgError("请选择需要重新识别的答卷!");
+        } else {
+          this.remarkDialogVisible = true;
+        }
+      },
+      doReTryMark() {
+        let urls = []
+        this.selectException.forEach(item => {
+          item = item + ";;" + String(this.form.khVoiceNum) + ";;" + String(this.form.khFillRate);
+          item = item + ";;" + String(this.form.tmVoiceNum) + ";;" + String(this.form.tmFillRate);
+          urls.push(item);
+        })
+        let that = this;
+        this.$api.reTryMarkPaper({
+          urls: urls
+        }).then(res => {
+          this.remarkDialogVisible = false;
+          this.getData();
+          window.clearInterval(this.timer);
+          this.timer = setInterval(function () {
+            that.$api.getMarkTaskStudents(that.recParams).then(res => {
+              that.studentsList = res.data.data.list;
+              that.studentsList.forEach(item => {
+                let mark_status = item.mark_status;
+                if (mark_status != 1) {
+                  item.mark_status_name = that.$const.recErrorList.filter((ritem) => {
+                    return ritem.value == mark_status;
+                  })[0].label
+                } else {
+                  item.mark_status_name = "正常"
+                }
+              })
+              that.recTotal = res.data.data.total;
+              that.recSucTotal = res.data.data.suc_total;
+              that.recKhErrTotal = res.data.data.kh_err_total;
+              that.recObjErrTotal = res.data.data.obj_err_cnt;
+              that.recWaitingErrTotal = res.data.data.waiting_cnt;
+            })
+          }, 4000)
+        })
+      },
+      startRecPaper() {
+        this.loading = true
+        this.$api.startRecPaper({
+          task_id: this.curTaskId
+        }).then(res => {
+          this.loading = false
+        })
+      },
+      remarkSet(row) {
+        this.remarkSetVisible = true
+        this.curTaskId = row.task_id;
+        this.curPaperId = row.paper_id;
+      },
+      closeMarkTaskSet(){
+        this.remarkSetVisible = false
+      }
+    },
+    created() {
+      this.getData();
+      this.getSchoolList();
+      this.getGradeList();
+      this.getClassList();
+    },
+  };
+</script>
+<style lang="scss">
+  .el-upload-list {
+    display: none !important;
+  }
+
+  .el-upload-list--picture .el-upload-list__item {
+    width: 150px;
+    float: left;
+    margin-right: 10px;
+    position: relative;
+  }
+
+  .el-upload-list--picture .el-upload-list__item.is-success .el-upload-list__item-name {
+    position: absolute;
+    z-index: 100;
+    height: 70px;
+    line-height: 130px;
+  }
+
+  .el-upload-list--picture .el-upload-list__item-thumbnail {
+    width: 125px;
+  }
+
+  .prosss_box .el-progress.el-progress--line {
+    width: 88px;
+    margin: auto 5px auto 0;
+  }
+
+  .prosss_box .el-progress-bar {
+    padding-right: 0;
+  }
+
+  .prosss_box .el-progress__text {
+    display: none;
+  }
+
+  .prosss_box {
+    display: flex;
+  }
+  .kgtContainer{
+    border:1px solid #ccc;
+    padding:10px;
+    .topContainer{
+      display:flex;
+      .topItem{
+        width:50%;
+        flex-direction:column;
+      }
+      .topItem:last-child{
+        width:50%;
+        flex-direction:column;
+        text-align:right;
+      }
+    }
+    .kgtItem{
+      margin:10px;
+    }
+  }
+  
+</style>