Index.vue 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810
  1. <template>
  2. <section class="content">
  3. <div class="breadcrumb">
  4. <el-breadcrumb separator="/">
  5. <el-breadcrumb-item><a href="/">阅卷管理</a></el-breadcrumb-item>
  6. <el-breadcrumb-item>阅卷任务</el-breadcrumb-item>
  7. </el-breadcrumb>
  8. </div>
  9. <el-form :model="queryParams" label-width="80px" class="filter-form" :inine="true">
  10. <el-row>
  11. <el-col :span="4">
  12. <el-form-item label="学校">
  13. <el-select size="mini" v-model="queryParams.school_id">
  14. <el-option label="人大附中" value="人大附中">人大附中</el-option>
  15. </el-select>
  16. </el-form-item>
  17. </el-col>
  18. <el-col :span="4">
  19. <el-form-item label="年级" v-model="queryParams.grade_id">
  20. <el-select v-model="queryParams.school_id" size="mini">
  21. <el-option label="高三一班" value="高三一班">高三一班</el-option>
  22. </el-select>
  23. </el-form-item>
  24. </el-col>
  25. <el-col :span="8">
  26. <el-form-item label-width="10" style="margin-left: 10px">
  27. <el-button type="primary" @click="getData" size="mini">筛选</el-button>
  28. <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd">新增</el-button>
  29. </el-form-item>
  30. </el-col>
  31. </el-row>
  32. </el-form>
  33. <el-table v-loading="loading" :data="list" style="width: 100%; margin-top: 10px" height="50vh">
  34. <el-table-column prop="name" label="作业名称"> </el-table-column>
  35. <el-table-column prop="full_score" label="满分">
  36. <template slot-scope="scope">
  37. <div class="bold">{{ scope.row.full_score }}</div>
  38. </template>
  39. </el-table-column>
  40. <el-table-column prop="max_score" label="最高分">
  41. <template slot-scope="scope">
  42. <div class="bold">{{ scope.row.max_score }}</div>
  43. </template>
  44. </el-table-column>
  45. <el-table-column prop="avg_score" label="平均分">
  46. <template slot-scope="scope">
  47. <div class="bold">{{ scope.row.avg_score }}</div>
  48. </template>
  49. </el-table-column>
  50. <el-table-column prop="pass_rate" label="及格率">
  51. <template slot-scope="scope">
  52. <div class="bold" style="color: #0a9dff">
  53. {{ scope.row.pass_rate }}
  54. </div>
  55. </template>
  56. </el-table-column>
  57. <el-table-column prop="phone" label="批阅进度" width="180">
  58. <template slot-scope="scope">
  59. <div class="d-f prosss_box">
  60. <el-progress :percentage="scope.row.ww" :stroke-width="8" :color="
  61. scope.row.total_students == scope.row.marked_students
  62. ? '#0A9DFF'
  63. : '#FA0A2F'
  64. "></el-progress>
  65. <div class="contrasts">
  66. <span>{{ scope.row.marked_students }}/</span>
  67. <span>{{ scope.row.total_students }}</span>
  68. </div>
  69. </div>
  70. </template>
  71. </el-table-column>
  72. <el-table-column align="center" prop="ctime" label="创建时间" />
  73. <el-table-column align="center" prop="date" label="操作" width="380">
  74. <template slot-scope="scope">
  75. <el-button @click="jump(
  76. '/task/markpaper?title=' +
  77. scope.row.name +
  78. '&id=' +
  79. scope.row.task_id
  80. )" size="mini" type="success">开始阅卷</el-button>
  81. <el-button @click="remarkSet(scope.row)" size="mini" type="warning">阅卷设置</el-button>
  82. <el-button @click="edit(scope.row.id)" size="mini" type="warning">编辑</el-button>
  83. <el-button @click="openUploadPaper(scope.row.task_id)" size="mini" type="primary">上传试卷</el-button>
  84. <el-button @click="del(scope.row.task_id)" size="mini" type="danger">删除</el-button>
  85. </template>
  86. </el-table-column>
  87. </el-table>
  88. <Page ref="pageButton" :current="form.page" :page_size="form.page_size" :total="total" @pageChange="gopage" />
  89. <!-- 新增/编辑阅卷任务 -->
  90. <el-dialog title="新增/编辑阅卷任务" :visible.sync="open" width="80%" append-to-body>
  91. <el-form ref="form" :model="form" :rules="rules" label-width="80px">
  92. <el-row>
  93. <el-col :span="12">
  94. <el-form-item label="考试名称" prop="name">
  95. <el-input clearable v-model="form.name" placeholder="请输入名称"></el-input>
  96. </el-form-item>
  97. <el-form-item label="参考班级" prop="role">
  98. <el-row>
  99. <el-col :span="12">
  100. <el-select @change="getClassList" v-model="form.school_id" placeholder="请选择学校" filterable clearable>
  101. <el-option v-for="item in schoolList" :key="item.id" :label="item.name" :value="item.school_id">
  102. </el-option>
  103. </el-select>
  104. </el-col>
  105. <el-col :span="12">
  106. <el-select @change="getClassList" v-model="form.grade_name" placeholder="请选择年级" filterable clearable>
  107. <el-option v-for="item in gradeList" :key="item" :label="item" :value="item">
  108. </el-option>
  109. </el-select>
  110. </el-col>
  111. <el-col :span="24" v-if="form.grade_name">
  112. <el-checkbox-group v-model="checkClassList">
  113. <el-checkbox v-for="item in classList" :key="item.class_id" :label="item.class_id">{{item.name}}
  114. </el-checkbox>
  115. </el-checkbox-group>
  116. </el-col>
  117. </el-row>
  118. </el-form-item>
  119. <el-form-item label="备注" prop="name">
  120. <el-input clearable v-model="form.remark" placeholder="请输入备注"></el-input>
  121. </el-form-item>
  122. </el-col>
  123. <el-col :span="12">
  124. <el-form-item label="试卷模板" prop="role">
  125. <el-select v-model="form.paper_id" placeholder="请选择试卷模板" filterable>
  126. <el-option v-for="item in papersList" :key="item.id" :label="item.name" :value="item.id">
  127. </el-option>
  128. </el-select>
  129. </el-form-item>
  130. </el-col>
  131. </el-row>
  132. </el-form>
  133. <div slot="footer" class="dialog-footer">
  134. <el-button type="primary" @click="submitForm">确 定</el-button>
  135. <el-button @click="open = false">取 消</el-button>
  136. </div>
  137. </el-dialog>
  138. <!-- 预览识别结果 -->
  139. <el-dialog title="预览识别结果" :visible.sync="showAnsVisible" width="500px" append-to-body>
  140. <el-form ref="form" :model="form" :rules="rules" label-width="80px">
  141. <el-image :src="curStudentRecImg">
  142. <div slot="error" class="image-slot">
  143. <i class="el-icon-picture-outline"></i>
  144. </div>
  145. </el-image>
  146. </el-form>
  147. <div slot="footer" class="dialog-footer">
  148. <el-button @click="showAnsVisible = false">关 闭</el-button>
  149. </div>
  150. </el-dialog>
  151. <!-- 上传试卷 -->
  152. <el-dialog title="试卷上传" :visible.sync="uploadDialogVisible" width="90%" @close="closeUploadDialog">
  153. <el-row :gutter="20">
  154. <el-col :span="24">
  155. <!-- <el-row>
  156. <el-col :span="6">参考人数:{{studentsList.length}}</el-col>
  157. <el-col :span="6">已上传:{{studentsList.length}}</el-col>
  158. <el-col :span="6">识别异常:</el-col>
  159. </el-row> -->
  160. <el-form :inline="true">
  161. <el-form-item label="姓名">
  162. <el-input size="mini" placeholder="请输入姓名/考号" v-model="queryName" clearable></el-input>
  163. </el-form-item>
  164. <el-form-item label="识别异常">
  165. <el-select v-model="queryMarkStatus" size="mini" clearable>
  166. <el-option v-for="item in $const.recErrorList" :label="item.label" :value="item.value"></el-option>
  167. </el-select>
  168. </el-form-item>
  169. <el-form-item>
  170. <el-button type="primary" size="mini" @click=searchMarkData>搜索</el-button>
  171. <el-button size="mini" @click="reSetMarkData">重置</el-button>
  172. <el-button @click="downloadObjectiveResult(curTaskId)" type="warning" size="mini" icon="el-icon-download">
  173. 导出</el-button>
  174. <el-button @click="reTryMark" size="mini" type="success" icon="el-icon-printer">重新识别</el-button>
  175. </el-form-item>
  176. <el-form-item>
  177. <el-button size="mini" type="warning" icon="el-icon-printer">
  178. 试卷扫描</el-button>
  179. </el-form-item>
  180. <el-form-item>
  181. <el-upload class="upload-demo" action="http://test.scxjc.club/api/admin/papers/uploadpaper"
  182. :on-success="handleUploadSuccess" :data="{taskid:taskid}" :on-change="handleChange" list-type="picture"
  183. multiple>
  184. <el-button size="mini" type="primary" @click="openTaskImgList">点击上传</el-button>
  185. </el-upload>
  186. </el-form-item>
  187. </el-form>
  188. <el-row>
  189. <el-col :span="24">
  190. <el-tabs v-model="activeName" @tab-click="handleTabClick">
  191. <el-tab-pane :label="'正常('+recSucTotal+')'" name="1"></el-tab-pane>
  192. <el-tab-pane :label="'异常('+recErrTotal+')'" name="100"></el-tab-pane>
  193. </el-tabs>
  194. </el-col>
  195. </el-row>
  196. <el-table v-loading="loading" :data="studentsList" style="width: 100%; margin-top: 10px"
  197. @selection-change="handleSelectionChange" height="60vh">
  198. <el-table-column type="selection" width="45" v-if="activeName==100"></el-table-column>
  199. <el-table-column align="center" prop="student_name" label="姓名" width="80" />
  200. <el-table-column align="center" prop="student_no" label="考号" width="150">
  201. <template slot-scope="scope">
  202. <el-button type="text" @click="showStudentImgs(scope.row)" size="mini">{{scope.row.student_no}}
  203. </el-button>
  204. </template>
  205. </el-table-column>
  206. <el-table-column align="center" prop="objective_score" label="得分" />
  207. <!-- <el-table-column align="center" prop="mark_status" label="试卷状态">
  208. <template slot-scope="scope">
  209. <span v-if="scope.row.mark_status==0" style="color:#e6a23c;">待上传</span>
  210. <span v-if="scope.row.mark_status==1" style="color:#85ce61;">已上传</span>
  211. </template>
  212. </el-table-column> -->
  213. <el-table-column align="center" prop="mark_status_name" label="识别状态">
  214. <template slot-scope="scope">
  215. <span v-if="scope.row.mark_status<=0" style="color:#f78989;">{{scope.row.mark_status_name}}</span>
  216. <span v-if="scope.row.mark_status==1" style="color:#85ce61;">正常</span>
  217. </template>
  218. </el-table-column>
  219. <el-table-column align="center" prop="ctime" label="时间" width="140px">
  220. <template slot-scope="scope">
  221. <span style="font-size:12px;">{{scope.row.ctime}}</span>
  222. </template>
  223. </el-table-column>
  224. <el-table-column align="center" prop="date" label="操作" fixed="right" width="120px">
  225. <template slot-scope="scope">
  226. <el-button v-if="scope.row.mark_status!=0" @click="showCurRecImg(scope.row)" size="mini" type="text">查看
  227. </el-button>
  228. <el-button v-if="scope.row.mark_status!=0" @click="showCurRecKhImg(scope.row)" size="mini" type="text">
  229. 考号</el-button>
  230. <el-button @click="delStudents(scope.row.student_id,scope.$index)" size="mini" type="text">删除
  231. </el-button>
  232. </template>
  233. </el-table-column>
  234. </el-table>
  235. <Page ref="pageButton" :current="recPage" :page_size="recPageSize" :total="recTotal"
  236. @pageChange="goRecPage" />
  237. </el-col>
  238. </el-row>
  239. <div slot="footer" class="dialog-footer">
  240. <el-button type="primary" @click="closeUploadDialog">关 闭</el-button>
  241. </div>
  242. <!-- 试卷上传 -->
  243. <el-dialog title="试卷预览" :visible.sync="imgListVisible" width="750px" @close="closeTaskImgDialog" append-to-body>
  244. <div style="text-align:right;">
  245. <font>成功上传:{{taskImgTotal}}</font>&nbsp;&nbsp;&nbsp;&nbsp;
  246. <el-button v-loading="loading" type="primary" size="mini" @click="startRecPaper">开始识别</el-button>
  247. </div>
  248. <div style="width:156px;display: inline-block;margin:10px;border:1px solid #ccc;"
  249. v-for="(item,index) in fileList">
  250. <el-image width="100px" alt="" :src="item.url" :preview-src-list="[item.url]"></el-image>
  251. </div>
  252. <Page ref="pageImgButton" :current="imgForm.page" :page_size="imgForm.page_size" :total="taskImgTotal" @pageChange="goTaskImg" />
  253. </el-dialog>
  254. </el-dialog>
  255. <!-- 重新识别 -->
  256. <el-dialog title="重新识别" :visible.sync="remarkDialogVisible" width="60%" @close="closeRemarkDialog">
  257. <el-form :inline="true">
  258. <el-form-item label="考号噪声参数">
  259. <el-input-number v-model="form.khVoiceNum" :min="1" :max="5"></el-input-number>
  260. </el-form-item>
  261. <el-form-item label="考号填涂比例阈值">
  262. <el-input-number v-model="form.khFillRate" :min="1" :max="5"></el-input-number>
  263. </el-form-item>
  264. <el-form-item label="题目噪声参数">
  265. <el-input-number v-model="form.tmVoiceNum" :min="1" :max="5"></el-input-number>
  266. </el-form-item>
  267. <el-form-item label="题目填涂比例阈值">
  268. <el-input-number v-model="form.tmFillRate" :min="1" :max="5"></el-input-number>
  269. </el-form-item>
  270. </el-form>
  271. <div slot="footer" class="dialog-footer">
  272. <el-button type="primary" @click="doReTryMark">确 定</el-button>
  273. </div>
  274. </el-dialog>
  275. <!--阅卷设置-->
  276. <MarkTaskSetDialog :remarkSetVisible="remarkSetVisible" :paperId="curPaperId" :taskId="curTaskId" @close="closeMarkTaskSet" />
  277. </section>
  278. </template>
  279. <script>
  280. import Page from "../../components/Page";
  281. import MarkTaskSetDialog from "./components/MarkTaskSetDialog"
  282. export default {
  283. components: {
  284. Page,
  285. MarkTaskSetDialog
  286. },
  287. data() {
  288. return {
  289. loading: false,
  290. queryParams: {
  291. page: 1,
  292. page_size: 20
  293. },
  294. form: {
  295. khVoiceNum: 5,
  296. khFillRate: 3.0,
  297. tmVoiceNum: 3,
  298. tmFillRate: 1.8,
  299. class_list: ["高三一班", "高三二班"],
  300. checkList: []
  301. },
  302. imgForm:{
  303. page:1,
  304. page_size:10
  305. },
  306. form1: {},
  307. form2: {},
  308. list: [{}, {}],
  309. total: 0,
  310. imgTotal:0,
  311. title: "新增用户",
  312. open: false,
  313. doctorList: [],
  314. rules: {},
  315. uploadDialogVisible: false,
  316. remarkDialogVisible: false,
  317. fileList: [],
  318. papersList: [],
  319. taskid: null,
  320. timer: null,
  321. timer2: null,
  322. studentsList: [],
  323. showAnsVisible: false,
  324. curStudentRecImg: "",
  325. activeName: "1",
  326. curTaskId: null,
  327. curPaperId:null,
  328. recPage: 1,
  329. recPageSize: 20,
  330. recTotal: 0,
  331. recParams: {},
  332. recSucTotal: 0,
  333. recErrTotal: 0,
  334. queryName: "",
  335. queryMarkStatus: null,
  336. selectException: [],
  337. checkClassList: [],
  338. schoolList: [],
  339. gradeList: [],
  340. classList: [],
  341. imgListVisible: false,
  342. taskImgTotal: 0,
  343. remarkSetVisible: false,
  344. activeSetName: "first",
  345. addQueForm:{},
  346. objectiveQueList:[],
  347. subjectiveQueList:[],
  348. subjectiveMarkTeacherList:[],
  349. checkList:[]
  350. };
  351. },
  352. methods: {
  353. jump(url, id) {
  354. id == 2 ? localStorage.setItem("sonNav", 2) : '';
  355. if (url) {
  356. this.$router.push(url);
  357. }
  358. },
  359. submitUpload() {
  360. this.$refs.upload.submit();
  361. },
  362. del(id) {
  363. this.$confirm("确认删除?", "提示", {
  364. type: "warning",
  365. }).then(() => {
  366. this.$api
  367. .delMarkTask({
  368. id: id,
  369. })
  370. .then((res) => {
  371. if (!res.data.code) {
  372. this.msgSuccess("删除成功");
  373. this.getData();
  374. } else {
  375. this.$msgError(res.data.message);
  376. }
  377. });
  378. });
  379. },
  380. gopage(size) {
  381. if (size) {
  382. this.queryParams.page_size = size;
  383. }
  384. this.queryParams.page = this.$refs.pageButton.page;
  385. this.getData();
  386. },
  387. goTaskImg(page){
  388. if (page) {
  389. this.imgForm.page_size = size;
  390. }
  391. this.imgForm.page = this.$refs.pageImgButton.page;
  392. let that = this;
  393. that.$api.getTaskImgList({
  394. task_id: that.curTaskId,
  395. page:that.imgForm.page,
  396. page_size:that.imgForm.page_size
  397. }).then(res => {
  398. that.fileList = res.data.data.list
  399. that.taskImgTotal = res.data.data.total;
  400. })
  401. },
  402. goRecPage(size) {
  403. if (size) {
  404. this.recPageSize = size;
  405. }
  406. this.recPage = this.$refs.pageButton.page;
  407. this.recParams = {
  408. task_id: this.curTaskId,
  409. page: this.recPage,
  410. page_size: this.recPageSize,
  411. status: this.activeName,
  412. name: this.queryName,
  413. err_status: this.queryMarkStatus
  414. }
  415. window.clearInterval(this.timer);
  416. this.openUploadPaper(this.curTaskId)
  417. },
  418. getData() {
  419. this.loading = true;
  420. // 试卷列表
  421. this.$api
  422. .getPapersSearch({})
  423. .then((res) => {
  424. this.papersList = res.data.data;
  425. this.loading = false
  426. });
  427. // 阅卷任务列表
  428. this.$api.getMarkTaskList(this.queryParams).then(res => {
  429. this.total = res.data.data.total;
  430. this.list = res.data.data.list;
  431. })
  432. },
  433. getSchoolList() {
  434. let params = {
  435. school_id: this.form.school_id,
  436. grade_name: this.form.grade_name,
  437. page: 1,
  438. page_size: 1000
  439. }
  440. // 学校列表
  441. this.$api.schoolList(params).then(res => {
  442. this.schoolList = res.data.data.list;
  443. })
  444. },
  445. getGradeList() {
  446. // 年级列表
  447. this.$api.gradeList({}).then(res => {
  448. this.gradeList = res.data.data;
  449. })
  450. },
  451. getClassList() {
  452. let params = {
  453. school_id: this.form.school_id,
  454. grade_name: this.form.grade_name,
  455. page: 1,
  456. page_size: 1000
  457. }
  458. // 班级列表
  459. this.$api.classList(params).then(res => {
  460. this.classList = res.data.data.list;
  461. })
  462. },
  463. handleAdd() {
  464. this.open = true;
  465. this.title = "新增医生";
  466. this.form = {};
  467. },
  468. /** 提交按钮 */
  469. submitForm() {
  470. this.$refs["form"].validate((valid) => {
  471. if (valid) {
  472. this.form.class_id = this.checkClassList.join();
  473. let selSchool = this.schoolList.filter(item => item.school_id == this.form.school_id);
  474. this.form.school_name = selSchool[0].name;
  475. let selClass = this.classList.filter(item => this.checkClassList.indexOf(item.class_id) != -1);
  476. this.form.class_name = selClass.map(item => item.name).join();
  477. if (this.form.id != null) {
  478. this.$api.editMarkTask(this.form).then((res) => {
  479. if (res.data.code == 0) {
  480. this.msgSuccess("成功!");
  481. this.open = false;
  482. this.getData();
  483. } else {
  484. this.msgError(res.data.message);
  485. }
  486. });
  487. } else {
  488. this.$api.addMarkTask(this.form).then((res) => {
  489. if (res.data.code == 0) {
  490. this.msgSuccess("成功!");
  491. this.open = false;
  492. this.getData();
  493. } else {
  494. this.msgError(res.data.message);
  495. }
  496. });
  497. }
  498. }
  499. });
  500. },
  501. remoteMethod(query) {
  502. if (query !== "") {
  503. // this.loading = true;
  504. this.$api
  505. .getDoctorsSearchList({
  506. name: query,
  507. })
  508. .then((res) => {
  509. this.doctorList = res.data.data;
  510. this.$set(this.doctorList, res.data.data);
  511. // this.loading = false;
  512. });
  513. } else {
  514. this.doctorList = [];
  515. }
  516. },
  517. searchMarkData() {
  518. this.recParams.name = this.queryName;
  519. this.recParams.errStatus = this.queryMarkStatus;
  520. window.clearInterval(this.timer);
  521. this.openUploadPaper(this.curTaskId);
  522. },
  523. reSetMarkData() {
  524. this.queryName = null;
  525. this.queryMarkStatus = null;
  526. this.queryParams.name = null;
  527. this.queryParams.err_status = null;
  528. window.clearInterval(this.timer);
  529. this.openUploadPaper(this.curTaskId);
  530. },
  531. openUploadPaper(id) {
  532. this.curTaskId = id
  533. this.uploadDialogVisible = true
  534. this.taskid = id
  535. let that = this;
  536. this.loading = true;
  537. this.recParams = {
  538. task_id: id,
  539. page: this.recPage,
  540. page_size: this.recPageSize,
  541. status: this.activeName,
  542. name: this.queryName,
  543. err_status: this.queryMarkStatus
  544. }
  545. this.$api.getMarkTaskStudents(this.recParams).then(res => {
  546. this.studentsList = res.data.data.list;
  547. this.studentsList.forEach(item => {
  548. let mark_status = item.mark_status;
  549. if (mark_status != 1) {
  550. item.mark_status_name = this.$const.recErrorList.filter((ritem) => {
  551. return ritem.value == mark_status;
  552. })[0].label
  553. } else {
  554. item.mark_status_name = "正常"
  555. }
  556. })
  557. this.recTotal = res.data.data.total;
  558. this.recSucTotal = res.data.data.suc_total;
  559. this.recErrTotal = res.data.data.err_total;
  560. this.loading = false;
  561. })
  562. window.clearInterval(this.timer);
  563. this.timer = setInterval(function () {
  564. that.$api.getMarkTaskStudents(that.recParams).then(res => {
  565. that.studentsList = res.data.data.list;
  566. that.studentsList.forEach(item => {
  567. let mark_status = item.mark_status;
  568. if (mark_status != 1) {
  569. item.mark_status_name = that.$const.recErrorList.filter((ritem) => {
  570. return ritem.value == mark_status;
  571. })[0].label
  572. } else {
  573. item.mark_status_name = "正常"
  574. }
  575. })
  576. that.recTotal = res.data.data.total;
  577. that.recSucTotal = res.data.data.suc_total;
  578. that.recErrTotal = res.data.data.err_total;
  579. })
  580. }, 4000)
  581. },
  582. closeUploadDialog() {
  583. this.uploadDialogVisible = false;
  584. this.fileList = [];
  585. window.clearInterval(this.timer);
  586. },
  587. closeRemarkDialog() {
  588. this.remarkDialogVisible = false;
  589. this.fileList = []
  590. },
  591. closeTaskImgDialog() {
  592. this.imgListVisible = false;
  593. window.clearInterval(this.timer2);
  594. },
  595. handlePreview(file) {
  596. console.log(file);
  597. },
  598. handleChange(file, fileList) {},
  599. openTaskImgList() {
  600. let that = this;
  601. this.imgListVisible = true
  602. window.clearInterval(this.timer2);
  603. this.timer2 = setInterval(function () {
  604. that.$api.getTaskImgList({
  605. task_id: that.curTaskId,
  606. page:that.imgForm.page,
  607. page_size:that.imgForm.page_size
  608. }).then(res => {
  609. that.fileList = res.data.data.list
  610. that.taskImgTotal = res.data.data.total;
  611. })
  612. }, 2000)
  613. },
  614. handleUploadSuccess(res, file, fileList) {
  615. if (!res.code) {
  616. if (fileList.every(item => item.status == "success")) {
  617. fileList.map(item => {
  618. item.response && this.fileList.push({
  619. "url": res.data.url,
  620. "name": res.data.name
  621. })
  622. })
  623. }
  624. }
  625. },
  626. delStudents(id, index) {
  627. this.$api.delMarkTaskStudents({
  628. id: id
  629. }).then(res => {
  630. this.msgSuccess("删除成功!");
  631. this.studentsList.splice(index, 1)
  632. })
  633. },
  634. handleRemove(e) {
  635. console.log(e)
  636. },
  637. showStudentImgs(row) {
  638. this.curStudentRecImg = row.imgs;
  639. this.showAnsVisible = true;
  640. },
  641. showCurRecImg(row) {
  642. this.curStudentRecImg = row.ans_imgs.replace(".png", "_draw_ans.png");
  643. this.showAnsVisible = true;
  644. },
  645. showCurRecKhImg(row) {
  646. let ext = row.ans_imgs.split("/").pop()
  647. if (ext) {
  648. ext = "." + ext.split(".")[1]
  649. }
  650. this.curStudentRecImg = row.ans_imgs.replace("_ans" + ext, "_sno" + ext);
  651. this.showAnsVisible = true;
  652. },
  653. handleTabClick(tab, event) {
  654. this.activeName = tab.name;
  655. this.recParams = {
  656. task_id: this.curTaskId,
  657. page: this.recPage,
  658. page_size: this.recPageSize,
  659. status: this.activeName,
  660. name: this.queryName,
  661. err_status: this.queryMarkStatus
  662. }
  663. window.clearInterval(this.timer);
  664. this.openUploadPaper(this.curTaskId)
  665. },
  666. downloadObjectiveResult(task_id) {
  667. this.$api
  668. .downloadObjectiveResult({
  669. task_id: task_id
  670. })
  671. .then((res) => {
  672. var elink = document.createElement("a");
  673. let blob = new Blob([res.data], {
  674. type: "application/vnd.ms-excel,charset=UTF-8",
  675. });
  676. let objUrl = URL.createObjectURL(blob);
  677. let file_name = decodeURIComponent(
  678. res.headers["content-disposition"].split("=")[1]
  679. );
  680. elink.download = file_name;
  681. elink.style.display = "none";
  682. elink.href = objUrl;
  683. document.body.appendChild(elink);
  684. elink.click();
  685. document.body.removeChild(elink);
  686. this.download_loading = false;
  687. });
  688. },
  689. handleSelectionChange(val) {
  690. this.selectException = [];
  691. if (val.length > 0) {
  692. val.forEach(item => {
  693. let task_img = item.task_id + ";;" + item.imgs + ";;" + item.id;
  694. this.selectException.push(task_img);
  695. })
  696. window.clearInterval(this.timer);
  697. }
  698. },
  699. reTryMark() {
  700. if (this.selectException.length < 1) {
  701. this.msgError("请选择需要重新识别的答卷!");
  702. } else {
  703. this.remarkDialogVisible = true;
  704. }
  705. },
  706. doReTryMark() {
  707. let urls = []
  708. this.selectException.forEach(item => {
  709. item = item + ";;" + String(this.form.khVoiceNum) + ";;" + String(this.form.khFillRate);
  710. item = item + ";;" + String(this.form.tmVoiceNum) + ";;" + String(this.form.tmFillRate);
  711. urls.push(item);
  712. })
  713. let that = this;
  714. this.$api.reTryMarkPaper({
  715. urls: urls
  716. }).then(res => {
  717. this.remarkDialogVisible = false;
  718. this.getData();
  719. window.clearInterval(this.timer);
  720. this.timer = setInterval(function () {
  721. that.$api.getMarkTaskStudents(that.recParams).then(res => {
  722. that.studentsList = res.data.data.list;
  723. that.studentsList.forEach(item => {
  724. let mark_status = item.mark_status;
  725. if (mark_status != 1) {
  726. item.mark_status_name = that.$const.recErrorList.filter((ritem) => {
  727. return ritem.value == mark_status;
  728. })[0].label
  729. } else {
  730. item.mark_status_name = "正常"
  731. }
  732. })
  733. that.recTotal = res.data.data.total;
  734. that.recSucTotal = res.data.data.suc_total;
  735. that.recErrTotal = res.data.data.err_total;
  736. })
  737. }, 4000)
  738. })
  739. },
  740. startRecPaper() {
  741. this.loading = true
  742. this.$api.startRecPaper({
  743. task_id: this.curTaskId
  744. }).then(res => {
  745. this.loading = false
  746. })
  747. },
  748. remarkSet(row) {
  749. this.remarkSetVisible = true
  750. this.curTaskId = row.task_id;
  751. this.curPaperId = row.paper_id;
  752. },
  753. closeMarkTaskSet(){
  754. this.remarkSetVisible = false
  755. }
  756. },
  757. created() {
  758. this.getData();
  759. this.getSchoolList();
  760. this.getGradeList();
  761. this.getClassList();
  762. },
  763. };
  764. </script>
  765. <style lang="scss">
  766. .el-upload-list {
  767. display: none !important;
  768. }
  769. .el-upload-list--picture .el-upload-list__item {
  770. width: 150px;
  771. float: left;
  772. margin-right: 10px;
  773. position: relative;
  774. }
  775. .el-upload-list--picture .el-upload-list__item.is-success .el-upload-list__item-name {
  776. position: absolute;
  777. z-index: 100;
  778. height: 70px;
  779. line-height: 130px;
  780. }
  781. .el-upload-list--picture .el-upload-list__item-thumbnail {
  782. width: 125px;
  783. }
  784. .prosss_box .el-progress.el-progress--line {
  785. width: 88px;
  786. margin: auto 5px auto 0;
  787. }
  788. .prosss_box .el-progress-bar {
  789. padding-right: 0;
  790. }
  791. .prosss_box .el-progress__text {
  792. display: none;
  793. }
  794. .prosss_box {
  795. display: flex;
  796. }
  797. </style>