zhangjie 5 dní pred
rodič
commit
438231714c

+ 36 - 12
src/modules/question/components/QuestionImportEdit.vue

@@ -197,7 +197,7 @@
               <div class="qe-part-head-menu">
                 <el-tabs
                   v-model="filterQuestionType"
-                  :before-leave="(val) => filterQuestionTypeChange(val, true)"
+                  :before-leave="(val) => filterQuestionTypeChange(val)"
                   :key="questionKey"
                 >
                   <el-tab-pane
@@ -224,6 +224,7 @@
                 :key="questionKey"
                 :paper="filterPaperData"
                 :course-id="data.importData.courseId"
+                @question-change="questionChange"
               ></question-import-paper-edit>
             </div>
           </div>
@@ -420,13 +421,22 @@ export default {
     },
     checkQuestionNormal(question) {
       if (question.subQuestions?.length) {
-        return (
-          question.subQuestions.filter((sub) => {
-            return sub.questionExceptions.length;
-          }).length === 0
-        );
+        const haseErrorQuestion = question.subQuestions.filter((sub) => {
+          const questionExceptions = sub.ignoreOptionRepeat
+            ? sub.questionExceptions.filter(
+                (v) => !v.cause.includes("选项内容相同")
+              )
+            : sub.questionExceptions;
+          return questionExceptions.length;
+        });
+        return haseErrorQuestion.length === 0;
       } else {
-        return !question.questionExceptions.length;
+        const questionExceptions = question.ignoreOptionRepeat
+          ? question.questionExceptions.filter(
+              (v) => !v.cause.includes("选项内容相同")
+            )
+          : question.questionExceptions;
+        return !questionExceptions.length;
       }
     },
     parseQuestionStatData() {
@@ -488,7 +498,7 @@ export default {
       const filterQuestionType = this.onlyErrorQuestion
         ? "all"
         : this.filterQuestionType;
-      this.filterQuestionTypeChange(filterQuestionType, true);
+      this.filterQuestionTypeChange(filterQuestionType);
 
       this.questionKey = randomCode();
     },
@@ -523,6 +533,10 @@ export default {
       this.paperData = JSON.parse(JSON.stringify(this.paperData));
       this.paperRichJsonGroup = this.getRichTextGroup();
       this.ignoreRepeatExceptionIndexArr.push(exceptionIndex);
+
+      this.parseQuestionStatData();
+      this.filterQuestionTypeChange(this.filterQuestionType);
+      this.questionKey = randomCode();
     },
     urlToBlob(url, callback) {
       let xhr = new XMLHttpRequest();
@@ -578,9 +592,18 @@ export default {
         this.getRichTextIndexList();
       });
     },
-    filterQuestionTypeChange(val, updateModify = false) {
-      if (updateModify) this.updateCurTagPaperData();
-
+    questionChange(data) {
+      const qid = `${data.detailNumber}-${data.question.number}`;
+      this.paperData.forEach((detail) => {
+        detail.questions.forEach((question) => {
+          const id = `${detail.number}-${question.number}`;
+          if (id === qid) {
+            Object.assign(question, data.question);
+          }
+        });
+      });
+    },
+    filterQuestionTypeChange(val) {
       this.filterQuestionType = val;
 
       const onlyErrorValidater = (question) => {
@@ -879,6 +902,8 @@ export default {
       );
       this.paperRichJson = this.buildRichText(deepCopy(res.data.richText));
       this.paperRichJsonGroup = this.getRichTextGroup();
+      this.parseQuestionStatData();
+      this.filterQuestionTypeChange(this.filterQuestionType);
       this.questionKey = randomCode();
 
       this.$nextTick(() => {
@@ -981,7 +1006,6 @@ export default {
     },
     getImportPaperData() {
       if (!this.$refs.QuestionImportPaperEdit) return [];
-      this.updateCurTagPaperData();
       let paperData = deepCopy(this.paperData);
       const transformFieldMap = {
         body: "quesBody",

+ 25 - 1
src/modules/question/components/QuestionImportPaperEdit.vue

@@ -18,7 +18,7 @@
           :key="qindex"
           :class="[
             'ep-question',
-            { 'is-error': question.exceptions?.length > 0 },
+            { 'is-error': !checkQuestionNormal(question) },
           ]"
         >
           <div class="ep-question-type">
@@ -29,6 +29,7 @@
               :is="structTypeComp(question.questionType)"
               :ref="`QuestionEditDetail-${dIndex}-${qindex}-${question.id}`"
               :question="question"
+              @change="(data) => questionChange(data, detail.number)"
             >
             </component>
           </div>
@@ -99,9 +100,32 @@ export default {
     });
   },
   methods: {
+    questionChange(question, detailNumber) {
+      this.$emit("question-change", { question, detailNumber });
+    },
     structTypeComp(questionType) {
       return STRUCT_TYPE_COMP_DICT[questionType];
     },
+    checkQuestionNormal(question) {
+      if (question.subQuestions?.length) {
+        const haseErrorQuestion = question.subQuestions.filter((sub) => {
+          const questionExceptions = sub.ignoreOptionRepeat
+            ? sub.questionExceptions.filter(
+                (v) => !v.cause.includes("选项内容相同")
+              )
+            : sub.questionExceptions;
+          return questionExceptions.length;
+        });
+        return haseErrorQuestion.length === 0;
+      } else {
+        const questionExceptions = question.ignoreOptionRepeat
+          ? question.questionExceptions.filter(
+              (v) => !v.cause.includes("选项内容相同")
+            )
+          : question.questionExceptions;
+        return !questionExceptions.length;
+      }
+    },
     getQuestionInfo(question) {
       // const exceptionField = ["bodyIndex", "optionIndex"];
       // let exceptionIndexs = [];

+ 4 - 0
src/modules/question/components/import-edit/BankedClozeQuestion.vue

@@ -48,6 +48,7 @@
         ref="MatchQuestion"
         :question="subq"
         :parent-question="question"
+        @change="emitChagne"
       >
       </match-question>
     </div>
@@ -85,6 +86,9 @@ export default {
   },
   created() {},
   methods: {
+    emitChagne() {
+      this.$emit("change", this.getData());
+    },
     async validate() {
       let errorQuestionIndexs = [];
       for (let i = 0; i < this.$refs.MatchQuestion.length; i++) {

+ 11 - 0
src/modules/question/components/import-edit/BooleanQuestion.vue

@@ -96,11 +96,22 @@ export default {
       return this.curQuestion.id === this.question.id;
     },
   },
+  watch: {
+    modalForm: {
+      handler() {
+        this.emitChagne();
+      },
+      deep: true,
+    },
+  },
   created() {
     this.initData();
   },
   methods: {
     ...mapMutations("import-edit", ["setCurQuestion"]),
+    emitChagne() {
+      this.$emit("change", this.getData());
+    },
     initData() {
       this.modalForm = this.$objAssign(getInitQuestionModel(), this.question);
       this.initAnswerAnalysis(this.question.answerAnalysis);

+ 11 - 0
src/modules/question/components/import-edit/FillBlankQuestion.vue

@@ -90,11 +90,22 @@ export default {
       return this.curQuestion.id === this.question.id;
     },
   },
+  watch: {
+    modalForm: {
+      handler() {
+        this.emitChagne();
+      },
+      deep: true,
+    },
+  },
   created() {
     this.initData();
   },
   methods: {
     ...mapMutations("import-edit", ["setCurQuestion"]),
+    emitChagne() {
+      this.$emit("change", this.getData());
+    },
     initData() {
       this.modalForm = this.$objAssign(getInitQuestionModel(), this.question);
       this.initAnswerAnalysis(this.question.answerAnalysis);

+ 4 - 0
src/modules/question/components/import-edit/NestedQuestion.vue

@@ -22,6 +22,7 @@
         :is="getStructTypeComp(subq.questionType)"
         ref="QuestionEditDetail"
         :question="subq"
+        @change="emitChagne"
       >
       </component>
     </div>
@@ -68,6 +69,9 @@ export default {
     },
   },
   methods: {
+    emitChagne() {
+      this.$emit("change", this.getData());
+    },
     getStructTypeComp(questionType) {
       return STRUCT_TYPE_COMP_DICT[questionType];
     },

+ 11 - 0
src/modules/question/components/import-edit/SelectQuestion.vue

@@ -136,6 +136,14 @@ export default {
       answerAnalysis: null,
     };
   },
+  watch: {
+    modalForm: {
+      handler() {
+        this.emitChagne();
+      },
+      deep: true,
+    },
+  },
   computed: {
     ...mapState("import-edit", ["curQuestion"]),
     isActive() {
@@ -157,6 +165,9 @@ export default {
   },
   methods: {
     ...mapMutations("import-edit", ["setCurQuestion"]),
+    emitChagne() {
+      this.$emit("change", this.getData());
+    },
     setIgnore(question, index, bool) {
       let targetQuestionException = question.questionExceptions[index];
       let exceptionIndex = targetQuestionException.exceptionIndex.toString();

+ 11 - 0
src/modules/question/components/import-edit/TextAnswerQuestion.vue

@@ -85,11 +85,22 @@ export default {
       return this.curQuestion.id === this.question.id;
     },
   },
+  watch: {
+    modalForm: {
+      handler() {
+        this.emitChagne();
+      },
+      deep: true,
+    },
+  },
   created() {
     this.initData();
   },
   methods: {
     ...mapMutations("import-edit", ["setCurQuestion"]),
+    emitChagne() {
+      this.$emit("change", this.getData());
+    },
     initData() {
       this.modalForm = this.$objAssign(getInitQuestionModel(), this.question);
       this.initAnswer(this.question.quesAnswer);