zhangjie 2 місяців тому
батько
коміт
cf74d5d995

+ 7 - 0
src/modules/mark/api.js

@@ -52,6 +52,13 @@ export const markSubjectiveUpdateMarkArea = (datas) => {
     datas
   );
 };
+// 设置ai智能评卷参数
+export const markSubjectiveAiParamInfo = (questionId) => {
+  return $postParam("/api/admin/mark/ai_question_param/info", { questionId });
+};
+export const markSubjectiveAiParamSave = (datas) => {
+  return $post("/api/admin/mark/ai_question_param/save", datas);
+};
 
 // class
 export const markClassStatusUpdate = (datas) => {

+ 20 - 22
src/modules/mark/components/ModifyMarkSetting.vue

@@ -95,18 +95,16 @@
           >
         </el-form-item>
         <el-form-item prop="aiMarkType" class="form-item-info">
-          <el-checkbox
-            v-model="modalForm.enableAIMark"
-            @change="enableAIMarkChange"
+          <el-checkbox v-model="aiMarkEnable" @change="aiMarkEnableChange"
             >启用AI智能评卷</el-checkbox
           >
           <el-radio-group
-            v-if="modalForm.enableAIMark"
-            v-model="modalForm.aiMarkType"
+            v-if="aiMarkEnable"
+            v-model="modalForm.aiMark"
             class="ml-2"
           >
             <el-radio label="AI_ONLY">仅AI评卷</el-radio>
-            <el-radio label="AI_HUMAN">人机双评</el-radio>
+            <el-radio label="MAN_MACHINE">人机双评</el-radio>
           </el-radio-group>
         </el-form-item>
         <!-- <el-form-item class="form-item-info">
@@ -155,8 +153,7 @@ const initModalForm = {
   doubleMark: false,
   autoScroll: false,
   mergeMarker: true,
-  enableAIMark: false,
-  aiMarkType: "",
+  aiMark: "NONE",
   // allowCloseBeforeFinish: false,
   passScore: 60,
   excellentScore: 80,
@@ -187,6 +184,7 @@ export default {
       MARK_MODE_TYPE,
       modalForm: { ...initModalForm },
       paperList: [],
+      aiMarkEnable: false,
       rules: {
         markMode: [
           {
@@ -216,18 +214,11 @@ export default {
             trigger: "change",
           },
         ],
-        aiMarkType: [
+        aiMark: [
           {
             required: true,
             message: "请选择AI评卷方式",
             trigger: "change",
-            validator: (rule, value, callback) => {
-              if (this.modalForm.enableAIMark && !value) {
-                callback(new Error("请选择AI评卷方式"));
-              } else {
-                callback();
-              }
-            },
           },
         ],
       },
@@ -261,10 +252,11 @@ export default {
         };
       });
     },
-    async initData(val) {
+    async initData() {
       if (this.isMultiple) {
         this.modalForm = { ...initModalForm };
         this.markTime = [undefined, undefined];
+        this.updateAiMarkEnable();
         return;
       }
       await this.getPaperList();
@@ -285,6 +277,7 @@ export default {
 
       this.modalForm.passScore = this.modalForm.passScore || 60;
       this.modalForm.excellentScore = this.modalForm.excellentScore || 80;
+      this.updateAiMarkEnable();
     },
     async getDefaultSheetConfig() {
       const detData = await cardDetail(this.instance.cardId);
@@ -309,7 +302,7 @@ export default {
       return areas;
     },
     visibleChange() {
-      this.initData(this.instance);
+      this.initData();
     },
     cancel() {
       this.modalIsShow = false;
@@ -326,11 +319,16 @@ export default {
         this.modalForm.markEndTime = "";
       }
     },
-    enableAIMarkChange() {
-      if (this.modalForm.enableAIMark) {
-        this.modalForm.aiMarkType = "AI_HUMAN";
+    updateAiMarkEnable() {
+      this.aiMarkEnable =
+        this.modalForm.aiMark === "MAN_MACHINE" ||
+        this.modalForm.aiMark === "AI_ONLY";
+    },
+    aiMarkEnableChange() {
+      if (this.aiMarkEnable) {
+        this.modalForm.aiMark = "MAN_MACHINE";
       } else {
-        this.modalForm.aiMarkType = "";
+        this.modalForm.aiMark = "NONE";
       }
     },
     areaModified(areas) {

+ 11 - 3
src/modules/mark/components/markParam/MarkParamGroup.vue

@@ -482,11 +482,19 @@ export default {
       return combinePictureConfigList;
     },
     toAiMarkSet(row) {
-      this.curRow = row;
+      this.curRow = {
+        ...row,
+        examId: this.basicInfo.examId,
+        courseId: this.basicInfo.courseId,
+        paperNumber: this.basicInfo.paperNumber,
+      };
       this.$refs.ModifyMarkAiSet.open();
     },
-    aiSetModified(data) {
-      this.$set(this.curRow, "aiMarkSet", data);
+    aiSetModified() {
+      this.updateSubjectiveTaskItem({
+        aiMarkSet: true,
+        id: this.curRow.id,
+      });
     },
     checkData() {
       const errorList = [];

+ 14 - 9
src/modules/mark/components/markParam/ModifyMarkAiLevelAnswer.vue

@@ -29,9 +29,9 @@
             :controls="false"
           ></el-input-number>
         </el-form-item>
-        <el-form-item label="标答内容:" prop="content">
+        <el-form-item label="标答内容:" prop="answer">
           <el-input
-            v-model="form.content"
+            v-model="form.answer"
             type="textarea"
             :rows="4"
             placeholder="请输入标答内容"
@@ -55,9 +55,10 @@ export default {
     return {
       visible: false,
       form: {
+        aiQuestionId: null,
         minScore: 0,
         maxScore: 0,
-        content: "",
+        answer: "",
       },
       rules: {
         minScore: [
@@ -78,23 +79,27 @@ export default {
             },
           },
         ],
-        content: [
+        answer: [
           { required: true, message: "请输入标答内容", trigger: "change" },
         ],
       },
     };
   },
   methods: {
+    getInitForm() {
+      return {
+        aiQuestionId: null,
+        minScore: 0,
+        maxScore: 0,
+        answer: "",
+      };
+    },
     open(data) {
       this.visible = true;
       if (data) {
         this.form = { ...data };
       } else {
-        this.form = {
-          minScore: 0,
-          maxScore: 0,
-          content: "",
-        };
+        this.form = this.getInitForm();
       }
     },
     handleClose() {

+ 12 - 8
src/modules/mark/components/markParam/ModifyMarkAiPointAnswer.vue

@@ -21,9 +21,9 @@
             :controls="false"
           ></el-input-number>
         </el-form-item>
-        <el-form-item label="标答内容:" prop="content">
+        <el-form-item label="标答内容:" prop="answer">
           <el-input
-            v-model="form.content"
+            v-model="form.answer"
             type="textarea"
             :rows="4"
             :maxlength="999"
@@ -48,26 +48,30 @@ export default {
       visible: false,
       form: {
         score: 0,
-        content: "",
+        answer: "",
       },
       rules: {
         score: [{ required: true, message: "请输入分值", trigger: "blur" }],
-        content: [
+        answer: [
           { required: true, message: "请输入标答内容", trigger: "blur" },
         ],
       },
     };
   },
   methods: {
+    getInitForm() {
+      return {
+        aiQuestionId: null,
+        score: 0,
+        answer: "",
+      };
+    },
     open(data) {
       this.visible = true;
       if (data) {
         this.form = { ...data };
       } else {
-        this.form = {
-          score: 0,
-          content: "",
-        };
+        this.form = this.getInitForm();
       }
     },
     handleClose() {

+ 61 - 31
src/modules/mark/components/markParam/ModifyMarkAiSet.vue

@@ -12,21 +12,18 @@
     >
       <div class="modify-mark-ai-set">
         <el-form ref="FormRef" :model="form" :rules="rules" label-width="90px">
-          <el-form-item label="试卷题干:" prop="questionStem">
+          <el-form-item label="试卷题干:" prop="mainTitle">
             <el-input
-              v-model="form.questionStem"
+              v-model="form.mainTitle"
               type="textarea"
-              :maxlength="999"
+              :maxlength="499"
               show-word-limit
               :rows="4"
               placeholder="请输入试卷题干"
             ></el-input>
           </el-form-item>
-          <el-form-item label="评分模式:" prop="scoreMode">
-            <el-radio-group
-              v-model="form.scoreMode"
-              @change="handleScoreModeChange"
-            >
+          <el-form-item label="评分模式:" prop="mode">
+            <el-radio-group v-model="form.mode" @change="handleScoreModeChange">
               <el-radio label="POINT">按得分点评分</el-radio>
               <el-radio label="LEVEL">按档次评分</el-radio>
             </el-radio-group>
@@ -51,14 +48,14 @@
               >新增</el-button
             >
           </div>
-          <el-table :data="form.answers" border>
+          <el-table :data="answers" border>
             <el-table-column
               type="index"
               label="序号"
               width="60"
               align="center"
             ></el-table-column>
-            <template v-if="form.scoreMode === 'POINT'">
+            <template v-if="form.mode === 'POINT'">
               <el-table-column prop="score" label="分值" width="100">
                 <template slot-scope="scope">
                   {{ scope.row.score }}
@@ -98,7 +95,9 @@
       </div>
       <div slot="footer">
         <el-button @click="close">取 消</el-button>
-        <el-button type="primary" @click="handleSubmit">确 定</el-button>
+        <el-button type="primary" :loading="loading" @click="handleSubmit"
+          >确 定</el-button
+        >
       </div>
     </el-dialog>
 
@@ -116,18 +115,13 @@
 </template>
 
 <script>
+import {
+  markSubjectiveAiParamInfo,
+  markSubjectiveAiParamSave,
+} from "../../api";
 import ModifyMarkAiPointAnswer from "./ModifyMarkAiPointAnswer.vue";
 import ModifyMarkAiLevelAnswer from "./ModifyMarkAiLevelAnswer.vue";
 
-const getInitForm = () => {
-  return {
-    questionStem: "",
-    scoreMode: "POINT",
-    minScore: undefined,
-    answers: [],
-  };
-};
-
 export default {
   name: "modify-mark-ai-set",
   components: {
@@ -145,12 +139,12 @@ export default {
   data() {
     return {
       modalIsShow: false,
-      form: getInitForm(),
+      form: this.getInitForm(),
       rules: {
-        questionStem: [
+        mainTitle: [
           { required: true, message: "请输入试卷题干", trigger: "blur" },
         ],
-        scoreMode: [
+        mode: [
           { required: true, message: "请选择评分模式", trigger: "change" },
         ],
         minScore: [
@@ -158,11 +152,34 @@ export default {
         ],
       },
       curAnswer: null,
+      loading: false,
     };
   },
+  computed: {
+    answers() {
+      return this.form.mode === "POINT"
+        ? this.form.pointList
+        : this.form.levelList;
+    },
+  },
   methods: {
-    visibleChange() {
-      this.form = this.group.aiMarkSet || getInitForm();
+    getInitForm() {
+      return {
+        id: null,
+        examId: this.group.examId,
+        courseId: this.group.courseId,
+        paperNumber: this.group.paperNumber,
+        questionId: this.group.id,
+        mainTitle: "",
+        mode: "POINT",
+        minScore: undefined,
+        pointList: [],
+        levelList: [],
+      };
+    },
+    async visibleChange() {
+      const res = await markSubjectiveAiParamInfo(this.group.id);
+      this.form = this.$objAssign(this.getInitForm(), res || {});
       this.$nextTick(() => {
         this.$refs.FormRef.clearValidate();
       });
@@ -175,10 +192,11 @@ export default {
       this.$refs.FormRef.resetFields();
     },
     handleScoreModeChange() {
-      this.form.answers = [];
+      this.form.pointList = [];
+      this.form.levelList = [];
     },
     toAddAnswer() {
-      if (this.form.scoreMode === "POINT") {
+      if (this.form.mode === "POINT") {
         this.$refs.ModifyMarkAiPointAnswer.open();
       } else {
         this.$refs.ModifyMarkAiLevelAnswer.open();
@@ -186,7 +204,7 @@ export default {
     },
     toEditAnswer(row) {
       this.curAnswer = row;
-      if (this.form.scoreMode === "POINT") {
+      if (this.form.mode === "POINT") {
         this.$refs.ModifyMarkAiPointAnswer.open(row);
       } else {
         this.$refs.ModifyMarkAiLevelAnswer.open(row);
@@ -199,18 +217,30 @@ export default {
       if (this.curAnswer) {
         Object.assign(this.curAnswer, answer);
       } else {
-        this.form.answers.push(answer);
+        if (this.form.mode === "POINT") {
+          this.form.pointList.push(answer);
+        } else if (this.form.mode === "LEVEL") {
+          this.form.levelList.push(answer);
+        }
       }
       this.curAnswer = null;
     },
     async handleSubmit() {
       const valid = await this.$refs.FormRef.validate().catch(() => {});
       if (!valid) return;
-      if (!this.form.answers.length) {
+      if (!this.answers.length) {
         this.$message.error("请添加标答");
         return;
       }
-      this.$emit("modified", { ...this.form });
+
+      if (this.loading) return;
+      this.loading = true;
+      const res = await markSubjectiveAiParamSave(this.form).catch(() => {});
+      this.loading = false;
+      if (!res) return;
+
+      this.$message.success("保存成功");
+      this.$emit("modified", this.form);
       this.close();
     },
   },