Эх сурвалжийг харах

feat: 评卷参数接口调试

zhangjie 3 сар өмнө
parent
commit
e054b7eb31

+ 2 - 1
src/components/RobotHelp.vue

@@ -33,7 +33,8 @@ export default {
   directives: { MoveEle },
   data() {
     return {
-      aiRobotResult: this.$ls.get("user", { aiRobotResult: {} }).aiRobotResult,
+      aiRobotResult:
+        this.$ls.get("user", { aiRobotResult: {} }).aiRobotResult || {},
       sizePos: {
         x: 0,
         y: 0,

+ 12 - 12
src/modules/mark/api.js

@@ -29,23 +29,29 @@ export const markStructureList = (datas) => {
 export const markStructureSave = (datas) => {
   return $post("/api/admin/mark/question/save", datas);
 };
-// group
+// subjective question
 export const markSubjectiveList = (datas) => {
-  return $postParam("/api/admin/mark/subjective/list", datas);
+  return $postParam("/api/admin/mark/question/subjective/list", datas);
 };
 export const markSubjectiveBindMarker = (datas) => {
-  return $post("/api/admin/mark/question/bind_marker", datas);
+  return $post("/api/admin/mark/marker/add", datas);
+};
+export const markSubjectiveUnbindMarker = (markUserQuestionId) => {
+  return $postParam("/api/admin/mark/marker/delete", { markUserQuestionId });
 };
 export const markSubjectiveUpdateMarkType = (datas) => {
-  return $post("/api/admin/mark/question/update_double_marking", datas);
+  return $post("/api/admin/mark/question/subjective/double/mark/update", datas);
 };
 export const markSubjectiveUpdateMarkArea = (datas) => {
-  return $post("/api/admin/mark/question/update_picture_config", datas);
+  return $post(
+    "/api/admin/mark/question/subjective/picture/config/update",
+    datas
+  );
 };
 
 // class
 export const markClassStatusUpdate = (datas) => {
-  return $postParam("/api/admin/mark/group/update_open_mark_class", datas);
+  return $postParam("/api/admin/mark/class/open_mark_class", datas);
 };
 export const markClassList = (datas) => {
   return $postParam("/api/admin/mark/class/list", datas);
@@ -53,12 +59,6 @@ export const markClassList = (datas) => {
 export const markClassSave = (datas) => {
   return $post("/api/admin/mark/class/save", datas);
 };
-export const markClassMarkerList = (datas) => {
-  return $postParam("/api/admin/mark/class/list", datas);
-};
-export const markClassMarkerSave = (datas) => {
-  return $post("/api/admin/mark/class/save", datas);
-};
 export const examStructureClassListPage = (datas) => {
   // examId,paperNumber
   return $postParam("/api/admin/exam/structure/list_user_class", datas);

+ 2 - 10
src/modules/mark/components/ModifyMarkSetting.vue

@@ -81,20 +81,13 @@
             >评卷显示客观分</el-checkbox
           >
         </el-form-item>
-        <el-form-item class="form-item-info">
-          <el-checkbox v-model="modalForm.allowMarkByQuestion"
-            >评卷界面显示按小题评卷开关</el-checkbox
-          >
-        </el-form-item>
         <el-form-item class="form-item-info">
           <el-checkbox v-model="modalForm.autoScroll"
             >评卷提交自动定位</el-checkbox
           >
         </el-form-item>
         <el-form-item class="form-item-info">
-          <el-checkbox v-model="modalForm.doubleMarke"
-            >是否开启双评</el-checkbox
-          >
+          <el-checkbox v-model="modalForm.doubleMark">是否开启双评</el-checkbox>
         </el-form-item>
         <el-form-item class="form-item-info">
           <el-checkbox v-model="modalForm.mergeMarker"
@@ -144,8 +137,7 @@ const initModalForm = {
   markStartTime: "",
   markEndTime: "",
   showObjectScore: false,
-  allowMarkByQuestion: false,
-  doubleMarke: false,
+  doubleMark: false,
   autoScroll: false,
   mergeMarker: true,
   // allowCloseBeforeFinish: false,

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

@@ -24,8 +24,8 @@
         </el-form-item>
       </el-form>
       <div>
-        <el-button type="primary" @click="toPrev">上一步</el-button>
-        <el-button type="primary" @click="toNext">下一步</el-button>
+        <el-button type="primary" @click="toPrev(1)">上一步</el-button>
+        <el-button type="primary" @click="toNext(1)">下一步</el-button>
       </div>
     </div>
     <div v-if="markClassIsOpen" class="part-box part-box-pad">
@@ -91,11 +91,7 @@
 </template>
 
 <script>
-import {
-  markClassMarkerList,
-  markClassMarkerSave,
-  markClassStatusUpdate,
-} from "../../api";
+import { markClassList, markClassSave, markClassStatusUpdate } from "../../api";
 import { mapState, mapMutations } from "vuex";
 import SelectClassByCourse from "./SelectClassByCourse.vue";
 import { toPrecision } from "@/plugins/utils";
@@ -137,15 +133,15 @@ export default {
     this.initData();
   },
   methods: {
-    ...mapMutations("markParam", ["setOpenMarkClass"]),
+    ...mapMutations("markParam", ["setOpenClassMark"]),
     async initData() {
-      this.markClassIsOpen = this.openMarkClass;
+      this.markClassIsOpen = this.openClassMark;
 
       const params = {
         examId: this.basicInfo.examId,
         paperNumber: this.basicInfo.paperNumber,
       };
-      const res = await markClassMarkerList(params);
+      const res = await markClassList(params);
       this.dataList = res.markerClass || [];
       this.classList = res.classNames || [];
 
@@ -180,7 +176,7 @@ export default {
         this.markClassIsOpen = !this.markClassIsOpen;
       });
       if (!res) return;
-      this.setOpenMarkClass(this.markClassIsOpen);
+      this.setOpenClassMark(this.markClassIsOpen);
       if (this.markClassIsOpen) {
         this.initData();
       } else {
@@ -247,7 +243,7 @@ export default {
         return;
       }
 
-      const res = await markClassMarkerSave({
+      const res = await markClassSave({
         examId: this.basicInfo.examId,
         paperNumber: this.basicInfo.paperNumber,
         questionMarkerClass: this.dataList,

+ 43 - 30
src/modules/mark/components/markParam/MarkParamGroup.vue

@@ -2,15 +2,15 @@
   <div class="mark-param-group">
     <div class="box-justify part-box part-box-pad">
       <div>
-        <p v-if="unsetQuestionNos.length" class="tips-info tips-error">
+        <p v-if="unsetQuestionNos" class="tips-info tips-error">
           试题{{
-            unsetQuestionNos.join(",")
+            unsetQuestionNos
           }}未设置评卷员,请点击列表里设置评卷员选择评卷员
         </p>
       </div>
       <div>
-        <el-button type="primary" @click="toPrev">上一步</el-button>
-        <el-button type="primary" @click="toNext">下一步</el-button>
+        <el-button type="primary" @click="toPrev(1)">上一步</el-button>
+        <el-button type="primary" @click="toNext(1)">下一步</el-button>
       </div>
     </div>
 
@@ -21,13 +21,15 @@
         :span-method="openMergeMarker ? objectSpanMethod : undefined"
       >
         <el-table-column label="大题名称" prop="mainTitle"> </el-table-column>
-        <el-table-column label="大题号" prop="mainNumber"> </el-table-column>
-        <el-table-column label="小题号" prop="subNumber"> </el-table-column>
-        <el-table-column label="评卷员">
+        <el-table-column label="大题号" prop="mainNumber" width="80">
+        </el-table-column>
+        <el-table-column label="小题号" prop="subNumber" width="80">
+        </el-table-column>
+        <el-table-column label="评卷员" min-width="200">
           <template slot-scope="scope">
             <el-tag
               v-for="user in scope.row.markers"
-              :key="user.id"
+              :key="user.markUserQuestionId"
               class="tag-spin tag-wrap"
               size="medium"
               effect="dark"
@@ -36,7 +38,11 @@
             >
               {{ user.name }}({{ user.loginName }})
             </el-tag>
-            <el-button type="text" @click="toSetMarker(scope.row)">
+            <el-button
+              type="text"
+              class="btn-primary"
+              @click="toSetMarker(scope.row)"
+            >
               设置评卷员
             </el-button>
           </template>
@@ -64,7 +70,7 @@
         <el-table-column label="评卷区" width="80" align="center">
           <template slot-scope="scope">
             <i
-              v-if="scope.row.pictureConfigs.length"
+              v-if="scope.row.pictureConfigs?.length"
               class="el-icon-success color-success"
             ></i>
           </template>
@@ -89,7 +95,7 @@
       </el-table>
 
       <!-- subjective answer -->
-      <el-form>
+      <el-form class="mt-2" label-width="150px">
         <el-form-item label="请上传标答PDF文档:">
           <mark-param-subjective-answer></mark-param-subjective-answer>
         </el-form-item>
@@ -132,6 +138,7 @@ import {
   markSubjectiveBindMarker,
   markSubjectiveUpdateMarkType,
   markSubjectiveUpdateMarkArea,
+  markSubjectiveUnbindMarker,
 } from "../../api";
 import { cardDetail } from "../../../card/api";
 import { SCORE_POLICY_TYPE } from "@/constants/enumerate";
@@ -166,6 +173,12 @@ export default {
       "openMergeMarker",
       "subjectiveTaskList",
     ]),
+    unsetQuestionNos() {
+      return this.subjectiveTaskList
+        .filter((item) => !item.markers.length)
+        .map((item) => `${item.mainNumber}-${item.subNumber}`)
+        .join(",");
+    },
   },
   mounted() {
     this.initFillQuestionRanges();
@@ -241,7 +254,7 @@ export default {
       if (this.openMergeMarker && row.questionType === 3) {
         // 填空题按大题批量处理
         const pos = this.subjectiveTaskList.findIndex(
-          (item) => item.questionId === row.questionId
+          (item) => item.id === row.id
         );
         if (pos === -1) return;
         const range = this.fillQuestionRanges.find((item) =>
@@ -251,7 +264,7 @@ export default {
         this.curRowQuestions = range.map((index) => {
           const item = this.subjectiveTaskList[index];
           return {
-            questionId: item.questionId,
+            id: item.id,
             mainNumber: item.mainNumber,
             subNumber: item.subNumber,
           };
@@ -260,7 +273,7 @@ export default {
         // 非填空题按单题处理
         this.curRowQuestions = [
           {
-            questionId: row.questionId,
+            id: row.id,
             mainNumber: row.mainNumber,
             subNumber: row.subNumber,
           },
@@ -273,13 +286,13 @@ export default {
       await markSubjectiveBindMarker({
         examId: this.basicInfo.examId,
         paperNumber: this.basicInfo.paperNumber,
-        questionIds: this.curRowQuestions.map((item) => item.questionId),
+        questionIds: this.curRowQuestions.map((item) => item.id),
         markers: row.markers,
       });
 
       this.curRowQuestions.forEach((item) => {
         this.updateSubjectiveTaskItem({
-          questionId: item.questionId,
+          id: item.id,
           markers: row.markers,
         });
       });
@@ -290,15 +303,18 @@ export default {
     },
     async areaModified(row) {
       const pos = this.subjectiveTaskList.findIndex(
-        (item) => item.questionId === row.questionId
+        (item) => item.id === row.id
       );
       if (pos === -1) return;
       const datas = {
-        questionId: row.questionId,
+        questionId: row.id,
         pictureConfigs: row.pictureConfigs,
       };
       await markSubjectiveUpdateMarkArea(datas);
-      this.updateSubjectiveTaskItem(datas);
+      this.updateSubjectiveTaskItem({
+        id: row.id,
+        pictureConfigs: row.pictureConfigs,
+      });
     },
     async toDeleteMarker(row, marker) {
       const confirm = await this.$confirm(`确定要删除当前评卷员吗?`, "提示", {
@@ -306,17 +322,14 @@ export default {
       }).catch(() => {});
       if (confirm !== "confirm") return;
 
-      const markers = row.markers.filter((item) => item.id !== marker.id);
-      const datas = {
-        questionId: row.questionId,
+      const markers = row.markers.filter(
+        (item) => item.markUserQuestionId !== marker.markUserQuestionId
+      );
+      await markSubjectiveUnbindMarker(marker.markUserQuestionId);
+      this.updateSubjectiveTaskItem({
+        id: row.id,
         markers,
-      };
-      await markSubjectiveBindMarker({
-        examId: this.basicInfo.examId,
-        paperNumber: this.basicInfo.paperNumber,
-        ...datas,
       });
-      this.updateSubjectiveTaskItem(datas);
     },
     toSetMarkType(row) {
       this.curRow = row;
@@ -324,11 +337,11 @@ export default {
     },
     async markTypeModified(row) {
       const pos = this.subjectiveTaskList.findIndex(
-        (item) => item.questionId === row.questionId
+        (item) => item.id === row.id
       );
       if (pos === -1) return;
       const datas = {
-        id: row.questionId,
+        id: row.id,
         doubleEnable: row.doubleEnable,
         doubleRate: row.doubleRate,
         arbitrateThreshold: row.arbitrateThreshold,

+ 1 - 1
src/modules/mark/components/markParam/MarkParamObjectiveAnswer.vue

@@ -31,7 +31,7 @@
         <el-button type="primary" :disabled="loading" @click="submit"
           >提交</el-button
         >
-        <el-button type="primary" @click="toPrev">上一步</el-button>
+        <el-button type="primary" @click="toPrev(1)">上一步</el-button>
       </div>
     </div>
 

+ 12 - 16
src/modules/mark/components/markParam/MarkParamStructure.vue

@@ -20,15 +20,17 @@
       </el-breadcrumb>
 
       <div>
-        <el-button type="primary" @click="toNext">下一步</el-button>
+        <el-button type="primary" @click="toNext(1)">下一步</el-button>
       </div>
     </div>
 
     <div class="part-box part-box-pad mb-0">
-      <div class="box-justify">
-        <el-button v-if="structureEditable" type="primary" @click="toAddMain"
-          >新增大题</el-button
-        >
+      <div class="box-justify mb-2">
+        <div>
+          <el-button v-if="structureEditable" type="primary" @click="toAddMain"
+            >新增大题</el-button
+          >
+        </div>
         <div v-if="checkPrivilege('link', 'EditPaperStruct', 'MarkSetting')">
           <el-switch v-model="editOpen" active-text="开启编辑"></el-switch>
         </div>
@@ -74,7 +76,7 @@
                 v-model="scope.row.questionType"
                 placeholder="请选择"
                 class="width-full"
-                :disabled="checkMainQuestionHasGroup(scope.row.mainId)"
+                :disabled="checkMainQuestionHasMarker(scope.row.mainId)"
                 @visible-change="(val) => qTypeVisibleChange(val, scope.row)"
                 @change="qTypeChange(scope.row)"
               >
@@ -239,7 +241,7 @@
             >
             <el-button
               :disabled="
-                tableData.length <= 1 || checkSubQuestionHasGroup(scope.row)
+                tableData.length <= 1 || checkSubQuestionHasMarker(scope.row)
               "
               class="btn-danger"
               type="text"
@@ -250,7 +252,7 @@
         </el-table-column>
       </el-table>
       <!-- tips -->
-      <div>
+      <div class="mt-2">
         <p class="tips-info">
           1.请确认展示的试卷结构与提交的试卷、答题卡是否一致?
         </p>
@@ -322,13 +324,6 @@ export default {
     structureEditable() {
       return this.structureCanEdit || this.editOpen;
     },
-    subjectiveTaskList() {
-      return this.subjectiveTaskList
-        .map((task) => {
-          return task.questions.map((q) => `${q.mainNumber}-${q.subNumber}`);
-        })
-        .flat();
-    },
   },
   watch: {
     structureEditable() {
@@ -343,7 +338,7 @@ export default {
     initData() {
       this.tableKey = this.$randomCode();
       this.editOpen = this.structureCanEdit;
-      this.hasMarkerQuestions = this.paperStructureInfo
+      this.hasMarkerQuestions = this.subjectiveTaskList
         .filter((item) => item.markers.length)
         .map((item) => `${item.mainNumber}-${item.subNumber}`);
 
@@ -357,6 +352,7 @@ export default {
       let curMainId = null;
       let scoresPerTopic = {},
         intervalScorePerTopic = {};
+
       this.tableData = this.paperStructureInfo.map((item) => {
         let nitem = {
           ...item,

+ 6 - 2
src/modules/mark/components/markParam/MarkParamSubjectiveAnswer.vue

@@ -72,8 +72,12 @@ export default {
         paperNumber: this.basicInfo.paperNumber,
       };
       const res = await markSubjectiveQuestionList(params);
-      (res || []).forEach((item, index) => {
-        this.subjectiveAnswerList[index].answerFileUrl = item;
+      const urlDict = {};
+      (res || []).forEach((item) => {
+        urlDict[item.paperType] = item.url;
+      });
+      this.subjectiveAnswerList.forEach((item) => {
+        item.answerFileUrl = urlDict[item.paperType];
       });
 
       this.updateSubjectiveAnswer();

+ 0 - 14
src/modules/mark/components/markParam/ModifyMarkMarker.vue

@@ -144,13 +144,6 @@ export default {
         callback();
       }
     };
-    const questionsValidator = (rule, value, callback) => {
-      if (!this.selectedQuestionNos.length) {
-        callback(new Error("请选择试题"));
-      } else {
-        callback();
-      }
-    };
 
     return {
       modalIsShow: false,
@@ -175,13 +168,6 @@ export default {
             trigger: "change",
           },
         ],
-        questions: [
-          {
-            required: true,
-            validator: questionsValidator,
-            trigger: "change",
-          },
-        ],
       },
     };
   },

+ 6 - 7
src/modules/mark/components/markParam/ModifyMarkParams.vue

@@ -136,8 +136,8 @@ export default {
       "setStructureCanEdit",
       "setSubjectiveTaskList",
       "setOpenMergeMarker",
-      "setOpenDoubleMarking",
-      "setOpenMarkClass",
+      "setOpenDoubleMark",
+      "setOpenClassMark",
       "initStore",
     ]),
     async initData() {
@@ -170,10 +170,10 @@ export default {
       }
       // group
       const subjectRes = await markSubjectiveList(params);
-      this.setSubjectiveTaskList(subjectRes.questionsList || []);
-      this.setOpenMergeMarker(!!subjectRes.openMergeMarker);
-      this.setOpenDoubleMarking(!!subjectRes.openDoubleMarking);
-      this.setOpenMarkClass(!!subjectRes.openMarkClass);
+      this.setSubjectiveTaskList(subjectRes.questions || []);
+      this.setOpenMergeMarker(!!subjectRes.mergeMarker);
+      this.setOpenDoubleMark(!!subjectRes.doubleMark);
+      this.setOpenClassMark(!!subjectRes.classMark);
       if (subjectRes.questionsList && subjectRes.questionsList.length) {
         // TODO:这里的判断需要调整
         this.curStepIndex = 2;
@@ -213,7 +213,6 @@ export default {
 
       const nextStepIndex = this.curStepIndex + step;
       if (nextStepIndex > this.lastStep) return;
-
       this.steps[this.curStepIndex].status = "success";
       if (this.steps[nextStepIndex].status === "wait") {
         this.steps[this.curStepIndex].status = "process";

+ 9 - 9
src/modules/mark/components/markParam/store.js

@@ -16,11 +16,11 @@ const state = {
   // 主观题任务列表
   subjectiveTaskList: [],
   // 是否开启分班阅
-  openMarkClass: false,
+  openClassMark: false,
   // 填空题是否合并设置评卷员
   openMergeMarker: false,
   // 是否开启双评
-  openDoubleMarking: false,
+  openDoubleMark: false,
   // 分班阅卷班级信息
   classInfo: [],
   // 客观题结构
@@ -44,7 +44,7 @@ const mutations = {
   },
   updateSubjectiveTaskItem(state, subjectiveTaskItem) {
     const pos = state.subjectiveTaskList.findIndex(
-      (item) => item.questionId === subjectiveTaskItem.questionId
+      (item) => item.id === subjectiveTaskItem.id
     );
     if (pos === -1) return;
 
@@ -54,14 +54,14 @@ const mutations = {
       Object.assign({}, state.subjectiveTaskList[pos], subjectiveTaskItem)
     );
   },
-  setOpenMarkClass(state, openMarkClass) {
-    state.openMarkClass = openMarkClass;
+  setOpenClassMark(state, openClassMark) {
+    state.openClassMark = openClassMark;
   },
   setOpenMergeMarker(state, openMergeMarker) {
     state.openMergeMarker = openMergeMarker;
   },
-  setOpenDoubleMarking(state, openDoubleMarking) {
-    state.openDoubleMarking = openDoubleMarking;
+  setOpenDoubleMark(state, openDoubleMark) {
+    state.openDoubleMark = openDoubleMark;
   },
   setClassInfo(state, classInfo) {
     state.classInfo = classInfo;
@@ -77,9 +77,9 @@ const mutations = {
     state.structureCanEdit = false;
     state.paperStructureInfo = [];
     state.subjectiveTaskList = [];
-    state.openMarkClass = false;
+    state.openClassMark = false;
     state.openMergeMarker = false;
-    state.openDoubleMarking = false;
+    state.openDoubleMark = false;
     state.classInfo = [];
     state.objectiveStructure = [];
     state.subjectiveAnswer = [];