diff --git a/apps/admin/src/views/results/results-detail/index.vue b/apps/admin/src/views/results/results-detail/index.vue
index 7fc6f37..19830bb 100644
--- a/apps/admin/src/views/results/results-detail/index.vue
+++ b/apps/admin/src/views/results/results-detail/index.vue
@@ -7,12 +7,15 @@ import { computed, onMounted, onUnmounted, ref, watch } from 'vue'
import { useRoute } from 'vue-router'
import { QuestionCategoryEnum } from '@/enum/business'
import { fetchGetQuestionList } from '@/service/api/competition'
-import { fetchGetCurrentQuestionByRoomID, fetchGetGameStatistics, fetchGetGroupListByActivityID } from '@/service/api/game'
+import { fetchGetCurrentQuestionByRoomID, fetchGetGameStatistics, fetchGetGroupListByActivityID, fetchGetQuestionDetailByID } from '@/service/api/game'
import { updateCurrentQuestionUse, updateScore } from '@/service/api/result'
import GroupTabs, { type GroupItem } from './modules/GroupTabs.vue'
+import Typewriter from './modules/Typewriter.vue'
-// 本地持久化存储手动修改的状态 (key: roomId-questionId-guid)
+// 本地存储手动修改的状态 (key: roomId-questionId-teamId-guid, value: status)
const manualStatusStorage = useStorage
>('read-star-manual-status', {})
+// 本地存储手动修改的分数 (key: roomId-questionId-teamId-guid, value: score)
+const manualScoreStorage = useStorage>('read-star-manual-score', {})
const route = useRoute()
const message = useMessage()
@@ -20,20 +23,39 @@ const activityId = computed(() => route.query?.activityId as string)
const roomId = computed(() => route.query?.roomId as string)
const currentGroupId = ref('') // 当前选中的组别 ID
-const currentQuestionId = ref('') // 当前选中的题目 ID
+const currentQuestionId = ref('') // 当前选中的题目大纲 ID
const currentQuestionType = ref('') // 当前选中的题目类型
const groups = ref([])
const questionList = ref<(GroupItem & { type: string })[]>([])
const currentQuestion = ref() // 当前正在参赛的题目
+const questionInfo = ref() // 题目详情
+const currentQuestionDetailID = ref('') // 当前选中的题目详情 ID
+
+// 判断当前activityId是正在比赛的活动
+const isActiveActivityId = computed(() => {
+ if (!currentQuestion.value)
+ return false
+ const qActivityId = (currentQuestion.value as any).MainID || (currentQuestion.value as any).ActivityID
+ return Number(activityId.value) === Number(qActivityId)
+})
// 计算当前题目类型对应的布局
const currentLayout = computed(() => {
// 只有 汉字加一加 (CharacterRadicalAddition) 需要人工评分 (列表布局 - 分屏视图)
// 其他所有题型 (汉字听写、诗词、词语听写、成语) 都使用长框展示 (网格布局 - 带切换的大图)
- if (currentQuestionType.value === QuestionCategoryEnum.CharacterRadicalAddition) {
+ // 修正需求:scoringTypes 包含 CharacterRadicalAddition, IdiomWriting1, ChineseCharacterDictation2
+ // 这些题型使用 'list' 布局,其他使用 'grid'
+ // 补充:当 scoringTypes 为 grid 时候,只有对错和正确,提交给接口分数规则是:如果评委觉得是正确的,就取 currentQuestion 里面的 Point 字段,反之错的就是 0
+ const scoringTypes = [
+ QuestionCategoryEnum.CharacterRadicalAddition,
+ QuestionCategoryEnum.IdiomWriting1,
+ QuestionCategoryEnum.ChineseCharacterDictation2,
+ ]
+ if (scoringTypes.includes(currentQuestionType.value as any)) {
return 'list'
}
+ // 其他题型 (汉字听写、诗词、词语听写、成语看图等) 使用 'grid' 布局 (网格布局 - 带切换的大图)
return 'grid'
})
@@ -60,11 +82,37 @@ async function setStatus(team: TeamResult, item: any, status: number) {
}
}
+/** 根据 QuestionDetailID 查询题目详情 */
+async function fetchQuestionDetail(QuestionDetailID: number) {
+ try {
+ const { data } = await fetchGetQuestionDetailByID(QuestionDetailID)
+ if (data?.data) {
+ questionInfo.value = data.data
+ console.log(questionInfo.value, 'questionInfo')
+ }
+ }
+ catch (error: any) {
+ message.error(error.message || '查询题目详情失败')
+ }
+}
+
async function handleManualScoreUpdate(item: any, newScore: number) {
item.Score = newScore
item._isManual = true
+
+ // 保存分数到本地存储
+ if (roomId.value && currentQuestionId.value && item.Guid && item.TeamId) {
+ const key = `${roomId.value}-${currentQuestionId.value}-${item.TeamId}-${item.Guid}`
+ manualScoreStorage.value[key] = newScore
+ }
+
try {
- await updateScore(item.TeamQuestionUseID, newScore)
+ await updateScore([{
+ Id: item.TeamQuestionUseID,
+ ResultPotins: newScore,
+ QuestionDetailID: item.QuestionDetailID || 0,
+ QuestionId: item.QuestionId || 0,
+ }])
message.success('分数已更新')
}
catch (e: any) {
@@ -86,22 +134,46 @@ function handleNext() {
/**
* 根据房间当前题目,自动同步选中题目和当前正在比赛的组
- * 逻辑:
- * - 如果后端返回了当前题目的 QuestionID,并且题目列表已加载,则将 currentQuestionId 设为该题
- * - 同时同步 currentQuestionType,便于切换布局
- * - 若找不到匹配项,则维持现状(由首次加载保持为第一题)
*/
function syncCurrentQuestionSelection() {
- const qid = currentQuestion.value?.QuestionID
- const gid = currentQuestion.value?.TeamGroupID
- if (!qid || questionList.value.length === 0)
+ // 1. 如果不是当前正在进行的活动,默认选中第一组第一题
+ if (!isActiveActivityId.value) {
+ console.log('当前活动不是正在进行的活动,默认选中第一组第一题')
+ if (groups.value.length > 0) {
+ currentGroupId.value = groups.value[0].id
+ }
+ if (questionList.value.length > 0) {
+ currentQuestionId.value = questionList.value[0].id
+ currentQuestionType.value = questionList.value[0].type
+ }
return
- const hit = questionList.value.find(q => Number(q.id) === Number(qid))
- if (gid)
+ }
+
+ // 2. 如果是当前正在进行的活动,同步选中当前正在进行的题目和组
+ const currentQ = currentQuestion.value
+ const qid = currentQ?.QuestionID
+ const gid = currentQ?.TeamGroupID
+
+ // 尝试匹配题目
+ if (qid) {
+ const hit = questionList.value.find(q => Number(q.id) === Number(qid))
+ if (hit) {
+ currentQuestionId.value = hit.id
+ currentQuestionType.value = (hit as any).type || ''
+ }
+ }
+ // 尝试匹配组
+ if (gid) {
currentGroupId.value = gid
- if (hit) {
- currentQuestionId.value = hit.id
- currentQuestionType.value = (hit as any).type || ''
+ }
+
+ // 兜底:如果同步失败(例如当前题目不在列表中),默认选中第一个
+ if (!currentQuestionId.value && questionList.value.length > 0) {
+ currentQuestionId.value = questionList.value[0].id
+ currentQuestionType.value = questionList.value[0].type
+ }
+ if (!currentGroupId.value && groups.value.length > 0) {
+ currentGroupId.value = groups.value[0].id
}
}
@@ -194,7 +266,7 @@ async function fetchCurrentQuestion() {
* 获取答题卡数据
*/
async function fetchAnswerData() {
- if (!currentGroupId.value || !currentQuestionId.value || !currentQuestion.value?.QuestionDetailID)
+ if (!currentGroupId.value || !currentQuestionId.value)
return
try {
const params = {
@@ -212,6 +284,20 @@ async function fetchAnswerData() {
const result = data?.data || []
console.log('接口返回的游戏统计数据:', result)
+ // 获取题目详情 ID
+ let detailId = 0
+ // 1. 尝试从答题卡数据中获取当前比赛的题目详情 ID (优先)
+ if (result.length > 0) {
+ const item = result[0]
+ if (item) {
+ detailId = item?.QuestionDetaiID || 0
+ }
+ }
+ // 如果获取到了新的 detailId,更新 currentQuestionDetailID (会触发 watch 调用 fetchQuestionDetail)
+ if (detailId && detailId !== Number(currentQuestionDetailID.value)) {
+ currentQuestionDetailID.value = detailId
+ }
+
result.forEach((item) => {
const UserAnswerFont = JSON.parse(item.UserAnswerFont)
console.log('解析后的 UserAnswerFont:', UserAnswerFont)
@@ -225,7 +311,8 @@ async function fetchAnswerData() {
if (t.Answers) {
t.Answers.forEach((a: any) => {
if (a.Guid) {
- oldMap.set(a.Guid, a)
+ // 使用 TeamId + Guid 作为 key,确保唯一性
+ oldMap.set(`${t.TeamId}-${a.Guid}`, a)
}
})
}
@@ -238,52 +325,119 @@ async function fetchAnswerData() {
if (answerData.UserAnswerFont) {
const parsedFonts = JSON.parse(answerData.UserAnswerFont)
parsedAnswers = Array.isArray(parsedFonts) ? parsedFonts : []
- console.warn('parsed fonts', parsedFonts)
+ // console.warn('parsed fonts', parsedFonts)
}
}
catch (e) {
console.error('解析 UserAnswerFont 失败', e)
}
+ // 如果 UserAnswerFont 为空,尝试使用根对象的数据构建答案(适用于选择题等没有切图的题型)
+ if (parsedAnswers.length === 0 && (answerData.UserAnswerPicture || answerData.AnswerValuePicture)) {
+ parsedAnswers = [{
+ Guid: answerData.Guid || `${answerData.QuestionId}-${answerData.TeamId}`,
+ TeamQuestionUseID: answerData.Id, // 确保有 TeamQuestionUseID 用于后续更新分数
+ AnswerText: '查看原图', // 默认提示文案
+ AnswerValuePicture: answerData.AnswerValuePicture || answerData.UserAnswerPicture,
+ Status: answerData.Status,
+ Score: answerData.Points, // 使用根节点的 Points
+ }]
+ }
// 将新答案与旧的手动编辑合并
const mergedAnswers = parsedAnswers.map((ans: any) => {
- const oldAns = oldMap.get(ans.Guid)
+ // 使用 TeamId + Guid 获取旧状态,确保不同队伍之间不冲突
+ const oldAns = oldMap.get(`${answerData.TeamId}-${ans.Guid}`)
// 检查本地存储是否有手动修改记录
const storageKey = `${roomId.value}-${currentQuestionId.value}-${answerData.TeamId}-${ans.Guid}`
const storedStatus = manualStatusStorage.value[storageKey]
+ const storedScore = manualScoreStorage.value[storageKey]
const hasStoredStatus = storedStatus !== undefined
+ const hasStoredScore = storedScore !== undefined
// 记录 AI 的原始推荐值(如果后端返回了)
const aiStatus = ans.Status
- const aiScore = ans.Score
+ // _aiScore 专门用于存储 AI 的推荐分数(优先取外层 Points,如果没有则尝试内层)
+ const aiScore = answerData.Points ?? ans.Score ?? ans.Point
- if ((oldAns && oldAns._isManual) || hasStoredStatus) {
+ // 强制更新图片 URL,防止缓存
+ // 优先使用 ans 中的图片,如果没有则回退到 answerData 中的图片
+ const imageUrl = ans.AnswerValuePicture || (parsedAnswers.length === 1 && parsedAnswers[0] === ans ? answerData.UserAnswerPicture : '')
+ let finalImageUrl = imageUrl
+ let cleanBaseUrl = ''
+ let timestamp = new Date().getTime()
+
+ if (imageUrl) {
+ // 清理 URL 中的反引号、引号和空格
+ cleanBaseUrl = imageUrl.replace(/[`'"]/g, '').trim()
+
+ // 尝试复用旧的时间戳以防止闪烁
+ // 只有当 URL 发生变化,或者 AI 状态/分数发生变化时才更新时间戳
+ // 注意:如果 ans.AnswerValuePicture 发生了变化(即使只是参数变化),cleanBaseUrl 会变
+ if (oldAns && oldAns._baseImgUrl === cleanBaseUrl && oldAns._aiStatus === aiStatus && oldAns._aiScore === aiScore && oldAns._t) {
+ timestamp = oldAns._t
+ }
+
+ // 强制刷新:每次都添加新的时间戳
+ const separator = cleanBaseUrl.includes('?') ? '&' : '?'
+ finalImageUrl = `${cleanBaseUrl}${separator}_t=${timestamp}`
+ }
+
+ // 判断是否手动干预:
+ // 1. 本地存储有状态 (hasStoredStatus) 或有分数 (hasStoredScore)
+ // 2. 内存中有手动标记 (oldAns._isManual)
+ const isManual = hasStoredStatus || hasStoredScore || (oldAns && oldAns._isManual)
+
+ if (isManual) {
// 优先使用本地存储的状态,其次是内存中的手动编辑状态
const finalStatus = hasStoredStatus ? storedStatus : (oldAns ? oldAns.Status : ans.Status)
- const finalScore = oldAns ? oldAns.Score : ans.Score // 分数目前只在内存保留,也可以加 localStorage
- return {
+ // 分数逻辑:
+ // 1. 优先使用本地存储的分数 (hasStoredScore)
+ // 2. 其次使用内存中的手动分数 (oldAns.Score)
+ // 3. 如果都没有 (可能是只改了状态没改分数),则默认 null
+ let finalScore: number | null = null
+ if (hasStoredScore) {
+ finalScore = storedScore
+ }
+ else if (oldAns && oldAns.Score !== undefined && oldAns.Score !== null) {
+ finalScore = oldAns.Score
+ }
+
+ // 修正:在返回的对象中注入 TeamId,以便 handleManualScoreUpdate 使用
+ const resultItem = {
...ans,
+ TeamId: answerData.TeamId, // [新增] 注入 TeamId
+ QuestionId: answerData.QuestionId, // [新增]
+ QuestionDetailID: answerData.QuestionDetaiID, // [新增] 注意后端字段拼写
+ AnswerText: ans.AnswerText,
+ AnswerValuePicture: finalImageUrl,
+ _baseImgUrl: cleanBaseUrl,
+ _t: timestamp, // 保存时间戳
Score: finalScore,
Status: finalStatus,
_isManual: true,
- _aiStatus: aiStatus, // 保存 AI 的最新状态供参考
+ _aiStatus: aiStatus,
_aiScore: aiScore,
}
+ return resultItem
}
- // 如果没有手动编辑,不要自动应用 AI 的状态,保持“未评”状态
- // 用 _isManual = false 来表示 "未人工介入",此时 Status 仍然跟随 AI (ans.Status),
- // 但 UI 上会显示 "AI 推荐: Correct/Wrong",而不是 "已人工校准"。
- // 只有当用户点击后,_isManual = true,才显示 "已人工校准"。
- // 并且 Status = ans.Status (AI 的值)。
+ // 如果没有手动编辑
return {
...ans,
- Status: ans.Status, // 默认跟随 AI,但 UI 会标记为 "AI 推荐"
+ TeamId: answerData.TeamId, // [新增] 注入 TeamId
+ QuestionId: answerData.QuestionId, // [新增]
+ QuestionDetailID: answerData.QuestionDetaiID, // [新增] 注意后端字段拼写
+ AnswerText: ans.AnswerText,
+ AnswerValuePicture: finalImageUrl,
+ _baseImgUrl: cleanBaseUrl,
+ _t: timestamp, // 保存时间戳
+ Status: ans.Status,
_aiStatus: aiStatus,
_aiScore: aiScore,
- _isManual: false, // 明确标记为非手动
+ Score: null, // 默认 null
+ _isManual: false,
}
})
@@ -311,6 +465,13 @@ async function fetchAnswerData() {
*/
async function handleNexCurrentQuestion() {
await fetchCurrentQuestion()
+
+ // 校验 ActivityID 是否一致
+ if (!isActiveActivityId.value) {
+ window.$message?.warning('当前房间正在进行的不是本场活动,无法跳转到当前题目')
+ return
+ }
+
if (currentQuestionId.value && currentGroupId.value) {
currentQuestionId.value = currentQuestion.value?.QuestionID || currentQuestionId.value
currentGroupId.value = currentQuestion.value?.TeamGroupID || currentGroupId.value
@@ -343,28 +504,64 @@ function handlePublish() {
negativeText: '再次检查',
onPositiveClick: async () => {
// 在发布前,将所有手动修改的分数/状态提交一次
- const updatePromises: Promise[] = []
+ // 注意:现在 updateScore 接口支持批量提交,我们需要收集所有需要提交的数据
+ const scoreList: { Id: number, ResultPotins: number, QuestionDetailID: number, QuestionId: number }[] = []
+ let isValid = true
teamResults.value.forEach((team) => {
+ if (!isValid)
+ return
+
if (team.Answers) {
team.Answers.forEach((item: any) => {
- if (item._isManual) {
- // 调用 updateScore 接口提交分数
- // 对于客观题,如果 Status=1 (Correct),Score=1;Status=0 (Wrong),Score=0
- // 假设客观题满分是 1 分 (或者根据业务逻辑调整)
+ // 无论是手动还是 AI 推荐,最终都需要提交分数
+ // 如果是 grid 布局(客观题),Status=1 -> 1分,Status=0 -> 0分
+ // 如果是 list 布局(主观题),直接用 Score 分数
+ // 必须有 TeamQuestionUseID (Id) 才能提交
+ if (item.TeamQuestionUseID) {
let scoreToSubmit = item.Score
- if (currentLayout.value === 'grid') {
- scoreToSubmit = item.Status === 1 ? 1 : 0
+
+ // 校验:对于 list 布局(主观题),分数不能为 null
+ if (currentLayout.value === 'list' && (scoreToSubmit === null || scoreToSubmit === undefined)) {
+ window.$message?.error(`队伍 "${team.TeamName}" 存在未打分的题目,请检查`)
+ isValid = false
+ return
}
- updatePromises.push(updateScore(item.TeamQuestionUseID, scoreToSubmit))
+ if (currentLayout.value === 'grid') {
+ // Grid 布局(客观题):只有对错
+ // 规则:如果评委认为是正确 (Status=1),则使用当前题目的总分 (currentQuestion.Point)
+ // 否则(错误),分数为 0
+ // 注意:currentQuestion 可能没有 Point 字段,需要确认类型,如果没有则尝试从 item._aiScore 获取或者默认 1?
+ // 根据需求:"就取currentQuestion里面的Point字段"
+ // 查看 typings,currentQuestion 是 GetCurrentQuestionInfo 类型,可能没有 Point。
+ // 假设 GetCurrentQuestionInfo 有 Point 字段 (或者 Points / Score)
+ // 如果 currentQuestion 没有,回退到 item._aiScore (AI 认为正确的那个分数) 还是默认 1?
+ // 通常客观题分数是固定的。这里假设 currentQuestion 有 Point。
+ // 修正:currentQuestion.value 可能是 undefined。
+ const maxPoint = (currentQuestion.value as any)?.Point || (currentQuestion.value as any)?.Score || 1
+ scoreToSubmit = item.Status === 1 ? maxPoint : 0
+ }
+
+ // 确保分数为数字
+ scoreList.push({
+ Id: item.TeamQuestionUseID,
+ ResultPotins: Number(scoreToSubmit || 0),
+ QuestionDetailID: item.QuestionDetailID || 0,
+ QuestionId: item.QuestionId || 0,
+ })
}
})
}
})
+ if (!isValid)
+ return
+
try {
- await Promise.all(updatePromises)
+ if (scoreList.length > 0) {
+ await updateScore(scoreList)
+ }
await fetchUpdateCurrentQuestionUse(currentQuestion.value?.TeamGroupQuestionID || 0)
// 发布成功后,清理本地存储
const prefix = `${roomId.value}-${currentQuestionId.value}-`
@@ -372,6 +569,10 @@ function handlePublish() {
if (k.startsWith(prefix))
delete manualStatusStorage.value[k]
})
+ Object.keys(manualScoreStorage.value).forEach((k) => {
+ if (k.startsWith(prefix))
+ delete manualScoreStorage.value[k]
+ })
}
catch (error: any) {
window.$message?.error(error.message || '提交分数或发布失败,请重试')
@@ -387,10 +588,41 @@ function handlePublish() {
const pollingTimer = ref(null)
function startPolling() {
- if (pollingTimer.value)
+ stopPolling()
+
+ // 检查是否已经结束
+ const endTime = (currentQuestion.value as any)?.EndTime
+ if (endTime) {
+ // 增加 8s 缓冲时间
+ const end = new Date(endTime).getTime() + 12000
+ const now = new Date().getTime()
+ if (now > end) {
+ console.log('当前题目已结束(含12s缓冲),仅获取一次最终结果,不启动轮询', endTime)
+ fetchAnswerData()
+ return
+ }
+ }
+
+ // 如果不是当前正在进行的活动,仅获取一次数据,不启动轮询
+ if (!isActiveActivityId.value) {
+ console.log('当前活动 ID 不是正在比赛的活动,仅获取一次数据', activityId.value, currentQuestion.value?.ActivityID)
+ fetchAnswerData()
return
+ }
+
fetchAnswerData() // 立即获取
pollingTimer.value = setInterval(() => {
+ // 每次轮询前再次检查是否过期
+ const currentEndTime = (currentQuestion.value as any)?.EndTime
+ if (currentEndTime) {
+ // 增加 8s 缓冲时间
+ const endTs = new Date(currentEndTime).getTime() + 12000
+ if (Date.now() > endTs) {
+ console.log('题目时间已到(含12s缓冲),停止轮询', currentEndTime)
+ stopPolling()
+ return
+ }
+ }
fetchAnswerData()
}, 3000)
}
@@ -437,6 +669,14 @@ watch([currentGroupId, currentQuestionId], () => {
}
})
+watch(() => currentQuestionDetailID.value, (newVal) => {
+ console.log(newVal)
+
+ if (newVal) {
+ fetchQuestionDetail(Number(newVal))
+ }
+}, { immediate: true })
+
onMounted(async () => {
// 并行拉取分组、题目与当前题目,完成后做一次同步
await Promise.all([fetchGroups(), fetchQuestions(), fetchCurrentQuestion()])
@@ -498,12 +738,12 @@ onUnmounted(() => {
-
- {{ item.AnswerText || '答案' }}
+
+ 由 ai识别出的答题文本:
+
-
-
- AI 推荐: {{ item.Status === 1 ? '正确' : '错误' }}
-
-
-
-
- 已人工校准: {{ item.Status === 1 ? '正确' : '错误' }}
+
+
+
+
+
AI: {{ item._aiScore }}分 ({{ item._aiStatus === 1 ? '对' : '错' }})
+
+
+
+
+
+ 跟随 AI
+
+
+
+
人工: {{ item.Status === 1 ? '对' : '错' }}
+
@@ -571,10 +813,16 @@ onUnmounted(() => {
>
-
+
确认正确 (绿)
-
+
确认错误 (红)
@@ -603,8 +851,8 @@ onUnmounted(() => {
@@ -613,12 +861,13 @@ onUnmounted(() => {
- {{ idx + 1 }}. {{ item.AnswerText || '题目' }} (汉字加一加)
+ 由 ai识别出的答题文本:
+
@@ -630,6 +879,7 @@ onUnmounted(() => {
主观题原图展示区
+
{
请根据对的字数进行打分
-
-
- AI 推荐: {{ item.Score }} 分
-
-
-
- 已人工校准: {{ item.Score }} 分
+
+
+
+
+
+
+ {{ item._aiScore }} 分
+
+ {{ item._aiStatus === 1 ? '判对' : '判错' }}
+
+
+
+
+
+
+
+
+ 已人工校准
+
+
+
- 最终得分
+ 最终得分 (人工)
-
handleManualScoreUpdate(item, val || 0)">
+ handleManualScoreUpdate(item, val || 0)"
+ >
分
@@ -682,13 +963,13 @@ onUnmounted(() => {
快捷打分
-
+
handleManualScoreUpdate(item, score)"
>
- {{ score }} 分
+ {{ score }}
diff --git a/apps/admin/src/views/results/results-detail/modules/Typewriter.vue b/apps/admin/src/views/results/results-detail/modules/Typewriter.vue
new file mode 100644
index 0000000..417d1dd
--- /dev/null
+++ b/apps/admin/src/views/results/results-detail/modules/Typewriter.vue
@@ -0,0 +1,48 @@
+
+
+
+
+
diff --git a/apps/admin/src/views/user/analysis/index.vue b/apps/admin/src/views/user/analysis/index.vue
index 4fc9478..fb52913 100644
--- a/apps/admin/src/views/user/analysis/index.vue
+++ b/apps/admin/src/views/user/analysis/index.vue
@@ -20,7 +20,7 @@ const currentQuestionDetail = computed(() => store.currentQuestionDetail)
const TeamGroup_QuestionID = computed(() => currentQuestionMainInfo.value?.TeamGroup_QuestionID || 0)
const QuestionID = computed(() => currentQuestionMainInfo.value?.Activity_Question.ID || 0)
-const QuestionDetaiID = computed(() => currentQuestionDetail.value?.Id || 0)
+const QuestionDetailID = computed(() => currentQuestionDetail.value?.Id || 0)
const zoomedImage = ref(null)
const isCompleted = ref(false)
@@ -123,7 +123,7 @@ async function fetchGetGameStatisticsData() {
const _params = {
TeamGroupID: Number(groupsId.value),
QuestionID: Number(QuestionID.value),
- QuestionDetaiID: Number(QuestionDetaiID.value),
+ QuestionDetaiID: Number(QuestionDetailID.value),
}
const { data } = await fetchGetGameStatistics(_params)
teams.value = (data?.data as any[]) || []
diff --git a/apps/admin/src/views/user/cover/index.vue b/apps/admin/src/views/user/cover/index.vue
index c02e8c2..3e296ed 100644
--- a/apps/admin/src/views/user/cover/index.vue
+++ b/apps/admin/src/views/user/cover/index.vue
@@ -1,5 +1,5 @@