Ver código fonte

试卷上传基本完成

Your Name 1 ano atrás
pai
commit
c1994ddf8a

+ 11 - 1
src/api.js

@@ -325,6 +325,16 @@ export default {
 	//打分
 	mark: params => {
 	    return axios.post(`${baseURL}/api/admin/teacher/mark/que/mark`, params)
-	},
+    },
+    // 查询阅卷任务图片列表
+    getTaskImgList:params => {
+		return axios.get(`${baseURL}/api/admin/teacher/mark/task/img/list`, {
+			params: params,
+		});
+    },
+    // 开始识别
+    startRecPaper: params => {
+	    return axios.post(`${baseURL}/api/admin/teacher/mark/task/starRec`, params)
+    },
 	
 }

+ 1 - 1
src/constant.js

@@ -44,7 +44,7 @@ export default{
         {label:"G",value:"G",flag:0}
     ],
     recErrorList:[
-        {label:"考号异常",value:0},
+        {label:"待上传",value:0},
         {label:"少识别选项",value:-1},
         {label:"多识别选项",value:-2},
         {label:"单选题多涂",value:-3},

+ 2 - 2
src/views/Login.vue

@@ -140,8 +140,8 @@ export default {
       tp:'',
       code:'',
       logindata:{
-        username:'',
-        password:'',
+        username:'root',
+        password:'hnwz@2021',
         imgcode_id:'',
         imgcode:'',
         utype:2

+ 2 - 2
src/views/school/ClassList.vue

@@ -29,7 +29,7 @@
 			      v-for="item in schoolList"
 			      :key="item.value"
 			      :label="item.name"
-			      :value="item.id"
+			      :value="item.school_id"
 			    >
 			    </el-option>
 			  </el-select>
@@ -134,7 +134,7 @@
 		      v-for="item in schoolList"
 		      :key="item.value"
 		      :label="item.name"
-		      :value="item.id"
+		      :value="item.school_id"
 		    >
 		    </el-option>
 		  </el-select>

+ 242 - 121
src/views/tasks/Index.vue

@@ -32,76 +32,106 @@
     </el-form>
     <el-table v-loading="loading" :data="list" style="width: 100%; margin-top: 10px" height="50vh">
       <el-table-column prop="name" label="作业名称"> </el-table-column>
-      	  <el-table-column prop="full_score" label="满分">
-      	    <template slot-scope="scope">
-      	      <div class="bold">{{ scope.row.full_score }}</div>
-      	    </template>
-      	  </el-table-column>
-      	  <el-table-column prop="max_score" label="最高分">
-      	    <template slot-scope="scope">
-      	      <div class="bold">{{ scope.row.max_score }}</div>
-      	    </template>
-      	  </el-table-column>
-      	  <el-table-column prop="avg_score" label="平均分">
-      	    <template slot-scope="scope">
-      	      <div class="bold">{{ scope.row.avg_score }}</div>
-      	    </template>
-      	  </el-table-column>
-      	  <el-table-column prop="pass_rate" label="及格率">
-      	    <template slot-scope="scope">
-      	      <div class="bold" style="color: #0a9dff">
-      	        {{ scope.row.pass_rate }}
-      	      </div>
-      	    </template>
-      	  </el-table-column>
-      	  <el-table-column prop="phone" label="批阅进度" width="180">
-      	    <template slot-scope="scope">
-      	     <div class="d-f prosss_box">
-      	        <el-progress
-      	          :percentage="scope.row.ww"
-      	          :stroke-width="8"
-      	          :color="
+      <el-table-column prop="full_score" label="满分">
+        <template slot-scope="scope">
+          <div class="bold">{{ scope.row.full_score }}</div>
+        </template>
+      </el-table-column>
+      <el-table-column prop="max_score" label="最高分">
+        <template slot-scope="scope">
+          <div class="bold">{{ scope.row.max_score }}</div>
+        </template>
+      </el-table-column>
+      <el-table-column prop="avg_score" label="平均分">
+        <template slot-scope="scope">
+          <div class="bold">{{ scope.row.avg_score }}</div>
+        </template>
+      </el-table-column>
+      <el-table-column prop="pass_rate" label="及格率">
+        <template slot-scope="scope">
+          <div class="bold" style="color: #0a9dff">
+            {{ scope.row.pass_rate }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column prop="phone" label="批阅进度" width="180">
+        <template slot-scope="scope">
+          <div class="d-f prosss_box">
+            <el-progress :percentage="scope.row.ww" :stroke-width="8" :color="
       	            scope.row.total_students == scope.row.marked_students
       	              ? '#0A9DFF'
       	              : '#FA0A2F'
-      	          "
-      	        ></el-progress>
-      	        <div class="contrasts">
-      	          <span>{{ scope.row.marked_students }}/</span>
-      	          <span>{{ scope.row.total_students }}</span>
-      	        </div>
-      	      </div>
-      	    </template>
-      	  </el-table-column>
+      	          "></el-progress>
+            <div class="contrasts">
+              <span>{{ scope.row.marked_students }}/</span>
+              <span>{{ scope.row.total_students }}</span>
+            </div>
+          </div>
+        </template>
+      </el-table-column>
       <el-table-column align="center" prop="ctime" label="创建时间" />
       <el-table-column align="center" prop="date" label="操作" width="360">
         <template slot-scope="scope">
-			
+
           <el-button @click="jump(
 	            '/task/markpaper?title=' +
 	              scope.row.name +
 	              '&id=' +
-	              scope.row.id
-	          )" size="mini" type="success">开始阅卷</el-button>
-		  <el-button @click="edit(scope.row.id)" size="mini" type="warning">编辑</el-button>
-          <el-button @click="openUploadPaper(scope.row.id)" size="mini" type="primary">上传试卷</el-button>
-          <el-button @click="del(scope.row.id)" size="mini" type="danger">删除</el-button>
+	              scope.row.task_id
+            )" size="mini" type="success">开始阅卷</el-button>
+          <el-button @click="edit(scope.row.id)" size="mini" type="warning">阅卷设置</el-button>
+          <el-button @click="edit(scope.row.id)" size="mini" type="warning">编辑</el-button>
+          <el-button @click="openUploadPaper(scope.row.task_id)" size="mini" type="primary">上传试卷</el-button>
+          <el-button @click="del(scope.row.task_id)" size="mini" type="danger">删除</el-button>
         </template>
       </el-table-column>
     </el-table>
     <Page ref="pageButton" :current="form.page" :page_size="form.page_size" :total="total" @pageChange="gopage" />
     <!-- 新增/编辑阅卷任务 -->
-    <el-dialog title="新增/编辑阅卷任务" :visible.sync="open" width="500px" append-to-body>
+    <el-dialog title="新增/编辑阅卷任务" :visible.sync="open" width="80%" append-to-body>
       <el-form ref="form" :model="form" :rules="rules" label-width="80px">
-        <el-form-item label="名称" prop="name">
-          <el-input clearable v-model="form.name" placeholder="请输入名称"></el-input>
-        </el-form-item>
-        <el-form-item label="试卷模板" prop="role">
-          <el-select v-model="form.paper_id" placeholder="请选择试卷模板" filterable>
-            <el-option v-for="item in papersList" :key="item.id" :label="item.name" :value="item.id">
-            </el-option>
-          </el-select>
-        </el-form-item>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="考试名称" prop="name">
+              <el-input clearable v-model="form.name" placeholder="请输入名称"></el-input>
+            </el-form-item>
+            <el-form-item label="参考班级" prop="role">
+              <el-row>
+                <el-col :span="12">
+                  <el-select @change="getClassList" v-model="form.school_id" placeholder="请选择学校" filterable clearable>
+                    <el-option v-for="item in schoolList" :key="item.id" :label="item.name" :value="item.school_id">
+                    </el-option>
+                  </el-select>
+                </el-col>
+                <el-col :span="12">
+                  <el-select @change="getClassList" v-model="form.grade_name" placeholder="请选择年级" filterable clearable>
+                    <el-option v-for="item in gradeList" :key="item" :label="item" :value="item">
+                    </el-option>
+                  </el-select>
+                </el-col>
+                <el-col :span="24" v-if="form.grade_name">
+                  <el-checkbox-group v-model="checkClassList">
+                    <el-checkbox v-for="item in classList" :key="item.class_id" :label="item.class_id">{{item.name}}
+                    </el-checkbox>
+                  </el-checkbox-group>
+                </el-col>
+              </el-row>
+            </el-form-item>
+            <el-form-item label="备注" prop="name">
+              <el-input clearable v-model="form.remark" placeholder="请输入备注"></el-input>
+            </el-form-item>
+
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="试卷模板" prop="role">
+              <el-select v-model="form.paper_id" placeholder="请选择试卷模板" filterable>
+                <el-option v-for="item in papersList" :key="item.id" :label="item.name" :value="item.id">
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
       </el-form>
       <div slot="footer" class="dialog-footer">
         <el-button type="primary" @click="submitForm">确 定</el-button>
@@ -124,7 +154,7 @@
     <!-- 上传试卷 -->
     <el-dialog title="试卷上传" :visible.sync="uploadDialogVisible" width="90%" @close="closeUploadDialog">
       <el-row :gutter="20">
-        <el-col :span="16">
+        <el-col :span="24">
           <!-- <el-row>
             <el-col :span="6">参考人数:{{studentsList.length}}</el-col>
             <el-col :span="6">已上传:{{studentsList.length}}</el-col>
@@ -147,6 +177,21 @@
                 导出</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">
@@ -156,13 +201,10 @@
               </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 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_no" label="姓名" width="80" />
+            <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}}
@@ -189,34 +231,32 @@
             </el-table-column>
             <el-table-column align="center" prop="date" label="操作" fixed="right" width="120px">
               <template slot-scope="scope">
-                <el-button @click="showCurRecImg(scope.row)" size="mini" type="text">查看</el-button>
-                <el-button @click="showCurRecKhImg(scope.row)" size="mini" type="text">考号</el-button>
-                <el-button @click="delStudents(scope.row.id,scope.$index)" size="mini" type="text">删除</el-button>
+                <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)" 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-col :span="8">
-          <div style="height:85vh;overflow-y:scroll;position: relative;">
-            <el-button style="position:absolute;top:0px;left:100px;" size="small" type="warning" icon="el-icon-printer">
-              试卷扫描</el-button>
-            <span style="position:absolute;top:0px;right:40px;color:green;">成功上传:{{fileList.length}}</span>
-            <el-upload class="upload-demo" action="http://test.scxjc.club/api/admin/papers/uploadpaper"
-              :on-success="handleUploadSuccess" :file-list="fileList" list-type="picture" :data="{taskid:taskid}"
-              multiple>
-              <el-button size="small" type="primary">点击上传</el-button>
-              <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div>
-            </el-upload>
-            <img v-if="fileList.length<1" src="../../assets/scanner.png" alt=""
-              style="position:absolute;left: 50%;transform: translate(-50%,120px)">
-          </div>
-        </el-col>
       </el-row>
       <div slot="footer" class="dialog-footer">
         <el-button type="primary" @click="closeUploadDialog">关 闭</el-button>
       </div>
+      <!-- 试卷上传 -->
+      <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 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>
+      </el-dialog>
     </el-dialog>
     <!-- 重新识别 -->
     <el-dialog title="重新识别" :visible.sync="remarkDialogVisible" width="60%" @close="closeRemarkDialog">
@@ -251,13 +291,15 @@
         loading: false,
         queryParams: {
           page: 1,
-		  page_size:20
+          page_size: 20
         },
         form: {
-          khVoiceNum:5,
-          khFillRate:3.0,
-          tmVoiceNum:3,
-          tmFillRate:1.8
+          khVoiceNum: 5,
+          khFillRate: 3.0,
+          tmVoiceNum: 3,
+          tmFillRate: 1.8,
+          class_list: ["高三一班", "高三二班"],
+          checkList: []
         },
         form1: {},
         form2: {},
@@ -268,11 +310,12 @@
         doctorList: [],
         rules: {},
         uploadDialogVisible: false,
-        remarkDialogVisible:false,
+        remarkDialogVisible: false,
         fileList: [],
         papersList: [],
         taskid: null,
         timer: null,
+        timer2:null,
         studentsList: [],
         showAnsVisible: false,
         curStudentRecImg: "",
@@ -286,16 +329,22 @@
         recErrTotal: 0,
         queryName: "",
         queryMarkStatus: null,
-        selectException:[]
+        selectException: [],
+        checkClassList: [],
+        schoolList: [],
+        gradeList: [],
+        classList: [],
+        imgListVisible:false,
+        taskImgTotal:0
       };
     },
     methods: {
-		jump(url,id) {
-				  id==2?localStorage.setItem("sonNav",2):'';
-				  if (url) {
-				    this.$router.push(url);
-				  }
-		},
+      jump(url, id) {
+        id == 2 ? localStorage.setItem("sonNav", 2) : '';
+        if (url) {
+          this.$router.push(url);
+        }
+      },
       submitUpload() {
         this.$refs.upload.submit();
       },
@@ -342,17 +391,49 @@
       },
       getData() {
         this.loading = true;
+        // 试卷列表
         this.$api
           .getPapersSearch({})
           .then((res) => {
             this.papersList = res.data.data;
             this.loading = false
           });
+        // 阅卷任务列表
         this.$api.getMarkTaskList(this.queryParams).then(res => {
           this.total = res.data.data.total;
           this.list = res.data.data.list;
         })
       },
+      getSchoolList() {
+        let params = {
+          school_id: this.form.school_id,
+          grade_name: this.form.grade_name,
+          page: 1,
+          page_size: 1000
+        }
+        // 学校列表
+        this.$api.schoolList(params).then(res => {
+          this.schoolList = res.data.data.list;
+        })
+      },
+      getGradeList() {
+        // 年级列表
+        this.$api.gradeList({}).then(res => {
+          this.gradeList = res.data.data;
+        })
+      },
+      getClassList() {
+        let params = {
+          school_id: this.form.school_id,
+          grade_name: this.form.grade_name,
+          page: 1,
+          page_size: 1000
+        }
+        // 班级列表
+        this.$api.classList(params).then(res => {
+          this.classList = res.data.data.list;
+        })
+      },
       handleAdd() {
         this.open = true;
         this.title = "新增医生";
@@ -362,6 +443,11 @@
       submitForm() {
         this.$refs["form"].validate((valid) => {
           if (valid) {
+            this.form.class_id = this.checkClassList.join();
+            let selSchool = this.schoolList.filter(item => item.school_id == this.form.school_id);
+            this.form.school_name = selSchool[0].name;
+            let selClass = this.classList.filter(item => this.checkClassList.indexOf(item.class_id) != -1);
+            this.form.class_name = selClass.map(item => item.name).join();
             if (this.form.id != null) {
               this.$api.editMarkTask(this.form).then((res) => {
                 if (res.data.code == 0) {
@@ -472,12 +558,30 @@
         this.fileList = [];
         window.clearInterval(this.timer);
       },
-      closeRemarkDialog(){
+      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}).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")) {
@@ -556,61 +660,74 @@
       },
       handleSelectionChange(val) {
         this.selectException = [];
-        if(val.length > 0){
-          val.forEach(item=>{
-            let task_img = item.task_id+";;"+item.imgs+";;"+item.id;
+        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){
+      reTryMark() {
+        if (this.selectException.length < 1) {
           this.msgError("请选择需要重新识别的答卷!");
-        }else{
+        } else {
           this.remarkDialogVisible = true;
         }
       },
-      doReTryMark(){
+      doReTryMark() {
         let urls = []
-        this.selectException.forEach(item=>{
+        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.$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.$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.recErrTotal = res.data.data.err_total;
             })
-            that.recTotal = res.data.data.total;
-            that.recSucTotal = res.data.data.suc_total;
-            that.recErrTotal = res.data.data.err_total;
-          })
-        }, 4000)
+          }, 4000)
+        })
+      },
+      startRecPaper(){
+        this.$api.startRecPaper({task_id:this.curTaskId}).then(res=>{
+
         })
       }
     },
     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;
@@ -628,17 +745,21 @@
   .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;
+
+  .prosss_box {
+    display: flex;
   }
 </style>

+ 6 - 4
src/views/tasks/markPaper.vue

@@ -22,7 +22,7 @@
 				<ul>
 					<li v-for="(item,index) in list2" :key='index' :class="stu_index==index?'act':''" @click="changeStu(index)">
 						<p>{{index+1}}.{{item.student_name}}   <span>{{item.mark_score}}分</span></p>
-						<img :src="item.imgs" alt="">
+						<!-- <img :src="item.imgs" alt=""> -->
 					</li>
 				</ul>
 			</template>
@@ -104,7 +104,7 @@
 					  <p>试题</p>
 					  <ul class="papers">
 						  <li  v-for="(item,index) in list2" :key='index' :class="qno_index==index?'act':''" @click="changeQno(index)">
-							  <img width="100%"    :src="item.imgs" alt=""><br>
+							  <!-- <img width="100%"    :src="item.imgs" alt=""><br> -->
 							  <span style="margin: 10px auto;">第{{item.qno}}题({{item.mark_score}}分)</span>
 						  </li>
 					  </ul>
@@ -1172,8 +1172,10 @@
 				flex-wrap: wrap;
 				li{
 					width: 47%;
-					height: 110px;
-					margin-bottom: 10px;
+					/* height: 110px; */
+					/* margin-bottom: 10px; */
+					margin:3px;
+					border:1px solid #ccc;
 				}
 			}
 		}