刘洋 2 ani în urmă
părinte
comite
fc327f2ed0

+ 2 - 0
src/api/api-types/statistics.d.ts

@@ -6,6 +6,8 @@ export namespace Statistics {
     subjectCode?: string
     questionMainNumber?: number
     markingGroupNumbers?: number[]
+    startTime?: string
+    endTime?: string
   }
 
   /** 质量统计-自查一致性分析 */

BIN
src/assets/images/logo.png


+ 9 - 3
src/assets/styles/element/custom.scss

@@ -210,9 +210,15 @@ button.el-button {
   box-shadow: 0 0 0 1px #ddd inset !important;
 }
 
-.el-table__body tr.current-row > td.el-table__cell{
-  background-color: #A1D6FF !important;
-}
+
+// .el-table--striped .el-table__body tr.el-table__row--striped.current-row td.el-table__cell,.el-table__body tr.el-table__row--striped.current-row td.el-table__cell,.el-table__body tr.current-row > td.el-table__cell{
+//   background-color: #A1D6FF;
+
+// }
+
+// .el-table__body tr.current-row > td.el-table__cell{
+//   background-color: #A1D6FF;
+// }
 
 
 

+ 9 - 6
src/components/shared/ImagePreview.vue

@@ -22,14 +22,17 @@ const visible = useVModel(props)
   margin-left: 70%;
   .preview-content {
     width: 100%;
-    min-width: 200px;
-    max-width: 400px;
+    min-width: 250px;
+    // max-width: 400px;
     text-align: center;
-    min-height: 400px;
-    max-height: 600px;
+    min-height: 40vh;
+    // max-height: 600px;
+    // max-height: calc(50vh - 50px);
     img {
-      width: 100%;
-      height: 100%;
+      // width: 100%;
+      // height: 100%;
+      height: calc(50vh - 50px);
+      width: auto;
       object-fit: contain;
     }
   }

+ 13 - 0
src/components/shared/MarkHeader.vue

@@ -30,6 +30,10 @@
         <el-icon><close /></el-icon>
       </div>
     </div>
+
+    <base-dialog v-model="standardVisible" title="评分标准" width="90vw" center :footer="false">
+      <iframe style="width: 100%; height: calc(100vh - 100px)" :src="standardRes?.url" alt="" />
+    </base-dialog>
   </div>
 </template>
 
@@ -46,6 +50,8 @@ import { ElIcon } from 'element-plus'
 import { Close } from '@element-plus/icons-vue'
 import { logout } from '@/utils/shared'
 import { sessionStorage } from '@/plugins/storage'
+import useFetch from '@/hooks/useFetch'
+import BaseDialog from '@/components/element/BaseDialog.vue'
 type ButtonType =
   | 'back'
   | 'scale-up'
@@ -87,6 +93,7 @@ const emits = defineEmits<{
   (e: 'front-color', color: number[]): void
   (e: 'background-color', color: number[]): void
 }>()
+const standardVisible = ref(false)
 
 const props = defineProps<{
   excludeOperations?: ButtonType[]
@@ -218,6 +225,10 @@ const onOperationClick = (button: HeaderButton) => {
 }
 
 const emitEvent = (type: EventType, val?: string | number | boolean | number[]) => {
+  if (type === 'standard') {
+    standardVisible.value = true
+    return
+  }
   if (attrs['on' + type.replace(/^\S/, (s) => s.toUpperCase())]) {
     emits(type, val as any)
   }
@@ -278,6 +289,8 @@ const willLogout = async () => {
 //     })
 //   }
 // })
+const { fetch: fetchStandard, result: standardRes } = useFetch('getMarkingStandard')
+fetchStandard()
 </script>
 
 <style scoped lang="scss">

+ 11 - 3
src/components/shared/ScoringPanel.vue

@@ -3,7 +3,7 @@
     v-model="modalVisible"
     title="键盘给分"
     modal-class="no-mask"
-    :width="'560px'"
+    :width="'388px'"
     :modal="false"
     :can-resize="true"
     class="keybord-dialog"
@@ -44,7 +44,7 @@ import ScoringPanelItem from './ScoringPanelItem.vue'
 import useVModel from '@/hooks/useVModel'
 import useVW from '@/hooks/useVW'
 import useFetch from '@/hooks/useFetch'
-
+import { sessionStorage } from '@/plugins/storage'
 const props = withDefaults(
   defineProps<{
     /** 弹窗模式? */
@@ -94,7 +94,9 @@ const scoreValidFail = ref<boolean[]>([])
 
 watch(modalVisible, (val) => {
   activeIndex.value = 0
-  dialogMode.value = dialogModeBeforeSubmit.value
+  let sessionKeyboardShowType = sessionStorage.get('dialogModeBeforeSubmit')
+  dialogMode.value =
+    typeof sessionKeyboardShowType === 'boolean' ? sessionKeyboardShowType : dialogModeBeforeSubmit.value
 })
 
 const { fetch: getQuestionStruct, reset: resetQuestionStruct, result: questionStruct } = useFetch('getQuestionStruct')
@@ -145,6 +147,8 @@ const onSubmit = () => {
 
 const onEnter = (index: number) => {
   dialogModeBeforeSubmit.value = dialogMode.value
+  sessionStorage.set('dialogModeBeforeSubmit', dialogModeBeforeSubmit.value)
+
   nextTick(() => {
     console.log('index:', index)
     console.log('scoreValues.value.length:', scoreValues.value.length)
@@ -178,6 +182,10 @@ const onBlur = (index: number) => {
 }
 
 const onToggleClick = () => {
+  if (modalVisible.value) {
+    dialogModeBeforeSubmit.value = dialogMode.value ? false : true
+    sessionStorage.set('dialogModeBeforeSubmit', dialogModeBeforeSubmit.value)
+  }
   dialogMode.value = props.toggleModal ? !dialogMode.value : dialogMode.value
   if (!props.toggleModal) {
     modalVisible.value = false

+ 3 - 2
src/directives/dialogResize.ts

@@ -7,8 +7,8 @@ export const dialogResize = {
     // 初始化不最大化
     el.fullscreen = false
     // 弹框可拉伸最小宽高
-    const minWidth = 410
-    const minHeight = 285
+    const minWidth = 336
+    const minHeight = 290
     // 当前宽高
     const nowWidth = minWidth
     // eslint-disable-next-line no-unused-vars
@@ -26,6 +26,7 @@ export const dialogResize = {
     console.log(el)
     // 给弹窗加上overflow auto;不然缩小时框内的标签可能超出dialog;
     // dragDom.style.overflow = 'auto'
+    dragDom.style.background = '#fff'
 
     const keyboardPositions = localStorage.getItem('cet-keyboard-positions')
     const keyboardResize = localStorage.getItem('cet-keyboard-resize')

+ 8 - 1
src/layout/main/MenuItem.vue

@@ -25,7 +25,7 @@
     :index="menuInfo.index"
     popper-class="main-layout-submenu-popper"
     class="main-layout-sub-menu"
-    :class="{ 'is-collapse': mainLayoutStore.collapse, 'active-index': currentIndex?.startsWith(menu.index) }"
+    :class="{ 'is-collapse': mainLayoutStore.collapse, 'active-index': checkActive() }"
   >
     <template #title>
       <div class="flex items-center flex-1 main-layout-sub-menu-title" :class="{ 'menu-padding-left': hasChildren }">
@@ -67,10 +67,17 @@ const props = defineProps<{
 }>()
 
 const menuInfo = computed(() => {
+  console.log('menuInfo:', { ...props.menu, children: props.menu.children || [] })
   return { ...props.menu, children: props.menu.children || [] }
 })
 
 const hasChildren = computed(() => !!menuInfo.value.children.length)
+const checkActive = () => {
+  if (props.currentIndex?.startsWith('marking_standard') && props.menu.index === 'marking') {
+    return false
+  }
+  return props.currentIndex?.startsWith(props.menu.index)
+}
 </script>
 
 <style scoped lang="scss">

+ 3 - 2
src/layout/main/index.vue

@@ -2,8 +2,9 @@
   <div class="flex main-layout">
     <div class="flex direction-column main-layout-left" :class="{ 'is-collapse': mainLayoutStore.collapse }">
       <div class="drag flex items-center justify-center dou-yu main-layout-left-logo">
-        <span>CET</span>
-        <span v-show="!mainLayoutStore.collapse"> 电子阅卷</span>
+        <span v-if="mainLayoutStore.collapse">CET</span>
+        <img v-else src="../../assets/images/logo.png" />
+        <!-- <span v-show="!mainLayoutStore.collapse"> 电子阅卷</span> -->
       </div>
       <div class="flex-1 scroll-y-auto">
         <left-menu></left-menu>

+ 3 - 3
src/modules/analysis/group-monitoring-detail/index.vue

@@ -6,7 +6,7 @@
       <user-info></user-info>
     </div>
     <div class="flex fill-blank detail-info">
-      <div class="flex-1 flex p-base detail-info-chart">
+      <div class="flex p-base detail-info-chart" style="width: 50%">
         <div class="flex-1">
           <vue-echarts class="full" :option="markerSubjectiveChartsOption"></vue-echarts>
         </div>
@@ -14,8 +14,8 @@
           <vue-echarts class="full" :option="markerObjectiveChartsOption"></vue-echarts>
         </div>
       </div>
-      <div class="flex direction-column flex-1 p-extra-small" style="width: 720px">
-        <div class="flex items-center justify-between detail-info-table-header">
+      <div class="flex direction-column p-extra-small" style="width: 50%">
+        <div class="flex items-center justify-between detail-info-table-header m-b-mini">
           <el-button custom-1 size="small" class="detail-info-label">
             <span class="">{{ dataType }}试卷总数:</span>
             <span class="m-l-extra-small detail-info-label-num">{{ total }}</span>

+ 11 - 3
src/modules/analysis/marker-statistics/index.vue

@@ -9,7 +9,7 @@
       <div class="fill-blank p-t-medium-base filter-header">
         <base-form size="small" :items="formItems" :model="model">
           <template #form-item-search>
-            <el-button type="primary" @click="onSearch">刷新</el-button>
+            <el-button type="primary" :loading="loading1 || loading2" @click="onSearch">刷新</el-button>
           </template>
         </base-form>
       </div>
@@ -95,8 +95,16 @@ const formItems: EpFormItem[] = [
   },
 ]
 
-const { fetch: getStatisticObjectiveByMarker, result: objectiveByMarker } = useFetch('getStatisticObjectiveByMarker')
-const { fetch: getStatisticSubjectiveByMarker, result: subjectiveByMarker } = useFetch('getStatisticSubjectiveByMarker')
+const {
+  fetch: getStatisticObjectiveByMarker,
+  result: objectiveByMarker,
+  loading: loading1,
+} = useFetch('getStatisticObjectiveByMarker')
+const {
+  fetch: getStatisticSubjectiveByMarker,
+  result: subjectiveByMarker,
+  loading: loading2,
+} = useFetch('getStatisticSubjectiveByMarker')
 
 type TableDataType = ExtractArrayValue<ExtractApiResponse<'getStatisticObjectiveByMarker'>['segmentsByAll']> & {
   groupCount: number

+ 11 - 1
src/modules/analysis/monitoring/index.vue

@@ -307,8 +307,18 @@ const sortableResult = computed<typeof result.value>(() => {
 })
 
 const onRefresh = () => {
+  let date = new Date()
+  let year = date.getFullYear()
+  let month: number | string = date.getMonth() + 1
+  let day: number | string = date.getDate()
+  month < 10 && (month = '0' + month)
+  day < 10 && (day = '0' + day)
   if (fetchModel.subjectCode && fetchModel.questionMainNumber) {
-    fetch(omit(fetchModel, 'refresh'))
+    fetch({
+      ...omit(fetchModel, 'refresh'),
+      startTime: `${year}${month}${day}000000`,
+      endTime: `${year}${month}${day}235959`,
+    })
   }
 }
 

+ 1 - 1
src/modules/analysis/personnel-statistics/components/StatisticsGroup.vue

@@ -89,7 +89,7 @@ const columns: EpTableColumn<ExtractArrayValue<ExtractApiResponse<'getStatistics
   { align: 'center', label: '速度', prop: 'markingRate', width: 66 },
   { align: 'center', label: '综合系数', prop: 'integration', width: 90 },
 ].map((col: any) => {
-  if (!['小组', '评卷员'].includes(col.label)) col.sortable = true
+  if (!['小组'].includes(col.label)) col.sortable = true
   return col
 })
 

+ 1 - 1
src/modules/analysis/personnel-statistics/components/StatisticsPersonnel.vue

@@ -139,7 +139,7 @@ const columns: EpTableColumn<ExtractArrayValue<ExtractApiResponse<'getStatistics
   { align: 'center', label: '速度', prop: 'markingRate', width: 66 },
   { align: 'center', label: '综合系数', prop: 'integration', width: 90 },
 ].map((col: any) => {
-  if (!['小组', '评卷员'].includes(col.label)) col.sortable = true
+  if (!['小组'].includes(col.label)) col.sortable = true
   return col
 })
 const visable = ref(false)

+ 38 - 6
src/modules/bootstrap/change-password/index.vue

@@ -4,6 +4,16 @@
       <div class="p-l-large change-pwd-modal-header">请修改密码</div>
       <div class="change-pwd-modal-content">
         <base-form ref="formRef" :model="userModel" :rules="rules" :items="items" :label-width="'90px'" size="large">
+          <template #form-item-repassword>
+            <el-input
+              ref="rePwdRef"
+              v-model="userModel.rePassword"
+              type="password"
+              clearable
+              show-password
+              @keydown="rePwdKeyDown"
+            ></el-input>
+          </template>
           <template #form-item-confirm>
             <confirm-button class="m-t-large" size="large" @confirm="onSubmit" @cancel="onCancel"></confirm-button>
           </template>
@@ -14,8 +24,8 @@
 </template>
 
 <script setup lang="ts" name="ChangePassword">
-import { reactive, watch } from 'vue'
-import { ElMessage } from 'element-plus'
+import { reactive, watch, ref } from 'vue'
+import { ElMessage, ElInput } from 'element-plus'
 import useFetch from '@/hooks/useFetch'
 import useVModel from '@/hooks/useVModel'
 import useVW from '@/hooks/useVW'
@@ -30,7 +40,8 @@ const { push, replace } = useRouter()
 const route = useRoute()
 const { formRef, elFormRef } = useForm()
 const mainStore = useMainStore()
-const userModel = reactive<{ password: string; rePassword?: string }>({
+const rePwdRef = ref(null)
+const userModel = reactive<{ password: string; rePassword: string }>({
   password: '',
   rePassword: '',
 })
@@ -56,10 +67,31 @@ const rules: EpFormRules = {
     },
   ],
 }
-
+const rePwdKeyDown = (e: any) => {
+  if (e.key === 'Enter') {
+    onSubmit()
+  }
+}
 const items: EpFormItem[] = [
-  { label: '新密码', prop: 'password', slotType: 'input', slot: { type: 'password' } },
-  { label: '确认密码', prop: 'rePassword', slotType: 'input', slot: { type: 'password' } },
+  {
+    label: '新密码',
+    prop: 'password',
+    slotType: 'input',
+    slot: {
+      type: 'password',
+      onKeydown(event: any) {
+        if (event.keyCode == 13) {
+          if (userModel.rePassword.length > 0) {
+            onSubmit()
+          } else {
+            ;(rePwdRef.value as any).ref.focus()
+          }
+        }
+      },
+    },
+  },
+  // { label: '确认密码', prop: 'rePassword', slotType: 'input', slot: { type: 'password' } },
+  { label: '确认密码', prop: 'rePassword', slotName: 'repassword' },
   { slotName: 'confirm' },
 ]
 const onCancel = () => {

+ 5 - 0
src/modules/bootstrap/init-name/index.vue

@@ -46,6 +46,11 @@ const items: EpFormItem[] = [
     slotType: 'input',
     slot: {
       placeholder: '请输入你的姓名',
+      onKeydown(event: any) {
+        if (event.keyCode == 13) {
+          onSubmit()
+        }
+      },
     },
   },
 ]

+ 9 - 9
src/modules/expert/assess/index.vue

@@ -20,6 +20,15 @@
         <div class="flex-1 p-base scroll-auto mark-content-paper">
           <img :src="dataUrl" alt="" class="paper-img" :style="{ 'background-color': frontColor }" />
         </div>
+        <scoring-panel-with-confirm
+          v-model:visible="editScoreVisible"
+          v-model:score="modelScore"
+          :main-number="currentAssessPaper?.mainNumber"
+          modal
+          :toggle-modal="false"
+          :auto-visible="false"
+          @submit="onSubmit"
+        ></scoring-panel-with-confirm>
       </div>
       <div class="flex direction-column p-base radius-base fill-blank m-l-base table-view">
         <base-form size="small" :model="formModel" :items="formItems" :label-width="'52px'">
@@ -50,15 +59,6 @@
     </div>
   </div>
   <image-preview v-model="previewModalVisible" :url="currentAssessPaper?.filePath"></image-preview>
-  <scoring-panel-with-confirm
-    v-model:visible="editScoreVisible"
-    v-model:score="modelScore"
-    :main-number="currentAssessPaper?.mainNumber"
-    modal
-    :toggle-modal="false"
-    :auto-visible="false"
-    @submit="onSubmit"
-  ></scoring-panel-with-confirm>
 </template>
 
 <script setup lang="ts" name="ExpertAssess">

+ 9 - 9
src/modules/expert/expert/index.vue

@@ -20,6 +20,15 @@
         <div class="flex-1 p-base scroll-auto mark-content-paper">
           <img :src="dataUrl" alt="" class="paper-img" :style="{ 'background-color': frontColor }" />
         </div>
+        <scoring-panel-with-confirm
+          v-model:visible="editScoreVisible"
+          v-model:score="modelScore"
+          modal
+          :toggle-modal="false"
+          :auto-visible="false"
+          :main-number="currentExpertPaper?.mainNumber"
+          @submit="onSubmit"
+        ></scoring-panel-with-confirm>
       </div>
       <div class="flex direction-column p-base radius-base fill-blank m-l-base table-view">
         <base-form size="small" :model="formModel" :items="formItems" :label-width="'72px'">
@@ -50,15 +59,6 @@
     </div>
   </div>
   <image-preview v-model="previewModalVisible" :url="currentExpertPaper?.filePath"></image-preview>
-  <scoring-panel-with-confirm
-    v-model:visible="editScoreVisible"
-    v-model:score="modelScore"
-    modal
-    :toggle-modal="false"
-    :auto-visible="false"
-    :main-number="currentExpertPaper?.mainNumber"
-    @submit="onSubmit"
-  ></scoring-panel-with-confirm>
 </template>
 
 <script setup lang="ts" name="ExpertExpert">

+ 9 - 9
src/modules/expert/sample/index.vue

@@ -20,6 +20,15 @@
         <div class="flex-1 p-base scroll-auto mark-content-paper">
           <img :src="dataUrl" alt="" class="paper-img" :style="{ 'background-color': frontColor }" />
         </div>
+        <scoring-panel-with-confirm
+          v-model:visible="editScoreVisible"
+          v-model:score="modelScore"
+          modal
+          :toggle-modal="false"
+          :auto-visible="false"
+          :main-number="currentRfPaper?.mainNumber"
+          @submit="onSubmit"
+        ></scoring-panel-with-confirm>
       </div>
       <div class="flex direction-column p-base radius-base fill-blank m-l-base table-view">
         <base-form size="small" :model="formModel" :items="formItems" :label-width="'52px'">
@@ -51,15 +60,6 @@
     </div>
   </div>
   <image-preview v-model="previewModalVisible" :url="currentRfPaper?.filePath"></image-preview>
-  <scoring-panel-with-confirm
-    v-model:visible="editScoreVisible"
-    v-model:score="modelScore"
-    modal
-    :toggle-modal="false"
-    :auto-visible="false"
-    :main-number="currentRfPaper?.mainNumber"
-    @submit="onSubmit"
-  ></scoring-panel-with-confirm>
 </template>
 
 <script setup lang="ts" name="ExpertSample">

+ 3 - 9
src/modules/marking/mark/index.vue

@@ -65,9 +65,6 @@
   </base-dialog>
   <remark-list-modal v-model="remarkModalVisible" @task-change="historyTaskChange"></remark-list-modal>
   <image-preview v-model="previewModalVisible" :url="currentTask?.url"></image-preview>
-  <base-dialog v-model="standardVisible" title="评分标准" width="90vw" center :footer="false">
-    <iframe style="width: 100%; height: calc(100vh - 100px)" :src="standardRes?.url" alt="" />
-  </base-dialog>
 </template>
 
 <script setup lang="ts" name="MarkingMark">
@@ -98,7 +95,6 @@ import SampleBStatus from '@/assets/images/status-sample-b.png'
 import type { SetImgBgOption } from '@/hooks/useSetImgBg'
 import type { ExtractApiResponse } from '@/api/api'
 import type { MarkHeaderInstance } from 'global-type'
-const standardVisible = ref(false)
 const { push, replace } = useRouter()
 
 const { getSpentTime, resume } = useSpentTime()
@@ -435,11 +431,9 @@ watch(currentTask, () => {
 
 onRefresh()
 
-bus.on('showStandard', () => {
-  standardVisible.value = true
-})
-const { fetch: fetchStandard, result: standardRes } = useFetch('getMarkingStandard')
-fetchStandard()
+// bus.on('showStandard', () => {
+//   standardVisible.value = true
+// })
 </script>
 
 <style scoped lang="scss">

+ 8 - 6
src/modules/monitor/training-monitoring/hooks/useFormFilter.ts

@@ -84,12 +84,13 @@ const useFormFilter = () => {
   // let isMiddleScreen = window.innerWidth<1400;
   const OneRowSpan2 = defineColumn(_, 'row-1', { span: 2 })
   const OneRowSpan3 = defineColumn(_, 'row-1', { span: 3 })
-  const OneRowSpan5 = defineColumn(_, 'row-1', { span: isSmallScreen ? 5 : 4 })
+  const OneRowSpan4 = defineColumn(_, 'row-1', { span: 4 })
+  const OneRowSpan5 = defineColumn(_, 'row-1', { span: 5 })
   // const TwoRowSpan5 = defineColumn(_, 'row-2', { span: 5 })
 
   const items = computed<EpFormItem[]>(() => {
     return [
-      OneRowSpan5({
+      OneRowSpan3({
         label: '科目',
         prop: 'subjectCode',
         slotType: 'select',
@@ -100,7 +101,7 @@ const useFormFilter = () => {
           disabled: true,
         },
       }),
-      OneRowSpan5({
+      OneRowSpan4({
         prop: 'mainNumber',
         label: '大题',
         slotType: 'select',
@@ -111,7 +112,7 @@ const useFormFilter = () => {
           disabled: true,
         },
       }),
-      OneRowSpan5({
+      OneRowSpan4({
         prop: 'markingGroupNumber',
         label: '小组',
         slotType: 'select',
@@ -122,11 +123,11 @@ const useFormFilter = () => {
         },
       }),
 
-      OneRowSpan5({
+      OneRowSpan4({
         label: '试卷类型',
         slotType: 'select',
         prop: 'markStage',
-        labelWidth: '74px',
+        labelWidth: '72px',
         slot: {
           placeholder: '试卷类型',
           options: [
@@ -141,6 +142,7 @@ const useFormFilter = () => {
             label: '强制考核组',
             slotType: 'select',
             prop: 'forceGroupNumber',
+            labelWidth: '86px',
             slot: {
               placeholder: '强制考核组',
               options: forceCheckGroup.value,

+ 6 - 2
src/modules/monitor/training-monitoring/index.vue

@@ -3,6 +3,7 @@
     <div class="p-l-base p-r-base p-t-medium-base fill-blank filter-form" style="padding-bottom: 10px">
       <base-form
         ref="formRef"
+        :key="formKey"
         size="small"
         :label-width="'100px'"
         :disabled="loading"
@@ -57,7 +58,7 @@
 
 <script setup lang="tsx" name="TrainingMonitoring">
 /** 培训监控 */
-import { computed, onBeforeUnmount, onBeforeMount, ref } from 'vue'
+import { computed, onBeforeUnmount, onBeforeMount, ref, watch } from 'vue'
 import { useRouter } from 'vue-router'
 import { ElButton, ElMessage } from 'element-plus'
 import { minus, isDefine } from '@/utils/common'
@@ -79,7 +80,10 @@ onBeforeMount(() => {
 const { push } = useRouter()
 
 const { diffShow, model, items, rules, formRef, elFormRef, onOptionInit } = useFormFilter()
-
+const formKey = ref(Date.now() + '')
+watch(rules, () => {
+  formKey.value = Date.now() + ''
+})
 /** 培训监控列表 */
 const { fetch: getTrainingMonitor, result: trainingMonitor, loading } = useFetch('getTrainingMonitor')
 /** 培训卷审核 */

+ 6 - 5
src/modules/quality/spot-check/index.vue

@@ -91,6 +91,7 @@ const columns: EpTableColumn<ExtractArrayValue<ExtractApiResponse<'statisticChec
     formatter(row) {
       return row.markerId === 0 ? '' : row.markerName
     },
+    sortable: true,
   },
   {
     label: '大题名称',
@@ -99,11 +100,11 @@ const columns: EpTableColumn<ExtractArrayValue<ExtractApiResponse<'statisticChec
       return row.markerId === 0 ? '' : row.questionMainName
     },
   },
-  { label: '主动抽查次数', prop: 'customCheckCount', align: 'center' },
-  { label: '打回量', prop: 'rejectCount', align: 'center' },
-  { label: '主动抽查给分次数', prop: 'customCheckReScoreCount', align: 'center' },
-  { label: '系统抽查复核次数', prop: 'sysCheckCount', align: 'center' },
-  { label: '系统抽查复核给分次数', prop: 'sysCheckReScoreCount', align: 'center' },
+  { label: '主动抽查次数', prop: 'customCheckCount', align: 'center', sortable: true },
+  { label: '打回量', prop: 'rejectCount', align: 'center', sortable: true },
+  { label: '主动抽查给分次数', prop: 'customCheckReScoreCount', align: 'center', sortable: true },
+  { label: '系统抽查复核次数', prop: 'sysCheckCount', align: 'center', sortable: true },
+  { label: '系统抽查复核给分次数', prop: 'sysCheckReScoreCount', align: 'center', sortable: true },
 ]
 
 const { fetch: statisticCheckOverview, result, loading } = useFetch('statisticCheckOverview')