فهرست منبع

feat: 主观题直接复核

zhangjie 10 ماه پیش
والد
کامیت
5de8b2c548

+ 13 - 1
src/api/checkPage.ts

@@ -1,5 +1,9 @@
 import { httpApp } from "@/plugins/axiosApp";
-import { StudentObjectiveInfo } from "@/types";
+import {
+  StudentObjectiveInfo,
+  StudentSubjectiveInfo,
+  StudentSubjectiveCheck,
+} from "@/types";
 
 /** 获取学生客观题数据 */
 export async function studentObjectiveConfirmData(studentId) {
@@ -33,3 +37,11 @@ export async function saveStudentSubjectiveConfirmData(data) {
     data
   );
 }
+/** 客观题检查直接点复核 */
+export async function saveStudentSubjectiveCheck(data: StudentSubjectiveCheck) {
+  return httpApp.post<boolean>(
+    "/api/admin/mark/inspected/subjective/confirmTask",
+    {},
+    { params: data }
+  );
+}

+ 39 - 0
src/features/check/SubjectiveAnswer.vue

@@ -81,16 +81,21 @@
         v-if="store.isTrackMode"
         isCheckAnswer
         @submit="saveTaskToServer"
+        @checkSubmit="checkTask"
       />
       <mark-board-key-board
         v-if="store.shouldShowMarkBoardKeyBoard"
+        isCheckAnswer
         @submit="saveTaskToServer"
         @allZeroSubmit="allZeroSubmit"
+        @checkSubmit="checkTask"
       />
       <mark-board-mouse
         v-if="store.shouldShowMarkBoardMouse"
+        isCheckAnswer
         @submit="saveTaskToServer"
         @allZeroSubmit="allZeroSubmit"
+        @checkSubmit="checkTask"
       />
     </div>
   </div>
@@ -113,6 +118,7 @@ import { onMounted, watch, h } from "vue";
 import {
   studentSubjectiveConfirmData,
   saveStudentSubjectiveConfirmData,
+  saveStudentSubjectiveCheck,
 } from "@/api/checkPage";
 import { doLogout, updateUISetting, getSetting } from "@/api/markPage";
 import { store } from "@/store/store";
@@ -480,4 +486,37 @@ const saveTaskToServer = async () => {
   store.currentTask = undefined;
   await getNextStudent();
 };
+
+// 直接点击复核,不做修改
+const checkTask = async () => {
+  const res = await saveStudentSubjectiveCheck({
+    studentId: store.currentTask.studentId,
+    examId,
+    paperNumber,
+  }).catch(() => false);
+
+  const mkey = "check_task_key";
+
+  if (!res) return;
+  if (!res.data.success) {
+    void message.error({ content: res.data.message, key: mkey, duration: 5 });
+    return;
+  }
+
+  if (!isMultiStudent) {
+    void message.success({
+      content: "保存成功,页面将在3秒钟之后关闭",
+      key: mkey,
+      duration: 2,
+    });
+    setTimeout(() => {
+      window.close();
+    }, 3000);
+    return;
+  } else {
+    void message.success({ content: "保存成功", key: mkey, duration: 2 });
+  }
+  store.currentTask = undefined;
+  await getNextStudent();
+};
 </script>

+ 26 - 2
src/features/mark/MarkBoardKeyBoard.vue

@@ -34,6 +34,16 @@
         </div>
       </div>
       <qm-button
+        v-if="props.isCheckAnswer && !hasModifyScore"
+        class="board-header-submit"
+        size="medium"
+        type="primary"
+        @click="checkSubmit"
+      >
+        复核
+      </qm-button>
+      <qm-button
+        v-else
         class="board-header-submit"
         size="medium"
         type="primary"
@@ -105,17 +115,24 @@
 <script setup lang="ts">
 import type { Question } from "@/types";
 import { isNumber } from "lodash-es";
-import { onMounted, onUnmounted, watch } from "vue";
+import { ref, onMounted, onUnmounted, watch } from "vue";
 import { store } from "@/store/store";
 import { keyMouse } from "./use/keyboardAndMouse";
 import { autoChooseFirstQuestion } from "./use/autoChooseFirstQuestion";
 import { message } from "ant-design-vue";
 import { DownOutlined } from "@ant-design/icons-vue";
 
-const emit = defineEmits(["submit", "allZeroSubmit", "unselectiveSubmit"]);
+const emit = defineEmits([
+  "submit",
+  "allZeroSubmit",
+  "unselectiveSubmit",
+  "checkSubmit",
+]);
+const props = defineProps<{ isCheckAnswer?: boolean }>();
 
 const { toggleKeyMouse } = keyMouse();
 const { chooseQuestion } = autoChooseFirstQuestion();
+const hasModifyScore = ref(false);
 
 /**
  * 当前题的输入串,初次是markResult.scoreList中score,然后接收输入字符,回车时判断是否合法,合法则赋值给markResult.scoreList
@@ -180,6 +197,9 @@ const questionScore = $computed(
 );
 
 function numberKeyListener(event: KeyboardEvent) {
+  // 只要修改了分值,就当做已修改
+  hasModifyScore.value = true;
+
   // console.log(event);
   // if (event.target.tagName !== "BODY") return;
   if (!store.currentQuestion || !store.currentTask) return;
@@ -305,6 +325,10 @@ function submit() {
   emit("submit");
 }
 
+function checkSubmit() {
+  emit("checkSubmit");
+}
+
 const buttonHeightForSelective = $computed(() =>
   store.setting.selective && store.setting.enableAllZero ? "36px" : "76px"
 );

+ 27 - 1
src/features/mark/MarkBoardMouse.vue

@@ -33,6 +33,16 @@
         </div>
       </div>
       <qm-button
+        v-if="props.isCheckAnswer && !hasModifyScore"
+        class="board-header-submit"
+        size="medium"
+        type="primary"
+        @click="checkSubmit"
+      >
+        复核
+      </qm-button>
+      <qm-button
+        v-else
         class="board-header-submit"
         size="medium"
         type="primary"
@@ -91,11 +101,23 @@ import type { Question } from "@/types";
 import { store } from "@/store/store";
 import { keyMouse } from "./use/keyboardAndMouse";
 import { DownOutlined } from "@ant-design/icons-vue";
+import { ref } from "vue";
+
+const emit = defineEmits([
+  "submit",
+  "allZeroSubmit",
+  "unselectiveSubmit",
+  "checkSubmit",
+]);
+const props = defineProps<{ isCheckAnswer?: boolean }>();
 
-const emit = defineEmits(["submit", "allZeroSubmit", "unselectiveSubmit"]);
 const { toggleKeyMouse } = keyMouse();
+const hasModifyScore = ref(false);
 
 function chooseScore(question: Question, score: number) {
+  // 只要修改了分值,就当做已修改
+  hasModifyScore.value = true;
+
   store.currentQuestion = question;
   const { __index } = store.currentQuestion;
   store.currentTask &&
@@ -136,6 +158,10 @@ function submit() {
   emit("submit");
 }
 
+function checkSubmit() {
+  emit("checkSubmit");
+}
+
 const buttonHeightForSelective = $computed(() =>
   store.setting.selective && store.setting.enableAllZero ? "36px" : "76px"
 );

+ 22 - 2
src/features/mark/MarkBoardTrack.vue

@@ -25,6 +25,16 @@
         </div>
       </div>
       <qm-button
+        v-if="props.isCheckAnswer && !hasModifyScore"
+        class="board-header-submit"
+        size="medium"
+        type="primary"
+        @click="checkSubmit"
+      >
+        复核
+      </qm-button>
+      <qm-button
+        v-else
         class="board-header-submit"
         size="medium"
         type="primary"
@@ -172,9 +182,11 @@ import EventBus from "@/plugins/eventBus";
 import { cloneDeep } from "lodash-es";
 
 const props = defineProps<{ modal?: boolean; isCheckAnswer?: boolean }>();
-const emit = defineEmits(["submit", "unselectiveSubmit"]);
+const emit = defineEmits(["submit", "unselectiveSubmit", "checkSubmit"]);
 const { dragSpliter, areaHeight } = dragSplitPane();
 const activeRightMenuItem = ref<any>(null);
+const hasModifyScore = ref(false);
+
 const tmpStyle = reactive<any>({
   left: 0,
   top: 0,
@@ -239,8 +251,9 @@ EventBus.on("draw-change", (list: any) => {
 // 切换题目是清空上一题的分数
 watch(
   () => store.currentQuestion,
-  (val) => {
+  () => {
     store.currentScore = undefined;
+    // eslint-disable-next-line @typescript-eslint/no-floating-promises
     nextTick(() => {
       if (!props.isCheckAnswer) chooseScore(questionScoreSteps[1]);
     });
@@ -435,6 +448,9 @@ function clearLatestMarkOfCurrentQuetion() {
 }
 
 function clearAllMarksOfCurrentQuetion() {
+  // 只要清除分数,就当做修改了
+  hasModifyScore.value = true;
+
   if (!store.currentTask?.markResult || !store.currentQuestion) return;
 
   const qno = `${store.currentQuestion.mainNumber}_${store.currentQuestion.subNumber}`;
@@ -456,6 +472,10 @@ function clearAllMarksOfCurrentQuetion() {
 function submit() {
   emit("submit");
 }
+
+function checkSubmit() {
+  emit("checkSubmit");
+}
 </script>
 
 <style lang="less" scoped>

+ 6 - 0
src/types/index.ts

@@ -607,6 +607,12 @@ export type StudentSubjectiveInfo = {
   success: boolean;
 };
 
+export interface StudentSubjectiveCheck {
+  examId: string;
+  paperNumber: string;
+  studentId: string;
+}
+
 export interface PaperRecogData {
   page_index: number;
   question: Array<{