diff --git a/src/views/user/registration/index.vue b/src/views/user/registration/index.vue index 0d4f85e..bdf2367 100644 --- a/src/views/user/registration/index.vue +++ b/src/views/user/registration/index.vue @@ -300,18 +300,6 @@
- - - - + @@ -350,7 +341,7 @@ type="primary" @click="handleStep2Next" :loading="submitDraftLoading" - :disabled="hasAnyValidationErrors() || hasAnyRegistrationLimit() || hasAnyCompletionCountError()" + :disabled="hasAnyValidationErrors() || hasAnyRegistrationLimit()" > 下一步 @@ -943,8 +934,6 @@ const memberRegistrationLimitMap = ref({}); // { memberId: { isLimited: boolean, const registrationLimitCheckResult = ref(null); // 报名限制检查结果 const validationLoading = ref(false); // 验证加载状态 let validationDebounceTimer = null; // 防抖定时器 -// 参赛人数错误提示显示控制 -const showCompletionCountErrors = ref(false); // Step2: 团队相关 const teamList = ref([]); @@ -1014,7 +1003,6 @@ const clearRegisterState = () => { memberRegistrationLimitMap.value = {}; registrationLimitCheckResult.value = null; validationLoading.value = false; - showCompletionCountErrors.value = false; if (validationDebounceTimer) { clearTimeout(validationDebounceTimer); validationDebounceTimer = null; @@ -1062,7 +1050,6 @@ const resetStep2AndBeyond = () => { // 验证相关状态重置 memberValidationMap.value = {}; registrationLimitCheckResult.value = null; - showCompletionCountErrors.value = false; }; const openRegistrationDialog = async (row) => { @@ -1293,71 +1280,6 @@ const hasAnyRegistrationLimit = () => { return registrationLimitCheckResult.value?.hasLimit ?? false; }; -// ==================== 参赛人数验证相关 ==================== -// 获取某个组别的当前分配人数(考虑多团队模式) -const getGroupAssignedCount = (groupId) => { - const group = selectedGroupItems.value.find(g => g.id === groupId); - if (!group) return 0; - - // 检查是否为团队项目且启用了多团队模式 - const isMultiTeamMode = isTeamProject(group) && groupTeamsMap.value[groupId] && - (groupTeamsMap.value[groupId].length > 1 || getGroupMaxTeams(groupId) > 1); - - if (isMultiTeamMode) { - // 多团队模式:统计所有团队的队员数 - return groupTeamsMap.value[groupId].reduce((total, team) => { - return total + (team.members?.length ?? 0); - }, 0); - } else { - // 单团队模式 - return groupMemberMap.value[groupId]?.length ?? 0; - } -}; - -// 检查某个组别的参赛人数是否符合要求 -const checkGroupCompletionCount = (group) => { - const requiredCount = group.projectCompletionCount ?? 0; - if (requiredCount <= 0) return { isValid: true, message: '' }; - - const currentCount = getGroupAssignedCount(group.id); - - if (currentCount !== requiredCount) { - let message; - if (currentCount < requiredCount) { - message = `${group.projectName}参赛人数错误(少${requiredCount - currentCount}人)`; - } else { - message = `${group.projectName}参赛人数错误(多${currentCount - requiredCount}人)`; - } - return { isValid: false, message }; - } - - return { isValid: true, message: '' }; -}; - -// 获取所有参赛人数错误信息 -const getCompletionCountErrors = () => { - const errors = []; - for (const group of selectedGroupItems.value) { - const result = checkGroupCompletionCount(group); - if (!result.isValid) { - errors.push({ - groupId: group.id, - projectName: group.projectName, - groupName: group.groupName ?? group.name, - message: result.message - }); - } - } - return errors; -}; - -// 检查是否有任何参赛人数错误 -const hasAnyCompletionCountError = () => { - return getCompletionCountErrors().length > 0; -}; - - - // 判断组别是否已达到队伍数量限制 const isGroupAtTeamLimit = (groupId) => { const limit = groupTeamLimitMap.value[groupId]; @@ -1400,8 +1322,6 @@ const assignMemberToActiveGroup = async (member) => { } groupMemberMap.value[gId].push({ ...member, teamId: member.teamId }); - // 显示参赛人数错误提示 - showCompletionCountErrors.value = true; // 触发实时验证(包含报名限制检查) debounceValidateAllMembers(); }; @@ -1422,8 +1342,6 @@ const removeMemberFromGroup = (groupId, memberId) => { usedTeamId.value = null; } - // 显示参赛人数错误提示 - showCompletionCountErrors.value = true; // 触发实时验证 debounceValidateAllMembers(); }; @@ -1624,8 +1542,6 @@ const assignMemberToActiveTeam = async (member) => { } team.members.push({ ...member, teamId: member.teamId }); - // 显示参赛人数错误提示 - showCompletionCountErrors.value = true; // 触发实时验证(包含报名限制检查) debounceValidateAllMembers(); }; @@ -1649,8 +1565,6 @@ const removeMemberFromTeam = (groupId, teamIndex, memberId) => { usedTeamId.value = null; } - // 显示参赛人数错误提示 - showCompletionCountErrors.value = true; // 触发实时验证 debounceValidateAllMembers(); }; @@ -1815,10 +1729,41 @@ const checkRegistrationLimit = async () => { teamId: usedTeamId.value ?? selectedTeamId.value, }); if (succeeded) { + // 添加错误边界处理,确保数据格式正确 + if (data && typeof data === 'object') { + // 确保 limitDetails 是一个数组 + if (!Array.isArray(data.limitDetails)) { + data.limitDetails = []; + } + // 确保每个 limitDetail 都有 limitMessage + data.limitDetails = data.limitDetails.map((detail) => { + if (detail && typeof detail === 'object') { + return { + ...detail, + limitMessage: detail.limitMessage ?? '报名限制' + }; + } + return { + limitMessage: '报名限制' + }; + }); + } else { + // 如果 data 格式异常,使用默认值 + registrationLimitCheckResult.value = { + hasLimit: false, + limitDetails: [] + }; + return; + } registrationLimitCheckResult.value = data; } - } catch { - console.error('检查报名限制失败'); + } catch (error) { + console.error('检查报名限制失败:', error); + // 出错时重置结果,避免显示异常 + registrationLimitCheckResult.value = { + hasLimit: false, + limitDetails: [] + }; } }; @@ -1848,20 +1793,11 @@ const handleStep1Next = async () => { setActiveTeam(group.id, 1); } }); - // 确保在初始化后不会立即显示参赛人数错误 - showCompletionCountErrors.value = false; }; const handleStep2Next = async () => { if (!currentEventId.value) return; - // 先检查参赛人数 - if (hasAnyCompletionCountError()) { - const errors = getCompletionCountErrors(); - ElMessage.warning(errors[0]?.message ?? '参赛人数错误,请检查后重试'); - return; - } - // 先检查报名限制 await checkRegistrationLimit();