Browse Source

feat: api-问题卷

zhangjie 1 week ago
parent
commit
29bd500d68

+ 1 - 4
components.d.ts

@@ -60,16 +60,13 @@ declare module '@vue/runtime-core' {
     PageBreadcrumb: typeof import('./src/components/page-breadcrumb/index.vue')['default']
     RouterLink: typeof import('vue-router')['RouterLink']
     RouterView: typeof import('vue-router')['RouterView']
-    SelectClass: typeof import('./src/components/select-class/index.vue')['default']
-    SelectCollege: typeof import('./src/components/select-college/index.vue')['default']
-    SelectCourse: typeof import('./src/components/select-course/index.vue')['default']
+    SelectData: typeof import('./src/components/select-data/index.vue')['default']
     SelectExam: typeof import('./src/components/select-exam/index.vue')['default']
     SelectImgArea: typeof import('./src/components/select-img-area/index.vue')['default']
     SelectOption: typeof import('./src/components/select-option/index.vue')['default']
     SelectRangeDatetime: typeof import('./src/components/select-range-datetime/index.vue')['default']
     SelectRangeTime: typeof import('./src/components/select-range-time/index.vue')['default']
     SelectSubject: typeof import('./src/components/select-subject/index.vue')['default']
-    SelectTeaching: typeof import('./src/components/select-teaching/index.vue')['default']
     SvgIcon: typeof import('./src/components/svg-icon/index.vue')['default']
     TableField: typeof import('./src/components/table-field/index.vue')['default']
     UploadButton: typeof import('./src/components/upload-button/index.vue')['default']

+ 19 - 4
src/api/issue-paper.ts

@@ -1,6 +1,7 @@
-import axios from 'axios';
+import axios, { AxiosResponse } from 'axios';
 import {
   IssuePaperListPageRes,
+  IssuePaperListFilter,
   IssuePaperListPageParam,
   IssuePaperTypeItem,
   IssuePaperTypeUpdateParam,
@@ -10,14 +11,28 @@ import {
 export function getIssuePaperList(
   params: IssuePaperListPageParam
 ): Promise<IssuePaperListPageRes> {
-  return axios.post('/api/score/list', {}, { params });
+  return axios.post('/api/admin/exam/problem/history/query', {}, { params });
 }
 
 // 重置问题卷
-export function resetIssuePaper(ids: number[]): Promise<any> {
-  return axios.post('/api/score/reset', { ids });
+export function resetIssuePaper(libraryIds: number[]): Promise<any> {
+  return axios.post('/api/admin/exam/problem/history/restBatch', {
+    libraryIds,
+  });
 }
 
+// 导出问题卷
+export function exportIssuePaper(
+  params: IssuePaperListFilter
+): Promise<AxiosResponse<Blob>> {
+  return axios.post(
+    '/api/admin/exam/problem/history/export',
+    {},
+    { params, responseType: 'blob' }
+  );
+}
+
+// 问题卷类型 ------------->
 // 查询问题卷类型
 export function getIssuePaperTypeList(
   examId: number

+ 17 - 15
src/api/types/issue-paper.ts

@@ -1,45 +1,47 @@
+import { IssuePaperStatus } from '@/constants/enumerate';
 import { PageResult, PageParams } from './common';
 
 // 问题卷
 export interface IssuePaperItem {
   id: number;
   // 科目
-  subject: string;
+  subjectName: string;
+  subjectCode: string;
   // 分组序号
-  groupNo: number;
+  groupNumber: number;
   // 状态
-  status: string;
+  status: IssuePaperStatus;
   // 准考证号
-  examNo: string;
+  examNumber: string;
   // 密号
-  secretNo: string;
+  secretNumber: string;
   // 姓名
   name: string;
   // 评卷员
-  reviewer: string;
+  markLogin: string;
   // 提交时间
-  submitTime: string;
+  markTime: string;
   // 问题类型
-  issueType: string;
+  problemType: string;
   // 处理人
-  handler: string;
+  problemUserName: string;
   // 处理时间
-  handleTime: string;
+  problemRestTime: string;
 }
 export type IssuePaperListPageRes = PageResult<IssuePaperItem>;
 
 //
 export interface IssuePaperListFilter {
   // 科目
-  subject: string | null;
+  subjectCode: string | null;
   // 分组序号
-  groupNo: number | undefined;
+  groupNumber: number | undefined;
   // 问题类型
-  issueType: string;
+  problemId?: number;
   // 状态
-  status: string;
+  status?: IssuePaperStatus;
   // 密号
-  secretNo: string;
+  secretNumber?: string;
 }
 
 export type IssuePaperListPageParam = PageParams<IssuePaperListFilter>;

+ 9 - 9
src/api/types/mark.ts

@@ -69,7 +69,7 @@ export interface MarkArbitrationItem {
   // 科目代码
   subjectCode: string;
   // 分组序号
-  groupNo: number;
+  groupNumber: number;
   // 准考证号
   examCardNo: string;
   // 状态
@@ -105,11 +105,11 @@ export interface MarkTaskItem {
   // 科目代码
   subjectCode: string;
   // 分组序号
-  groupNo: number;
+  groupNumber: number;
   // 准考证号
   examCardNo: string;
   // 密号
-  secretNo: string;
+  secretNumber: string;
   // 状态
   status: string;
   // 打回原因
@@ -142,7 +142,7 @@ export interface MarkTaskListFilter {
   // 准考证号
   examCardNo?: string;
   // 密号
-  secretNo?: string;
+  secretNumber?: string;
   // 总分
   totalStartScore?: number;
   totalEndScore?: number;
@@ -167,11 +167,11 @@ export interface MarkTrialItem {
   // 科目代码
   subjectCode: string;
   // 分组序号
-  groupNo: number;
+  groupNumber: number;
   // 准考证号
   examCardNo: string;
   // 密号
-  secretNo: string;
+  secretNumber: string;
   // 评卷员
   marker: string;
   // 评卷总分
@@ -190,7 +190,7 @@ export interface MarkTrialListFilter {
   // 准考证号
   examCardNo?: string;
   // 密号
-  secretNo?: string;
+  secretNumber?: string;
 }
 export type MarkTrialListPageParam = PageParams<MarkTrialListFilter>;
 
@@ -237,7 +237,7 @@ export type MarkMarkerListPageParam = PageParams<MarkMarkerListFilter>;
 export interface MarkGroupItem {
   id: number;
   // 分组序号
-  groupNo: number;
+  groupNumber: number;
   // 大题号
   questionNo: string;
   // 大题名称
@@ -275,7 +275,7 @@ export interface MarkGroupUpdateParams {
   id?: number;
   subjectCode: string;
   // 分组序号
-  groupNo: number;
+  groupNumber: number;
   // 名称
   name: string;
   // 题目

+ 2 - 2
src/api/types/review.ts

@@ -51,7 +51,7 @@ export interface FullReviewItem {
   // 科目
   courseName: string;
   // 密号
-  secretNo: string;
+  secretNumber: string;
   // 选做异常
   isOptionalException: boolean;
   // 客观分
@@ -91,7 +91,7 @@ export interface FullReviewListFilter {
   // 小题得分
   smallQuestionScore?: number;
   // 密号
-  secretNo?: string;
+  secretNumber?: string;
 }
 export type FullReviewListPageParams = PageParams<FullReviewListFilter>;
 

+ 2 - 2
src/api/types/score.ts

@@ -4,7 +4,7 @@ import { PageResult, PageParams } from './common';
 export interface ScoreItem {
   id: number;
   // 准考证号
-  examNo: string;
+  examNumber: string;
   // 姓名
   name: string;
   // 学号
@@ -44,7 +44,7 @@ export interface ScoreListFilter {
   // 姓名
   name: string;
   // 准考证号
-  examNo: string;
+  examNumber: string;
   // 学号
   studentNo: string;
   // 科目

+ 2 - 0
src/components/index.ts

@@ -13,6 +13,7 @@ import ImportDialog from './import-dialog/index.vue';
 import TableField from './table-field/index.vue';
 import PageBreadcrumb from './page-breadcrumb/index.vue';
 import SelectOption from './select-option/index.vue';
+import SelectData from './select-data/index.vue';
 
 export default {
   install(Vue: App) {
@@ -23,6 +24,7 @@ export default {
     Vue.component('SelectRangeTime', SelectRangeTime);
     Vue.component('UploadButton', UploadButton);
     Vue.component('SelectExam', SelectExam);
+    Vue.component('SelectData', SelectData);
     Vue.component('SelectOption', SelectOption);
     Vue.component('SelectSubject', SelectSubject);
     Vue.component('ImportDialog', ImportDialog);

+ 85 - 0
src/components/select-data/index.vue

@@ -0,0 +1,85 @@
+<template>
+  <el-select
+    v-model="selected"
+    :placeholder="props.placeholder"
+    :clearable="props.clearable"
+    :disabled="props.disabled"
+    filterable
+    default-first-option
+    :multiple="false"
+    v-bind="attrs"
+    @change="onChange"
+  >
+    <el-option
+      v-for="item in optionList"
+      :key="item.value"
+      :label="item.label"
+      :value="item.value"
+    />
+  </el-select>
+</template>
+
+<script setup lang="ts">
+  import { ref, useAttrs, watch } from 'vue';
+  import useSearch, { SelectType } from './search';
+
+  defineOptions({
+    name: 'SelectData',
+  });
+
+  type ValueType = number | Array<number> | null;
+
+  const props = withDefaults(
+    defineProps<{
+      modelValue: ValueType;
+      clearable?: boolean;
+      disabled?: boolean;
+      placeholder?: string;
+      type: SelectType;
+      params?: Record<string, any>;
+    }>(),
+    {
+      clearable: true,
+      disabled: false,
+      placeholder: '请选择',
+    }
+  );
+  const emit = defineEmits(['update:modelValue', 'change']);
+  const attrs = useAttrs();
+
+  const selected = ref<number | Array<number> | undefined>();
+  const { optionList, search } = useSearch(props.type);
+  search(props.params);
+
+  const onChange = () => {
+    const selectedData = optionList.value.filter(
+      (item) => selected.value === item.value
+    );
+    emit('update:modelValue', selectedData[0].value || null);
+    emit('change', selectedData[0]);
+  };
+
+  watch(
+    () => props.params,
+    (val, oldval) => {
+      if (!val) return;
+
+      if (JSON.stringify(val) !== JSON.stringify(oldval)) {
+        search(val);
+      }
+    },
+    {
+      deep: true,
+    }
+  );
+
+  watch(
+    () => props.modelValue,
+    (val) => {
+      selected.value = val || undefined;
+    },
+    {
+      immediate: true,
+    }
+  );
+</script>

+ 71 - 0
src/components/select-data/search.ts

@@ -0,0 +1,71 @@
+import axios from 'axios';
+import { ref } from 'vue';
+
+import useLoading from '@/hooks/loading';
+
+export interface OptionListItem {
+  value: number;
+  label: string;
+}
+type TransformType = (item: Record<string, any>) => OptionListItem;
+
+type ConfigItem = string | { url: string; transform?: TransformType };
+
+const defaultTransform = (item: {
+  id: number;
+  name: string;
+}): OptionListItem => ({
+  value: item.id,
+  label: item.name,
+});
+
+export type SelectType = 'problemType' | 'rejectType';
+
+const selectConfig: Record<SelectType, ConfigItem> = {
+  // 问题卷分类
+  problemType: '/api/admin/exam/problem/type/list',
+  // 打回卷分类
+  rejectType: '/api/admin/exam/reject/type/find',
+};
+
+export default function useSearch(type: SelectType) {
+  const { loading, setLoading } = useLoading();
+  const optionList = ref<OptionListItem[]>([]);
+
+  async function search(params?: Record<string, any>) {
+    if (loading.value) return;
+    const config = selectConfig[type];
+    if (!config) {
+      console.error('下拉列表类型错误!');
+      return;
+    }
+
+    try {
+      setLoading(true);
+      let url = '';
+      if (typeof config === 'string') {
+        url = config;
+      } else {
+        url = config.url;
+      }
+      const res = (await axios.post(url, {}, { params })) as Array<
+        Record<string, any>
+      >;
+
+      const transform = config.transform
+        ? (config.transform as TransformType)
+        : defaultTransform;
+      optionList.value = res.map(transform);
+    } catch (error) {
+      console.error(error);
+    } finally {
+      setLoading(false);
+    }
+  }
+
+  return {
+    loading,
+    optionList,
+    search,
+  };
+}

+ 2 - 1
src/components/select-option/search.ts

@@ -21,7 +21,7 @@ const selectConfig = {
 export type SelectType = keyof typeof selectConfig;
 
 export interface OptionListItem {
-  value: number;
+  value: string;
   label: string;
 }
 
@@ -30,6 +30,7 @@ export default function useSearch(type: SelectType) {
   const optionList = ref<OptionListItem[]>([]);
 
   async function search(params?: Record<string, any>) {
+    if (loading.value) return;
     if (!selectConfig[type]) {
       console.error('下拉列表类型错误!');
       return;

+ 7 - 0
src/constants/enumerate.ts

@@ -147,3 +147,10 @@ export const OBJECTIVE_POLICY = {
   LEAK: '漏选给分',
 };
 export type ObjectivePolicy = keyof typeof OBJECTIVE_POLICY;
+
+// 问题卷状态:WAITING:待处理,BACK:已处理
+export const ISSUE_PAPER_STATUS = {
+  WAITING: '待处理',
+  BACK: '已处理',
+};
+export type IssuePaperStatus = keyof typeof ISSUE_PAPER_STATUS;

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

@@ -22,6 +22,7 @@ import {
 } from '@/api/subject';
 import { exportScanStatByPoint, exportScanStatByCourse } from '@/api/scan';
 import { exportRejectStat, exportRejectRecord } from '@/api/reject';
+import { exportIssuePaper } from '@/api/issue-paper';
 
 import useLoading from '@/hooks/loading';
 
@@ -72,6 +73,9 @@ const downloadConfig = {
   exportRejectStat,
   // 导出打回记录
   exportRejectRecord,
+  // issue paper
+  // 导出问题卷
+  exportIssuePaper,
 };
 type DownloadType = keyof typeof downloadConfig;
 

+ 3 - 0
src/utils/filter.ts

@@ -8,6 +8,7 @@ import {
   OPTIONAL_SCORE_RULE,
   USER_SOURCE,
   EXAM_STATUS,
+  ISSUE_PAPER_STATUS,
 } from '@/constants/enumerate';
 import { formatDate } from './utils';
 
@@ -30,6 +31,8 @@ export const dictFilter = {
     USER_SOURCE[val as keyof typeof USER_SOURCE] || DEFAULT_LABEL,
   examStatus: (val: string) =>
     EXAM_STATUS[val as keyof typeof EXAM_STATUS] || DEFAULT_LABEL,
+  issuePaperStatus: (val: string) =>
+    ISSUE_PAPER_STATUS[val as keyof typeof ISSUE_PAPER_STATUS] || DEFAULT_LABEL,
 };
 
 // 时间戳过滤器

+ 36 - 46
src/views/issue-paper/IssuePaper.vue

@@ -2,11 +2,11 @@
   <div class="part-box is-filter">
     <el-form inline>
       <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-select
-          v-model="searchModel.groupNo"
+          v-model="searchModel.groupNumber"
           placeholder="请选择"
           clearable
           style="width: 120px"
@@ -16,15 +16,8 @@
         </el-select>
       </el-form-item>
       <el-form-item label="问题">
-        <el-select
-          v-model="searchModel.issueType"
-          placeholder="请选择"
-          clearable
-          style="width: 120px"
-        >
-          <el-option label="请选择" value="" />
-          <!-- TODO: 添加问题类型选项 -->
-        </el-select>
+        <Select-data v-model="searchModel.problemId" type="problemType">
+        </Select-data>
       </el-form-item>
       <el-form-item label="状态">
         <el-select
@@ -33,13 +26,17 @@
           clearable
           style="width: 120px"
         >
-          <el-option label="请选择" value="" />
-          <!-- TODO: 添加状态选项 -->
+          <el-option
+            v-for="(label, value) in ISSUE_PAPER_STATUS"
+            :key="value"
+            :label="label"
+            :value="value"
+          />
         </el-select>
       </el-form-item>
       <el-form-item label="密号">
         <el-input
-          v-model="searchModel.secretNo"
+          v-model="searchModel.secretNumber"
           placeholder="请输入密号"
           clearable
           style="width: 120px"
@@ -69,23 +66,27 @@
       @selection-change="handleSelectionChange"
     >
       <el-table-column type="selection" width="55" />
-      <el-table-column prop="subject" label="科目" min-width="120" />
-      <el-table-column prop="groupNo" label="分组序号" min-width="100" />
+      <el-table-column prop="subjectName" label="科目" min-width="120" />
+      <el-table-column prop="groupNumber" label="分组序号" min-width="100" />
       <el-table-column prop="status" label="状态" min-width="100">
         <template #default="scope">
-          <el-tag :type="getStatusType(scope.row.status)">
-            {{ scope.row.status }}
+          <el-tag>
+            {{ dictFilter.issuePaperStatus(scope.row.status) }}
           </el-tag>
         </template>
       </el-table-column>
-      <el-table-column prop="examNo" label="准考证号" min-width="120" />
-      <el-table-column prop="secretNo" label="密号" min-width="100" />
+      <el-table-column prop="examNumber" label="准考证号" min-width="120" />
+      <el-table-column prop="secretNumber" label="密号" min-width="100" />
       <el-table-column prop="name" label="姓名" min-width="100" />
-      <el-table-column prop="reviewer" label="评卷员" min-width="100" />
-      <el-table-column prop="submitTime" label="提交时间" min-width="150" />
-      <el-table-column prop="issueType" label="问题类型" min-width="120" />
-      <el-table-column prop="handler" label="处理人" min-width="100" />
-      <el-table-column prop="handleTime" label="处理时间" min-width="150" />
+      <el-table-column prop="markLogin" label="评卷员" min-width="100" />
+      <el-table-column prop="markTime" label="提交时间" min-width="150" />
+      <el-table-column prop="problemType" label="问题类型" min-width="120" />
+      <el-table-column prop="problemUserName" label="处理人" min-width="100" />
+      <el-table-column
+        prop="problemRestTime"
+        label="处理时间"
+        min-width="150"
+      />
       <el-table-column label="操作" width="120" fixed="right">
         <template #default="scope">
           <el-button
@@ -128,6 +129,9 @@
   } from '@/api/types/issue-paper';
   import useTable from '@/hooks/table';
   import { modalConfirm } from '@/utils/ui';
+  import { ISSUE_PAPER_STATUS } from '@/constants/enumerate';
+  import { dictFilter } from '@/utils/filter';
+  import { downloadExport } from '@/utils/download-export';
 
   defineOptions({
     name: 'IssuePaperQuery',
@@ -136,11 +140,11 @@
   const tableRef = ref<InstanceType<typeof ElTable>>();
 
   const searchModel = reactive<IssuePaperListFilter>({
-    subject: null,
-    groupNo: undefined,
-    issueType: '',
-    status: '',
-    secretNo: '',
+    subjectCode: null,
+    groupNumber: undefined,
+    problemId: undefined,
+    status: undefined,
+    secretNumber: '',
   });
 
   const {
@@ -153,19 +157,6 @@
     handleSelectionChange,
   } = useTable<IssuePaperItem>(getIssuePaperList, searchModel, false);
 
-  function getStatusType(status: string) {
-    switch (status) {
-      case '已处理':
-        return 'success';
-      case '处理中':
-        return 'warning';
-      case '待处理':
-        return 'danger';
-      default:
-        return 'info';
-    }
-  }
-
   async function batchReset() {
     if (selectedRows.value.length === 0) {
       ElMessage.warning('请选择要重置的数据');
@@ -212,9 +203,8 @@
     }
   }
 
-  function exportData() {
-    // TODO: 实现导出功能
-    console.log('导出问题卷数据');
+  async function exportData() {
+    await downloadExport('exportIssuePaper', searchModel);
   }
 
   function viewDetail(row: IssuePaperItem) {

+ 6 - 1
src/views/mark/ArbitrationManage.vue

@@ -58,7 +58,12 @@
     >
       <el-table-column type="selection" width="55" />
       <el-table-column prop="subjectCode" label="科目代码" min-width="200" />
-      <el-table-column prop="groupNo" label="分组序号" width="110" sortable />
+      <el-table-column
+        prop="groupNumber"
+        label="分组序号"
+        width="110"
+        sortable
+      />
       <el-table-column prop="examCardNo" label="准考证号" width="150" />
       <el-table-column label="状态" width="100" sortable>
         <template #default="scope">

+ 2 - 2
src/views/mark/GroupManage.vue

@@ -25,7 +25,7 @@
       @selection-change="handleSelectionChange"
     >
       <el-table-column type="selection" width="55" />
-      <el-table-column prop="groupNo" label="分组序号" width="100" />
+      <el-table-column prop="groupNumber" label="分组序号" width="100" />
       <el-table-column prop="questionNo" label="大题号" width="100" />
       <el-table-column
         prop="questionName"
@@ -147,7 +147,7 @@
 
   // 修改分组
   function onEdit(row: MarkGroupItem) {
-    ElMessage.info(`修改分组:${row.groupNo}`);
+    ElMessage.info(`修改分组:${row.groupNumber}`);
     // TODO: 实现修改分组的逻辑,功能空着留着后面做
   }
 

+ 9 - 4
src/views/mark/TaskManage.vue

@@ -45,7 +45,7 @@
       </el-form-item>
       <el-form-item label="密号">
         <el-input
-          v-model.trim="searchModel.secretNo"
+          v-model.trim="searchModel.secretNumber"
           placeholder="请输入密号"
           clearable
           style="width: 120px"
@@ -115,9 +115,14 @@
       @sort-change="handleSortChange"
     >
       <el-table-column prop="subjectCode" label="科目代码" min-width="200" />
-      <el-table-column prop="groupNo" label="分组序号" width="110" sortable />
+      <el-table-column
+        prop="groupNumber"
+        label="分组序号"
+        width="110"
+        sortable
+      />
       <el-table-column prop="examCardNo" label="准考证号" width="150" />
-      <el-table-column prop="secretNo" label="密号" width="120" />
+      <el-table-column prop="secretNumber" label="密号" width="120" />
       <el-table-column label="状态" width="100" sortable>
         <template #default="scope">
           <el-tag :type="getStatusType(scope.row.status)" size="small">
@@ -218,7 +223,7 @@
     markerId: undefined,
     optional: undefined,
     examCardNo: '',
-    secretNo: '',
+    secretNumber: '',
     totalStartScore: undefined,
     totalEndScore: undefined,
     smallQuestionScore: undefined,

+ 9 - 4
src/views/mark/TrialManage.vue

@@ -24,7 +24,7 @@
       </el-form-item>
       <el-form-item label="密号">
         <el-input
-          v-model.trim="searchModel.secretNo"
+          v-model.trim="searchModel.secretNumber"
           placeholder="请输入密号"
           clearable
           style="width: 120px"
@@ -49,9 +49,14 @@
       @sort-change="handleSortChange"
     >
       <el-table-column prop="subjectCode" label="科目代码" min-width="200" />
-      <el-table-column prop="groupNo" label="分组序号" width="110" sortable />
+      <el-table-column
+        prop="groupNumber"
+        label="分组序号"
+        width="110"
+        sortable
+      />
       <el-table-column prop="examCardNo" label="准考证号" width="150" />
-      <el-table-column prop="secretNo" label="密号" width="120" />
+      <el-table-column prop="secretNumber" label="密号" width="120" />
       <el-table-column prop="marker" label="评卷员" width="120" sortable />
       <el-table-column
         prop="totalScore"
@@ -110,7 +115,7 @@
     subject: null,
     group: '',
     examCardNo: '',
-    secretNo: '',
+    secretNumber: '',
   });
 
   const {

+ 1 - 1
src/views/mark/group-edit/GroupEdit.vue

@@ -93,7 +93,7 @@
     return {
       id: route.params?.groupId,
       subjectCode: route.params.subjectCode,
-      groupNo: 0,
+      groupNumber: 0,
       name: '',
       markingArea: [],
       questions: [],

+ 5 - 3
src/views/mark/group-edit/GroupRuleForm.vue

@@ -5,9 +5,9 @@
     :rules="formRules"
     label-width="120px"
   >
-    <el-form-item label="分组序号" prop="groupNo">
+    <el-form-item label="分组序号" prop="groupNumber">
       <el-input-number
-        v-model="formModel.groupNo"
+        v-model="formModel.groupNumber"
         :min="1"
         :max="99"
         :step="1"
@@ -226,7 +226,9 @@
   const formModel = ref<MarkGroupUpdateParams>({ ...props.modelValue });
 
   const formRules: FormRules<keyof MarkGroupUpdateParams> = {
-    groupNo: [{ required: true, message: '请输入分组序号', trigger: 'change' }],
+    groupNumber: [
+      { required: true, message: '请输入分组序号', trigger: 'change' },
+    ],
     name: [{ required: true, message: '请输入分组名称', trigger: 'change' }],
     arbitrationType: [{ required: true, message: '请选择', trigger: 'change' }],
     combinationStrategy: [

+ 3 - 3
src/views/review/AllReview.vue

@@ -148,7 +148,7 @@
       </el-form-item>
       <el-form-item label="密号">
         <el-input
-          v-model.trim="searchModel.secretNo"
+          v-model.trim="searchModel.secretNumber"
           placeholder=""
           clearable
           style="width: 120px"
@@ -200,7 +200,7 @@
         min-width="200"
         sortable
       />
-      <el-table-column prop="secretNo" label="密号" width="120" />
+      <el-table-column prop="secretNumber" label="密号" width="120" />
       <el-table-column label="选做异常" width="100">
         <template #default="scope">
           <el-tag :type="scope.row.isOptionalException ? 'warning' : 'success'">
@@ -278,7 +278,7 @@
     bigQuestionStartScore: undefined,
     bigQuestionEndScore: undefined,
     smallQuestionScore: undefined,
-    secretNo: undefined,
+    secretNumber: undefined,
   });
 
   const {

+ 3 - 3
src/views/score/ScoreQuery.vue

@@ -3,7 +3,7 @@
     <el-form inline>
       <el-form-item label="准考证号">
         <el-input
-          v-model="searchModel.examNo"
+          v-model="searchModel.examNumber"
           placeholder="请输入准考证号"
           clearable
           style="width: 150px"
@@ -165,7 +165,7 @@
       stripe
       @sort-change="handleSortChange"
     >
-      <el-table-column prop="examNo" label="准考证号" width="120" />
+      <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" sortable />
       <el-table-column prop="subject" label="科目" min-width="200" />
@@ -251,7 +251,7 @@
 
   const searchModel = reactive<ScoreListFilter>({
     name: '',
-    examNo: '',
+    examNumber: '',
     studentNo: '',
     subject: null,
     filterType: '',