From fa662bf36ed8db479b42f912d4705c11511db558 Mon Sep 17 00:00:00 2001
From: 闫增涛 <1829501689@qq.com>
Date: 星期二, 19 三月 2024 18:45:25 +0800
Subject: [PATCH] 组卷功能完善

---
 packageBookService/pages/bookServices/examination/examination.js |  450 +++++++++++++++++++++++++++++++++++++------------------
 1 files changed, 299 insertions(+), 151 deletions(-)

diff --git a/packageBookService/pages/bookServices/examination/examination.js b/packageBookService/pages/bookServices/examination/examination.js
index e5c3c26..d948903 100644
--- a/packageBookService/pages/bookServices/examination/examination.js
+++ b/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) {
@@ -267,23 +296,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 +409,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 +451,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 +616,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 +698,7 @@
             aitem.infoList.forEach((bitem, bindex) => {
               questionList.push(bitem)
               bitem.number = bindex + 1
-              bitem.grade = 2
+              bitem.score = 2
             })
           })
           this.setData({
@@ -685,13 +760,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 +800,7 @@
           console.log(res)
         })
     }
+
     this.setData({
       questionDataList: questionList
     })
@@ -1180,11 +1256,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 +1280,7 @@
             numberIndex++
             return {
               number: numberIndex,
-              itemId: idItem.id,
+              id: idItem.id,
               score: idItem.score
             }
           })
@@ -1216,7 +1294,7 @@
               numberIndex++
               return {
                 number: numberIndex,
-                itemId: extractCmsItem.id,
+                id: extractCmsItem.id,
                 score: extractCmsItem.score
               }
             })
@@ -1252,7 +1330,146 @@
         await this.getMockDataList(this.data.cardList) // 璇锋眰棰樼洰鏁版嵁
       })
   },
-
+  // 鑾峰彇缁勫嵎棰樼洰鍒楄〃
+  async getMockDataList(questionList, oldList) {
+    console.log(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, // 瑙f瀽
+            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: '' // 鎺у埗瑙f瀽鐨勬姌鍙犻潰鏉挎槸鍚﹀睍寮�
+          }
+          // 澶氶�夊拰濉┖绛旀鑲负鏁扮粍锛岃杞崲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
+          // if (flag == this.data.idPathList.length) {
+          cardUpdatedList.forEach(aitem => {
+            aitem.infoList.forEach((bitem, bindex) => {
+              questionList.push(bitem)
+              bitem.number = bindex + 1
+            })
+          })
+          this.setData({
+            questionDataList: questionList,
+            cardList: cardUpdatedList
+          })
+        })
+      })
+    })
+    this.setData({
+      // questionDataList: questionDataList,
+      loading: false
+    })
+  },
   // 鑾峰彇缁勫嵎鏁版嵁
   getMockInfo(callback) {
     app.MG.identity
@@ -1316,136 +1533,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, // 瑙f瀽
-            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: '' // 鎺у埗瑙f瀽鐨勬姌鍙犻潰鏉挎槸鍚﹀睍寮�
-          }
-          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('妯¤�冪瓟棰樻暟鎹凡璁板綍')
+      })
   }
 })
\ No newline at end of file

--
Gitblit v1.9.1