Administrator
2022-05-09 c7735db135f9c3c99224d8b5d2157926efde0977
src/views/startexam/index.vue
@@ -39,13 +39,13 @@
                      >答题卡</el-button
                    >
                  </div>
                  <el-button
                  <!-- <el-button
                    type="success"
                    icon="el-icon-date"
                    @click="submitExam"
                    v-bind:disabled="disableSubmit"
                    >提交</el-button
                  >
                  > -->
                </div>
              </el-col>
              <el-col :span="18">
@@ -55,44 +55,58 @@
                      subjectIds.length
                    }}题,合计100分)
                  </div>
                  <!-- 题目内容 -->
                  <choices ref="choices" v-show="this.query.type === 0" />
                  <div class="subject_main">
                    <!-- 题目内容 -->
                    <choices ref="choices" v-show="this.query.type === 0" />
                  <multiple-choices
                    ref="multipleChoices"
                    v-show="this.query.type === 1"
                  />
                    <multiple-choices
                      ref="multipleChoices"
                      v-show="this.query.type === 1"
                    />
                  <judgement ref="judgement" v-show="this.query.type === 2" />
                    <judgement ref="judgement" v-show="this.query.type === 2" />
                  <practical-operation
                    ref="practicalOperation"
                    v-show="this.query.type === 3"
                  />
                    <practical-operation
                      ref="practicalOperation"
                      v-show="this.query.type === 3"
                    />
                  <short-answer
                    ref="shortAnswer"
                    v-show="this.query.type === 4"
                  />
                    <short-answer
                      ref="shortAnswer"
                      v-show="this.query.type === 4"
                    />
                  <div class="subject-buttons" v-if="query.subjectId !== ''">
                    <!-- <el-button plain @click="last" :loading="loadingLast"
                    <div class="subject-buttons" v-if="query.subjectId !== ''">
                      <!-- <el-button plain @click="last" :loading="loadingLast"
                      >上一题</el-button
                    > -->
                    <el-button
                      @click="next"
                      class="buttons"
                      :loading="loadingNext"
                      type="primary"
                      >下一题</el-button
                    >
                    <el-button
                      <el-button
                        @click="next"
                        class="buttons"
                        :loading="loadingNext"
                        type="primary"
                        >下一题</el-button
                      >
                      <!-- <el-button
                      :disabled="timesIT"
                      type="success"
                      style="display: none"
                      @click="submitExam"
                      v-bind:disabled="disableSubmit"
                      >提交</el-button
                    >
                      :title="
                        timesIT
                          ? '根据国家考试要求,30分钟内不可提交! 剩(' +
                            timesITValue +
                            ')分钟'
                          : '点击完成考试'
                      "
                      >完成考试 {{ time }}</el-button
                    > -->
                      <el-button
                        type="success"
                        @click="submitExam"
                        :disabled="subjectIndex != 60"
                        >完成考试 {{ time }}
                      </el-button>
                    </div>
                  </div>
                </div>
              </el-col>
@@ -104,6 +118,7 @@
              top="10vh"
              :modal="false"
              center
              class="datika"
            >
              <div class="answer-card-title">
                {{ exam.examinationName }}(共{{
@@ -127,6 +142,7 @@
                  :key="index"
                  >&nbsp;{{ index + 1 }}&nbsp;</el-button
                >
                <!-- @click="toSubject(value.everyID, value.type, index)" -->
              </el-row>
            </el-dialog>
          </div>
@@ -139,7 +155,7 @@
import { mapState } from "vuex";
import CountDown from "vue2-countdown";
import { saveAndNext } from "@/api/exam/answer";
import { getSubjectIds } from "@/api/exam/exam";
import { getSubjectIds, getSubjectRefresh } from "@/api/exam/exam";
import { getCurrentTime } from "@/api/exam/examRecord";
import { getSubjectResultInfo } from "@/api/exam/subject";
@@ -148,7 +164,7 @@
  messageSuccess,
  messageFail,
  messageWarn,
  isNotEmpty,
  isNotEmpty
} from "@/util/util";
import Tinymce from "@/components/Tinymce";
import Choices from "@/components/Subjects/Choices";
@@ -168,7 +184,7 @@
    Choices,
    MultipleChoices,
    PracticalOperation,
    Judgement,
    Judgement
    // ShortAnswer,
  },
  data() {
@@ -187,7 +203,7 @@
        examRecordId: undefined,
        subjectId: undefined,
        userId: undefined,
        type: 0,
        type: 0
      },
      subject: {},
      answer: "",
@@ -214,17 +230,46 @@
        remark: "全国计算机统考练习题10道",
        newRecord: false,
        newRecord: false
      },
      firstFlag: true,
      times: ["30", "00"],
      timeOut: null,
      timeOTiv: null,
      timesIT: true,
      timesITValue: 0,
      first: true
    };
  },
  computed: {
    ...mapState({
      userInfo: (state) => state.user.userInfo,
      userInfo: state => state.user.userInfo,
      scoreId: state =>
        state.exam.scoreId
          ? state.exam.scoreId
          : window.localStorage.getItem("scoreId")
    }),
    time() {
      var d = [+this.times[0], +this.times[1]];
    }
  },
  created() {
    var useInfo = this.$store.state.exam.examUserData;
    if (useInfo.isExam == 3) {
      window.name = "first";
      this.first = false;
    } else {
      if (window.name == "") {
        // console.log("首次被加载");
        window.name = "first"; // 在首次进入页面时我们可以给window.name设置一个固定值
        this.first = true;
      } else if (window.name == "first") {
        // console.log("页面被刷新");
        this.first = false;
      }
    }
    const examInfo = this.$route.params.id;
    if (isNotEmpty(examInfo)) {
@@ -244,45 +289,107 @@
      // this.exam.totalScore = this.$route.query.totalScore
      // this.exam.status = this.$route.query.examStatus
      // this.exam.remark = this.$route.query.remark
      this.validateExamTime();
    }
  },
  methods: {
    countDownS_cb: function () {
    countDownS_cb: function() {
      // console.log(12456);
      messageSuccess(this, "考试开始");
      this.startTime = this.getCurrentTimes();
    },
    countDownE_cb: function() {
      messageWarn(this, "考试结束");
      //   this.disableSubmit = true;
      // this.submitExam("over");
    },
    bottonControl(time) {
      //倒计时循环
      let times = time * 60;
      var setTime = function(time) {
        let a, b, d;
        a = parseInt(time / 60);
        b = time - a * 60;
        d = a + ":" + b;
        return d;
      };
      if (this.timeOTiv == null) {
        this.timeOTiv = setInterval(res => {
          times--;
          this.timesITValue = setTime(times);
        }, 1000);
      } else {
        clearTimeout(this.timeOTiv);
        this.timeOTiv = null;
        this.timeOTiv = setInterval(res => {
          times--;
          this.timesITValue = setTime(times);
        }, 1000);
      }
      //倒计时定时
      if (this.timeOut == null) {
        this.timeOut = setTimeout(res => {
          this.timesIT = false;
          this.timesITValue--;
        }, time * 3600);
      } else {
        clearTimeout(this.timeOut);
        this.timeOut = null;
        this.timeOut = setTimeout(res => {
          this.timesIT = false;
        }, time * 3600);
      }
    },
    validateExamTime() {
      getCurrentTime()
        .then((response) => {
        .then(response => {
          // console.log(response, 7777);
          const currentTime = moment(response.data.data);
          if (currentTime.isAfter(this.exam.endTime)) {
            messageWarn(this, "考试已结束");
          } else if (currentTime.isBefore(this.exam.startTime)) {
            messageWarn(this, "考试未开始");
          } else {
            this.startExam();
            const current = currentTime.valueOf();
            this.currentTime = current;
            this.startTime = current;
            this.subjectStartTime = current;
            // this.endTime = moment(this.exam.endTime).valueOf()
            this.endTime = current + 60 * 60 * 1000;
            // this.endTime = current + 1 * 60 * 1000;
            this.disableSubmit = false;
            //判断是否是答过题
            this.startExam(currentTime);
            //判断是否是答过题
            if (this.first) {
              const current = currentTime.valueOf();
              // console.log(current, "首次");
              this.currentTime = current;
              this.startTime = current;
              this.subjectStartTime = current;
              //   // this.endTime = moment(this.exam.endTime).valueOf()
              this.endTime = current + 60 * 60 * 1000;
              this.bottonControl(60);
            }
            // this.disableSubmit = false;
          }
        })
        .catch(() => {
          messageFail(this, "开始考试失败!15");
        });
    },
    startExam() {
      // 获取题目ID列表
      getSubjectIds()
        .then((subjectResponse) => {
          const subjectData = subjectResponse.data.data;
    startExam(currentTime) {
      var scoreId = window.localStorage.getItem("scoreId");
      // console.log(scoreId, this.first, "scoreIdscoreIdscoreIdscoreId");
      this.subjectIds = [];
      // if (this.first) {
      //   const current = currentTime.valueOf();
      //   console.log(current, "首次");
      //   this.currentTime = current;
      //   this.startTime = current;
      //   this.subjectStartTime = current;
      //   //   // this.endTime = moment(this.exam.endTime).valueOf()
      //   this.endTime = current + 60 * 60 * 1000;
      // }
      if (!this.first) {
        getSubjectRefresh(scoreId).then(obj => {
          const objs = obj.data.data;
          // console.log(objs, "objobjobjobjobjobj");
          const subjectData = objs.examSubjectChoicesVOSList;
          if (subjectData.length > 0) {
            //重载题目
            for (let i = 0; i < subjectData.length; i++) {
              this.subjectIds.push({
                subjectId: 1,
@@ -294,6 +401,136 @@
                score: subjectData[i].score,
                color: "#fff",
                fontColor: "#000",
                title: subjectData[i].subjectName
              });
            }
            //重载到当前题目
            let nowObj = objs.examSubjectChoicesVO;
            nowObj.answer = ""; //清除答案
            // console.log(nowObj, "nowObj");
            for (var i = 0; i < this.subjectIds.length; i++) {
              if (nowObj.id == this.subjectIds[i].everyID) {
                //定位显示题目
                this.subjectIndex = i + 1;
                //题目类型
                this.query.type = parseInt(this.subjectIds[i].type);
                // 题目id
                this.query.subjectId = this.subjectIds[i].everyID;
                this.setSubjectInfo(nowObj);
              }
            }
            // 添加到答题卡
            const anSwer = objs.examAnswerRecordList;
            for (var i = 0; i < this.subjectIds.length; i++) {
              for (var n = 0; n < anSwer.length; n++) {
                // console.log(anSwer[i].subjectChoicesId);
                if (anSwer[n].subjectChoicesId == this.subjectIds[i].everyID) {
                  if (anSwer[n].answerResult == 1) {
                    this.subjectIds[i].color = "#67C23A";
                    this.subjectIds[i].fontColor = "#fff";
                  }
                  if (anSwer[n].answerResult == 2) {
                    this.subjectIds[i].color = "red";
                    this.subjectIds[i].fontColor = "#fff";
                  }
                  var test = /,/g;
                  if (test.test(anSwer[n].answerOption)) {
                    let ans = anSwer[n].answerOption.split(","),
                      anw = [];
                    for (var k = 0; k < ans.length; k++) {
                      anw.push({
                        key: k + 1,
                        value: ans[k]
                      });
                    }
                    this.subjectIds[i].answer = anw;
                  } else {
                    this.subjectIds[i].answer = anSwer[n].answerOption;
                  }
                  // console.log(anSwer[n].answerOption, 1);
                  // console.log(this.subjectIds[i].answer, 2);
                }
              }
            }
            //适应时间
            const datyTime = objs.examScore.examTime;
            // console.log(objs, "datyTimedatyTimedatyTime");
            var duibiTime = function(newTime, oldTime) {
              var newYear = newTime.split(" ")[0],
                newDat = newTime.split(" ")[1],
                oldYear = oldTime.split(" ")[0],
                oldDat = oldTime.split(" ")[1];
              if (newYear !== oldYear) {
                return false;
              } else {
                let newD = {
                  s: +newDat.split(":")[0],
                  f: +newDat.split(":")[1],
                  m: +newDat.split(":")[2]
                };
                let oldD = {
                  s: +oldDat.split(":")[0],
                  f: +oldDat.split(":")[1],
                  m: +oldDat.split(":")[2]
                };
                if (newD.s - oldD.s > 1) {
                  return false;
                } else if (newD.s - oldD.s == 1) {
                  if (newD.f < oldD.f) {
                    return oldD.f - newD.f;
                  } else {
                    return false;
                  }
                } else if (newD.s == oldD.s) {
                  return 60 - (newD.f - oldD.f);
                }
                return [newD, oldD];
              }
              // return false;
            };
            var listTime = duibiTime(currentTime._i, datyTime);
            const current = currentTime.valueOf();
            this.currentTime = current;
            this.startTime = current;
            this.subjectStartTime = current;
            // // this.endTime = moment(this.exam.endTime).valueOf()
            if (listTime) {
              this.endTime = current + listTime * 60 * 1000;
              this.bottonControl(listTime - 30);
            } else {
              this.endTime = current + 0 * 60 * 1000;
              this.bottonControl(0);
            }
            // console.log(datyTime, currentTime, "刷新");
          }
        });
        // this.first = true;
        return;
      }
      // console.log(this.subjectIds);
      // 获取题目ID列表
      // console.log("subjectResponsesubjectResponsesubjectResponse");
      getSubjectIds(scoreId)
        .then(subjectResponse => {
          const subjectData = subjectResponse.data.data;
          // console.log(
          //   subjectResponse,
          //   "subjectResponsesubjectResponsesubjectResponse"
          // );
          // console.log(subjectData, "subjectDatasubjectDatasubjectData");
          if (subjectData.length > 0) {
            for (let i = 0; i < subjectData.length; i++) {
              this.subjectIds.push({
                subjectId: 1,
                everyID: subjectData[i].id,
                type: subjectData[i].choicesType,
                index: i + 1,
                answered: false,
                answer: "",
                score: subjectData[i].score,
                color: "#fff",
                fontColor: "#000"
              });
            }
@@ -305,9 +542,9 @@
            this.updateSubjectIndex();
            // 获取当前题目信息
            getSubjectResultInfo({
              id: this.subjectIds[0].everyID,
              id: this.subjectIds[0].everyID
            })
              .then((response) => {
              .then(response => {
                if (isNotEmpty(response.data.data)) {
                  response.data.data.answer = "";
                  this.setSubjectInfo(response.data.data);
@@ -322,11 +559,7 @@
          messageFail(this, "开始考试失败!4646549888*8*");
        });
    },
    countDownE_cb: function () {
      messageWarn(this, "考试结束");
      //   this.disableSubmit = true;
      this.submitExam("over");
    },
    last() {
      for (let i = 0; i < this.subjectIds.length; i++) {
        if (this.subjectIds[i].everyID == this.query.subjectId) {
@@ -357,8 +590,35 @@
      for (let i = 0; i < this.subjectIds.length; i++) {
        if (this.subjectIds[i].everyID == this.query.subjectId) {
          if (this.getAnswer() == "") {
            messageSuccess(this, "请选择答案");
            this.$message({
              message: "请选择答案",
              type: "warning"
            });
            return;
          }
          //  if (this.getAnswer() == "") {
          //   this.$message({
          //     message: "请选择答案",
          //     type: "warning",
          //   });
          //   return;
          // }
          // console.log(this.getAnswer(), this.query.type);
          if (this.query.type == 3) {
            let goShiCao = true;
            const answer = this.getAnswer();
            for (let k in answer) {
              if (answer[k].value == "") {
                goShiCao = false;
              }
            }
            if (!goShiCao) {
              this.$message({
                message: "实操题目请选择完整顺序!",
                type: "warning"
              });
              return;
            }
          }
          this.subjectIds[i].answer = this.getAnswer();
@@ -388,35 +648,34 @@
    saveCurrentSubjectAndGetNextSubject(nextType, nextSubjectId, subjectIds) {
      this.startLoading(nextType);
      console.log()
      // console.log();
      var answerData = this.getAnswer();
      var str = '';
      var str = "";
      if (Array.isArray(answerData)) {
        answerData.forEach(item => {
          str += item.value + ','
        })
          str += item.value + ",";
        });
        str = str.substr(0, str.length - 1);
        answerData = str
        answerData = str;
      }
      var data = {
        id: nextSubjectId,
        preSubJectId: this.query.subjectId,
        preResult: answerData,
        scoreId: this.scoreId
      };
      getSubjectResultInfo(data)
        .then((response) => {
        .then(response => {
          if (response.data.data !== null) {
            // 保存成功后更新答题卡状态
            const subject = response.data.data;
            // console.log(subject.answer, 123456);
            //结果
            this.result = response.data.data.result;
@@ -444,17 +703,20 @@
            }
            this.setSubjectInfo(subject);
            console.log(subject);
            this.$store.commit("setWindowSizeHeightAdd");
            // store.dispatch('SetSubjectInfo', subject).then(() => { })
          }
          // 更新时间
          getCurrentTime().then((response) => {
          getCurrentTime().then(response => {
            this.subjectStartTime = moment(response.data.data);
          });
          this.endLoading(nextType);
        })
        .catch((error) => {
        .catch(error => {
          console.log(error);
          this.$store.commit("setWindowSizeHeightAdd");
          messageFail(this, "获取题目失败");
          this.endLoading(nextType);
        });
@@ -464,10 +726,10 @@
      this.startLoading(nextType);
      var data = {
        id: nextSubjectId,
        id: nextSubjectId
      };
      getSubjectResultInfo(data)
        .then((response) => {
        .then(response => {
          if (response.data.data !== null) {
            // 保存成功后更新答题卡状态
            const subject = response.data.data;
@@ -501,12 +763,12 @@
            // store.dispatch('SetSubjectInfo', subject).then(() => { })
          }
          // 更新时间
          getCurrentTime().then((response) => {
          getCurrentTime().then(response => {
            this.subjectStartTime = moment(response.data.data);
          });
          this.endLoading(nextType);
        })
        .catch((error) => {
        .catch(error => {
          console.log(error);
          messageFail(this, "获取题目失败");
          this.endLoading(nextType);
@@ -538,9 +800,9 @@
      this.subjectIndex = index + 1;
      this.firstFlag = true;
      // 保存当前题目,同时加载下一题
      console.log(nextSubjectType.next,111);
      console.log(everyID,222);
      console.log(type,333);
      // console.log(nextSubjectType.next, 111);
      // console.log(everyID, 222);
      // console.log(type, 333);
      this.saveCurrentSubjectAndGetNextSubject(
        nextSubjectType.next,
        everyID,
@@ -551,6 +813,7 @@
    },
    // 提交
    submitExam(val) {
      // console.log(val);
      var ind = this.subjectIndex;
      if (this.firstFlag == false) {
@@ -573,7 +836,7 @@
      this.$confirm("确定要提交吗?", "提示", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning",
        type: "warning"
      })
        .then(() => {
          this.disableSubmit = true;
@@ -593,51 +856,67 @@
        examTime: this.startTime,
        papersId: this.$route.query.id,
        examEndTime: this.getCurrentTimes(),
        examResultVOS: null,
        examResultVOS: null
      };
      var arr = [];
      this.subjectIds.forEach((item) => {
        if (item.type == 3) {
      console.log(this.subjectIds);
      // debugger;
      console.log(this.subjectIds.length, 111);
      for (var i = 0; i < this.subjectIds.length; i++) {
        let item = this.subjectIds[i];
        // console.log(item.answer, i);
        if (item.type == 3 || item.type == 1) {
          var str = "";
          if (item.answer.length > 0) {
            item.answer.forEach((it) => {
              if (it.value != "") {
                str += it.value + ",";
              }
            });
            //如果是数组
            if (item.answer instanceof Array) {
              item.answer.forEach(it => {
                if (it.value != "") {
                  str += it.value + ",";
                }
              });
            var a = str.substr(0, str.length - 1);
              var a = str.substr(0, str.length - 1);
            arr.push({
              subjectChoicesId: item.everyID,
              value: a,
              grade: item.score,
            });
              arr.push({
                subjectChoicesId: item.everyID,
                value: a,
                grade: item.score
              });
            } else {
              arr.push({
                subjectChoicesId: item.everyID,
                value: item.answer,
                grade: item.score
              });
            }
          }
        } else {
          arr.push({
            subjectChoicesId: item.everyID,
            value: item.answer,
            grade: item.score,
            grade: item.score
          });
        }
      });
      }
      // console.log(arr, 123);
      // return;
      obj.examResultVOS = arr;
      // console.log(this.subjectIds, 456);
      // console.log(obj.examResultVOS, 789);
      saveAndNext(obj)
        .then((response) => {
        .then(response => {
          messageSuccess(this, "提交成功");
          if (response) {
            this.$store.commit("DEL_TAG", this.$store.state.tags.tag);
            var obj = {
              userId: this.userInfo.user_id,
              examId: this.$route.query.id,
              examId: this.$route.query.id
            };
            this.$router.push({
              path: `/singleperformance/index`,
              query: obj,
              query: obj
            });
          }
        })
@@ -760,7 +1039,7 @@
    },
    setSubjectInfo(subject) {
      const ref = this.getSubjectRef();
      // console.log(subject, "subject");
      if (isNotEmpty(ref)) {
        try {
          ref.setSubjectInfo(
@@ -772,8 +1051,8 @@
          console.error(error);
        }
      }
    },
  },
    }
  }
};
</script>
@@ -783,8 +1062,9 @@
$fontSize2: 20px;
$fontSize3: 40px;
.subject-box {
  margin-top: 50px;
  margin-top: 25px;
  margin-left: 20px;
  height: 100%;
}
.subject-box-card {
  font-size: 28px;