闫增涛
2024-03-20 ecbc81c918a288dc752b1634b3f545f795d992aa
packageBookService/pages/bookServices/examination/examination.js
@@ -39,7 +39,9 @@
      time: 0, // 答题剩余时间
      datas: [], // 所有模考记录数据(题目列表,用户答题,考试报告)
      answer: []
    }
    },
    saveTime: 20,
    isNight: false
  },
  /**
@@ -80,7 +82,19 @@
   * 生命周期函数--监听页面显示
   */
  onShow() {
    if (this.data.answerType == 'mock') {
      if (wx.timer) {
        clearInterval(wx.timer)
      }
      wx.timer = setInterval(() => {
        this.setData({
          saveTime: this.data.saveTime - 1
        })
        if (this.data.saveTime == 0) {
          this.saveMockData()
        }
      }, 1000)
    }
  },
  /**
@@ -122,7 +136,12 @@
  goBack() {
    wx.navigateBack();
  },
  //设置背景色
  changeBGColor(e) {
    this.setData({
      isNight: e.detail.value
    })
  },
  // 获取保存的倒计时时间
  getSavedTime() {
    const savedTime = wx.getStorageSync('countdownTime')
@@ -207,12 +226,17 @@
    questionList.forEach(item => {
      if (item.id == id) {
        item.userAnswer = radioChecked
        item.isUserAnswer = this.isHaveAnswer(radioChecked)
      }
    })
    this.setData({
      questionDataList: questionList
    })
    console.log(this.data.questionDataList);
    if (this.data.answerType == 'mock') {
      this.setData({
        saveTime: 20
      })
    }
  },
  // 输入框触发
  onChangeInput(e) {
@@ -222,13 +246,18 @@
    const questionList = this.data.questionDataList
    questionList.forEach(item => {
      if (item.id == id) {
        item.userAnswer[index] = inputData
        item.userAnswer[index] = inputData,
          item.isUserAnswer = this.isHaveAnswer(item.userAnswer)
      }
    })
    this.setData({
      questionDataList: questionList
    })
    console.log(this.data.questionDataList);
    if (this.data.answerType == 'mock') {
      this.setData({
        saveTime: 20
      })
    }
  },
  // 数组转为字符串方法
  arrayToString(data) {
@@ -253,13 +282,15 @@
      } else {
        return false
      }
    } else {
    } else if (typeof data == 'object') {
      const answer = data.find((item) => item.length > 0)
      if (answer) {
        return true
      } else {
        return false
      }
    } else {
      return false
    }
  },
  // 提交逻辑
@@ -267,23 +298,61 @@
    this.setData({
      submitStatus: true
    })
    const child = this.selectComponent('#question-options')
    if (this.data.answerType == 'option' || this.data.answerType == 'errorQuestion' || this.data.answerType == 'mock') {
      // 先遍历所有题目,将未批改的题目批改
      const qustionList = this.data.questionDataList
      for (let index = 0; index < qustionList.length; index++) {
        const item = qustionList[index];
        if (!item.isComplete) this.handleQuestion(index + 1)
      }
    }
    if (this.data.answerType == 'option') {
      this.toggleCountdown()
      const child = this.selectComponent('#question-options')
      if (this.data.answerType == 'option' || this.data.answerType == 'errorQuestion') {
        // 先遍历所有题目,将未批改的题目批改
        const qustionList = this.data.questionDataList
        for (let index = 0; index < qustionList.length; index++) {
          const item = qustionList[index];
          if (!item.isComplete) this.handleQuestion(index + 1)
        }
      }
      if (this.data.answerType == 'option') {
        this.recordAnswerData()
        child.openTestReportDialog()
      }
      this.recordAnswerData()
      child.openTestReportDialog()
    } else if (this.data.answerType == 'collectQuestion' || this.data.answerType == 'errorQuestion') {
      this.goBack()
    } else if (this.data.answerType == 'mock') {
      this.toggleCountdown()
      // 设置模考状态为已完成
      const mockData = this.data.mockData
      mockData.datas.forEach((item) => {
        if (item.id == this.data.uuid) {
          item.state = '3'
          item.report = {
            userScore: this.data.subjectiveNum
          }
        }
      })
      this.setData({
        mockData: mockData,
        submitStatus: true
      })
      this.setMockInfo(mockData.datas)
      // 记录用户答题数据
      let saveData = []
      for (let index = 0; index < this.data.questionDataList.length; index++) {
        const item = this.data.questionDataList[index];
        saveData.push({
          id: item.id,
          answer: item.userAnswer,
          isRight: item.isRight
        })
      }
      app.MG.identity.setUserKey({
        setKeyRequests: [
          {
            domain: 'mockAnswerData',
            key: this.data.uuid,
            value: JSON.stringify({
              time: this.data.countdownTime,
              answerData: saveData
            })
          }
        ]
      })
      child.openTestReportDialog()
    }
  },
@@ -342,7 +411,14 @@
              'mockData.sumTime': oldMockData.time,
              cardList: oldQuestionList
            })
          }
          if (oldMockData.state == '0' || oldMockData.state == '1' || oldMockData.state == '2') {
            this.startCountdown()
          }
          if (oldMockData.state == '3') {
            this.setData({
              submitStatus: true
            })
          }
        }
      })
@@ -377,9 +453,9 @@
        setKeyRequests: [
          {
            domain: 'mockAnswerData',
            key: route.query.uuid,
            key: this.data.uuid,
            value: JSON.stringify({
              time: countDownRef.value.countdownTime,
              time: this.data.countdownTime,
              answerData: []
            })
          }
@@ -542,6 +618,7 @@
                item.Embedded_QuestionBank_QuestionType == 'multipleChoice'
                ? []
                : '',
            isUserAnswer: oldObj ? this.isHaveAnswer(oldObj.userAnswer) : false,
            isRight: oldObj ? oldObj.isRight : null,
            isComplete: oldObj ? oldObj.isComplete : false,
            isCollect: this.data.collectList.indexOf(item.id) > -1 ? true : false,
@@ -623,7 +700,7 @@
            aitem.infoList.forEach((bitem, bindex) => {
              questionList.push(bitem)
              bitem.number = bindex + 1
              bitem.grade = 2
              bitem.score = 2
            })
          })
          this.setData({
@@ -637,7 +714,7 @@
      loading: false,
    })
  },
  // 批改题目 (练习,我的错题,我的收藏)
  // 批改题目 (练习,我的错题,我的收藏,,组卷)
  handleQuestion(num) {
    const questionList = this.data.questionDataList
    const index = num - 1 >= 0 ? num - 1 : 0
@@ -685,13 +762,13 @@
    if (item.questionType != 'shortAnswer') {
      this.setData({
        subjectiveTotal: this.data.subjectiveTotal + 1,
        subjectiveGrade: this.data.subjectiveGrade + item.grade
        subjectiveGrade: this.data.subjectiveGrade + item.score
      })
    }
    if (questionList[index].isRight && item.questionType != 'shortAnswer') {
      // 客观题回答正确
      this.setData({
        subjectiveNum: this.data.subjectiveNum + item.grade,
        subjectiveNum: this.data.subjectiveNum + item.score,
        correctNum: this.data.correctNum + 1
      })
    }
@@ -725,6 +802,7 @@
          console.log(res)
        })
    }
    this.setData({
      questionDataList: questionList
    })
@@ -1180,11 +1258,13 @@
        })
        try {
          this.setData({
            'mockData.time': JSON.parse(configRes.config).time * 1000
            'mockData.time': JSON.parse(configRes.config).time * 1000,
            countdownTime: JSON.parse(configRes.config).time * 1000
          })
        } catch (error) {
          this.setData({
            'mockData.time': 3600 * 1000
            'mockData.time': 3600 * 1000,
            countdownTime: 3600 * 1000,
          })
        }
        this.setData({
@@ -1202,7 +1282,7 @@
            numberIndex++
            return {
              number: numberIndex,
              itemId: idItem.id,
              id: idItem.id,
              score: idItem.score
            }
          })
@@ -1216,7 +1296,7 @@
              numberIndex++
              return {
                number: numberIndex,
                itemId: extractCmsItem.id,
                id: extractCmsItem.id,
                score: extractCmsItem.score
              }
            })
@@ -1252,7 +1332,145 @@
        await this.getMockDataList(this.data.cardList) // 请求题目数据
      })
  },
  // 获取组卷题目列表
  async getMockDataList(questionList, oldList) {
    const questionDataList = this.data.questionDataList
    questionList.forEach(async (pathitem, pathindex) => {
      let itemIds = []
      pathitem.infoList.forEach(item => {
        itemIds.push(item.id + '')
      })
      let query = {
        path: '*',
        cmsPath: this.data.rootCmsItemId,
        cmsType: '*',
        productId: this.data.bookId,
        queryType: '*',
        itemIds,
        itemFields: {
          Embedded_QuestionBank_Stem: [],
          Embedded_QuestionBank_AnalysisCon: [],
          Embedded_QuestionBank_Answer: [],
          Embedded_QuestionBank_Option: [],
          Embedded_QuestionBank_QuestionType: [],
          Embedded_QuestionBank_StemStyle: [],
          Embedded_QuestionBank_OptionStyle: [],
          Embedded_QuestionBank_KnowledgePoint: [],
          Embedded_QuestionBank_Difficulty: []
        }
      }
      await app.MG.store.getProductDetail(query).then((res) => {
        res.datas.cmsDatas[0].datas.forEach((item, index) => {
          // 循环questionList,给每题赋值分数
          let oldObj
          if (oldList) oldObj = oldList.find((oldItem) => oldItem.id == item.id)
          let questionObj = {
            // number: pathitem.infoList.find(infoItem => infoItem.itemId == item.id).number,
            id: item.id,
            score: pathitem.infoList.find(infoItem => infoItem.id == item.id).score,
            stem:
              item.Embedded_QuestionBank_QuestionType == 'completion'
                ? JSON.parse(item.Embedded_QuestionBank_Stem)
                  .stemTxt.replaceAll('<vacancy>', ',input,')
                  .split(',')
                : JSON.parse(item.Embedded_QuestionBank_Stem), // 题干
            answer: item.Embedded_QuestionBank_Answer, // 答案
            option: item.Embedded_QuestionBank_Option
              ? JSON.parse(item.Embedded_QuestionBank_Option)
              : '', // 选择题选项
            analysisCon: item.Embedded_QuestionBank_AnalysisCon, // 解析
            questionType: item.Embedded_QuestionBank_QuestionType, // 题型
            optionStyle: item.Embedded_QuestionBank_OptionStyle, // 选项显示类型
            stemStyle: item.Embedded_QuestionBank_StemStyle, // 题干显示类型
            difficulty: item.Embedded_QuestionBank_Difficulty
              ? 4 - item.Embedded_QuestionBank_Difficulty
              : 0, // 难度等级
            userAnswer: oldObj
              ? oldObj.answer
              : item.Embedded_QuestionBank_QuestionType == 'completion' ||
                item.Embedded_QuestionBank_QuestionType == 'multipleChoice'
                ? []
                : '',
            isUserAnswer: oldObj ? this.isHaveAnswer(oldObj.userAnswer) : false,
            isRight: oldObj ? oldObj.isRight : null,
            // isComplete: oldObj ? oldObj.isComplete : false,
            isComplete: this.data.mockData.state == '3' ? true : oldObj ? this.isHaveAnswer(oldObj.answer) : false,
            isCollect: this.data.collectList.indexOf(item.id) > -1 ? true : false,
            isUnfold: '' // 控制解析的折叠面板是否展开
          }
          // 多选和填空答案肯为数组,要转换JSON格式
          if (
            questionObj.questionType == 'completion' ||
            questionObj.questionType == 'multipleChoice'
          ) {
            try {
              questionObj.answer = JSON.parse(questionObj.answer)
            } catch (error) {
              questionObj.answer = item.Embedded_QuestionBank_Answer
            }
          }
          // 填空题改造
          if (questionObj.questionType == 'completion') {
            let index = 0
            for (let i = 0; i < questionObj.stem.length; i++) {
              const item = questionObj.stem[i]
              if (item == 'input') {
                questionObj.stem[i] = {
                  num: index,
                  data: 'input'
                }
                if (!oldObj) questionObj.userAnswer[index] = ''
                index++
              }
            }
          }
          // 获取图片
          if (questionObj.stemStyle == 'Image' || questionObj.stemStyle == 'TxtAndImage') {
            questionObj.stem.stemImage = getPublicImage(questionObj.stem.stemImage, 150)
          }
          if (questionObj.optionStyle == 'Image' || questionObj.optionStyle == 'TxtAndImage') {
            questionObj.option.forEach(optionItem => {
              if (optionItem.img) optionItem.img = getPublicImage(optionItem.img, 150)
            })
          }
          if (oldObj && oldObj.isRight) {
            this.setData({
              correctNum: this.data.correctNum + 1
            })
          }
          if (item.questionType != 'shortAnswer' && item.isComplete) {
            this.setData({
              subjectiveTotal: this.data.subjectiveTotal + 1
            })
          }
          // if (oldObj && isHaveAnswer(oldObj.answer)) countDownRef.value.changeAlready()
          // cardList赋值
          let cardIndex = this.data.cardList.findIndex((item) => item.catalogName == pathitem.catalogName)
          let infoIndex = this.data.cardList[cardIndex].infoList.findIndex(infoItem => infoItem.id == item.id)
          this.setData({
            [`cardList[${cardIndex}].infoList[${infoIndex}]`]: questionObj
          })
          let questionList = []
          const cardUpdatedList = this.data.cardList
          cardUpdatedList.forEach(aitem => {
            aitem.infoList.forEach((bitem, bindex) => {
              questionList.push(bitem)
              bitem.number = bindex + 1
            })
          })
          this.setData({
            questionDataList: questionList,
            cardList: cardUpdatedList
          })
          console.log('组卷题目列表', this.data.questionDataList);
        })
      })
    })
    this.setData({
      // questionDataList: questionDataList,
      loading: false
    })
  },
  // 获取组卷数据
  getMockInfo(callback) {
    app.MG.identity
@@ -1316,136 +1534,67 @@
      .then((res) => {
        if (res[0]) {
          this.setData({
            'mockData.time': JSON.parse(res[0].value).timem,
            currentIndex: JSON.parse(res[0].value).currentIndex,
            'mockData.time': JSON.parse(res[0].value).time,
            countdownTime: JSON.parse(res[0].value).time ? JSON.parse(res[0].value).time : this.data.mockData.sumTime,
            'mockData.answer': JSON.parse(res[0].value).answerData
          })
          console.log(JSON.parse(res[0].value));
          data = JSON.parse(res[0].value).answerData
        }
      })
    return data
  },
  // 组卷获取题目列表
  async getMockDataList(questionList, oldList) {
    const questionDataList = this.data.questionDataList
    questionList.forEach(async (pathitem, pathindex) => {
      let itemIds = []
      pathitem.infoList.forEach(item => {
        itemIds.push(item.itemId + '')
      })
      let query = {
        path: '*',
        cmsPath: this.data.rootCmsItemId,
        cmsType: '*',
        productId: this.data.bookId,
        queryType: '*',
        itemIds,
        itemFields: {
          Embedded_QuestionBank_Stem: [],
          Embedded_QuestionBank_AnalysisCon: [],
          Embedded_QuestionBank_Answer: [],
          Embedded_QuestionBank_Option: [],
          Embedded_QuestionBank_QuestionType: [],
          Embedded_QuestionBank_StemStyle: [],
          Embedded_QuestionBank_OptionStyle: [],
          Embedded_QuestionBank_KnowledgePoint: [],
          Embedded_QuestionBank_Difficulty: []
  // 记录模考答题数据
  saveMockData() {
    const data = this.data.mockData.datas.find((itme) => itme.id == this.data.uuid)
    if (data.state == '3') return true
    const saveData = this.data.mockData.answer
    for (let i = 0; i < this.data.questionDataList.length; i++) {
      const item = this.data.questionDataList[i]
      if (this.isHaveAnswer(item.userAnswer)) {
        const index = saveData.findIndex((saveitem) => saveitem.id == item.id)
        if (index + '' != '-1') {
          saveData[index].answer = item.userAnswer
        } else {
          saveData.push({
            id: item.id,
            answer: item.userAnswer
          })
        }
      }
      await app.MG.store.getProductDetail(query).then((res) => {
        res.datas.cmsDatas[0].datas.forEach((item, index) => {
          // 循环questionList,给每题赋值分数
          let oldObj
          if (oldList) oldObj = oldList.find((oldItem) => oldItem.id == item.id)
          let questionObj = {
            id: item.id,
            stem:
              item.Embedded_QuestionBank_QuestionType == 'completion'
                ? JSON.parse(item.Embedded_QuestionBank_Stem)
                  .stemTxt.replaceAll('<vacancy>', ',input,')
                  .split(',')
                : JSON.parse(item.Embedded_QuestionBank_Stem), // 题干
            answer: item.Embedded_QuestionBank_Answer, // 答案
            option: item.Embedded_QuestionBank_Option
              ? JSON.parse(item.Embedded_QuestionBank_Option)
              : '', // 选择题选项
            analysisCon: item.Embedded_QuestionBank_AnalysisCon, // 解析
            questionType: item.Embedded_QuestionBank_QuestionType, // 题型
            optionStyle: item.Embedded_QuestionBank_OptionStyle, // 选项显示类型
            stemStyle: item.Embedded_QuestionBank_StemStyle, // 题干显示类型
            difficulty: item.Embedded_QuestionBank_Difficulty
              ? 4 - item.Embedded_QuestionBank_Difficulty
              : 0, // 难度等级
            userAnswer: oldObj
              ? oldObj.answer
              : item.Embedded_QuestionBank_QuestionType == 'completion' ||
                item.Embedded_QuestionBank_QuestionType == 'multipleChoice'
                ? []
                : '',
            isRight: oldObj ? oldObj.isRight : null,
            // isComplete: oldObj ? oldObj.isComplete : false,
            isComplete: oldObj ? oldObj.isComplete : false,
            isCollect: this.data.collectList.indexOf(item.id) > -1 ? true : false,
            isUnfold: '' // 控制解析的折叠面板是否展开
          }
          const cardList = this.data.cardList
          for (let a = 0; a < cardList.length; a++) {
            const cardItem = cardList[a];
            for (let b = 0; b < cardItem.infoList.length; b++) {
              if (cardItem.infoList[b].itemId == item.id) {
                questionObj.number = cardItem.infoList[b].number;
                questionObj.score = cardItem.infoList[b].score;
                cardItem.infoList[b] = obj;
              }
            }
          }
          this.setData({
            cardList: cardList
          })
          // 多选和填空答案肯为数组,要转换JSON格式
          if (
            questionObj.questionType == 'completion' ||
            questionObj.questionType == 'multipleChoice'
          ) {
            try {
              questionObj.answer = JSON.parse(questionObj.answer)
            } catch (error) {
              questionObj.answer = item.Embedded_QuestionBank_Answer
            }
          }
          // 填空题改造
          if (questionObj.questionType == 'completion') {
            let index = 0
            for (let i = 0; i < questionObj.stem.length; i++) {
              const item = questionObj.stem[i]
              if (item == 'input') {
                questionObj.stem[i] = {
                  num: index,
                  data: 'input'
                }
                if (!oldObj) questionObj.userAnswer[index] = ''
                index++
              }
            }
          }
          if (oldObj && oldObj.isRight) {
            this.setData({
              correctNum: this.data.correctNum + 1
            })
          }
          if (item.questionType != 'shortAnswer') {
            this.setData({
              subjectiveTotal: this.data.subjectiveTotal + 1
            })
          }
          // if (oldObj && isHaveAnswer(oldObj.answer)) countDownRef.value.changeAlready()
          questionDataList.push(questionObj)
        })
    }
    //
    if (this.data.mockData.state == '1') {
      const datas = this.data.mockData.datas
      datas.forEach((item) => {
        if (item.id == this.data.uuid) {
          item.state = '2'
        }
      })
    })
    this.setData({
      questionDataList: questionDataList,
      loading: false
    })
      this.setMockInfo(datas)
    }
    //
    app.MG.identity
      .setUserKey({
        setKeyRequests: [
          {
            domain: 'mockAnswerData',
            key: this.data.uuid,
            value: JSON.stringify({
              currentIndex: this.data.currentIndex,
              time: this.data.countdownTime,
              answerData: saveData
            })
          }
        ]
      })
      .then((res) => {
        this.setData({
          saveTime: 20
        })
        console.log('模考答题数据已记录')
      })
  }
})