刘洋 2 жил өмнө
parent
commit
fe1bc2cc4d

+ 4 - 0
src/api/api-types/marking.d.ts

@@ -28,6 +28,10 @@ export namespace Marking {
     timeStart?: string
     /** 密号 */
     secretNumber?: string
+    ratioStart?: number
+    ratioEnd?: number
+    objectiveScoreStart?: number
+    objectiveScoreEnd?: number
   }
 
   /** 自定义抽查任务列表 */

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

@@ -480,6 +480,8 @@ export namespace Statistics {
     secretNumber: string
     status: string
     taskId: number
+    checked?: boolean
+    corrected?: boolean
   }
 
   type GetSystemSpotList = BaseDefine<

+ 39 - 0
src/components/common/secNumberStatus.vue

@@ -0,0 +1,39 @@
+<template>
+  <span class="sec-number-box">
+    <el-tooltip
+      v-if="props.corrected || props.checked"
+      effect="light"
+      :content="props.corrected ? '已给分' : props.checked ? '已抽查' : ''"
+    >
+      <span v-if="props.corrected" class="status corrected"></span>
+      <span v-else-if="props.checked" class="status checked"></span>
+    </el-tooltip>
+    <span v-if="!props.corrected && !props.checked" class="status2"></span>
+
+    <span>{{ props.secretNumber }}</span>
+  </span>
+</template>
+<script setup lang="ts" name="SecNumberStatus">
+const props = defineProps<{ secretNumber: any; checked: boolean; corrected: boolean }>()
+</script>
+<style lang="scss" scoped>
+.sec-number-box {
+  .status,
+  .status2 {
+    display: inline-block;
+    width: 8px;
+    height: 8px;
+    border-radius: 4px;
+    background-color: transparent;
+    margin-right: 3px;
+    &.corrected {
+      background-color: #f53f3f;
+      cursor: pointer;
+    }
+    &.checked {
+      background-color: #00b42a;
+      cursor: pointer;
+    }
+  }
+}
+</style>

+ 4 - 1
src/components/shared/ScoringPanelItem.vue

@@ -46,6 +46,7 @@
             size="small"
             type="primary"
             style="min-width: 44px; margin-left: 5px; margin-bottom: 8px"
+            @click="confirmWithBtn"
             >确定</el-button
           >
         </div>
@@ -231,7 +232,9 @@ const deleteStringChart = (str: string, index: number) => {
 const joinStringChart = (str: string, index: number, chart: string) => {
   return str.substring(0, index) + chart + str.substring(index + 1)
 }
-
+const confirmWithBtn = () => {
+  emit('enter')
+}
 const onValidScore = (e: any) => {
   const target = e.target as HTMLInputElement
   const oldScore = `${currentScore.value ?? ''}`

+ 12 - 7
src/modules/analysis/group-monitoring/hooks/useFormFilter.ts

@@ -7,11 +7,16 @@ import type { EpFormItem } from 'global-type'
 import type { ExtractApiParams } from '@/api/api'
 
 const useFormFilter = () => {
-  const { subjectList, mainQuestionList, groupListWithAll, changeModelValue, dataModel, onOptionInit } = useOptions([
-    'subject',
-    'question',
-    'group',
-  ])
+  const {
+    subjectList,
+    mainQuestionList,
+    groupListWithAll,
+    changeModelValue,
+    dataModel,
+    onOptionInit,
+    isExpert,
+    isLeader,
+  } = useOptions(['subject', 'question', 'group'])
   const { formRef, elFormRef, defineColumn, _ } = useForm()
 
   const model = reactive<
@@ -45,7 +50,7 @@ const useFormFilter = () => {
       prop: 'subjectCode',
       slotType: 'select',
       slot: {
-        disabled: true,
+        disabled: !isExpert.value,
         options: subjectList.value,
         onChange: changeModelValue('subject'),
       },
@@ -55,7 +60,7 @@ const useFormFilter = () => {
       label: '大题',
       slotType: 'select',
       slot: {
-        disabled: true,
+        disabled: !isExpert.value && !isLeader.value,
         options: mainQuestionList.value,
         onChange: changeModelValue('question'),
       },

+ 12 - 7
src/modules/analysis/personnel-compare/hooks/useCompareFilter.ts

@@ -4,11 +4,16 @@ import useForm from '@/hooks/useForm'
 import { getCurDayRange } from '@/utils/common'
 import { reactive, computed, watch } from 'vue'
 const useCompareFilter = () => {
-  const { subjectList, mainQuestionList, groupListWithAll, changeModelValue, dataModel, onOptionInit } = useOptions([
-    'subject',
-    'question',
-    'group',
-  ])
+  const {
+    subjectList,
+    mainQuestionList,
+    groupListWithAll,
+    changeModelValue,
+    dataModel,
+    onOptionInit,
+    isExpert,
+    isLeader,
+  } = useOptions(['subject', 'question', 'group'])
   const curDayRange = getCurDayRange()
   const model = reactive({
     subjectCode: dataModel.subject || '',
@@ -49,7 +54,7 @@ const useCompareFilter = () => {
       slot: {
         options: subjectList.value,
         onChange: changeModelValue('subject'),
-        disabled: true,
+        disabled: !isExpert.value,
       },
     }),
     OneRowSpan4({
@@ -60,7 +65,7 @@ const useCompareFilter = () => {
       slot: {
         options: mainQuestionList.value,
         onChange: changeModelValue('question'),
-        disabled: true,
+        disabled: !isExpert.value && !isLeader.value,
       },
     }),
     OneRowSpan4({

+ 12 - 7
src/modules/analysis/personnel-statistics/hooks/useStatisticsFilter.ts

@@ -20,11 +20,16 @@ type FormMode = Omit<
 }
 
 const useStatisticsFilter = () => {
-  const { subjectList, mainQuestionList, groupListWithAll, changeModelValue, dataModel, onOptionInit } = useOptions([
-    'subject',
-    'question',
-    'group',
-  ])
+  const {
+    subjectList,
+    mainQuestionList,
+    groupListWithAll,
+    changeModelValue,
+    dataModel,
+    onOptionInit,
+    isExpert,
+    isLeader,
+  } = useOptions(['subject', 'question', 'group'])
   const curDayRange = getCurDayRange()
   const model = reactive<any>({
     subjectCode: dataModel.subject || '',
@@ -96,7 +101,7 @@ const useStatisticsFilter = () => {
       slot: {
         options: subjectList.value,
         onChange: changeModelValue('subject'),
-        disabled: true,
+        disabled: !isExpert.value,
       },
     }),
     OneRowSpan4({
@@ -107,7 +112,7 @@ const useStatisticsFilter = () => {
       slot: {
         options: mainQuestionList.value,
         onChange: changeModelValue('question'),
-        disabled: true,
+        disabled: !isExpert.value && !isLeader.value,
       },
     }),
     OneRowSpan4({

+ 12 - 7
src/modules/analysis/statistics/index.vue

@@ -54,11 +54,16 @@ import type { ExtractApiParams, ExtractApiResponse } from '@/api/api'
 
 const { push } = useRouter()
 
-const { subjectList, mainQuestionList, groupListWithAll, dataModel, changeModelValue, onOptionInit } = useOptions([
-  'subject',
-  'question',
-  'group',
-])
+const {
+  subjectList,
+  mainQuestionList,
+  groupListWithAll,
+  dataModel,
+  changeModelValue,
+  onOptionInit,
+  isExpert,
+  isLeader,
+} = useOptions(['subject', 'question', 'group'])
 
 const model = reactive<
   Omit<ExtractApiParams<'getStatistics'>, 'markingGroupNumbers'> & {
@@ -101,7 +106,7 @@ const formItems = computed<EpFormItem[]>(() => [
     slot: {
       options: subjectList.value,
       onChange: changeModelValue('subject'),
-      disabled: true,
+      disabled: !isExpert.value,
     },
   }),
   OneRowSpan4({
@@ -111,7 +116,7 @@ const formItems = computed<EpFormItem[]>(() => [
     slot: {
       options: mainQuestionList.value,
       onChange: changeModelValue('question'),
-      disabled: true,
+      disabled: !isExpert.value && !isLeader.value,
     },
   }),
   OneRowSpan4({

+ 24 - 5
src/modules/analysis/view-marked-detail/index.vue

@@ -100,7 +100,7 @@
   ></mark-history-list>
 </template>
 
-<script setup lang="ts" name="AnalysisViewMarked">
+<script setup lang="tsx" name="AnalysisViewMarked">
 // <script setup lang="ts" name="ViewMarkedDetail">
 /** 提取阅卷明细 */
 import { ref, computed, watch } from 'vue'
@@ -120,7 +120,7 @@ import SvgIcon from '@/components/common/SvgIcon.vue'
 import ImagePreview from '@/components/shared/ImagePreview.vue'
 import ScoringPanelWithConfirm from '@/components/shared/ScoringPanelWithConfirm.vue'
 import SendBackMark from '@/components/shared/SendBackMark.vue'
-
+import SecNumberStatus from '@/components/common/secNumberStatus.vue'
 import type { SetImgBgOption } from '@/hooks/useSetImgBg'
 import type { ExtractMultipleApiResponse, ExtractApiParams, ExtractApiResponse } from '@/api/api'
 import type { MarkHeaderInstance, EpTableColumn } from 'global-type'
@@ -201,11 +201,29 @@ const onOperationClick: OperationClick = ({ type, value }) => {
 }
 
 const columns: EpTableColumn<RowType>[] = [
-  { label: '评卷员', prop: 'markerName', minWidth: 90 },
-  { label: '密号', prop: 'secretNumber', minWidth: 100 },
+  {
+    label: '评卷员',
+    prop: 'markerName',
+    minWidth: 90,
+    formatter(row: any) {
+      return (
+        <SecNumberStatus
+          secretNumber={row.markerName}
+          checked={row.checked}
+          corrected={row.corrected}
+        ></SecNumberStatus>
+      )
+    },
+  },
+  {
+    label: '密号',
+    prop: 'secretNumber',
+    minWidth: 100,
+  },
   { label: '给分', prop: 'markerScore', minWidth: 70 },
   { label: '客观分', prop: 'objectiveScore', minWidth: 70 },
   { label: '客主比', prop: 'markerRatio', minWidth: 80 },
+  { label: '成绩', prop: 'markScore', minWidth: 70 },
   { label: '评卷时间', prop: 'markTime', minWidth: 130 },
 ]
 
@@ -234,7 +252,8 @@ const onSubmit = async () => {
   if (current.value) {
     const scores = JSON.parse(JSON.stringify(modelScore.value))
     await updatePersonalMarkDetailScore({ taskId: current.value.taskId, scores: modelScore.value })
-    current.value.markerScore = add(...scores)
+    // current.value.markerScore = add(...scores)
+    current.value.markScore = add(...scores)
     ElMessage.success('修改成功')
     // editScoreVisible.value = false
     // onRefresh()

+ 6 - 3
src/modules/marking/assess/index.vue

@@ -109,7 +109,10 @@ import { useRoute } from 'vue-router'
 import { TreeKey } from 'element-plus/es/components/tree/src/tree.type'
 const route = useRoute()
 const forceCheckVisible = ref(false)
-const { subjectList, mainQuestionList, dataModel, onOptionInit, changeModelValue } = useOptions(['subject', 'question'])
+const { subjectList, mainQuestionList, dataModel, onOptionInit, changeModelValue, isExpert, isLeader } = useOptions([
+  'subject',
+  'question',
+])
 
 const markerIds = ref()
 let defaultCheckedKeys = ref<TreeKey[]>([])
@@ -185,7 +188,7 @@ const items = computed<EpFormItem[]>(() => {
       slot: {
         options: subjectList.value,
         onChange: changeModelValue('subject'),
-        disabled: true,
+        disabled: !isExpert.value,
       },
     }),
     Span12({
@@ -196,7 +199,7 @@ const items = computed<EpFormItem[]>(() => {
       slot: {
         options: mainQuestionList.value,
         onChange: changeModelValue('question'),
-        disabled: true,
+        disabled: !isExpert.value && !isLeader.value,
       },
     }),
     {

+ 4 - 1
src/modules/marking/inquiry-result/index.vue

@@ -223,6 +223,9 @@ const columns: EpTableColumn<RowType>[] = [
   { label: '评卷员', prop: 'markerName', minWidth: 90 },
   { label: '评卷员给分', prop: 'markerScore', minWidth: 88 },
   { label: '组长给分', prop: 'headerScore', minWidth: 70 },
+  { label: '客观分', prop: 'objectiveScore', minWidth: 70 },
+  { label: '客主比', prop: 'ratio', minWidth: 70 },
+  { label: '成绩', prop: 'markScore', minWidth: 70 },
   { label: '评卷时间', prop: 'markTime', minWidth: 130 },
   { label: '抽查次数', prop: 'customCheckNumber', minWidth: 70 },
 ]
@@ -375,7 +378,7 @@ const onSubmit = async () => {
 
     await useFetch('updateCustomPaperScore').fetch({ taskId: current.value.taskId, scores: modelScore.value })
 
-    current.value.headerScore = add(...scores)
+    current.value.markScore = current.value.headerScore = add(...scores)
     current.value.markScores = scores
     // onRefresh()
     ElMessage.success('修改成功')

+ 61 - 9
src/modules/marking/inquiry/index.vue

@@ -53,11 +53,9 @@ const { push } = useRouter()
 
 const shortQueryConfigIndex = ref<number>()
 
-const { subjectList, mainQuestionList, groupListWithAll, dataModel, changeModelValue } = useOptions([
-  'subject',
-  'question',
-  'group',
-])
+const { subjectList, mainQuestionList, groupListWithAll, dataModel, changeModelValue, isExpert, isLeader } = useOptions(
+  ['subject', 'question', 'group']
+)
 
 const { formRef, elFormRef, defineColumn, _ } = useForm()
 
@@ -76,6 +74,10 @@ const model = reactive<FormModel>({
   secretNumber: '',
   // timeEnd: void 0,
   // timeStart: void 0,
+  ratioStart: void 0,
+  ratioEnd: void 0,
+  objectiveScoreStart: void 0,
+  objectiveScoreEnd: void 0,
 })
 
 watch(dataModel, () => {
@@ -130,7 +132,9 @@ const OneRow = Span7(_, 'row-1')
 const TwoRow = Span7(_, 'row-2')
 const ThreeRow = Span7(_, 'row-3')
 const FourRow = Span7(_, 'row-4')
-const ElevenRow = Span8(_, 'row-11')
+const FiveRow = Span7(_, 'row-5')
+const SixRow = Span7(_, 'row-6')
+const ElevenRow = Span8(_, 'row-15')
 
 const rules: EpFormRules = {
   subjectCode: [{ required: true, message: '请选择科目' }],
@@ -146,7 +150,7 @@ const items = computed<EpFormItem[]>(() => [
       placeholder: '科目',
       options: subjectList.value,
       onChange: changeModelValue('subject'),
-      disabled: true,
+      disabled: !isExpert.value,
     },
   }),
   OneRow({
@@ -157,7 +161,7 @@ const items = computed<EpFormItem[]>(() => [
       placeholder: '大题',
       options: mainQuestionList.value,
       onChange: changeModelValue('question'),
-      disabled: true,
+      disabled: !isExpert.value && !isLeader.value,
     },
   }),
   TwoRow({
@@ -183,6 +187,54 @@ const items = computed<EpFormItem[]>(() => [
     },
   }),
   FourRow({
+    label: '客主比',
+    slotType: 'inputNumber',
+    prop: 'ratioStart',
+    slot: {
+      step: 0.1,
+      stepStrictly: true,
+      min: 0,
+      max: 999999,
+      precision: 1,
+    },
+  }),
+  FourRow({
+    label: '至',
+    labelWidth: '35px',
+    slotType: 'inputNumber',
+    prop: 'ratioEnd',
+    slot: {
+      step: 0.1,
+      stepStrictly: true,
+      min: 0,
+      max: 999999,
+      precision: 1,
+    },
+  }),
+  FiveRow({
+    label: '客观分',
+    slotType: 'inputNumber',
+    prop: 'objectiveScoreStart',
+    slot: {
+      step: 1,
+      stepStrictly: true,
+      min: 0,
+      max: 999999,
+    },
+  }),
+  FiveRow({
+    label: '至',
+    labelWidth: '35px',
+    slotType: 'inputNumber',
+    prop: 'objectiveScoreEnd',
+    slot: {
+      step: 1,
+      stepStrictly: true,
+      min: 0,
+      max: 999999,
+    },
+  }),
+  SixRow({
     label: '分数',
     slotType: 'inputNumber',
     prop: 'scoreStart',
@@ -193,7 +245,7 @@ const items = computed<EpFormItem[]>(() => [
       max: 999999,
     },
   }),
-  FourRow({
+  SixRow({
     label: '至',
     labelWidth: '35px',
     slotType: 'inputNumber',

+ 1 - 0
src/modules/marking/problem/index.vue

@@ -257,6 +257,7 @@ const columns: EpTableColumn[] = [
   { label: '客观分', prop: 'objectiveScore', minWidth: 55 },
   { label: '主观分', prop: 'markScore', minWidth: 55 },
   { label: '客主比', prop: 'markRatio', minWidth: 55 },
+  { label: '成绩', prop: 'markScore', minWidth: 55 },
   { label: '评卷时间', prop: 'markTime', minWidth: 130 },
   { label: '处理人', prop: 'headerName', minWidth: 75 },
   { label: '处理时间', prop: 'solveTime', minWidth: 160 },

+ 3 - 0
src/modules/marking/repeat/index.vue

@@ -221,6 +221,9 @@ const columns: EpTableColumn[] = [
 
   { label: '确认状态', prop: 'confirmName', minWidth: 72 },
   { label: '确认给分', prop: 'confirmScore', minWidth: 72 },
+  { label: '客观分', prop: 'objectiveScore', minWidth: 72 },
+  { label: '客主比', prop: 'ratio', minWidth: 72 },
+  { label: '成绩', prop: 'markScore', minWidth: 72 },
   { label: '重评时间', prop: 'reMarkTime', minWidth: 130 },
 ]
 

+ 21 - 3
src/modules/monitor/system-check/index.vue

@@ -102,7 +102,7 @@
   ></send-back-mark>
 </template>
 
-<script setup lang="ts" name="SystemCheck">
+<script setup lang="tsx" name="SystemCheck">
 /** 系统抽查卷 */
 import { reactive, ref, computed, watch } from 'vue'
 import { ElButton, ElPagination, ElMessage } from 'element-plus'
@@ -125,6 +125,7 @@ import SendBackMark from '@/components/shared/SendBackMark.vue'
 import RightButton from '@/components/shared/RightButton.vue'
 import ScoringPanelWithConfirm from '@/components/shared/ScoringPanelWithConfirm.vue'
 import ImagePreview from '@/components/shared/ImagePreview.vue'
+import SecNumberStatus from '@/components/common/secNumberStatus.vue'
 
 import type { SetImgBgOption } from '@/hooks/useSetImgBg'
 import type { ExtractApiParams } from '@/api/api'
@@ -285,11 +286,28 @@ const formItems = computed<EpFormItem[]>(() => [
 /** 系统抽查卷列表 */
 
 const columns: EpTableColumn[] = [
-  { label: '密号', prop: 'secretNumber', minWidth: 100, fixed: 'left' },
+  {
+    label: '密号',
+    prop: 'secretNumber',
+    minWidth: 100,
+    fixed: 'left',
+    formatter(row: any) {
+      return (
+        <SecNumberStatus
+          secretNumber={row.secretNumber}
+          checked={row.checked}
+          corrected={row.corrected}
+        ></SecNumberStatus>
+      )
+    },
+  },
   { label: '评卷员', prop: 'markerName', minWidth: 80 },
   { label: '评卷员给分', prop: 'markerScore', minWidth: 80 },
   { label: '组长给分', prop: 'headerScore', minWidth: 70 },
   // { label: '评卷时间', prop: 'markTime', width: 160 },
+  { label: '客观分', prop: 'objectiveScore', minWidth: 70 },
+  { label: '客主比', prop: 'ratio', minWidth: 70 },
+  { label: '成绩', prop: 'markScore', minWidth: 70 },
   { label: '抽查次数', prop: 'checkCount', minWidth: 70 },
   { label: '评卷时间', prop: 'markTime', minWidth: 130 },
 ]
@@ -334,7 +352,7 @@ const onSubmit = async () => {
   if (currentSystemCheckPaper.value) {
     const scores = JSON.parse(JSON.stringify(modelScore.value))
     await markSystemSpotPaper({ id: currentSystemCheckPaper.value.id, scores: modelScore.value })
-    currentSystemCheckPaper.value.headerScore = add(...scores)
+    currentSystemCheckPaper.value.markScore = currentSystemCheckPaper.value.headerScore = add(...scores)
     currentSystemCheckPaper.value.markScores = scores
     ElMessage.success('修改成功')
     // scoringPanelVisible.value = false

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

@@ -53,7 +53,7 @@
   ></mark-history-list>
 </template>
 
-<script setup lang="ts" name="TrainingDetail">
+<script setup lang="tsx" name="TrainingDetail">
 /** 培训监控调卷详情 */
 import { ref, computed } from 'vue'
 import { useRoute } from 'vue-router'
@@ -68,6 +68,7 @@ import ImagePreview from '@/components/shared/ImagePreview.vue'
 import RightButton from '@/components/shared/RightButton.vue'
 import SvgIcon from '@/components/common/SvgIcon.vue'
 import MarkHistoryList from '@/components/shared/MarkHistoryList.vue'
+import SecNumberStatus from '@/components/common/secNumberStatus.vue'
 
 import type { SetImgBgOption } from '@/hooks/useSetImgBg'
 import type { ExtractApiResponse } from '@/api/api'
@@ -128,7 +129,21 @@ const onOperationClick: OperationClick = ({ type, value }) => {
 }
 
 const columns: EpTableColumn<RowType>[] = [
-  { label: '密号', prop: 'secretNumber', width: 100, fixed: 'left' },
+  {
+    label: '密号',
+    prop: 'secretNumber',
+    width: 100,
+    fixed: 'left',
+    formatter(row: any) {
+      return (
+        <SecNumberStatus
+          secretNumber={row.secretNumber}
+          checked={row.checked}
+          corrected={row.corrected}
+        ></SecNumberStatus>
+      )
+    },
+  },
   { label: '标准分', prop: 'score', width: 60 },
   { label: '评卷给分', prop: 'markScore', width: 75 },
   // { label: '分组', prop: 'group' },

+ 12 - 7
src/modules/monitor/training-monitoring/hooks/useFormFilter.ts

@@ -8,11 +8,16 @@ import type { EpFormItem, EpFormRules } from 'global-type'
 import type { ExtractApiParams } from '@/api/api'
 
 const useFormFilter = () => {
-  const { subjectList, mainQuestionList, groupListWithAll, dataModel, onOptionInit, changeModelValue } = useOptions([
-    'subject',
-    'question',
-    'group',
-  ])
+  const {
+    subjectList,
+    mainQuestionList,
+    groupListWithAll,
+    dataModel,
+    onOptionInit,
+    changeModelValue,
+    isExpert,
+    isLeader,
+  } = useOptions(['subject', 'question', 'group'])
 
   const { formRef, elFormRef, defineColumn, _ } = useForm()
 
@@ -98,7 +103,7 @@ const useFormFilter = () => {
         slot: {
           options: subjectList.value,
           onChange: changeModelValue('subject'),
-          disabled: true,
+          disabled: !isExpert.value,
         },
       }),
       OneRowSpan4({
@@ -109,7 +114,7 @@ const useFormFilter = () => {
         slot: {
           options: mainQuestionList.value,
           onChange: changeModelValue('question'),
-          disabled: true,
+          disabled: !isExpert.value && !isLeader.value,
         },
       }),
       OneRowSpan4({

+ 16 - 7
src/modules/quality/self-check/index.vue

@@ -66,11 +66,16 @@ const { push } = useRouter()
 
 type FormModel = Omit<ExtractApiParams<'selfCheckAnalysis'>, 'startTime' | 'endTime'>
 
-const { subjectList, mainQuestionList, groupListWithAll, dataModel, onOptionInit, changeModelValue } = useOptions([
-  'subject',
-  'question',
-  'group',
-])
+const {
+  subjectList,
+  mainQuestionList,
+  groupListWithAll,
+  dataModel,
+  onOptionInit,
+  changeModelValue,
+  isExpert,
+  isLeader,
+} = useOptions(['subject', 'question', 'group'])
 
 const model = reactive<FormModel & { time: string }>({
   time: '',
@@ -96,13 +101,17 @@ const items = computed<EpFormItem[]>(() => {
       slotType: 'select',
       prop: 'subjectCode',
       labelWidth: '52px',
-      slot: { options: subjectList.value, onChange: changeModelValue('subject'), disabled: true },
+      slot: { options: subjectList.value, onChange: changeModelValue('subject'), disabled: !isExpert.value },
     }),
     OneRowSpan4({
       label: '大题',
       slotType: 'select',
       prop: 'questionMainNumber',
-      slot: { options: mainQuestionList.value, onChange: changeModelValue('question'), disabled: true },
+      slot: {
+        options: mainQuestionList.value,
+        onChange: changeModelValue('question'),
+        disabled: !isExpert.value && !isLeader.value,
+      },
     }),
     OneRowSpan4({
       label: '小组',