浏览代码

选做题

zhangjie 1 年之前
父节点
当前提交
aa107ff838

+ 6 - 0
src/assets/styles/element-ui-costom.scss

@@ -238,6 +238,12 @@
   .el-input-number__decrease {
     left: 4px;
   }
+
+  &.align-left {
+    .el-input__inner {
+      text-align: left;
+    }
+  }
 }
 // .el-form
 .el-form {

+ 5 - 0
src/constants/constants.js

@@ -177,3 +177,8 @@ export const PAPER_TEMPLATE_TYPE = {
   PAPER_EXPORT: "试卷导出模板",
   // SYNTHESIZE_PAPER_EXPORT: "综合卷导出模版",
 };
+
+export const SELECTIVE_RULE_TYPE = {
+  HIGH_SCORE: "取高分",
+  LOW_SCORE: "取低分",
+};

+ 24 - 7
src/modules/paper/components/BuildPaperAuto.vue

@@ -48,6 +48,17 @@
               <span>题型:</span>
               <span>{{ detail.sourceDetailName }}</span>
             </p>
+            <p v-if="detail.selective">
+              <span>选择题:</span>
+              <span
+                :class="{
+                  'color-danger': detail.questionCount < detail.selectiveCount,
+                }"
+                >{{ detail.questionCount }}选{{ detail.selectiveCount }},{{
+                  SELECTIVE_RULE_TYPE[detail.selectiveRule]
+                }}</span
+              >
+            </p>
           </div>
           <div>
             <p>
@@ -86,6 +97,8 @@ import ModifyDetailStruct from "./ModifyDetailStruct.vue";
 import QuestionGroupStruct from "./QuestionGroupStruct.vue";
 import { isAnEmptyRichText } from "@/utils/utils";
 import { deepCopy } from "@/plugins/utils";
+import { SELECTIVE_RULE_TYPE } from "@/constants/constants";
+import { omit } from "lodash";
 
 export default {
   name: "BuildPaperAuto",
@@ -110,6 +123,7 @@ export default {
       details: [],
       curDetail: {},
       activeNames: [],
+      SELECTIVE_RULE_TYPE,
     };
   },
   mounted() {
@@ -177,13 +191,7 @@ export default {
         const structData =
           this.$refs[`QuestionStruct${item.id}`][0].getDataList();
         return {
-          questionType: item.questionType,
-          description: item.description,
-          detailName: item.detailName,
-          sourceDetailId: item.sourceDetailId,
-          sourceDetailName: item.sourceDetailName,
-          courseId: item.courseId,
-          score: item.score,
+          ...omit(item, ["id"]),
           ...structData,
         };
       });
@@ -204,6 +212,15 @@ export default {
         return Promise.reject();
       }
 
+      let selectiveUnvalid = this.details.some(
+        (detail) =>
+          detail.selective && detail.questionCount < detail.selectiveCount
+      );
+      if (selectiveUnvalid) {
+        this.$message.error("有大题设置的小题数小于选做题数!");
+        return Promise.reject();
+      }
+
       const { detailInfo } = this.getData();
       let hasNoClassifyDetail = detailInfo.some(
         (detail) => detail.useClassify && !detail.classifyIdList.length

+ 51 - 9
src/modules/paper/components/BuildPaperManual.vue

@@ -41,9 +41,25 @@
             ></el-button>
           </div>
         </div>
-        <div v-if="detail.description" class="detail-desc">
+        <div v-if="!isAnEmptyRichText(detail.description)" class="detail-desc">
           <rich-text :text-json="detail.description"></rich-text>
         </div>
+        <div v-if="detail.selective" class="detail-info">
+          <div>
+            <p>
+              <span>选择题:</span>
+              <span
+                :class="{
+                  'color-danger':
+                    detail.questions.length < detail.selectiveCount,
+                }"
+                >{{ detail.questions.length }}选{{ detail.selectiveCount }},{{
+                  SELECTIVE_RULE_TYPE[detail.selectiveRule]
+                }}</span
+              >
+            </p>
+          </div>
+        </div>
         <div class="detail-questions">
           <template v-for="(question, qindex) in detail.questions">
             <build-paper-question-base
@@ -55,6 +71,7 @@
               :question-serialno="qindex + 1"
               @on-edit="toEditQuestion"
               @on-remove="toRemoveQuestion"
+              @change="scoreChange(detail, question)"
             >
             </build-paper-question-base>
             <build-paper-question-nested
@@ -110,6 +127,9 @@ import SelectQuestionDialog from "./SelectQuestionDialog.vue";
 import QuestionEditDialog from "../../question/components/QuestionEditDialog.vue";
 import { BASE_QUESTION_TYPES } from "@/constants/constants";
 import { randomCode } from "@/plugins/utils";
+import { isAnEmptyRichText } from "@/utils/utils";
+import { SELECTIVE_RULE_TYPE } from "@/constants/constants";
+import { omit } from "lodash";
 
 // import details from "../datas/details.json";
 
@@ -130,6 +150,7 @@ export default {
   },
   data() {
     return {
+      SELECTIVE_RULE_TYPE,
       details: [],
       // details,
       curDetail: {},
@@ -140,6 +161,7 @@ export default {
     };
   },
   methods: {
+    isAnEmptyRichText,
     checkIsBaseQuestion(questionType) {
       const qtype = BASE_QUESTION_TYPES.find(
         (item) => item.code === questionType
@@ -177,10 +199,11 @@ export default {
           index,
           Object.assign({}, this.details[index], data)
         );
-
-        this.$refs[`BuildPaperQuestion${index}`].forEach((qRef) => {
-          qRef.setScore(data.scorePerQuestion);
-        });
+        if (this.$refs[`BuildPaperQuestion${index}`]) {
+          this.$refs[`BuildPaperQuestion${index}`].forEach((qRef) => {
+            qRef.setScore(data.scorePerQuestion);
+          });
+        }
       }
     },
     toAddQuestion(detail, detailIndex) {
@@ -196,8 +219,13 @@ export default {
       this.$refs.SelectQuestionDialog.open();
     },
     questionSelected(questions) {
+      let scorePerQuestion = this.curDetail.scorePerQuestion;
+      if (this.curDetail.selective && this.curDetail.questions.length) {
+        scorePerQuestion =
+          this.curDetail.questions[0].score || scorePerQuestion;
+      }
       questions.forEach((q) => {
-        q.score = this.curDetail.scorePerQuestion;
+        q.score = scorePerQuestion;
         q.key = randomCode();
       });
       this.curDetail.questions.push(...questions);
@@ -205,7 +233,7 @@ export default {
       this.$nextTick(() => {
         this.$refs[`BuildPaperQuestion${this.curDetailIndex}`].forEach(
           (qRef) => {
-            qRef.setScore(this.curDetail.scorePerQuestion);
+            qRef.setScore(scorePerQuestion);
           }
         );
       });
@@ -227,11 +255,16 @@ export default {
         if (qindex !== -1) detail.questions.splice(qindex, 1);
       });
     },
+    scoreChange(detail, question) {
+      if (!detail.selective) return;
+      detail.questions.forEach((q) => {
+        q.score = question.score;
+      });
+    },
     getData() {
       let detailInfo = this.details.map((item) => {
         return {
-          description: item.description,
-          detailName: item.detailName,
+          ...omit(item, ["id", "questions"]),
           unitInfo: item.questions.map((q) => {
             if (q.subQuestions && q.subQuestions.length) {
               return {
@@ -264,6 +297,15 @@ export default {
         return Promise.reject();
       }
 
+      let selectiveUnvalid = this.details.some(
+        (detail) =>
+          detail.selective && detail.questions.length < detail.selectiveCount
+      );
+      if (selectiveUnvalid) {
+        this.$message.error("有大题设置的小题数小于选做题数!");
+        return Promise.reject();
+      }
+
       let hasNoScoreQuestion = this.details.some((detail) => {
         return detail.questions.some((q) => !q.score);
       });

+ 84 - 18
src/modules/paper/components/ModifyDetailStruct.vue

@@ -28,24 +28,67 @@
           :enable-formula="false"
         ></v-editor>
       </el-form-item>
-      <el-form-item v-if="!onlyName" label="题型" prop="sourceDetailId">
-        <source-detail-select
-          v-model="modalForm"
-          :course-id="modalForm.courseId"
-        ></source-detail-select>
-      </el-form-item>
-      <el-form-item v-if="!onlyName" label="每题分值" prop="scorePerQuestion">
-        <el-input-number
-          v-model="modalForm.scorePerQuestion"
-          placeholder="请输入每题分值"
-          :step="0.1"
-          :min="0.1"
-          :max="999"
-          :controls="false"
-          :precision="1"
-          step-strictly
-        ></el-input-number>
-      </el-form-item>
+      <template v-if="!onlyName">
+        <el-form-item label="题型" prop="sourceDetailId">
+          <source-detail-select
+            v-model="modalForm"
+            :course-id="modalForm.courseId"
+          ></source-detail-select>
+        </el-form-item>
+        <el-form-item label="每题分值" prop="scorePerQuestion">
+          <el-input-number
+            v-model="modalForm.scorePerQuestion"
+            class="align-left"
+            placeholder="请输入每题分值"
+            :step="0.1"
+            :min="0.1"
+            :max="999"
+            :controls="false"
+            :precision="1"
+            step-strictly
+          ></el-input-number>
+        </el-form-item>
+        <el-form-item label="是否选做题">
+          <el-radio-group
+            v-model="modalForm.selective"
+            @change="selectiveChange"
+          >
+            <el-radio :label="true">是</el-radio>
+            <el-radio :label="false">否</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item
+          v-if="modalForm.selective"
+          label="选做题数"
+          prop="selectiveCount"
+        >
+          <el-input-number
+            v-model="modalForm.selectiveCount"
+            class="align-left"
+            placeholder="请输入选做题数"
+            :step="1"
+            :min="1"
+            :max="999"
+            :controls="false"
+            :precision="0"
+            step-strictly
+          ></el-input-number>
+        </el-form-item>
+        <el-form-item
+          v-if="modalForm.selective"
+          label="取分规则"
+          prop="selectiveRule"
+        >
+          <el-select v-model="modalForm.selectiveRule">
+            <el-option
+              v-for="(val, key) in SELECTIVE_RULE_TYPE"
+              :key="key"
+              :label="val"
+              :value="key"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+      </template>
     </el-form>
     <div slot="footer">
       <el-button type="primary" @click="confirm">保存</el-button>
@@ -57,6 +100,7 @@
 <script>
 import { randomCode } from "@/plugins/utils";
 import { debounce } from "lodash";
+import { SELECTIVE_RULE_TYPE } from "@/constants/constants";
 
 const initModalForm = {
   id: null,
@@ -66,6 +110,9 @@ const initModalForm = {
   questionType: null,
   sourceDetailId: null,
   scorePerQuestion: 1,
+  selective: false,
+  selectiveCount: null,
+  selectiveRule: "",
 };
 export default {
   name: "ModifyDetailStruct",
@@ -84,6 +131,7 @@ export default {
   data() {
     return {
       modalIsShow: false,
+      SELECTIVE_RULE_TYPE,
       modalForm: { ...initModalForm },
       rules: {
         detailName: [
@@ -107,6 +155,20 @@ export default {
             trigger: "change",
           },
         ],
+        selectiveCount: [
+          {
+            required: true,
+            message: "请输入选做题数",
+            trigger: "blur",
+          },
+        ],
+        selectiveRule: [
+          {
+            required: true,
+            message: "请选择取分规则",
+            trigger: "change",
+          },
+        ],
       },
     };
   },
@@ -120,6 +182,10 @@ export default {
     open() {
       this.modalIsShow = true;
     },
+    selectiveChange() {
+      this.modalForm.selectiveRule = "";
+      this.modalForm.selectiveCount = undefined;
+    },
     confirm: debounce(
       async function () {
         const valid = await this.$refs.modalFormComp.validate().catch(() => {});