Michael Wang 3 жил өмнө
parent
commit
c3bb78776f

+ 28 - 1
src/api/markPage.ts

@@ -67,12 +67,13 @@ export async function getHistoryTask({
   return httpApp.post("/mark/getHistory", form);
 }
 
-/** 保存评卷任务 */
+/** 保存评卷任务(正常保存) */
 export async function saveTask() {
   let markResult = store.currentMarkResult;
   if (markResult) {
     // markResult.specialTagList = [];
     markResult.problem = false;
+    markResult.unselective = false;
     markResult.spent = Date.now() - markResult.__markStartTime;
     markResult = { ...markResult };
     // @ts-ignore
@@ -114,6 +115,7 @@ export async function doProblemType(problemId: number) {
   let markResult = store.currentMarkResult;
   if (markResult) {
     markResult.problem = true;
+    markResult.unselective = false;
     markResult.problemTypeId = problemId;
     // @ts-ignore FIXME: should allow null
     markResult.markerScore = null;
@@ -127,6 +129,31 @@ export async function doProblemType(problemId: number) {
     markResult.__markStartTime = undefined;
     // @ts-ignore
     markResult.__previous = undefined;
+
+    return httpApp.post("/mark/saveTask", markResult);
+  } else {
+    console.error("无当前评卷结果");
+  }
+}
+
+/** 评卷用户选择试卷的为未选做 */
+export async function doUnselectiveType() {
+  let markResult = store.currentMarkResult;
+  if (markResult) {
+    markResult.problem = false;
+    markResult.unselective = true;
+    markResult.markerScore = -1;
+    markResult.scoreList = [];
+    markResult.specialTagList = [];
+    markResult.trackList = [];
+
+    markResult.spent = Date.now() - markResult.__markStartTime;
+    markResult = { ...markResult };
+    // @ts-ignore
+    markResult.__markStartTime = undefined;
+    // @ts-ignore
+    markResult.__previous = undefined;
+
     return httpApp.post("/mark/saveTask", markResult);
   } else {
     console.error("无当前评卷结果");

+ 37 - 0
src/features/mark/Mark.vue

@@ -8,16 +8,19 @@
         v-if="showMarkBoardTrack"
         @submit="saveTaskToServer"
         @allZeroSubmit="allZeroSubmit"
+        @unselectiveSubmit="unselectiveSubmit"
       />
       <mark-board-key-board
         v-if="showMarkBoardKeyBoard"
         @submit="saveTaskToServer"
         @allZeroSubmit="allZeroSubmit"
+        @unselectiveSubmit="unselectiveSubmit"
       />
       <mark-board-mouse
         v-if="showMarkBoardMouse"
         @submit="saveTaskToServer"
         @allZeroSubmit="allZeroSubmit"
+        @unselectiveSubmit="unselectiveSubmit"
       />
     </div>
   </div>
@@ -40,6 +43,7 @@ import {
   getTask,
   saveTask,
   updateUISetting,
+  doUnselectiveType,
 } from "@/api/markPage";
 import {
   findCurrentTaskMarkResult,
@@ -267,6 +271,39 @@ const allZeroSubmit = async () => {
     markResult.specialTagList = specialTagList;
   }
 };
+
+const unselectiveSubmit = async () => {
+  const markResult = store.currentMarkResult;
+  if (!markResult) return;
+
+  try {
+    const res = await doUnselectiveType();
+    if (res?.data.success) {
+      message.success({ content: "未选做处理成功", duration: 3 });
+      const removeSubmitedTask = () => {
+        removeCurrentMarkResult();
+
+        if (!store.historyOpen) {
+          store.currentTask = undefined;
+          store.tasks.shift();
+          store.currentTask = store.tasks[0];
+        }
+      };
+      removeSubmitedTask();
+      if (store.historyOpen) {
+        shouldReloadFunc();
+      }
+      updateStatus();
+    } else {
+      message.error({ content: res?.data.message || "错误", duration: 5 });
+    }
+  } catch (error) {
+    console.log("未选做处理失败", error);
+    message.error({ content: "网络异常", duration: 5 });
+    await new Promise((res) => setTimeout(res, 1500));
+    window.location.reload();
+  }
+};
 const saveTaskToServer = async () => {
   const markResult = store.currentMarkResult;
   if (!markResult) return;

+ 42 - 16
src/features/mark/MarkBoardKeyBoard.vue

@@ -35,19 +35,41 @@
         </div>
       </div>
 
-      <div class="tw-flex tw-place-content-center tw-items-center tw-gap-1">
-        <a-popconfirm
-          v-if="store.setting.enableAllZero"
-          title="确定给全零分?"
-          ok-text="确定"
-          cancel-text="取消"
-          @confirm="$emit('allZeroSubmit')"
-          :overlayStyle="{ width: '200px' }"
-        >
-          <a-button type="primary" size="middle" class="all-zero-button">
-            <span>全零分</span>
-          </a-button>
-        </a-popconfirm>
+      <div class="tw-flex tw-place-content-center tw-items-center tw-gap-2">
+        <div class="tw-flex tw-flex-col tw-gap-1">
+          <a-popconfirm
+            v-if="store.setting.enableAllZero"
+            title="确定给全零分?"
+            ok-text="确定"
+            cancel-text="取消"
+            @confirm="$emit('allZeroSubmit')"
+            :overlayStyle="{ width: '200px' }"
+          >
+            <a-button
+              type="primary"
+              size="middle"
+              class="all-zero-unselective-button"
+            >
+              <span>全零分</span>
+            </a-button>
+          </a-popconfirm>
+          <a-popconfirm
+            v-if="store.setting.selective"
+            title="确定是未选做?"
+            ok-text="确定"
+            cancel-text="取消"
+            @confirm="$emit('unselectiveSubmit')"
+            :overlayStyle="{ width: '200px' }"
+          >
+            <a-button
+              type="primary"
+              size="middle"
+              class="all-zero-unselective-button"
+            >
+              <span>未选做</span>
+            </a-button>
+          </a-popconfirm>
+        </div>
 
         <qm-button
           type="primary"
@@ -127,7 +149,7 @@ import { autoChooseFirstQuestion } from "./use/autoChooseFirstQuestion";
 import { message } from "ant-design-vue";
 import { DownOutlined } from "@ant-design/icons-vue";
 
-const emit = defineEmits(["submit", "allZeroSubmit"]);
+const emit = defineEmits(["submit", "allZeroSubmit", "unselectiveSubmit"]);
 
 const { toggleKeyMouse } = keyMouse();
 const { chooseQuestion } = autoChooseFirstQuestion();
@@ -337,6 +359,10 @@ function submit() {
     });
   }
 }
+
+const buttonHeightForSelective = computed(() =>
+  store.setting.selective && store.setting.enableAllZero ? "36px" : "76px"
+);
 </script>
 
 <style scoped>
@@ -384,8 +410,8 @@ function submit() {
   height: 5px;
   background-color: #5c69f6;
 }
-.all-zero-button {
-  height: 76px;
+.all-zero-unselective-button {
+  height: v-bind(buttonHeightForSelective);
   border-radius: 10px;
   padding: 7px;
   background-color: #4db9ff;

+ 43 - 16
src/features/mark/MarkBoardMouse.vue

@@ -35,19 +35,41 @@
         </div>
       </div>
 
-      <div class="tw-flex tw-place-content-center tw-items-center tw-gap-1">
-        <a-popconfirm
-          v-if="store.setting.enableAllZero"
-          title="确定给全零分?"
-          ok-text="确定"
-          cancel-text="取消"
-          @confirm="$emit('allZeroSubmit')"
-          :overlayStyle="{ width: '200px' }"
-        >
-          <a-button type="primary" size="middle" class="all-zero-button">
-            <span>全零分</span>
-          </a-button>
-        </a-popconfirm>
+      <div class="tw-flex tw-place-content-center tw-items-center tw-gap-2">
+        <div class="tw-flex tw-flex-col tw-gap-1">
+          <a-popconfirm
+            v-if="store.setting.enableAllZero"
+            title="确定给全零分?"
+            ok-text="确定"
+            cancel-text="取消"
+            @confirm="$emit('allZeroSubmit')"
+            :overlayStyle="{ width: '200px' }"
+          >
+            <a-button
+              type="primary"
+              size="middle"
+              class="all-zero-unselective-button"
+            >
+              <span>全零分</span>
+            </a-button>
+          </a-popconfirm>
+          <a-popconfirm
+            v-if="store.setting.selective"
+            title="确定是未选做?"
+            ok-text="确定"
+            cancel-text="取消"
+            @confirm="$emit('unselectiveSubmit')"
+            :overlayStyle="{ width: '200px' }"
+          >
+            <a-button
+              type="primary"
+              size="middle"
+              class="all-zero-unselective-button"
+            >
+              <span>未选做</span>
+            </a-button>
+          </a-popconfirm>
+        </div>
 
         <qm-button
           type="primary"
@@ -111,8 +133,9 @@ import { store } from "./store";
 import { keyMouse } from "./use/keyboardAndMouse";
 import { message } from "ant-design-vue";
 import { DownOutlined } from "@ant-design/icons-vue";
+import { computed } from "vue";
 
-const emit = defineEmits(["submit", "allZeroSubmit"]);
+const emit = defineEmits(["submit", "allZeroSubmit", "unselectiveSubmit"]);
 const { toggleKeyMouse } = keyMouse();
 
 function chooseScore(question: Question, score: number) {
@@ -184,6 +207,10 @@ function submit() {
     });
   }
 }
+
+const buttonHeightForSelective = computed(() =>
+  store.setting.selective && store.setting.enableAllZero ? "36px" : "76px"
+);
 </script>
 
 <style scoped>
@@ -236,8 +263,8 @@ function submit() {
   height: 5px;
   background-color: #5c69f6;
 }
-.all-zero-button {
-  height: 76px;
+.all-zero-unselective-button {
+  height: v-bind(buttonHeightForSelective);
   border-radius: 10px;
   padding: 7px;
   background-color: #4db9ff;

+ 46 - 16
src/features/mark/MarkBoardTrack.vue

@@ -20,19 +20,41 @@
         </div>
       </div>
 
-      <div class="tw-flex tw-place-content-center tw-items-center tw-gap-1">
-        <a-popconfirm
-          v-if="store.setting.enableAllZero && !store.setting.forceSpecialTag"
-          title="确定给全零分?"
-          ok-text="确定"
-          cancel-text="取消"
-          @confirm="$emit('allZeroSubmit')"
-          :overlayStyle="{ width: '200px' }"
-        >
-          <a-button type="primary" size="middle" class="all-zero-button">
-            <span>全零分</span>
-          </a-button>
-        </a-popconfirm>
+      <div class="tw-flex tw-place-content-center tw-items-center tw-gap-2">
+        <div class="tw-flex tw-flex-col tw-gap-1">
+          <a-popconfirm
+            v-if="store.setting.enableAllZero && !store.setting.forceSpecialTag"
+            title="确定给全零分?"
+            ok-text="确定"
+            cancel-text="取消"
+            @confirm="$emit('allZeroSubmit')"
+            :overlayStyle="{ width: '200px' }"
+          >
+            <a-button
+              type="primary"
+              size="middle"
+              class="all-zero-unselective-button"
+            >
+              <span>全零分</span>
+            </a-button>
+          </a-popconfirm>
+          <a-popconfirm
+            v-if="store.setting.selective"
+            title="确定是未选做?"
+            ok-text="确定"
+            cancel-text="取消"
+            @confirm="$emit('unselectiveSubmit')"
+            :overlayStyle="{ width: '200px' }"
+          >
+            <a-button
+              type="primary"
+              size="middle"
+              class="all-zero-unselective-button"
+            >
+              <span>未选做</span>
+            </a-button>
+          </a-popconfirm>
+        </div>
 
         <qm-button
           type="primary"
@@ -159,7 +181,7 @@ import { autoChooseFirstQuestion } from "./use/autoChooseFirstQuestion";
 import { message } from "ant-design-vue";
 import { dragSplitPane } from "./use/splitPane";
 
-const emit = defineEmits(["submit", "allZeroSubmit"]);
+const emit = defineEmits(["submit", "allZeroSubmit", "unselectiveSubmit"]);
 const { dragSpliter, topPercent } = dragSplitPane();
 
 const { chooseQuestion } = autoChooseFirstQuestion();
@@ -356,6 +378,14 @@ function submit() {
     });
   }
 }
+
+const buttonHeightForSelective = computed(() =>
+  store.setting.selective &&
+  store.setting.enableAllZero &&
+  !store.setting.forceSpecialTag
+    ? "36px"
+    : "76px"
+);
 </script>
 
 <style scoped>
@@ -415,8 +445,8 @@ function submit() {
   height: 5px;
   background-color: #5c69f6;
 }
-.all-zero-button {
-  height: 76px;
+.all-zero-unselective-button {
+  height: v-bind(buttonHeightForSelective);
   border-radius: 10px;
   padding: 7px;
   background-color: #4db9ff;

+ 2 - 1
src/features/mark/MarkProblemDialog.vue

@@ -48,8 +48,9 @@ export default defineComponent({
       removeCurrentMarkResult();
 
       if (!store.historyOpen) {
-        store.tasks.shift();
         store.currentTask = undefined;
+        store.tasks.shift();
+        store.currentTask = store.tasks[0];
       }
       // 回评时,在MarkHistory中处理
       // else {

+ 3 - 0
src/types/index.ts

@@ -60,6 +60,7 @@ export interface Setting {
   prefetchCount: number; //预加载任务数量
   startTime: number; //评卷开始时间
   endTime: number; //评卷结束时间
+  selective: boolean; // 是否是未选择类型
 }
 
 export enum ModeEnum {
@@ -179,6 +180,7 @@ export interface MarkResult {
   // 问题卷
   problem: boolean;
   problemTypeId: number;
+  unselective: boolean; // 当前task是否为学生未选做
 
   __markStartTime: number; // 前端自用,用于标记阅卷开始时间和计算spent
   __previous: boolean; // 前端只用,用于删除回评产生的 markResult
@@ -211,6 +213,7 @@ export interface InspectStore {
   historyTasks: Array<Task>;
   focusTracks: Array<Track>;
   message: string | null;
+  selective: boolean; // 当前分组是否有选做题
 }
 
 // 前端自用,用来渲染裁切图