Bläddra i källkod

评卷参数-多选题新增漏选给分策略

zhangjie 1 år sedan
förälder
incheckning
f92266d3fb

+ 3 - 0
src/assets/styles/base.scss

@@ -517,6 +517,9 @@ body {
 .width-200 {
   width: 200px;
 }
+.width-100 {
+  width: 100px;
+}
 
 // other
 .tips-info {

+ 1 - 0
src/constants/enumerate.js

@@ -355,6 +355,7 @@ export const QUESTION_SCORE_TYPE = {
   NONE: "全对给分",
   ALL: "任选给半分",
   LEAK: "漏选给半分",
+  PICK: "漏选给分",
 };
 
 // mark

+ 1 - 1
src/modules/course/components/TargetReportDetail.vue

@@ -343,7 +343,7 @@ export default {
   },
   data() {
     return {
-      modalIsShow: true,
+      modalIsShow: false,
       baseInfo: {},
       courseTargetList: [],
       totalGetVal: 0.67,

+ 101 - 25
src/modules/mark/components/markParam/MarkParamObjectiveAnswer.vue

@@ -50,12 +50,12 @@
           label="小题号"
           width="80"
         ></el-table-column>
-        <el-table-column prop="totalScore" label="小题满分" width="105">
+        <el-table-column prop="totalScore" label="ß" width="85">
         </el-table-column>
-        <el-table-column label="答案" width="200px" class-name="answer-column">
+        <el-table-column label="答案" width="140px" class-name="answer-column">
           <div
             slot-scope="scope"
-            :class="['el-form-item', { 'is-error': scope.row.error }]"
+            :class="['el-form-item', { 'is-error': scope.row.answerError }]"
           >
             <div class="el-form-item__content">
               <el-input
@@ -65,17 +65,25 @@
                 "
                 :maxlength="scope.row.optionCount"
                 clearable
-                @change="validateAnswer(scope.row)"
+                @change="answerChange(scope.row)"
               ></el-input>
-              <div v-if="scope.row.error" class="el-form-item__error">
-                {{ scope.row.errMsg }}
+              <div v-if="scope.row.answerError" class="el-form-item__error">
+                {{ scope.row.answerError }}
               </div>
             </div>
           </div>
         </el-table-column>
-        <el-table-column label="判分策略" width="140px">
+        <el-table-column
+          label="判分策略"
+          width="270px"
+          class-name="answer-column"
+        >
           <template v-if="scope.row.questionType === 2" slot-scope="scope">
-            <el-select v-model="scope.row.objectivePolicy">
+            <el-select
+              v-model="scope.row.objectivePolicy"
+              style="width: 120px"
+              @change="objectivePolicyChange(scope.row)"
+            >
               <el-option
                 v-for="(val, key) in QUESTION_SCORE_TYPE"
                 :key="key"
@@ -83,6 +91,36 @@
                 :label="val"
               ></el-option>
             </el-select>
+            <div
+              v-if="scope.row.objectivePolicy === 'PICK'"
+              :class="[
+                'el-form-item',
+                { 'is-error': scope.row.objectivePolicyError },
+              ]"
+              style="display: inline-block"
+            >
+              <div class="el-form-item__content">
+                <el-input-number
+                  v-model="scope.row.objectivePolicyPickScore"
+                  style="width: 110px; margin-left: 5px"
+                  size="small"
+                  :min="0"
+                  :max="100"
+                  :step="0.5"
+                  step-strictly
+                  :controls="false"
+                  placeholder="每个选项得分"
+                  @change="validateObjectivePolicy(scope.row)"
+                ></el-input-number>
+                <div
+                  v-if="scope.row.objectivePolicyError"
+                  class="el-form-item__error"
+                  style="padding-left: 5px"
+                >
+                  {{ scope.row.objectivePolicyError }}
+                </div>
+              </div>
+            </div>
           </template>
         </el-table-column>
       </el-table>
@@ -135,10 +173,11 @@ export default {
       this.tableData = objectiveStructure.map((item) => {
         let nitem = {
           ...item,
+          objectivePolicyPickScore: item.objectivePolicyPickScore || undefined,
           mainFirstSub: false,
           expandSub: true,
-          error: false,
-          errMsg: "",
+          answerError: "",
+          objectivePolicyError: "",
         };
         if (item.questionType === 2 && !item.objectivePolicy) {
           nitem.objectivePolicy = "NONE";
@@ -168,16 +207,18 @@ export default {
         .filter((item) => item.mainId === row.mainId && !item.mainFirstSub)
         .forEach((item) => (item.expandSub = row.expandSub));
     },
+    answerChange(row) {
+      this.validateAnswer(row);
+      this.objectivePolicyChange(row);
+    },
     validateAnswer(row) {
       if (!row.answer) {
-        row.error = true;
-        row.errMsg = "不能为空";
+        row.answerError = "不能为空";
         return;
       }
 
       if (!/^[A-Z]{1,26}$/.test(row.answer)) {
-        row.error = true;
-        row.errMsg = "只能输入英文大写字母";
+        row.answerError = "只能输入英文大写字母";
         return;
       }
 
@@ -188,8 +229,7 @@ export default {
           row.answer.length !== 1 ||
           row.answer.split("").some((item) => !validAnswers.includes(item))
         ) {
-          row.error = true;
-          row.errMsg = `只能输入${validAnswers}中的一个`;
+          row.answerError = `只能输入${validAnswers}中的一个`;
           return;
         }
       }
@@ -197,33 +237,69 @@ export default {
       // 多选题
       if (row.questionType === 2) {
         // if (row.answer.length <= 1) {
-        //   row.error = true;
-        //   row.errMsg = `答案必须为多个`;
+        //   row.answerError = `答案必须为多个`;
         //   return;
         // }
         if (row.answer.split("").some((item) => !validAnswers.includes(item))) {
-          row.error = true;
-          row.errMsg = `只能输入${validAnswers}中的字符`;
+          row.answerError = `只能输入${validAnswers}中的字符`;
           return;
         }
 
         const ansSet = new Set(row.answer.split(""));
         if (ansSet.size !== row.answer.length) {
-          row.error = true;
-          row.errMsg = "答案不能重复";
+          row.answerError = "答案不能重复";
           return;
         }
       }
 
-      row.error = false;
-      row.errMsg = "";
+      row.answerError = "";
+    },
+    validateObjectivePolicy(row) {
+      if (row.questionType === 2 && row.objectivePolicy === "PICK") {
+        if (
+          !row.objectivePolicyPickScore &&
+          row.objectivePolicyPickScore !== 0
+        ) {
+          row.objectivePolicyError = "不能为空";
+          return;
+        }
+
+        if (
+          row.answer &&
+          row.objectivePolicyPickScore * row.answer.length > row.totalScore
+        ) {
+          row.objectivePolicyError = "分值过大";
+          return;
+        }
+      }
+
+      row.objectivePolicyError = "";
     },
     checkData() {
       this.tableData.forEach((item) => {
         this.validateAnswer(item);
+        this.validateObjectivePolicy(item);
       });
 
-      return !this.tableData.some((item) => item.error);
+      return !this.tableData.some(
+        (item) => item.answerError || item.objectivePolicyError
+      );
+    },
+    objectivePolicyChange(row) {
+      const { totalScore, answer, objectivePolicy } = row;
+      if (objectivePolicy === "PICK") {
+        if (answer) {
+          const answerCount = answer.length;
+          const pickScore = Math.floor((totalScore * 2) / answerCount) / 2;
+
+          row.objectivePolicyPickScore = pickScore;
+        } else {
+          row.objectivePolicyPickScore = undefined;
+        }
+      } else {
+        row.objectivePolicyPickScore = undefined;
+      }
+      this.validateObjectivePolicy(row);
     },
     async submit() {
       if (!this.checkData()) return;