|
@@ -65,9 +65,8 @@
|
|
|
|
|
|
<script setup lang="ts" name="MarkingMark">
|
|
|
/** 阅卷-正式评卷 */
|
|
|
-import { computed, nextTick, ref, watch } from 'vue'
|
|
|
+import { computed, nextTick, ref, watch, onBeforeUnmount } from 'vue'
|
|
|
import { useRouter } from 'vue-router'
|
|
|
-import { debounce } from 'lodash-es'
|
|
|
import { ElButton, ElRadioGroup, ElRadioButton, ElRadio, ElMessage } from 'element-plus'
|
|
|
import { minus } from '@/utils/common'
|
|
|
import { useSetImgBg } from '@/hooks/useSetImgBg'
|
|
@@ -96,7 +95,7 @@ const { push, replace } = useRouter()
|
|
|
|
|
|
const { getSpentTime, resume } = useSpentTime()
|
|
|
|
|
|
-const CACHE_NUM = 3
|
|
|
+const CACHE_NUM = 2
|
|
|
|
|
|
type TaskType = ExtractArrayValue<ExtractApiResponse<'getMarkingTask'>>['taskType'] | 'default' | 'remarking'
|
|
|
|
|
@@ -160,27 +159,50 @@ const historyTaskChange = (task: HistoryTaskType) => {
|
|
|
})
|
|
|
}
|
|
|
|
|
|
-const debounceGetMarkingTask = debounce(getMarkingTask, 5000)
|
|
|
+const setCurrentTask = () => {
|
|
|
+ currentTask.value = currentTaskPool.shift()
|
|
|
+ currentTaskType.value =
|
|
|
+ currentTask.value && markStatusIcon[currentTask.value.taskType] ? currentTask.value.taskType : 'FORMAL'
|
|
|
+}
|
|
|
+
|
|
|
+let refreshTimer: number | null = null
|
|
|
+
|
|
|
+onBeforeUnmount(() => {
|
|
|
+ if (refreshTimer) {
|
|
|
+ clearTimeout(refreshTimer)
|
|
|
+ refreshTimer = null
|
|
|
+ }
|
|
|
+})
|
|
|
+
|
|
|
+const refreshTaskPool = (force = false, isRefresh = false) => {
|
|
|
+ if (refreshTimer) {
|
|
|
+ clearTimeout(refreshTimer)
|
|
|
+ }
|
|
|
+ refreshTimer = window.setTimeout(
|
|
|
+ () => {
|
|
|
+ if (currentTaskPool.length < (isRefresh ? Number.MAX_SAFE_INTEGER : CACHE_NUM)) {
|
|
|
+ getMarkingTask().then((result) => {
|
|
|
+ if (result?.length) {
|
|
|
+ currentTaskPool[isRefresh ? 'unshift' : 'push'](...result)
|
|
|
+ }
|
|
|
+ if (currentTaskPool?.length && !currentTask.value) {
|
|
|
+ setCurrentTask()
|
|
|
+ }
|
|
|
+ refreshTaskPool()
|
|
|
+ })
|
|
|
+ }
|
|
|
+ },
|
|
|
+ force ? 0 : 5000
|
|
|
+ )
|
|
|
+}
|
|
|
|
|
|
/**
|
|
|
* @param force 即时更新任务
|
|
|
* @param isRefresh 是否有插队任务
|
|
|
*/
|
|
|
const getNextTask = (force = false, isRefresh = false) => {
|
|
|
- currentTask.value = currentTaskPool.shift()
|
|
|
- currentTaskType.value =
|
|
|
- currentTask.value && markStatusIcon[currentTask.value.taskType] ? currentTask.value.taskType : 'FORMAL'
|
|
|
- if (currentTaskPool.length < (isRefresh ? Number.MAX_SAFE_INTEGER : CACHE_NUM)) {
|
|
|
- const getTaskApi = force ? getMarkingTask : debounceGetMarkingTask
|
|
|
- getTaskApi()?.then((result) => {
|
|
|
- if (result?.length) {
|
|
|
- currentTaskPool[isRefresh ? 'push' : 'unshift'](...result)
|
|
|
- if (currentTaskPool.length && !currentTask.value) {
|
|
|
- getNextTask()
|
|
|
- }
|
|
|
- }
|
|
|
- })
|
|
|
- }
|
|
|
+ setCurrentTask()
|
|
|
+ refreshTaskPool(force, isRefresh)
|
|
|
}
|
|
|
|
|
|
/** 给分板 */
|
|
@@ -225,7 +247,7 @@ const onSubmit: InstanceType<typeof ScoringPanelWithConfirm>['onSubmit'] = async
|
|
|
taskId: currentTask.value.taskId,
|
|
|
taskType: currentTask.value.taskType,
|
|
|
})
|
|
|
- await getNextTask(true, submitResult.refresh)
|
|
|
+ await getNextTask(true, submitResult?.refresh)
|
|
|
} catch (error) {
|
|
|
console.error(error)
|
|
|
scoringPanelVisible.value = true
|
|
@@ -262,7 +284,7 @@ const onSubmitProblem = async () => {
|
|
|
taskId: currentTask.value.taskId,
|
|
|
taskType: currentTask.value.taskType,
|
|
|
})
|
|
|
- await getNextTask(true, submitResult.refresh)
|
|
|
+ await getNextTask(true, submitResult?.refresh)
|
|
|
}
|
|
|
|
|
|
/** 提交问题卷 & 雷同卷 */
|