瀏覽代碼

feat: api-考试管理

zhangjie 2 天之前
父節點
當前提交
9e5eea8b15

+ 14 - 3
src/api/issue-paper.ts

@@ -22,16 +22,27 @@ export function resetIssuePaper(ids: number[]): Promise<any> {
 export function getIssuePaperTypeList(
   examId: number
 ): Promise<IssuePaperTypeItem[]> {
-  return axios.post('/api/score/type/list', {}, { params: { examId } });
+  return axios.post(
+    '/api/admin/exam/problem/type/list',
+    {},
+    { params: { examId } }
+  );
 }
 
 // 新增/修改问题卷类型
 export function updateIssuePaperType(
   params: IssuePaperTypeUpdateParam
 ): Promise<any> {
-  return axios.post('/api/score/type/add', params);
+  if (params.id) {
+    return axios.post('/api/admin/exam/problem/type/update', params);
+  }
+  return axios.post('/api/admin/exam/problem/type/save', params);
 }
 // 删除问题卷类型
 export function deleteIssuePaperType(id: number): Promise<any> {
-  return axios.post('/api/score/type/delete', {}, { params: { id } });
+  return axios.post(
+    '/api/admin/exam/problem/type/delete',
+    {},
+    { params: { id } }
+  );
 }

+ 14 - 3
src/api/reject.ts

@@ -30,13 +30,24 @@ export function getRejectStatisticsList(
 
 // 查询打回类型
 export function getRejectTypeList(examId: number): Promise<RejectTypeItem[]> {
-  return axios.post('/api/student/list', {}, { params: { examId } });
+  return axios.post(
+    '/api/admin/exam/reject/type/list',
+    {},
+    { params: { examId } }
+  );
 }
 // 新增/修改打回类型
 export function updateRejectType(params: RejectTypeUpdateParam): Promise<any> {
-  return axios.post('/api/student/list', {}, params);
+  if (params.id) {
+    return axios.post('/api/admin/exam/reject/type/update', params);
+  }
+  return axios.post('/api/admin/exam/reject/type/save', {}, params);
 }
 // 删除打回类型
 export function deleteRejectType(id: number): Promise<any> {
-  return axios.post('/api/student/list', {}, { params: { id } });
+  return axios.post(
+    '/api/admin/exam/reject/type/delete',
+    {},
+    { params: { id } }
+  );
 }

+ 12 - 12
src/api/types/exam.ts

@@ -1,4 +1,4 @@
-import { ExamType, MarkingMode } from '@/constants/enumerate';
+import { ExamType, MarkingMode, ExamStatus } from '@/constants/enumerate';
 import { PageResult, PageParams, CoverArea } from './common';
 
 export interface ExamBaseItem {
@@ -42,9 +42,9 @@ export interface ExamBaseItem {
   // 原卷显示
   sheetView: boolean;
   // 评卷提交自动定位
-  autoPositionAfterSubmit: boolean;
+  autoScroll: boolean;
   // 自动对切题卡
-  autoAlignAnswerSheet: boolean;
+  enableSplit: boolean;
   // 描述
   description: string;
   // 状态
@@ -56,17 +56,17 @@ export interface ExamBaseItem {
 // 高级配置
 export interface ExamAdvancedConfig {
   // 评卷时强制试卷拉到底部
-  forceScrollToBottom: boolean;
+  markScrollBottom: boolean;
   // 最小阅卷时长(秒)
-  minMarkingDuration: number | undefined;
+  minMarkDuration: number | undefined;
   // 单卷回评次数
-  singlePaperRecheckCount: number | undefined;
+  reMarkLimitCount: number | undefined;
   // 给分次数限制类型:等于 小于等于
   trackCountPolicy: 'EQ' | 'LE' | null;
   // 启用条码粘贴AI检测
-  enableBarcodeAIDetection: boolean;
+  barcodeAiCheck: boolean;
   // 启用题卡作答AI检测
-  enableAnswerSheetAIDetection: boolean;
+  answerAiCheck: boolean;
 }
 
 export type ExamItem = ExamBaseItem & ExamAdvancedConfig;
@@ -76,11 +76,11 @@ export type ExamQueryItem = Pick<
   | 'id'
   | 'name'
   | 'type'
-  | 'examDate'
-  | 'markingStartDate'
-  | 'markingEndDate'
+  | 'examTime'
+  | 'startTime'
+  | 'endTime'
   | 'status'
-  | 'forceMark'
+  | 'forceSpecialTag'
 >;
 
 export type ExamListPageRes = PageResult<ExamQueryItem>;

+ 5 - 2
src/api/types/issue-paper.ts

@@ -48,14 +48,17 @@ export type IssuePaperListPageParam = PageParams<IssuePaperListFilter>;
 export interface IssuePaperTypeItem {
   // 编号
   id: number;
+  // 考试id
+  examId: number;
   // 名称
   name: string;
-  // 类型
-  type: string;
+  // 是否自定义
+  custom: boolean;
 }
 
 export interface IssuePaperTypeUpdateParam {
   id?: number;
   examId: number;
   name: string;
+  custom: boolean;
 }

+ 7 - 2
src/api/types/reject.ts

@@ -66,14 +66,19 @@ export type RejectStatisticsListParams = PageParams<RejectStatisticsFilter>;
 export interface RejectTypeItem {
   // 编号
   id: number;
+  /** 考试ID */
+  examId: number;
   // 名称
   name: string;
-  // 类型
-  type: string;
+  // 自定义
+  custom: boolean;
 }
 
 export interface RejectTypeUpdateParam {
   id?: number;
   examId: number;
+  // 名称
   name: string;
+  // 自定义
+  custom: boolean;
 }

+ 26 - 28
src/views/exam/ExamAdvancedDialog.vue

@@ -17,12 +17,12 @@
       label-width="180px"
     >
       <el-form-item label="评卷时强制试卷拉到底部">
-        <el-checkbox v-model="formModel.forceScrollToBottom"> </el-checkbox>
+        <el-checkbox v-model="formModel.markScrollBottom"> </el-checkbox>
       </el-form-item>
 
-      <el-form-item label="最小阅卷时长(秒)" prop="minMarkingDuration">
+      <el-form-item label="最小阅卷时长(秒)" prop="minMarkDuration">
         <el-input-number
-          v-model="formModel.minMarkingDuration"
+          v-model="formModel.minMarkDuration"
           :min="0"
           :max="999999"
           :step="1"
@@ -34,9 +34,9 @@
         />
       </el-form-item>
 
-      <el-form-item label="单卷回评次数" prop="singlePaperRecheckCount">
+      <el-form-item label="单卷回评次数" prop="reMarkLimitCount">
         <el-input-number
-          v-model="formModel.singlePaperRecheckCount"
+          v-model="formModel.reMarkLimitCount"
           :min="0"
           :max="100"
           :step="1"
@@ -48,22 +48,21 @@
         />
       </el-form-item>
 
-      <el-form-item label="给分次数限制" prop="scoringLimitType">
+      <el-form-item label="给分次数限制" prop="trackCountPolicy">
         <el-select
-          v-model="formModel.scoringLimitType"
+          v-model="formModel.trackCountPolicy"
           placeholder="请选择给分次数限制类型"
           style="width: 200px"
           clearable
         >
-          <el-option label="小于等于" value="le" />
-          <el-option label="等于" value="eq" />
+          <el-option label="小于等于" value="LE" />
+          <el-option label="等于" value="EQ" />
         </el-select>
       </el-form-item>
 
       <el-form-item label="启用条码粘贴AI检测">
-        <el-checkbox v-model="formModel.enableBarcodeAIDetection">
-        </el-checkbox>
-        <span v-show="formModel.enableBarcodeAIDetection" class="tip-text"
+        <el-checkbox v-model="formModel.barcodeAiCheck"> </el-checkbox>
+        <span v-show="formModel.barcodeAiCheck" class="tip-text"
           >预计耗时: 15小时12分</span
         >
         <div class="ai-detection-tip">
@@ -74,8 +73,7 @@
       </el-form-item>
 
       <el-form-item label="启用题卡作答AI检测">
-        <el-checkbox v-model="formModel.enableAnswerSheetAIDetection">
-        </el-checkbox>
+        <el-checkbox v-model="formModel.answerAiCheck"> </el-checkbox>
         <div class="ai-detection-tip">
           <span class="tip-warning">
             *AI检测均耗时较久,如需使用此功能,建议在开始扫描时就配置启用此功能
@@ -113,12 +111,12 @@
 
   const props = withDefaults(defineProps<Props>(), {
     advancedConfig: () => ({
-      forceScrollToBottom: false,
-      minMarkingDuration: undefined,
-      singlePaperRecheckCount: undefined,
-      scoringLimitType: null,
-      enableBarcodeAIDetection: false,
-      enableAnswerSheetAIDetection: false,
+      markScrollBottom: false,
+      minMarkDuration: undefined,
+      reMarkLimitCount: undefined,
+      trackCountPolicy: null,
+      barcodeAiCheck: false,
+      answerAiCheck: false,
     }),
   });
 
@@ -134,18 +132,18 @@
   const { loading, setLoading } = useLoading();
 
   const initialFormState: ExamAdvancedConfig = {
-    forceScrollToBottom: false,
-    minMarkingDuration: undefined,
-    singlePaperRecheckCount: undefined,
-    scoringLimitType: null,
-    enableBarcodeAIDetection: false,
-    enableAnswerSheetAIDetection: false,
+    markScrollBottom: false,
+    minMarkDuration: undefined,
+    reMarkLimitCount: undefined,
+    trackCountPolicy: null,
+    barcodeAiCheck: false,
+    answerAiCheck: false,
   };
 
   const formModel = reactive({ ...initialFormState });
 
   const rules: FormRules<keyof ExamAdvancedConfig> = {
-    minMarkingDuration: [
+    minMarkDuration: [
       {
         validator: (rule, value, callback) => {
           if (value !== undefined && value < 0) {
@@ -157,7 +155,7 @@
         trigger: 'blur',
       },
     ],
-    singlePaperRecheckCount: [
+    reMarkLimitCount: [
       {
         validator: (rule, value, callback) => {
           if (value !== undefined && value < 0) {

+ 51 - 64
src/views/exam/ExamEdit.vue

@@ -42,7 +42,7 @@
 
             <el-form-item label="评卷开始日期" label-width="110px">
               <el-date-picker
-                v-model="formModel.markingStartDate"
+                v-model="formModel.startTime"
                 type="date"
                 placeholder="请选择评卷开始日期"
                 style="width: 200px"
@@ -53,7 +53,7 @@
 
             <el-form-item label="评卷结束日期" label-width="110px">
               <el-date-picker
-                v-model="formModel.markingEndDate"
+                v-model="formModel.endTime"
                 type="date"
                 placeholder="请选择评卷结束日期"
                 style="width: 200px"
@@ -88,11 +88,11 @@
               <el-space size="40">
                 <el-form-item
                   label="评卷模式"
-                  prop="markingMode"
+                  prop="markMode"
                   label-width="110px"
                 >
                   <el-select
-                    v-model="formModel.markingMode"
+                    v-model="formModel.markMode"
                     placeholder="请选择"
                     style="width: 200px"
                   >
@@ -106,7 +106,9 @@
                 </el-form-item>
 
                 <el-form-item label="强制标记" label-width="110px">
-                  <el-checkbox v-model="formModel.forceMark"></el-checkbox>
+                  <el-checkbox
+                    v-model="formModel.forceSpecialTag"
+                  ></el-checkbox>
                 </el-form-item>
               </el-space>
             </div>
@@ -115,15 +117,11 @@
               <h4 class="section-part-title">数据安全</h4>
               <el-space :size="10">
                 <el-form-item label="禁止他人查看考生信息" label-width="194px">
-                  <el-checkbox
-                    v-model="formModel.forbidViewStudentInfo"
-                  ></el-checkbox>
+                  <el-checkbox v-model="formModel.forbiddenInfo"></el-checkbox>
                 </el-form-item>
 
                 <el-form-item label="禁止科组长成绩查询" label-width="200px">
-                  <el-checkbox
-                    v-model="formModel.forbidLeaderScoreQuery"
-                  ></el-checkbox>
+                  <el-checkbox v-model="formModel.forbiddenScore"></el-checkbox>
                 </el-form-item>
               </el-space>
             </div>
@@ -136,7 +134,7 @@
                   label-width="220px"
                 >
                   <el-checkbox
-                    v-model="formModel.preventSameAccountRecheck"
+                    v-model="formModel.inspectUnrepeated"
                   ></el-checkbox>
                 </el-form-item>
 
@@ -145,7 +143,7 @@
                   label-width="200px"
                 >
                   <el-checkbox
-                    v-model="formModel.forceScrollToBottom"
+                    v-model="formModel.inspectScrollBottom"
                   ></el-checkbox>
                 </el-form-item>
                 <el-form-item
@@ -153,7 +151,7 @@
                   label-width="240px"
                 >
                   <el-checkbox
-                    v-model="formModel.requireFullProgressForRecheck"
+                    v-model="formModel.inspectRoundLimit"
                   ></el-checkbox>
                 </el-form-item>
               </el-space>
@@ -164,11 +162,11 @@
               <el-space :size="40">
                 <el-form-item
                   label="回评卷数"
-                  prop="recheckCount"
+                  prop="remarkCount"
                   label-width="110px"
                 >
                   <el-input-number
-                    v-model="formModel.recheckCount"
+                    v-model="formModel.remarkCount"
                     :min="0"
                     :max="100"
                     :step="1"
@@ -181,16 +179,16 @@
 
                 <el-form-item
                   label="给分次数限制"
-                  prop="scoringLimitType"
+                  prop="trackCountPolicy"
                   label-width="110px"
                 >
                   <el-select
-                    v-model="formModel.scoringLimitType"
+                    v-model="formModel.trackCountPolicy"
                     placeholder="请选择"
                     style="width: 200px"
                   >
-                    <el-option label="小于等于" value="le" />
-                    <el-option label="等于" value="eq" />
+                    <el-option label="小于等于" value="LE" />
+                    <el-option label="等于" value="EQ" />
                   </el-select>
                 </el-form-item>
               </el-space>
@@ -216,30 +214,22 @@
                   label="打回后显示原分值及轨迹"
                   label-width="207px"
                 >
-                  <el-checkbox
-                    v-model="formModel.showOriginalScoreAfterReturn"
-                  ></el-checkbox>
+                  <el-checkbox v-model="formModel.showReject"></el-checkbox>
                 </el-form-item>
 
                 <el-form-item label="原卷显示" label-width="100px">
-                  <el-checkbox
-                    v-model="formModel.showOriginalPaper"
-                  ></el-checkbox>
+                  <el-checkbox v-model="formModel.sheetView"></el-checkbox>
                 </el-form-item>
               </el-space>
               <br />
 
               <el-space :size="20">
                 <el-form-item label="评卷提交自动定位" label-width="165px">
-                  <el-checkbox
-                    v-model="formModel.autoPositionAfterSubmit"
-                  ></el-checkbox>
+                  <el-checkbox v-model="formModel.autoScroll"></el-checkbox>
                 </el-form-item>
 
                 <el-form-item label="自动对切题卡" label-width="168px">
-                  <el-checkbox
-                    v-model="formModel.autoAlignAnswerSheet"
-                  ></el-checkbox>
+                  <el-checkbox v-model="formModel.enableSplit"></el-checkbox>
                 </el-form-item>
               </el-space>
             </div>
@@ -250,11 +240,11 @@
                 <el-col :span="8">
                   <el-form-item
                     label="及格分"
-                    prop="passingScore"
+                    prop="passScore"
                     label-width="110px"
                   >
                     <el-input-number
-                      v-model="formModel.passingScore"
+                      v-model="formModel.passScore"
                       :min="0"
                       :max="100"
                       :step="1"
@@ -367,34 +357,33 @@
     const initialFormState: Partial<ExamUpdateParam> = {
       name: '',
       type: 'SCAN',
-      examDate: '',
-      markingStartDate: '',
-      markingEndDate: '',
+      examTime: '',
+      startTime: '',
+      endTime: '',
       status: '',
-      markingMode: 'TRACK',
-      forceMark: false,
-      forbidViewStudentInfo: false,
-      forbidLeaderScoreQuery: false,
-      preventSameAccountRecheck: false,
-      forceScrollToBottom: false,
-      requireFullProgressForRecheck: false,
+      markMode: 'TRACK',
+      forceSpecialTag: false,
+      forbiddenInfo: false,
+      forbiddenScore: false,
+      inspectUnrepeated: false,
+      inspectScrollBottom: false,
+      inspectRoundLimit: false,
       showObjectiveScore: false,
-      showOriginalScoreAfterReturn: false,
-      recheckCount: undefined,
-      passingScore: 60,
+      showReject: false,
+      remarkCount: undefined,
+      passScore: 60,
       excellentScore: 90,
-      showOriginalPaper: false,
+      sheetView: false,
       sheetConfig: [],
-      autoPositionAfterSubmit: false,
-      autoAlignAnswerSheet: false,
+      autoScroll: false,
+      enableSplit: false,
       description: '',
       // 高级配置默认值
-      minMarkingDuration: undefined,
-      singlePaperRecheckCount: undefined,
-      scoringLimitType: null,
-      scoringLimitCount: undefined,
-      enableBarcodeAIDetection: false,
-      enableAnswerSheetAIDetection: false,
+      minMarkDuration: undefined,
+      reMarkLimitCount: undefined,
+      trackCountPolicy: null,
+      barcodeAiCheck: false,
+      answerAiCheck: false,
     };
     return initialFormState;
   };
@@ -403,14 +392,12 @@
 
   // 高级配置数据
   const advancedConfig = computed<ExamAdvancedConfig>(() => ({
-    forceScrollToBottom: formModel.forceScrollToBottom || false,
-    minMarkingDuration: formModel.minMarkingDuration,
-    singlePaperRecheckCount: formModel.singlePaperRecheckCount,
-    scoringLimitType: formModel.scoringLimitType,
-    scoringLimitCount: formModel.scoringLimitCount,
-    enableBarcodeAIDetection: formModel.enableBarcodeAIDetection || false,
-    enableAnswerSheetAIDetection:
-      formModel.enableAnswerSheetAIDetection || false,
+    markScrollBottom: formModel.inspectScrollBottom || false,
+    minMarkDuration: formModel.minMarkDuration,
+    reMarkLimitCount: formModel.reMarkLimitCount,
+    trackCountPolicy: formModel.trackCountPolicy,
+    barcodeAiCheck: formModel.barcodeAiCheck || false,
+    answerAiCheck: formModel.answerAiCheck || false,
   }));
 
   // 表单验证规则

+ 4 - 4
src/views/exam/ExamManage.vue

@@ -68,11 +68,11 @@
           {{ dictFilter.examType(scope.row.type) }}
         </template>
       </el-table-column>
-      <el-table-column prop="examDate" label="考试日期" width="120" />
-      <el-table-column prop="forceMark" label="强制标记" width="100">
+      <el-table-column prop="examTime" label="考试日期" width="120" />
+      <el-table-column prop="forceSpecialTag" label="强制标记" width="100">
         <template #default="scope">
-          <el-tag :type="scope.row.forceMark ? 'warning' : 'info'">
-            {{ scope.row.forceMark ? '是' : '否' }}
+          <el-tag :type="scope.row.forceSpecialTag ? 'warning' : 'info'">
+            {{ scope.row.forceSpecialTag ? '是' : '否' }}
           </el-tag>
         </template>
       </el-table-column>

+ 6 - 6
src/views/exam/ExamStatDialog.vue

@@ -64,9 +64,9 @@
   const statInfo = ref<ExamStatDetailInfo>({
     studentCount: 0,
     subjectCount: 0,
-    scanProgress: 0,
-    scanImageCount: 0,
-    markingProgress: 0,
+    scanCount: 0,
+    paperCount: 0,
+    markedCount: 0,
   });
 
   interface TableDataItem {
@@ -91,19 +91,19 @@
     },
     {
       name: '扫描进度',
-      attribute: `已扫描 ${statInfo.value.scanProgress}%`,
+      attribute: `已扫描 ${statInfo.value.scanCount}%`,
       type: 'scanProgress',
       router: 'ScanManage',
     },
     {
       name: '扫描张数',
-      attribute: `已扫描 ${statInfo.value.scanImageCount} 张`,
+      attribute: `已扫描 ${statInfo.value.paperCount} 张`,
       type: 'scanImage',
       router: 'ScanManage',
     },
     {
       name: '评卷进度',
-      attribute: `已评卷 ${statInfo.value.markingProgress}%`,
+      attribute: `已评卷 ${statInfo.value.markedCount}%`,
       type: 'markingProgress',
       router: 'MarkProgress',
     },

+ 5 - 1
src/views/exam/IssuePaperTypeDialog.vue

@@ -26,7 +26,11 @@
       >
         <el-table-column prop="id" label="编号" width="80" />
         <el-table-column prop="name" label="分类名称" />
-        <el-table-column prop="type" label="类型" />
+        <el-table-column prop="custom" label="类型" width="80">
+          <template #default="scope">
+            {{ scope.row.custom ? '自定义' : '系统' }}
+          </template>
+        </el-table-column>
         <el-table-column label="操作" width="120">
           <template #default="scope">
             <el-button size="small" link @click="onEdit(scope.row)">

+ 1 - 0
src/views/exam/ModifyIssuePaperType.vue

@@ -71,6 +71,7 @@
   const formRef = ref<FormInstance>();
   const initialFormState: Partial<IssuePaperTypeUpdateParam> = {
     name: '',
+    custom: true,
   };
 
   const formModel = reactive({ ...initialFormState });

+ 1 - 0
src/views/exam/ModifyRejectType.vue

@@ -72,6 +72,7 @@
   const formRef = ref<FormInstance>();
   const initialFormState: Partial<RejectTypeUpdateParam> = {
     name: '',
+    custom: true,
   };
 
   const formModel = reactive({ ...initialFormState });

+ 5 - 1
src/views/exam/RejectTypeDialog.vue

@@ -26,7 +26,11 @@
       >
         <el-table-column prop="id" label="编号" width="80" />
         <el-table-column prop="name" label="分类名称" />
-        <el-table-column prop="type" label="类型" />
+        <el-table-column prop="custom" label="类型" width="80">
+          <template #default="scope">
+            {{ scope.row.custom ? '自定义' : '系统' }}
+          </template>
+        </el-table-column>
         <el-table-column label="操作" width="120">
           <template #default="scope">
             <el-button size="small" link @click="onEdit(scope.row)">