zhangjie пре 9 месеци
родитељ
комит
9c48e29f61

+ 3 - 4
src/render/ap/absentCheck.ts

@@ -53,11 +53,10 @@ export const absentCheckRoomExport = (
   });
 
 // 缺考校验导入模版
-export const absentTemplateDownload = (): Promise<AxiosResponse<Blob>> =>
+export const absentTemplateDownload = (): Promise<Blob> =>
   request({
     url: "/api/admin/check/exam-status/template",
     method: "post",
-    data,
     download: true,
   });
 
@@ -68,7 +67,7 @@ export const absentImportStatus = (
   request({
     url: "/api/admin/check/exam-status/import/status",
     method: "post",
-    data,
+    data: { examId },
   });
 
 // 缺考校验导入进度
@@ -87,5 +86,5 @@ export const absentResetStatus = (
   request({
     url: "/api/admin/check/exam-status/reset/status",
     method: "post",
-    data,
+    data: { examId },
   });

+ 1 - 1
src/render/ap/types/absentCheck.ts

@@ -7,7 +7,7 @@ export interface AbsentCheckListFilter {
   studentCode: string;
   name: string;
   subjectCode: string;
-  examStatus: ExamStatus;
+  examStatus: ExamStatus[];
 }
 
 export type AbsentCheckListParams = PageParams<AbsentCheckListFilter>;

+ 5 - 0
src/render/constants/enumerate.ts

@@ -9,6 +9,11 @@ export const DATA_CHECK_TYPE = {
   6: "缺考有条码",
 };
 
+export const ABSENT_CHECK_TYPE = {
+  1: "缺考",
+  2: "正常",
+};
+
 export const PAPER_TYPE_STATUS = {
   OK: "正常",
   BLANK: "空白",

+ 2 - 0
src/render/hooks/dictOption.ts

@@ -2,6 +2,7 @@ import { ref } from "vue";
 import {
   DEFAULT_LABEL,
   DATA_CHECK_TYPE,
+  ABSENT_CHECK_TYPE,
   PAPER_TYPE_STATUS,
   EXAM_STATUS,
   EXAM_SIMPLE_STATUS,
@@ -10,6 +11,7 @@ import {
 
 const dicts = {
   DATA_CHECK_TYPE,
+  ABSENT_CHECK_TYPE,
   PAPER_TYPE_STATUS,
   EXAM_STATUS,
   EXAM_SIMPLE_STATUS,

+ 39 - 12
src/render/views/AbsentCheck/CheckAction.vue

@@ -7,19 +7,22 @@
     >
       <a-collapse-panel key="1">
         <template #header><FilterFilled />搜索条件 </template>
-        <a-form :label-col="{ style: { width: '83px' } }">
+        <a-form :label-col="{ style: { width: '76px' } }">
           <a-form-item label="科目">
             <select-course
               v-model:value="searchModel.subjectCode"
               :exam-id="userStore.curExam.id"
               style="width: 150px"
+              allow-clear
             ></select-course>
           </a-form-item>
           <a-form-item label="查找条件">
             <a-select
               v-model:value="searchDataCheckType"
               placeholder="请选择"
-              :options="dataCheckOptions"
+              :options="absentCheckOptions"
+              allow-clear
+              @change="absentCheckTypeChange"
             ></a-select>
           </a-form-item>
           <a-form-item label="准考证号">
@@ -35,17 +38,17 @@
           </a-form-item>
 
           <a-row>
-            <a-col :span="16">
+            <a-col :span="15">
               <a-form-item label="姓名">
                 <a-input
                   v-model:value="searchModel.name"
                   placeholder="请输入"
-                  style="width: 150px"
+                  style="width: 140px"
                 ></a-input>
               </a-form-item>
             </a-col>
-            <a-col :span="8">
-              <a-form-item>
+            <a-col :span="9">
+              <a-form-item style="text-align: right">
                 <a-button class="m-r-8px" type="primary" @click="onSearch"
                   >查询</a-button
                 >
@@ -81,11 +84,17 @@
       <a-collapse-panel key="4">
         <template #header><SettingFilled />缺考数据设置 </template>
 
-        <a-button type="primary" :rotate="90" @click="onImport">
+        <a-button
+          class="m-r-10px"
+          type="primary"
+          :rotate="90"
+          @click="onImport"
+        >
           <template #icon><SelectOutlined /></template>导入缺考名单
         </a-button>
-        <a-button :rotate="270" @click="onReset">
-          <template #icon><RedoOutlined /></template>重新生成缺考数据
+        <a-button @click="onReset">
+          <template #icon><RedoOutlined :rotate="270" /></template
+          >重新生成缺考数据
         </a-button>
       </a-collapse-panel>
     </a-collapse>
@@ -137,7 +146,7 @@ const emit = defineEmits(["search"]);
 const userStore = useUserStore();
 const dataCheckStore = useDataCheckStore();
 
-const { optionList: dataCheckOptions } = useDictOption("DATA_CHECK_TYPE");
+const { optionList: absentCheckOptions } = useDictOption("ABSENT_CHECK_TYPE");
 const { optionList: imageTypeOptions } = useDictOption("IMAGE_TYPE");
 const panelKey = ref(["1", "2", "3", "4"]);
 
@@ -148,7 +157,7 @@ const initSearchModel = {
   studentCode: "",
   name: "",
   subjectCode: "",
-  examStatus: "",
+  examStatus: [],
 };
 const searchModel = reactive<AbsentCheckListFilter>({ ...initSearchModel });
 const searchDataCheckType = ref();
@@ -167,6 +176,23 @@ const examNumberCountCont = computed(() => {
   return `${examNumbers.length}/100`;
 });
 
+function absentCheckTypeChange() {
+  switch (searchDataCheckType.value) {
+    // 缺考
+    case "1":
+      searchModel.examStatus = ["ABSENT"];
+      break;
+    // 正常
+    case "2":
+      searchModel.examStatus = ["OK"];
+      break;
+
+    default:
+      searchModel.examStatus = [];
+      break;
+  }
+}
+
 function onSearch() {
   emit("search", searchModel);
 }
@@ -193,7 +219,8 @@ watch(
   () => dataCheckStore.curPageIndex,
   (val, oldval) => {
     if (val !== oldval) {
-      questions.value = [...dataCheckStore.curPage?.question];
+      if (!dataCheckStore.curPage || !dataCheckStore.curPage.question) return;
+      questions.value = [...dataCheckStore.curPage.question.result];
     }
   }
 );

+ 10 - 16
src/render/views/AbsentCheck/ImportTypeDialog.vue

@@ -11,34 +11,34 @@
         <import-btn
           :upload-url="uploadUrl"
           :upload-data="updateData"
-          :disabled="importing"
+          :format="['txt']"
           @upload-success="checkUploadStatus"
           @valid-error="onValidError"
         >
-          <div class="type-box" @click="seleted('COMPARE')">
+          <a-button class="type-box" @click="seleted('COMPARE')">
             <img src="@/assets/imgs/bg-compare.png" alt="交叉对比" />
             <p>交叉对比</p>
             <p>CROSS-CONTRAST</p>
-          </div>
+          </a-button>
         </import-btn>
       </a-col>
       <a-col :span="12">
         <import-btn
           :upload-url="uploadUrl"
           :upload-data="updateData"
-          :disabled="importing"
+          :format="['txt']"
           @upload-success="startLoopSync"
           @valid-error="onValidError"
         >
-          <div class="type-box" @click="seleted('OVERRIDE')">
+          <a-button class="type-box" @click="seleted('OVERRIDE')">
             <img src="@/assets/imgs/bg-overwrite.png" alt="覆盖数据" />
             <p>覆盖数据</p>
             <p>OVERWRITE THE DATA</p>
-          </div>
+          </a-button>
         </import-btn>
       </a-col>
     </a-row>
-    <div class="m-t-16px">
+    <div class="m-t-16px text-center">
       <a-button type="primary" :loading="loading" @click="onDownloadTemp">
         <template #icon><DownloadOutlined /></template>
         下载缺考名单模版
@@ -76,7 +76,7 @@ defineExpose({ open, close });
 
 const userStore = useUserStore();
 
-const uploadUrl = "/api/admin/scan/answer/sheet/update";
+const uploadUrl = "/api/admin/check/exam-status/import";
 const uploadMode = ref("" as ImportType);
 
 const updateData = computed(() => {
@@ -86,13 +86,8 @@ const updateData = computed(() => {
   };
 });
 
-const { loading: importing, setLoading: setImportLoading } = useLoading();
-
 function seleted(type: ImportType) {
-  console.log(type);
   uploadMode.value = type;
-  setImportLoading(true);
-  // emit("confirm", type);
 }
 
 const { start: startLoopSync, stop: stopLoopSync } = useLoop(
@@ -102,16 +97,15 @@ const { start: startLoopSync, stop: stopLoopSync } = useLoop(
 
 async function checkUploadStatus() {
   const res = await absentImportStatus(userStore.curExam.id).catch(() => {});
+  console.log(res);
 
   if (res) {
     if (!res.synching) {
       stopLoopSync();
-      setImportLoading(false);
       message.success("导入成功!");
       close();
     }
   } else {
-    setImportLoading(false);
     stopLoopSync();
     message.error("导入错误!");
   }
@@ -119,7 +113,6 @@ async function checkUploadStatus() {
 
 function onValidError(data: { message: string }) {
   message.error(message);
-  setImportLoading(false);
 }
 
 // 下载模板
@@ -139,6 +132,7 @@ async function onDownloadTemp() {
 
 <style lang="less" scoped>
 .type-box {
+  width: 200px;
   height: 140px;
   border-radius: 6px;
   padding: 26px;

+ 22 - 2
src/render/views/AbsentCheck/ResetDialog.vue

@@ -5,7 +5,7 @@
     style="top: 10vh"
     title="重新生成缺考数据"
   >
-    <div>
+    <div class="reset-tips">
       <h3>生成条件</h3>
       <p>1.客观题未作答+主观题有作答的考生;</p>
       <p>2.客观题未作答+主观题有作答+卡1或卡2任一题卡准考证号</p>
@@ -17,6 +17,7 @@
           :max="999"
           :precision="0"
           :controls="false"
+          style="width: 50px; margin: 0 5px; vertical-align: middle"
         ></a-input-number>
         位+有条码的考生。
       </p>
@@ -105,4 +106,23 @@ async function confirm() {
 }
 </script>
 
-<style lang="less" scoped></style>
+<style lang="less" scoped>
+.reset-tips {
+  h3 {
+    height: 24px;
+    font-weight: 500;
+    font-size: 15px;
+    color: @text-color1;
+    line-height: 24px;
+    margin-bottom: 8px;
+  }
+  p {
+    height: 22px;
+    font-weight: 400;
+    font-size: 14px;
+    color: @text-color2;
+    line-height: 22px;
+    margin-bottom: 8px;
+  }
+}
+</style>

+ 7 - 12
src/render/views/AbsentCheck/index.vue

@@ -6,6 +6,7 @@
           <li
             v-for="item in studentList"
             :key="item.id"
+            :class="{ 'is-active': dataCheckStore.curStudent?.id === item.id }"
             @click="onSelectStudent(item)"
           >
             {{ item.examNumber }}
@@ -43,7 +44,7 @@ import { AbsentCheckListFilter } from "@/ap/types/absentCheck";
 import { DataCheckListItem } from "@/ap/types/dataCheck";
 import { absentCheckList } from "@/ap/absentCheck";
 import { StudentPage } from "./types";
-import { useDataCheckStore } from "@/store";
+import { useDataCheckStore, useUserStore } from "@/store";
 
 import SimplePagination from "@/components/SimplePagination/index.vue";
 import ScanImage from "../DataCheck/ScanImage/index.vue";
@@ -55,6 +56,7 @@ defineOptions({
 });
 
 const dataCheckStore = useDataCheckStore();
+const userStore = useUserStore();
 
 let searchModel = {} as AbsentCheckListFilter;
 const pageNumber = ref(1);
@@ -90,9 +92,10 @@ function parseStudentPageList(students: DataCheckListItem[]) {
       paper.pages.forEach((page, pageIndex) => {
         dataList.value.push({
           ...page,
-          paperId: paper.id as number,
-          pageIndex,
+          paperId: paper.id,
           paperIndex,
+          paperNumber: paper.number,
+          pageIndex,
           studentIndex,
           studentId: student.id,
           examId: searchModel.examId,
@@ -129,17 +132,9 @@ async function onSearch(datas: AbsentCheckListFilter) {
   await getList();
   selectPage(0);
 }
+onSearch({ examId: userStore.curExam.id });
 
 // page
-const curStudentInfo = ref({
-  examNumber: "",
-  name: "",
-  examSite: "",
-  seatNumber: "",
-  paperType: "",
-});
-const curPageQuestions = ref<string[]>([]);
-
 function selectPage(index: number) {
   dataCheckStore.setInfo({
     curPage: dataList.value[index],

+ 2 - 2
src/render/views/DataCheck/ScanImage/RecogEditDialog.vue

@@ -22,7 +22,7 @@
           </div>
         </a-col>
         <a-col :span="4">
-          <div class="modal-box">
+          <div class="modal-box" @click="close">
             <p class="box-title">Esc键</p>
             <p class="box-cont">关闭</p>
           </div>
@@ -47,7 +47,7 @@
           </div>
         </a-col>
         <a-col :span="4">
-          <div class="modal-box">
+          <div class="modal-box" @click="onConfirm">
             <p class="box-title">Enter键</p>
             <p class="box-cont">保存</p>
           </div>

+ 1 - 10
src/render/views/DataCheck/index.vue

@@ -6,7 +6,7 @@
           <li
             v-for="item in studentList"
             :key="item.id"
-            :class="{ 'is-active': dataCheckStore.curStudent.id === item.id }"
+            :class="{ 'is-active': dataCheckStore.curStudent?.id === item.id }"
             @click="onSelectStudent(item)"
           >
             {{ item.examNumber }}
@@ -135,15 +135,6 @@ async function onSearch(datas: DataCheckListFilter) {
 onSearch({ examId: userStore.curExam.id });
 
 // page
-const curStudentInfo = ref({
-  examNumber: "",
-  name: "",
-  examSite: "",
-  seatNumber: "",
-  paperType: "",
-});
-const curPageQuestions = ref<string[]>([]);
-
 function selectPage(index: number) {
   dataCheckStore.setInfo({
     curPage: dataList.value[index],