fix: 修复选手/集体列表重复问题,添加集体项目已报名标记

- add-team.vue: 添加选手列表去重逻辑
- event-register.vue: loadTeamList添加去重和已报名标记
- event-register.vue: toggleTeam添加已报名警告
- 集体项目UI显示已报名标签
This commit is contained in:
DevOps
2026-01-15 16:52:08 +08:00
parent 82deb8b4f9
commit 5f68218079
2 changed files with 62 additions and 8 deletions
+9
View File
@@ -119,6 +119,15 @@ export default {
list = res list = res
} }
// Deduplicate by id
const seen = new Set()
list = list.filter(item => {
const key = item.id
if (seen.has(key)) return false
seen.add(key)
return true
})
this.playerList = list.map(item => ({ this.playerList = list.map(item => ({
id: item.id, id: item.id,
name: item.name || item.playerName name: item.name || item.playerName
+53 -8
View File
@@ -66,13 +66,16 @@
</view> </view>
<view class="player-list"> <view class="player-list">
<view class="player-item" v-for="(item, index) in teamList" :key="index"> <view class="player-item" v-for="(item, index) in teamList" :key="index" :class="{ 'registered': item.hasRegistered }">
<view class="player-checkbox" @click="toggleTeam(item)"> <view class="player-checkbox" @click="toggleTeam(item)">
<image v-if="item.selected" class="checkbox-img" src="/static/images/选中@3x.png" mode="aspectFit"></image> <image v-if="item.selected" class="checkbox-img" src="/static/images/选中@3x.png" mode="aspectFit"></image>
<image v-else class="checkbox-img" src="/static/images/未选中@3x.png" mode="aspectFit"></image> <image v-else class="checkbox-img" src="/static/images/未选中@3x.png" mode="aspectFit"></image>
</view> </view>
<view class="player-info"> <view class="player-info">
<view class="player-name">{{ item.name }}</view> <view class="player-name">
{{ item.name }}
<text v-if="item.hasRegistered" class="registered-tag">已报名</text>
</view>
<view class="player-id">成员数{{ item.memberCount || 0 }}</view> <view class="player-id">成员数{{ item.memberCount || 0 }}</view>
</view> </view>
<view class="player-actions"> <view class="player-actions">
@@ -482,12 +485,43 @@ export default {
}) })
let list = res.records || (Array.isArray(res) ? res : []) let list = res.records || (Array.isArray(res) ? res : [])
this.teamList = list.map(item => ({
id: item.id, // Deduplicate by id
name: item.teamName || item.name, const seen = new Set()
memberCount: item.memberCount || 0, list = list.filter(item => {
selected: false const key = item.id
})) if (seen.has(key)) return false
seen.add(key)
return true
})
// Get current project IDs
const projectIds = this.selectedProjects.map(p => p.id)
// Check which teams have already registered for these projects
let registeredTeamNames = []
if (projectIds.length > 0 && this.eventId) {
try {
const regRes = await athleteAPI.getRegisteredAthletes({
competitionId: this.eventId,
projectIds: projectIds.join(',')
})
registeredTeamNames = (regRes || []).filter(r => r.teamName).map(r => r.teamName)
} catch (e) {
console.log('查询已报名集体失败:', e)
}
}
this.teamList = list.map(item => {
const teamName = item.teamName || item.name
return {
id: item.id,
name: teamName,
memberCount: item.memberCount || 0,
selected: false,
hasRegistered: registeredTeamNames.includes(teamName)
}
})
} catch (err) { } catch (err) {
console.error('加载集体列表失败:', err) console.error('加载集体列表失败:', err)
this.teamList = [] this.teamList = []
@@ -530,6 +564,17 @@ export default {
}, },
toggleTeam(item) { toggleTeam(item) {
// Warn if team has already registered for this project
if (item.hasRegistered && !item.selected) {
uni.showModal({
title: '提示',
content: '该集体已报名此项目,重复报名将被系统拒绝',
confirmText: '知道了',
showCancel: false
})
return
}
const index = this.teamList.findIndex(t => t.id === item.id) const index = this.teamList.findIndex(t => t.id === item.id)
if (index !== -1) { if (index !== -1) {
this.$set(this.teamList[index], 'selected', !this.teamList[index].selected) this.$set(this.teamList[index], 'selected', !this.teamList[index].selected)