Ver código fonte

feat: api- 数据检查

zhangjie 1 semana atrás
pai
commit
a51e151f41

+ 13 - 3
src/api/check.ts

@@ -1,6 +1,7 @@
 import axios from 'axios';
 import {
   ImageCheckDataListFilter,
+  ImageCheckPageParams,
   ImageCheckPageRes,
   ManualConfirmDataListFilter,
   ManualConfirmPageRes,
@@ -16,14 +17,23 @@ export function getManualConfirmDataList(
 
 // 图片检查查询
 export function getImageCheckDataList(
-  params: ImageCheckDataListFilter
+  params: ImageCheckPageParams
 ): Promise<ImageCheckPageRes> {
   return axios.post('/api/imageCheckDataList', {}, { params });
 }
 
+// 导出图片检查数据
+export function exportImageCheckData(params: ImageCheckDataListFilter) {
+  return axios.post(
+    '/api/admin/exam/check/export',
+    {},
+    { responseType: 'blob', params }
+  );
+}
+
 // 识别结果查询
 export function getResultCheckDataList(
   params: ResultCheckDataListFilter
-): Promise<number[]> {
-  return axios.post('/api/recognitionResultDataList', {}, { params });
+): Promise<number> {
+  return axios.post('/api/admin/exam/check/answer/count', {}, { params });
 }

+ 27 - 26
src/api/types/check.ts

@@ -4,27 +4,27 @@ import { PageResult, PageParams } from './common';
 // 识别结果检查 数据列表筛选条件
 export interface ResultCheckDataListFilter {
   // 是否缺考
-  isMissing: boolean | undefined;
+  absent: boolean | undefined;
   // 准考证号
   examNumber: string;
   // 科目
-  subject: string;
+  subjectCodeInput: string;
   // 科目范围模式
-  subjectRangeMode: DataScopeMode;
+  subjectCodeFunction: DataScopeMode;
   // 考点
-  examPoint: string;
+  examSiteInput: string;
   // 考点范围模式
-  examPointRangeMode: DataScopeMode;
+  examSiteFunction: DataScopeMode;
   // 客观题是否有识别结果
-  objectiveQuestionHasResult: boolean | undefined;
-  // 客观总分
-  objectiveTotalScore: number | null;
-  // 客观总分范围模式
-  objectiveTotalScoreRangeMode: NumberScopeMode;
-  // 主观总分
-  subjectiveTotalScore: number | null;
-  // 主观总分范围模式
-  subjectiveTotalScoreRangeMode: NumberScopeMode;
+  objectiveFill: boolean | undefined;
+  // 客观总分
+  objectiveScoreInput: number | null;
+  // 客观总分范围模式
+  objectiveScoreFunction: NumberScopeMode;
+  // 主观总分
+  subjectiveScoreInput: number | null;
+  // 主观总分范围模式
+  subjectiveScoreFunction: NumberScopeMode;
   // 试卷类型
   paperType: string;
 }
@@ -36,9 +36,9 @@ export interface ImageCheckDataListFilter {
   // 准考证号
   examNumber: string;
   // 学号
-  studentNo: string;
+  studentCode: string;
   // 科目
-  subject: string | null;
+  subjectCode: string | null;
 }
 export type ImageCheckPageParams = PageParams<ImageCheckDataListFilter>;
 
@@ -51,11 +51,11 @@ export interface ImageCheckDataListItem {
   // 准考证号
   examNumber: string;
   // 学号
-  studentNo: string;
+  studentCode: string;
   // 科目
-  subject: string | null;
+  subjectCode: string | null;
   // 扫描批次
-  scanBatch: string;
+  batchCode: string;
   // 上传时间
   uploadTime: string;
 }
@@ -64,11 +64,11 @@ export type ImageCheckPageRes = PageResult<ImageCheckDataListItem>;
 // 人工确认 数据列表筛选条件
 export interface ManualConfirmDataListFilter {
   // 确认类型
-  confirmType: number | null;
+  type: number | null;
   // 科目
-  subject: string | null;
+  subjectCode: string | null;
   // 考点
-  examPoint: string;
+  examSite: string;
 }
 export type ManualConfirmPageParams = PageParams<ManualConfirmDataListFilter>;
 
@@ -81,13 +81,14 @@ export interface ManualConfirmDataListItem {
   // 准考证号
   examNumber: string;
   // 学号
-  studentNo: string;
+  studentCode: string;
   // 科目
-  subject: string | null;
+  subjectCode: string;
+  subjectName: string;
   // 考点
-  examPoint: string;
+  examSite: string;
   // 扫描批次
-  scanBatch: string;
+  batchCode: string;
   // 上传时间
   uploadTime: string;
 }

+ 4 - 0
src/utils/download-export.ts

@@ -45,6 +45,7 @@ import {
   exportReviewWorkload,
   reviewImportTemplate,
 } from '@/api/review';
+import { exportImageCheckData } from '@/api/check';
 
 import useLoading from '@/hooks/loading';
 
@@ -133,6 +134,9 @@ const downloadConfig = {
   exportReviewWorkload,
   // 复核导入模板下载
   reviewImportTemplate,
+  // check
+  // 导出图片检查数据
+  exportImageCheckData,
 };
 type DownloadType = keyof typeof downloadConfig;
 

+ 14 - 12
src/views/check/ImageCheck.vue

@@ -19,20 +19,20 @@
       </el-form-item>
       <el-form-item label="学号">
         <el-input
-          v-model.trim="searchModel.studentNo"
+          v-model.trim="searchModel.studentCode"
           placeholder="请输入"
           clearable
           style="width: 120px"
         />
       </el-form-item>
       <el-form-item label="科目">
-        <select-subject v-model="searchModel.subject"></select-subject>
+        <select-subject v-model="searchModel.subjectCode"></select-subject>
       </el-form-item>
     </el-form>
     <el-divider class="form-divider" />
     <div class="part-action">
       <el-space wrap>
-        <el-button type="primary" @click="toPage(1)">查询</el-button>
+        <el-button type="primary" @click="toPage(1)">异常查询</el-button>
         <el-button @click="onExport">导出</el-button>
         <el-button type="success" @click="startCheck">开始检查</el-button>
       </el-space>
@@ -49,9 +49,9 @@
       <el-table-column type="index" label="序号" width="60" />
       <el-table-column prop="examNumber" label="准考证号" width="120" />
       <el-table-column prop="name" label="姓名" min-width="100" />
-      <el-table-column prop="studentNo" label="学号" width="120" />
-      <el-table-column prop="subject" label="科目" min-width="100" />
-      <el-table-column prop="scanBatch" label="扫描批次" width="120" />
+      <el-table-column prop="studentCode" label="学号" width="120" />
+      <el-table-column prop="subjectCode" label="科目" min-width="100" />
+      <el-table-column prop="batchCode" label="扫描批次" width="120" />
       <el-table-column prop="uploadTime" label="上传时间" width="160" />
     </el-table>
     <el-pagination
@@ -67,13 +67,14 @@
 
 <script setup lang="ts">
   import { reactive } from 'vue';
-  import { ElMessage } from 'element-plus';
   import { getImageCheckDataList } from '@/api/check';
   import type {
     ImageCheckDataListItem,
     ImageCheckDataListFilter,
   } from '@/api/types/check';
   import useTable from '@/hooks/table';
+  import { downloadExport } from '@/utils/download-export';
+  import ls from '@/utils/storage';
 
   defineOptions({
     name: 'ImageCheck',
@@ -82,18 +83,19 @@
   const searchModel = reactive<ImageCheckDataListFilter>({
     name: '',
     examNumber: '',
-    studentNo: '',
-    subject: null,
+    studentCode: '',
+    subjectCode: null,
   });
 
   const { dataList, pagination, loading, toPage, pageSizeChange } =
     useTable<ImageCheckDataListItem>(getImageCheckDataList, searchModel, false);
 
-  function onExport() {
-    ElMessage.info('导出功能待实现');
+  async function onExport() {
+    await downloadExport('exportImageCheckData', searchModel);
   }
 
   function startCheck() {
-    ElMessage.info('开始检查功能待实现');
+    ls.set('image-check', searchModel);
+    // TODO:开始处理
   }
 </script>

+ 13 - 12
src/views/check/ManualConfirm.vue

@@ -3,7 +3,7 @@
     <el-form inline>
       <el-form-item label="确认类型">
         <el-select
-          v-model="searchModel.confirmType"
+          v-model="searchModel.type"
           placeholder="手动更新"
           clearable
           style="width: 120px"
@@ -12,11 +12,11 @@
         </el-select>
       </el-form-item>
       <el-form-item label="科目">
-        <select-subject v-model="searchModel.subject"></select-subject>
+        <select-subject v-model="searchModel.subjectCode"></select-subject>
       </el-form-item>
       <el-form-item label="考点">
         <el-input
-          v-model.trim="searchModel.examPoint"
+          v-model.trim="searchModel.examSite"
           placeholder="请选择"
           clearable
           style="width: 120px"
@@ -42,10 +42,10 @@
       <el-table-column type="index" label="序号" width="60" />
       <el-table-column prop="examNumber" label="准考证号" width="120" />
       <el-table-column prop="name" label="姓名" min-width="100" />
-      <el-table-column prop="studentNo" label="学号" width="120" />
-      <el-table-column prop="subject" label="科目" min-width="100" />
-      <el-table-column prop="examPoint" label="考点" width="120" />
-      <el-table-column prop="scanBatch" label="扫描批次" width="120" />
+      <el-table-column prop="studentCode" label="学号" width="120" />
+      <el-table-column prop="subjectName" label="科目" min-width="100" />
+      <el-table-column prop="examSite" label="考点" width="120" />
+      <el-table-column prop="batchCode" label="扫描批次" width="120" />
       <el-table-column prop="uploadTime" label="上传时间" width="160" />
     </el-table>
     <el-pagination
@@ -61,22 +61,22 @@
 
 <script setup lang="ts">
   import { reactive } from 'vue';
-  import { ElMessage } from 'element-plus';
   import { getManualConfirmDataList } from '@/api/check';
   import type {
     ManualConfirmDataListItem,
     ManualConfirmDataListFilter,
   } from '@/api/types/check';
   import useTable from '@/hooks/table';
+  import ls from '@/utils/storage';
 
   defineOptions({
     name: 'ManualConfirm',
   });
 
   const searchModel = reactive<ManualConfirmDataListFilter>({
-    confirmType: null,
-    subject: null,
-    examPoint: '',
+    type: null,
+    subjectCode: null,
+    examSite: '',
   });
 
   const { dataList, pagination, loading, toPage, pageSizeChange } =
@@ -87,6 +87,7 @@
     );
 
   function startCheck() {
-    ElMessage.info('开始检查功能待实现');
+    ls.set('manual-confirm', searchModel);
+    // TODO:开始处理
   }
 </script>

+ 28 - 30
src/views/check/ResultCheck.vue

@@ -3,7 +3,7 @@
     <el-form label-width="200px">
       <el-form-item label="是否缺考">
         <el-select
-          v-model="searchModel.isMissing"
+          v-model="searchModel.absent"
           placeholder="请选择"
           clearable
           style="width: 120px"
@@ -23,7 +23,7 @@
       </el-form-item>
       <el-form-item label="科目">
         <el-select
-          v-model="searchModel.subjectRangeMode"
+          v-model="searchModel.subjectCodeFunction"
           placeholder="请选择"
           style="width: 200px"
         >
@@ -37,7 +37,7 @@
       </el-form-item>
       <el-form-item label="">
         <el-input
-          v-model.trim="searchModel.subjectCodes"
+          v-model.trim="searchModel.subjectCodeInput"
           placeholder="多个科目代码用英文逗号分隔"
           :rows="4"
           type="textarea"
@@ -46,7 +46,7 @@
       </el-form-item>
       <el-form-item label="考点">
         <el-select
-          v-model="searchModel.examPointRangeMode"
+          v-model="searchModel.examSiteFunction"
           placeholder="请选择"
           style="width: 200px"
         >
@@ -60,7 +60,7 @@
       </el-form-item>
       <el-form-item label="">
         <el-input
-          v-model.trim="searchModel.examPoint"
+          v-model.trim="searchModel.examSiteInput"
           placeholder="多个考点用英文逗号分隔"
           type="textarea"
           :rows="4"
@@ -69,7 +69,7 @@
       </el-form-item>
       <el-form-item label="客观题是否有识别结果">
         <el-select
-          v-model="searchModel.objectiveQuestionHasResult"
+          v-model="searchModel.objectiveFill"
           placeholder="请选择"
           clearable
           style="width: 120px"
@@ -80,7 +80,7 @@
       </el-form-item>
       <el-form-item label="客观总分">
         <el-select
-          v-model="searchModel.objectiveTotalScoreMode"
+          v-model="searchModel.objectiveScoreFunction"
           placeholder="请选择"
           style="width: 100px"
         >
@@ -92,7 +92,7 @@
           />
         </el-select>
         <el-input-number
-          v-model="searchModel.objectiveTotalScore"
+          v-model="searchModel.objectiveScoreInput"
           :min="0"
           :max="9999"
           :step="0.1"
@@ -105,7 +105,7 @@
       </el-form-item>
       <el-form-item label="主观总分">
         <el-select
-          v-model="searchModel.subjectiveTotalScoreMode"
+          v-model="searchModel.subjectiveScoreFunction"
           placeholder="请选择"
           style="width: 100px"
         >
@@ -117,7 +117,7 @@
           />
         </el-select>
         <el-input-number
-          v-model="searchModel.subjectiveTotalScore"
+          v-model="searchModel.subjectiveScoreInput"
           :min="0"
           :max="9999"
           :step="0.1"
@@ -136,15 +136,12 @@
           style="width: 200px"
         />
       </el-form-item>
-      <el-form-item v-if="queryResult" label="查询结果">
-        <el-input :value="queryResult.length" readonly style="width: 120px" />
+      <el-form-item label="查询结果">
+        <el-input :value="queryResult" readonly style="width: 120px" />
       </el-form-item>
       <el-form-item>
         <el-button type="primary" @click="queryData">查询数量</el-button>
-        <el-button
-          v-if="queryResult && queryResult.length"
-          type="primary"
-          @click="startProcess"
+        <el-button v-if="queryResult" type="primary" @click="startProcess"
           >开始处理</el-button
         >
       </el-form-item>
@@ -154,37 +151,37 @@
 
 <script setup lang="ts">
   import { reactive, ref } from 'vue';
-  import { ElMessage } from 'element-plus';
   import { getResultCheckDataList } from '@/api/check';
   import type { ResultCheckDataListFilter } from '@/api/types/check';
   import { DATA_SCOPE_MODE, NUMBER_SCOPE_MODE } from '@/constants/enumerate';
+  import ls from '@/utils/storage';
 
   defineOptions({
     name: 'ResultCheck',
   });
 
   const searchModel = reactive<ResultCheckDataListFilter>({
-    isMissing: undefined,
+    absent: undefined,
     examNumber: '',
-    subject: '',
-    subjectRangeMode: 'BELONG',
-    examPoint: '',
-    examPointRangeMode: 'BELONG',
-    objectiveQuestionHasResult: undefined,
-    objectiveTotalScore: undefined,
-    objectiveTotalScoreRangeMode: 'GREATER_THAN',
-    subjectiveTotalScore: undefined,
-    subjectiveTotalScoreRangeMode: 'GREATER_THAN',
+    subjectCodeInput: '',
+    subjectCodeFunction: 'BELONG',
+    examSiteInput: '',
+    examSiteFunction: 'BELONG',
+    objectiveFill: undefined,
+    objectiveScoreInput: null,
+    objectiveScoreFunction: 'GREATER_THAN',
+    subjectiveScoreInput: null,
+    subjectiveScoreFunction: 'GREATER_THAN',
     paperType: '',
   });
 
-  const queryResult = ref<number[] | null>(null);
+  const queryResult = ref<number | null>(null);
   const loading = ref(false);
   async function queryData() {
     loading.value = true;
     try {
       const result = await getResultCheckDataList({ ...searchModel });
-      queryResult.value = result || [];
+      queryResult.value = result || 0;
     } catch (error) {
       console.error('查询失败:', error);
     } finally {
@@ -193,6 +190,7 @@
   }
 
   function startProcess() {
-    ElMessage.info('开始处理功能待实现');
+    ls.set('result-check', searchModel);
+    // TODO:开始处理
   }
 </script>