diff --git a/src/api/index.js b/src/api/index.js index 59476c6..34ac49d 100644 --- a/src/api/index.js +++ b/src/api/index.js @@ -37,6 +37,10 @@ export default { getSandTableLastCache: `product/product/bank/operation/getSandTableLastCache`, getSchoolCourseAuthority: `nakadai/nakadai/curriculum/getSchoolCourseAuthority`, requestRenewalNotice: `nakadai/nakadai/curriculum/requestRenewalNotice`, + getTestPaperPracticeCache: `exam/exam/paper/getTestPaperPracticeCache`, + recordTestPaperPracticeCache: `exam/exam/paper/recordTestPaperPracticeCache`, + getRecentTestPaperPracticeCache: `exam/exam/paper/getRecentTestPaperPracticeCache`, + getRecentTestPaperPracticeByCid: `exam/exam/paper/getRecentTestPaperPracticeByCid`, // 课程笔记 addNote: `nakadai/curriculumNotes/addNote`, curriculumNoteList: `nakadai/curriculumNotes/curriculumNoteList`, diff --git a/src/pages/station/preview/index.vue b/src/pages/station/preview/index.vue index 44371a9..aceb791 100644 --- a/src/pages/station/preview/index.vue +++ b/src/pages/station/preview/index.vue @@ -816,8 +816,7 @@ export default { this.curProject = item.projectId }, // 展示选择项目弹框 - showProjectDia (isTheory) { - this.isTheory = isTheory + showProjectDia () { this.projectVisible = true }, // 查询项目 @@ -833,7 +832,7 @@ export default { }).catch(res => { }) }, // 进入实验 - entryProject (projectId) { + entryProject (projectId = '', paperId = '') { this.$confirm('是否要继续上次的实验?', '提示', { confirmButtonText: '是', cancelButtonText: '否', @@ -841,16 +840,23 @@ export default { closeOnClickModal: false }).then(() => { this.curProject = projectId + this.curPaper = paperId this.toSub() }).catch(() => { this.showProjectDia() }) }, // 进入实验 - entry (isTheory) { + async entry (isTheory) { + this.isTheory = isTheory if (isTheory) { // 理论试卷 - this.showProjectDia(1) + const res = await this.$post(`${this.api.getRecentTestPaperPracticeByCid}?cid=${this.courseId}`) + if (res.recentCacheInfo) { + this.entryProject('', res.recentCacheInfo.paperId) + } else { + this.showProjectDia(1) + } } else { // 实训系统 // 查询上次做的项目(python跟沙盘接口不一样) diff --git a/src/pages/theoryExam/index.vue b/src/pages/theoryExam/index.vue index a990096..92708f2 100644 --- a/src/pages/theoryExam/index.vue +++ b/src/pages/theoryExam/index.vue @@ -25,8 +25,16 @@ {{ timeSum.seconds }}秒 - 重新开始 - 提交 + + + 重新开始 + 提交 @@ -144,6 +152,7 @@ import Util from '@/libs/util' import Setting from "@/setting" import QuesConst from '@/const/ques' +import TestPaperConst from '@/const/testPaper' import _ from 'lodash' import Upload from '@/components/upload' import UeditorPlus from '@/components/ueditorPlus' @@ -174,7 +183,7 @@ export default { curriculumName: this.$route.query.curriculumName, assessmentId: this.$route.query.assessmentId, // 考核id classId: this.$route.query.classId, - id: +this.$route.query.id, // 赛事id + competitionId: +this.$route.query.competitionId, // 赛事id stageId: +this.$route.query.stageId, teamId: this.$route.query.teamId || '', entryTime: '', @@ -215,6 +224,8 @@ export default { pdfVisible: false, pdfSrc: '', client: null, + score: '', + reportId: '', }; }, mounted () { @@ -227,7 +238,7 @@ export default { this.getCompetition() }) - this.per = this.id ? 2 : this.assessmentId ? 1 : 0 + this.per = this.competitionId ? 2 : this.assessmentId ? 1 : 0 this.paperId ? this.getPracticePaper() : this.getCompetition(1) this.initOss() }, @@ -235,7 +246,7 @@ export default { // 获取竞赛信息 async getCompetition (load) { if (load) this.loading = true - const { competition } = await this.$post(`${this.api.getCompetition}?competitionId=${this.id}`) + const { competition } = await this.$post(`${this.api.getCompetition}?competitionId=${this.competitionId}`) const stages = competition.contentList if (stages) { const stage = stages.find(e => e.stageId === this.stageId) @@ -267,7 +278,7 @@ export default { // 缓存,如果有,则全部回显到页面上 const { examSubmitReq: cache } = await this.$post(this.api.getExamPaperCache, { - competitionId: this.id, + competitionId: this.competitionId, paperId, stageId }) @@ -296,10 +307,25 @@ export default { // 试卷详情 const { examPaper } = await this.$get(this.api.examPaperDetails, { id: paperId }) + // 缓存,如果有,则全部回显到页面上 + const { examSubmitReq: cache } = await this.$post(this.api.getTestPaperPracticeCache, { + cid: this.cid, + paperId: this.paperId, + mallId: this.mallId, + isContinueLastPractice: 1 + }) const now = await Util.getNow() - this.entryTime = now + let cacheQues + if (cache) { + this.entryTime = new Date(cache.startTime) + this.timeSumVal = (now - new Date(cache.startTime)) / 1000 + cacheQues = cache.examSubmitJudgeList + } else { + this.entryTime = now + } this.startCount() - this.handlePaper(examPaper) + + this.handlePaper(examPaper, cacheQues) } } catch (e) { this.loading = false @@ -360,7 +386,7 @@ export default { // 给填空题的每个空监听input事件,用以显示已作答状态 this.$nextTick(() => { - if (!cacheQues && this.id) this.submit(0) // 如果没有缓存,则先缓存一次(只是为了缓存进入时间,因为只有在每个小题答题后才会调缓存接口,所以只能第一次进入就缓存一次进入时间) + if (!cacheQues && this.per !== 1) this.submit(0) // 如果没有缓存,则先缓存一次(只是为了缓存进入时间,因为只有在每个小题答题后才会调缓存接口,所以只能第一次进入就缓存一次进入时间) paper.map(e => { e.examQuestions.map(n => { if (e.questionType === 'fill_blank') { @@ -401,7 +427,6 @@ export default { }, // 计时器 handleCounter (counterTime, isCount) { - console.log("🚀 ~ handleCounter ~ counterTime, isCount:", counterTime, isCount) let leave1 = counterTime % (24 * 3600) //计算天数后剩余的毫秒数 let leave2 = leave1 % 3600 //计算小时数后剩余的毫秒数 let leave3 = leave2 % 60 //计算分钟数后剩余的毫秒数 @@ -445,7 +470,7 @@ export default { startCount () { clearInterval(this.counterTimer) this.counterTimer = setInterval(() => { - this.id && this.counter(this.countVal--) + this.competitionId && this.counter(this.countVal--) this.timeSumVal >= 0 && this.handleCounter(this.timeSumVal++) }, 1000) }, @@ -634,6 +659,19 @@ export default { answerAnalysisReady (editor) { this.answerAnalysis && editor.setContent(this.answerAnalysis) }, + // 查看成绩报告 + toReport () { + this.$router.push(`/match/theoryReport?reportId=${this.reportId}`) + }, + // 清除练习的缓存 + clearPracticeCache () { + this.$post(this.api.getTestPaperPracticeCache, { + cid: this.cid, + paperId: this.paperId, + mallId: this.mallId, + isContinueLastPractice: 0 + }) + }, // 重新开始 async reload () { // 已提交状态则直接重新开始,未提交则询问弹框 @@ -641,13 +679,14 @@ export default { location.reload() } else { try { - await this.$confirm('

点击重新开始,之前操作会清空。

确定重新开始吗?

', '提示', { + await this.$confirm('重新开始会清除答题记录,确定要继续吗?', '提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning', closeOnClickModal: false, dangerouslyUseHTMLString: true, }) + await this.clearPracticeCache() location.reload() } catch (e) { } } @@ -675,11 +714,11 @@ export default { }, // 提交 async submit (isSubmit, autoSubmit) { - if ((isSubmit && this.submiting) || (!isSubmit && this.paperId)) return false + if ((isSubmit && this.submiting) || (!isSubmit && this.per === 1)) return false try { if (isSubmit) this.submiting = true const form = _.cloneDeep(this.form) - const { entryTime, curStage } = this + const { entryTime, curStage, per } = this const ques = [] form.paperOutline.map(e => { const type = e.questionType @@ -709,7 +748,7 @@ export default { }) const data = { - competitionId: this.id, + competitionId: this.competitionId, stageId: curStage.stageId, teamId: this.teamId, startTime: Util.formatDate('yyyy-MM-dd hh:mm:ss', entryTime), // 取页面进入的时间 @@ -733,18 +772,26 @@ export default { data.assessmentId = this.assessmentId data.classId = this.classId } - // 缓存跟提交接口的参数一样 - await this.$post(this.api[this.assessmentId ? 'submitTheExamPaperForAssessment' : this.paperId ? 'submitTheExamPaperForPractice' : isSubmit ? 'submitTheExamPaper' : 'examPaperRecordCache'], data) + // 缓存跟提交接口的参数一样,(练习、考核、竞赛的提交是不同接口) + const res = await this.$post(this.api[isSubmit ? (per === 1 ? + 'submitTheExamPaperForAssessment' : !per ? 'submitTheExamPaperForPractice' : 'submitTheExamPaper') : + (!per ? 'recordTestPaperPracticeCache' : 'examPaperRecordCache')], data) if (isSubmit) { window.opener && window.opener.location.reload() clearInterval(this.counterTimer) this.submiting = false + if (res.reportId) { + this.reportId = res.reportId + this.score = res.score + } this.submited = true + per !== 2 && clearPracticeCache() + // 如果是时间到了自动提交,则提交完不弹框,直接关闭页面 if (autoSubmit) { - this.$alert(`${this.per == 2 ? '竞赛' : '考核'}时间已到,系统已自动交卷`, '提示', { + this.$alert(`${per == 2 ? '竞赛' : '考核'}时间已到,系统已自动交卷`, '提示', { confirmButtonText: '确定', type: 'warning', callback: _ => { @@ -753,7 +800,7 @@ export default { }) } else { // 如果是竞赛,并且勾选了公布成绩详情的选项,则弹框提示 - if (this.id) { + if (this.competitionId) { const time = curStage.resultAnnouncementTime const msg = time === 0 ? '提交成功!成绩将在比赛结束后公布,请前往参赛信息模块查看' : time > 0 ? `提交成功!成绩将在比赛结束后${time}小时公布,请前往参赛信息模块查看` : '提交成功'; @@ -807,8 +854,25 @@ export default { font-weight: 600; } - .submit { - width: 106px; + .score { + margin: 0 30px; + display: inline-flex; + align-items: center; + font-size: 15px; + color: #fff; + + .num { + padding: 0 8px; + margin-left: 7px; + color: #f00; + line-height: 2.4; + background-color: #fff; + border-radius: 20px; + } + } + + .btn { + min-width: 106px; font-size: 15px; }