zhangjie 5 дней назад
Родитель
Сommit
e0c60d36a3

+ 6 - 7
src/api/api-types/question.d.ts

@@ -60,17 +60,16 @@ export namespace Question {
     subNumber: number
     totalScore: number
   }
-  /** 获取大题评卷结构 */
-  type GetQuestionStruct = BaseDefine<
-    { mainNumber?: number | string; subjectCode?: any },
-    { mainNumber: number | string; mainTitle: string; questionList: SubQuestionStruct[] }
-  >
-
   export interface MarkDelayItem {
     startScore: number | undefined
     endScore: number | undefined
     minMarkTime: number | undefined
   }
+  /** 获取大题评卷结构 */
+  type GetQuestionStruct = BaseDefine<
+    { mainNumber?: number | string; subjectCode?: any },
+    { mainNumber: number | string; mainTitle: string; questionList: SubQuestionStruct[]; markDelay: string }
+  >
 
   /** 大题设置 (新增/编辑) */
   interface MainQuestionMeta {
@@ -109,7 +108,7 @@ export namespace Question {
     relationMainNumber?: any
     markSpeedLimit?: any
     // 分数段评卷时间
-    markDelay?: MarkDelayItem[]
+    markDelay?: string
   }
 
   /** 新增大题 */

+ 5 - 5
src/components/common/ScoreRangeTimeEditor.vue

@@ -101,14 +101,14 @@ const validateRange = (index: number) => {
     return false
   }
 
-  if (isNull(range.minMarkTime) || range.minMarkTime < 1) {
+  if (isNull(range.minMarkTime) || range.minMarkTime! < 1) {
     errorMessage.value = '最小评卷时间必须大于0'
     return false
   }
 
   // 检查起始分是否大于结束分
   if (!isNull(range.startScore) && !isNull(range.endScore)) {
-    if (range.startScore > range.endScore) {
+    if (range.startScore! > range.endScore!) {
       errorMessage.value = '起始分不能大于结束分'
       return false
     }
@@ -127,9 +127,9 @@ const validateRange = (index: number) => {
     ) {
       // 检查是否有交叉
       if (
-        (range.startScore >= otherRange.startScore && range.startScore <= otherRange.endScore) ||
-        (range.endScore >= otherRange.startScore && range.endScore <= otherRange.endScore) ||
-        (range.startScore <= otherRange.startScore && range.endScore >= otherRange.endScore)
+        (range.startScore! >= otherRange.startScore! && range.startScore! <= otherRange.endScore!) ||
+        (range.endScore! >= otherRange.startScore! && range.endScore! <= otherRange.endScore!) ||
+        (range.startScore! <= otherRange.startScore! && range.endScore! >= otherRange.endScore!)
       ) {
         errorMessage.value = '分数段不能交叉'
         return false

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

@@ -58,6 +58,12 @@ import { sessionStorage } from '@/plugins/storage'
 import bus from '@/utils/bus'
 import useMarkStore from '@/store/mark'
 
+interface MarkDelayItem {
+  startScore: number
+  endScore: number
+  minMarkTime: number
+}
+
 const markStore = useMarkStore()
 const props = withDefaults(
   defineProps<{
@@ -165,7 +171,10 @@ const questionList = computed(() => {
   const { mainNumber, mainTitle, questionList = [] } = questionStruct.value
 
   // 更新分数端评卷时间
-  const markDelay = questionStruct.value.markDelay ? JSON.parse(questionStruct.value.markDelay) : []
+  const markDelay = questionStruct.value.markDelay
+    ? (JSON.parse(questionStruct.value.markDelay) as MarkDelayItem[])
+    : []
+
   const getMarkLevelSpeedLimit = (score: number): number => {
     if (markDelay.length) {
       const speedLimit = markDelay.find((limit) => {
@@ -200,12 +209,12 @@ const buttonDisabled = computed(() => {
 
 // 启动倒计时
 const startCountdown = () => {
-  const markSpeedLimit = questionList.value[activeIndex.value]?.markSpeedLimit
+  const markSpeedLimit = questionList.value[activeIndex.value ?? 0]?.markSpeedLimit ?? 0
   markStore.startCountdown(markSpeedLimit)
 }
 
 const currentQuestion = computed(() => {
-  return questionList.value[activeIndex.value]
+  return questionList.value[activeIndex.value ?? 0] ?? {}
 })
 
 // 监听questionList变化,启动倒计时

+ 5 - 4
src/modules/admin-subject/edit-main-question/index.vue

@@ -35,7 +35,7 @@
           </el-select>
         </template>
         <template #form-item-levelMarkTime>
-          <score-range-time-editor ref="scoreRangeTimeEditorRef" v-model="model.markDelay" />
+          <score-range-time-editor ref="scoreRangeTimeEditorRef" v-model="markDelay" />
         </template>
       </base-form>
     </el-card>
@@ -89,6 +89,7 @@ import { TrueOrFalse } from '@/constants/dicts'
 
 import type { ExtractApiParams } from '@/api/api'
 import type { EpFormItem, EpFormRules, FormGroup } from 'global-type'
+import { Question } from '@/api/api-types/question'
 const { fetch: getMainQuestionList, result: mainQuestionListResult } = useFetch('getMainQuestionList')
 const { back } = useRouter()
 
@@ -163,8 +164,8 @@ const model = reactive<ExtractApiParams<'addMainQuestion'>>({
   startNumber: 1,
   relationMainNumber: void 0,
   markSpeedLimit: false,
-  markDelay: [],
 })
+const markDelay = ref<Question.MarkDelayItem[]>([])
 const compareChange = (val: string) => {
   if (val == '0') {
     model.relationMainNumber = void 0
@@ -442,7 +443,7 @@ if (isEdit) {
       result.remarkNumber = (result.remarkNumber || 0) / 60
     }
     Object.assign(model, omit(result, 'examId'))
-    model.markDelay = result.markDelay ? JSON.parse(result.markDelay || '[]') : []
+    markDelay.value = result.markDelay ? JSON.parse(result.markDelay || '[]') : []
     // levelRangValues.value = result.levelRange.slice(0)
     levelRangValues.value = result.levelRange.slice(0).map((item) => {
       return item * 100
@@ -475,7 +476,7 @@ const onSubmit = async () => {
         { ...model, levelRange: model.levelRange || [], category: model.category || void 0 },
         { remarkNumber: model.remarkType === 'TIME' ? (model.remarkNumber || 0) * 60 : model.remarkNumber }
       )
-      data.markDelay = JSON.stringify(data.markDelay || [])
+      data.markDelay = JSON.stringify(markDelay.value || [])
       await (isEdit ? editMainQuestion(data) : addMainQuestion(data))
       ElMessage.success('保存成功')
       back()

+ 2 - 2
src/store/mark.ts

@@ -24,8 +24,8 @@ const useMarkStore = defineStore<'mark', MarkStoreState, Record<string, any>, Ma
     }
   },
   getters: {
-    isCountingDown: (state) => state.countdownTime > 0,
-    buttonText: (state) => (state.countdownTime > 0 ? `${state.countdownTime}s` : '确定'),
+    isCountingDown: (state: MarkStoreState) => state.countdownTime > 0,
+    buttonText: (state: MarkStoreState) => (state.countdownTime > 0 ? `${state.countdownTime}s` : '确定'),
   },
   actions: {
     setCurQuestionScore(val: number | null) {