examScheduling.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. <template>
  2. <el-container>
  3. <el-main>
  4. <commonFormVue :form="form" :getExamCondition="getExamCondition">
  5. <el-col :span="8">
  6. <el-form-item label="完成状态">
  7. <el-select v-model="form.finished" clearable placeholder="全部">
  8. <el-option value="true" label="已完成"></el-option>
  9. <el-option value="false" label="未完成"></el-option>
  10. </el-select>
  11. </el-form-item>
  12. </el-col>
  13. <el-col :span="8">
  14. <el-form-item label="采集人">
  15. <el-input v-model="form.infoCollector" placeholder="采集人">
  16. </el-input>
  17. </el-form-item>
  18. </el-col>
  19. </commonFormVue>
  20. <el-row>
  21. <el-col :span="24">
  22. <el-button @click="search" size="medium" type="primary"
  23. >查询</el-button
  24. >
  25. <commonExportVue
  26. v-show="currentPagePrivileges.EXAM_PARTICULARS_EXPORT"
  27. :form="form"
  28. :exportUrl="exportUrl"
  29. :exportFileName="exportFileName"
  30. ></commonExportVue>
  31. </el-col>
  32. </el-row>
  33. <el-row class="margin-top-10"
  34. ><el-col :span="24">
  35. <el-table
  36. v-loading="tableLoading"
  37. element-loading-text="数据加载中"
  38. ref="multipleTable"
  39. @selection-change="handleSelectionChange"
  40. :data="tableData"
  41. border
  42. >
  43. <el-table-column sortable label="学习中心" prop="orgName">
  44. </el-table-column>
  45. <el-table-column sortable label="姓名" prop="studentName">
  46. </el-table-column>
  47. <el-table-column sortable label="身份证号" prop="identityNumber">
  48. </el-table-column>
  49. <el-table-column sortable label="学号" prop="studentCode">
  50. </el-table-column>
  51. <el-table-column sortable label="课程" prop="courseName">
  52. </el-table-column>
  53. <el-table-column sortable label="课程层次" prop="courseLevel">
  54. </el-table-column>
  55. <el-table-column sortable label="专业" prop="specialtyName">
  56. </el-table-column>
  57. <el-table-column sortable label="已考次数" prop="normalExamTimes">
  58. </el-table-column>
  59. <el-table-column sortable label="学生电话" prop="phone">
  60. </el-table-column>
  61. <el-table-column sortable label="年级" prop="grade">
  62. </el-table-column>
  63. <el-table-column sortable label="采集人" prop="infoCollector">
  64. </el-table-column>
  65. <el-table-column sortable label="完成状态">
  66. <template slot-scope="scope">
  67. <span
  68. v-show="scope.row.finished && scope.row.examType == 'ONLINE'"
  69. >已完成</span
  70. >
  71. <span
  72. v-show="!scope.row.finished && scope.row.examType == 'ONLINE'"
  73. >未完成</span
  74. >
  75. <span
  76. v-show="scope.row.finished && scope.row.examType == 'OFFLINE'"
  77. >已抽题</span
  78. >
  79. <span
  80. v-show="
  81. !scope.row.finished && scope.row.examType == 'OFFLINE'
  82. "
  83. >未抽题</span
  84. >
  85. </template>
  86. </el-table-column>
  87. <el-table-column label="操作">
  88. <template slot-scope="scope">
  89. <el-button
  90. size="mini"
  91. v-show="scope.row.examType == 'OFFLINE'"
  92. type="success"
  93. icon="el-icon-success"
  94. @click="previewPaper(scope.row.examStudentId);"
  95. >查看考题</el-button
  96. >
  97. <el-button
  98. size="mini"
  99. v-show="scope.row.examType == 'OFFLINE'"
  100. type="success"
  101. icon="el-icon-success"
  102. @click="exportPaper(scope.row.examStudentId);"
  103. >下载考题</el-button
  104. >
  105. <el-button
  106. size="mini"
  107. v-show="scope.row.examType == 'OFFLINE'"
  108. type="success"
  109. icon="el-icon-success"
  110. @click="openUploadAnswerDialog(scope.row.examStudentId);"
  111. >上传作答</el-button
  112. >
  113. </template>
  114. </el-table-column>
  115. </el-table>
  116. <div class="block">
  117. <el-pagination
  118. @size-change="handleSizeChange"
  119. @current-change="handleCurrentChange"
  120. :current-page.sync="form.pageNo"
  121. :page-sizes="[10, 30, 50, 100]"
  122. :page-size="form.pageSize"
  123. layout="total, sizes, prev, pager, next, jumper"
  124. :total="total"
  125. >
  126. </el-pagination></div></el-col
  127. ></el-row>
  128. <div>
  129. <el-dialog title="上传作答" :visible.sync="uploadAnswerDialogVisible">
  130. <el-form>
  131. <el-form-item label="选择文件"
  132. ><input
  133. type="file"
  134. accept="application/pdf,application/zip"
  135. id="importFile"
  136. @change="uploadAnswerChange"
  137. />
  138. <div>温馨提示:仅支持pdf和zip文件,文件大小请不要超过30M!</div>
  139. </el-form-item>
  140. <div class="dialog-footer">
  141. <el-button @click="uploadAnswerDialogVisible = false;"
  142. >取 消</el-button
  143. >
  144. <el-button
  145. :disabled="!offlineAnswerFile"
  146. type="primary"
  147. @click="doUploadAnswer"
  148. >确 定</el-button
  149. >
  150. </div>
  151. </el-form>
  152. </el-dialog>
  153. </div>
  154. </el-main>
  155. </el-container>
  156. </template>
  157. <script>
  158. import { mapState } from "vuex";
  159. import commonFormVue from "../component/commonForm.vue";
  160. import commonExportVue from "../component/commonExport.vue";
  161. import pagePrivilege from "../mixin/pagePrivilege.js";
  162. export default {
  163. components: { commonFormVue, commonExportVue },
  164. mixins: [pagePrivilege],
  165. data() {
  166. return {
  167. uploadAnswerDialogVisible: false,
  168. total: 0,
  169. tableLoading: false,
  170. form: {
  171. examRecordDataId: null,
  172. hasStranger: null,
  173. courseId: null,
  174. courseLevel: null,
  175. examId: null,
  176. examRecordId: null,
  177. faceSuccessPercentLower: null,
  178. faceSuccessPercentUpper: null,
  179. livenessSuccessPercentLower: null,
  180. livenessSuccessPercentUpper: null,
  181. identityNumber: null,
  182. orgId: null,
  183. studentCode: null,
  184. studentName: null,
  185. isWarn: null,
  186. pageNo: 1,
  187. pageSize: 10
  188. },
  189. getExamCondition: {
  190. params: {
  191. name: "",
  192. examTypes: "ONLINE#OFFLINE"
  193. },
  194. filterCondition: ""
  195. },
  196. tableData: [],
  197. exportUrl: "/api/ecs_oe_admin/exam/student/all/list/export",
  198. exportFileName: "考试进度详情",
  199. currentOfflineExamRecordDataId: "",
  200. offlineAnswerFile: "",
  201. currentPagePrivileges: {
  202. EXAM_PARTICULARS_EXPORT: false //导出
  203. }
  204. };
  205. },
  206. computed: {
  207. ...mapState({ user: state => state.user })
  208. },
  209. methods: {
  210. search() {
  211. if (!this.form.examId) {
  212. this.$notify({
  213. title: "警告",
  214. message: "请选择考试批次",
  215. type: "warning",
  216. duration: 1000
  217. });
  218. return false;
  219. }
  220. this.tableLoading = true;
  221. this.$http
  222. .post("/api/ecs_oe_admin/exam/student/all/list", this.form)
  223. .then(response => {
  224. if (response.data) {
  225. this.tableData = response.data.content;
  226. this.total = response.data.totalElements;
  227. } else {
  228. this.tableData = [];
  229. }
  230. this.tableLoading = false;
  231. });
  232. },
  233. selectable(row) {
  234. return row.isWarn;
  235. },
  236. handleSelectionChange(val) {
  237. this.multipleSelection = val;
  238. },
  239. /**
  240. * pagesize改变时触发
  241. */
  242. handleSizeChange(val) {
  243. this.form.pageSize = val;
  244. this.search();
  245. },
  246. /**
  247. * 当前页改变时触发
  248. */
  249. handleCurrentChange() {
  250. this.search();
  251. },
  252. previewPaper(examStudentId) {
  253. this.$http
  254. .get("/api/ecs_oe_admin/exam/record/select/byExamStudentId", {
  255. params: { examStudentId: examStudentId }
  256. })
  257. .then(function success(response) {
  258. if (response.data) {
  259. var examRecordList = response.data;
  260. if (examRecordList && examRecordList.length > 0) {
  261. window.open(
  262. "http://192.168.10.39:8868/#/preview_paper/" +
  263. examRecordList[0].basePaperId
  264. );
  265. } else {
  266. alert("该考生未参加考试");
  267. }
  268. }
  269. });
  270. },
  271. exportPaper(examStudentId) {
  272. var currentUser = this.user;
  273. this.$http
  274. .get("/api/ecs_oe_admin/exam/record/select/byExamStudentId", {
  275. params: { examStudentId: examStudentId }
  276. })
  277. .then(function success(response) {
  278. if (response.data) {
  279. var examRecordList = response.data;
  280. if (examRecordList && examRecordList.length > 0) {
  281. var basePaperId = examRecordList[0].basePaperId;
  282. var rootOrgName = currentUser.rootOrgName;
  283. var token = currentUser.token;
  284. var key = currentUser.key;
  285. window.location.href =
  286. "http://192.168.10.39:8868" +
  287. "/api/ecs_ques/paper/export/" +
  288. basePaperId +
  289. "/PAPER/" +
  290. rootOrgName +
  291. "/" +
  292. basePaperId +
  293. "/offLine?$key=" +
  294. key +
  295. "&$token=" +
  296. token;
  297. } else {
  298. alert("该考生未参加考试");
  299. }
  300. }
  301. });
  302. },
  303. openUploadAnswerDialog(examStudentId) {
  304. this.uploadAnswerDialogVisible = true;
  305. this.currentOfflineExamStudentId = examStudentId;
  306. },
  307. uploadAnswerChange(event) {
  308. if (event.target.files.length > 0) {
  309. this.offlineAnswerFile = event.target.files[0];
  310. } else {
  311. this.offlineAnswerFile = "";
  312. }
  313. },
  314. doUploadAnswer() {
  315. this.$http
  316. .get("/api/ecs_oe_admin/exam/record/data/findByExamStudentId", {
  317. params: { examStudentId: this.currentOfflineExamStudentId }
  318. })
  319. .then(response => {
  320. debugger;
  321. var examRecordDataList = response.data;
  322. if (examRecordDataList.length == 0) {
  323. alert("改学生未参加考试");
  324. return;
  325. }
  326. let param = new FormData();
  327. param.append("file", this.offlineAnswerFile);
  328. var examRecordDataId = examRecordDataList[0].id;
  329. param.append("examRecordDataId", examRecordDataId);
  330. let config = {
  331. headers: { "Content-Type": "multipart/form-data" }
  332. };
  333. this.$http
  334. .post("/api/ecs_oe_student/offlineExam/submitPaper", param, config)
  335. .then(() => {
  336. debugger;
  337. })
  338. .catch(function(error) {
  339. console.log(error);
  340. });
  341. });
  342. }
  343. },
  344. created() {}
  345. };
  346. </script>
  347. <style scoped>
  348. .el-row {
  349. position: static !important;
  350. }
  351. .margin-top-10 {
  352. margin-top: 10px;
  353. }
  354. </style>