Procházet zdrojové kódy

feat: 复核校验

zhangjie před 8 měsíci
rodič
revize
f6873f2bd2

+ 10 - 13
src/render/ap/review.ts

@@ -1,16 +1,13 @@
 import { AxiosResponse } from "axios";
 import { request } from "@/utils/request";
 
-import {
-  ExamParams,
-  ExamSubjectParams,
-  RequestActionResult,
-} from "./types/common";
+import { ExamSubjectParams, RequestActionResult } from "./types/common";
 import {
   ReviewTaskListItem,
   ReviewProgressResult,
   ReviewTaskSaveParams,
   ReviewTaskHistoryParams,
+  ReviewTaskHistoryResult,
   ReviewWarningTaskExportParams,
 } from "./types/review";
 
@@ -29,15 +26,15 @@ export const reviewProgress = (
   data: ExamSubjectParams
 ): Promise<ReviewProgressResult> =>
   request({
-    url: "/api/admin/check/assigned/overview",
+    url: "/api/admin/check/assigned/task/status",
     method: "post",
     data,
   });
 
 // 复核校验任务历史
 export const reviewTaskHistory = (
-  data: ExamParams
-): Promise<ReviewTaskListItem[]> =>
+  data: ReviewTaskHistoryParams
+): Promise<ReviewTaskHistoryResult> =>
   request({
     url: "/api/admin/check/assigned/task/history",
     method: "post",
@@ -59,7 +56,7 @@ export const reviewTaskSave = (
 
 // 复核校验任务释放
 export const reviewTaskRelease = (
-  data: ExamParams
+  data: ExamSubjectParams
 ): Promise<{ success: boolean }> =>
   request({
     url: "/api/admin/check/assigned/task/release",
@@ -113,7 +110,7 @@ export const reviewAuditProgress = (
   data: ExamSubjectParams
 ): Promise<ReviewProgressResult> =>
   request({
-    url: "/api/auditor/check/assigned/overview",
+    url: "/api/auditor/check/assigned/task/status",
     method: "post",
     data,
   });
@@ -133,8 +130,8 @@ export const reviewAuditTaskSave = (
 
 // 复核校验任务历史
 export const reviewAuditTaskHistory = (
-  data: ExamParams
-): Promise<ReviewTaskListItem[]> =>
+  data: ReviewTaskHistoryParams
+): Promise<ReviewTaskHistoryResult> =>
   request({
     url: "/api/auditor/check/assigned/task/history",
     method: "post",
@@ -143,7 +140,7 @@ export const reviewAuditTaskHistory = (
 
 // 复核校验任务释放
 export const reviewAuditTaskRelease = (
-  data: ExamParams
+  data: ExamSubjectParams
 ): Promise<{ success: boolean }> =>
   request({
     url: "/api/auditor/check/assigned/task/release",

+ 5 - 4
src/render/ap/types/review.ts

@@ -1,4 +1,4 @@
-import { PageResult } from "./common";
+import { PageParams, PageResult } from "./common";
 
 // 复核校验
 export interface ReviewTaskItemPage {
@@ -36,11 +36,12 @@ export interface ReviewTaskSaveParams {
   id: number;
   assignedSuspect: boolean;
 }
-export interface ReviewTaskHistoryParams {
-  id: number;
+export interface ReviewTaskHistoryFilter {
+  examId: number;
   subjectCode: string;
-  pageSize: number;
 }
+export type ReviewTaskHistoryParams = PageParams<ReviewTaskHistoryFilter>;
+export type ReviewTaskHistoryResult = PageResult<ReviewTaskListItem>;
 
 export type ReviewExportType = "STUDENT_CODE" | "EXAM_ROOM";
 

+ 1 - 0
src/render/styles/pages.less

@@ -572,6 +572,7 @@
 
       img {
         display: block;
+        width: 100%;
         max-height: none;
         height: auto;
       }

+ 29 - 17
src/render/views/Audit/Review/ReviewAction.vue

@@ -50,8 +50,8 @@
             v-model:value="result"
             @change="onMark"
           >
-            <a-radio :value="1">正常</a-radio>
-            <a-radio :value="0">异常</a-radio>
+            <a-radio :value="false">正常</a-radio>
+            <a-radio :value="true">异常</a-radio>
           </a-radio-group>
         </a-collapse-panel>
       </a-collapse>
@@ -69,8 +69,8 @@
             v-model:value="historyResult"
             @change="onMark"
           >
-            <a-radio :value="1">正常</a-radio>
-            <a-radio :value="0">异常</a-radio>
+            <a-radio :value="false">正常</a-radio>
+            <a-radio :value="true">异常</a-radio>
           </a-radio-group>
         </a-collapse-panel>
       </a-collapse>
@@ -94,10 +94,10 @@
               <li style="width: 80px">
                 <span
                   :class="
-                    item.assignedSuspect ? 'color-success' : 'color-error'
+                    !item.assignedSuspect ? 'color-success' : 'color-error'
                   "
                 >
-                  {{ item.assignedSuspect ? "正常" : "异常" }}
+                  {{ !item.assignedSuspect ? "正常" : "异常" }}
                 </span>
               </li>
             </ul>
@@ -124,17 +124,24 @@ defineOptions({
   name: "ReviewAction",
 });
 const emit = defineEmits(["search", "mark"]);
-defineExpose({ switchTab });
+defineExpose({ switchTab, updateTaskStatus });
 
 const userStore = useUserStore();
 const reviewStore = useReviewStore();
 
+const searchCourseCode = ref("");
+const result = ref();
+const historyResult = ref();
 const fieldNames = { label: "name", value: "code" };
 
 // tab
 const reviewKey = ref(["1", "2"]);
 
 async function switchTab(key: "review" | "history") {
+  if (key === "history" && !searchCourseCode.value) {
+    message.error("请先选择科目");
+    return;
+  }
   reviewStore.setInfo({ tabKey: key });
 
   if (key === "history") {
@@ -154,21 +161,23 @@ async function getCourses() {
 }
 getCourses();
 
-const searchCourseCode = ref("");
-const result = ref();
-const historyResult = ref();
-
 // history
 const curHistoryTaskIndex = ref(0);
 const dataList = ref<ReviewTaskListItem[]>([]);
 async function getHistory() {
-  if (!reviewStore.waitTask?.id) return;
   const res = await reviewAuditTaskHistory({
-    id: reviewStore.waitTask?.id,
+    examId: userStore.curExam.id,
     subjectCode: searchCourseCode.value,
-    pageSize: 30,
+    pageNumber: 1,
+    pageSize: 20,
   });
-  dataList.value = res || [];
+  dataList.value = res.result || [];
+}
+
+function updateTaskStatus(assignedSuspect: boolean) {
+  const row = dataList.value.find((item) => item.id === reviewStore.curTask.id);
+  if (!row) return;
+  row.assignedSuspect = assignedSuspect;
 }
 
 function setCurTask(index: number) {
@@ -190,12 +199,15 @@ function onMark() {
 
 // watch
 watch(
-  () => reviewStore.curTask,
+  () => reviewStore.curTask?.id,
   (val) => {
-    result.value = undefined;
+    result.value = null;
     if (reviewStore.tabKey === "history") {
       historyResult.value = reviewStore.curTask?.assignedSuspect;
     }
+  },
+  {
+    immediate: true,
   }
 );
 </script>

+ 12 - 3
src/render/views/Audit/Review/index.vue

@@ -5,6 +5,7 @@
         {{ reviewStore.curTask.examNumber }} - {{ reviewStore.curTask.name }} -
         {{ userStore.curExam?.name }}
       </h2>
+      <h2 v-else class="review-title">-</h2>
 
       <div class="review-stat">
         <p class="color-success">
@@ -120,12 +121,19 @@ async function onMark(assignedSuspect: boolean) {
 
   try {
     await reviewAuditTaskSave({ id: reviewStore.curTask.id, assignedSuspect });
-    if (reviewStore.tabKey === "history") return;
+
+    if (reviewStore.tabKey === "history") {
+      reviewActionRef.value?.updateTaskStatus(assignedSuspect);
+      loading.value = false;
+      return;
+    }
 
     await getNextTask();
+    await updateProgress();
   } catch (error) {
-    loading.value = false;
+    console.log(error);
   }
+  loading.value = false;
 }
 
 async function onSearch(subjectCode: string) {
@@ -135,7 +143,8 @@ async function onSearch(subjectCode: string) {
 }
 
 async function releaseTask() {
-  await reviewAuditTaskRelease({ examId: userStore.curExam.id });
+  if (!searchModel.subjectCode) return;
+  await reviewAuditTaskRelease(searchModel);
 }
 
 onMounted(async () => {

+ 31 - 19
src/render/views/Review/ReviewAction.vue

@@ -70,8 +70,8 @@
             v-model:value="result"
             @change="onMark"
           >
-            <a-radio :value="1">正常</a-radio>
-            <a-radio :value="0">异常</a-radio>
+            <a-radio :value="false">正常</a-radio>
+            <a-radio :value="true">异常</a-radio>
           </a-radio-group>
         </a-collapse-panel>
         <a-collapse-panel key="4">
@@ -110,8 +110,8 @@
             v-model:value="historyResult"
             @change="onMark"
           >
-            <a-radio :value="1">正常</a-radio>
-            <a-radio :value="0">异常</a-radio>
+            <a-radio :value="false">正常</a-radio>
+            <a-radio :value="true">异常</a-radio>
           </a-radio-group>
         </a-collapse-panel>
       </a-collapse>
@@ -135,10 +135,10 @@
               <li style="width: 80px">
                 <span
                   :class="
-                    item.assignedSuspect ? 'color-success' : 'color-error'
+                    !item.assignedSuspect ? 'color-success' : 'color-error'
                   "
                 >
-                  {{ item.assignedSuspect ? "正常" : "异常" }}
+                  {{ !item.assignedSuspect ? "正常" : "异常" }}
                 </span>
               </li>
             </ul>
@@ -178,17 +178,26 @@ defineOptions({
   name: "ReviewAction",
 });
 const emit = defineEmits(["search", "reset", "mark"]);
-defineExpose({ switchTab });
+defineExpose({ switchTab, updateTaskStatus });
 
 const userStore = useUserStore();
 const reviewStore = useReviewStore();
 
+const searchCourseCode = ref("");
+const exportCourseCode = ref("");
+const resetCourseCode = ref("");
+const result = ref();
+const historyResult = ref();
 const fieldNames = { label: "name", value: "code" };
 
 // tab
 const reviewKey = ref(["1", "2", "3", "4"]);
 
 async function switchTab(key: "review" | "history") {
+  if (key === "history" && !searchCourseCode.value) {
+    message.error("请先选择科目");
+    return;
+  }
   reviewStore.setInfo({ tabKey: key });
 
   if (key === "history") {
@@ -208,23 +217,23 @@ async function getCourses() {
 }
 getCourses();
 
-const searchCourseCode = ref("");
-const exportCourseCode = ref("");
-const resetCourseCode = ref("");
-const result = ref();
-const historyResult = ref();
-
 // history
 const curHistoryTaskIndex = ref(0);
 const dataList = ref<ReviewTaskListItem[]>([]);
 async function getHistory() {
-  if (!reviewStore.waitTask?.id) return;
   const res = await reviewTaskHistory({
-    id: reviewStore.waitTask?.id,
+    examId: userStore.curExam.id,
     subjectCode: searchCourseCode.value,
-    pageSize: 30,
+    pageNumber: 1,
+    pageSize: 20,
   });
-  dataList.value = res || [];
+  dataList.value = res.result || [];
+}
+
+function updateTaskStatus(assignedSuspect: boolean) {
+  const row = dataList.value.find((item) => item.id === reviewStore.curTask.id);
+  if (!row) return;
+  row.assignedSuspect = assignedSuspect;
 }
 
 function setCurTask(index: number) {
@@ -281,12 +290,15 @@ async function onExportConfirm(type: ReviewExportType) {
 
 // watch
 watch(
-  () => reviewStore.curTask,
+  () => reviewStore.curTask?.id,
   (val) => {
-    result.value = undefined;
+    result.value = null;
     if (reviewStore.tabKey === "history") {
       historyResult.value = reviewStore.curTask?.assignedSuspect;
     }
+  },
+  {
+    immediate: true,
   }
 );
 </script>

+ 11 - 3
src/render/views/Review/index.vue

@@ -5,6 +5,7 @@
         {{ reviewStore.curTask.examNumber }} - {{ reviewStore.curTask.name }} -
         {{ userStore.curExam?.name }}
       </h2>
+      <h2 v-else class="review-title">-</h2>
 
       <div class="review-stat">
         <p class="color-success">
@@ -134,12 +135,18 @@ async function onMark(assignedSuspect: boolean) {
 
   try {
     await reviewTaskSave({ id: reviewStore.curTask.id, assignedSuspect });
-    if (reviewStore.tabKey === "history") return;
+    if (reviewStore.tabKey === "history") {
+      reviewActionRef.value?.updateTaskStatus(assignedSuspect);
+      loading.value = false;
+      return;
+    }
 
     await getNextTask();
+    await updateProgress();
   } catch (error) {
-    loading.value = false;
+    console.log(error);
   }
+  loading.value = false;
 }
 
 async function onSearch(subjectCode: string) {
@@ -163,7 +170,8 @@ async function onResetConfirm() {
 }
 
 async function releaseTask() {
-  await reviewTaskRelease({ examId: userStore.curExam.id });
+  if (!searchModel.subjectCode) return;
+  await reviewAuditTaskRelease(searchModel);
 }
 
 onMounted(async () => {