diff --git a/src/views/Admin.vue b/src/views/Admin.vue
index bbafb42..7ad49ca 100644
--- a/src/views/Admin.vue
+++ b/src/views/Admin.vue
@@ -170,6 +170,19 @@
{{ groupMap[row.group] || row.group }}
+
+
+
+ {{ accountTeamLabel(row) }}
+ — 无小组
+
+
+
+
+ {{ row.schoolName }}
+ — 未填写
+
+
{{ row.activated ? '已激活' : '未激活' }}
@@ -230,6 +243,13 @@
共 {{ teamSummary.total }} 个小组 · 已激活 {{ teamSummary.activated }} · 部分激活 {{ teamSummary.partial }} · 未激活 {{ teamSummary.inactive }}
|成员 {{ teamSummary.memberActivated }}/{{ teamSummary.memberTotal }} 已激活
+
+ |当前筛选后 {{ teamFilteredSummary.total }} 个小组 · 成员 {{ teamFilteredSummary.memberActivated }}/{{ teamFilteredSummary.memberTotal }} 已激活
+
+
+
+
+ 说明:「已激活小组」只统计「全员已激活」的小组;另有 {{ teamPartialExtra }} 名已激活选手所在小组尚未全员激活(部分激活),故不计入上表,但会计入「选手列表」的已激活人数。
@@ -1869,6 +1889,22 @@ const teamActivatedFilter = ref('')
const teamIncludeTest = ref(false)
const teamSummary = ref(null)
+// R90:双口径汇总的读取辅助(防御式——后端未同步时自动退回全量口径,不显示 undefined)
+const teamFilteredSummary = computed(() => {
+ const s = teamSummary.value
+ if (!s) return { total: 0, memberTotal: 0, memberActivated: 0 }
+ return {
+ total: s.filteredTotal === undefined ? s.total : s.filteredTotal,
+ memberTotal: s.filteredMemberTotal === undefined ? s.memberTotal : s.filteredMemberTotal,
+ memberActivated: s.filteredMemberActivated === undefined ? s.memberActivated : s.filteredMemberActivated,
+ }
+})
+// 「部分激活」小组内已激活的选手数(= 选手列表激活人数 − 已激活小组成员数 的差额来源)
+const teamPartialExtra = computed(() => {
+ const s = teamSummary.value
+ return s && typeof s.memberActivatedInPartial === 'number' ? s.memberActivatedInPartial : 0
+})
+
async function fetchTeams() {
teamsLoading.value = true
try {
@@ -1894,6 +1930,14 @@ function onAccountsViewChange(view) {
if (view === 'teams') fetchTeams()
}
+// R90:选手列表「小组编号」显示文本(与小组视图同优先级:teamNumber → teamId → 队伍 #uid)
+function accountTeamLabel(row) {
+ if (!row) return ''
+ if (row.teamNumber || row.teamId) return row.teamNumber || row.teamId
+ if (row.teamUid !== null && row.teamUid !== undefined) return '队伍 #' + row.teamUid
+ return ''
+}
+
async function fetchAccounts() {
accountsLoading.value = true
try {
@@ -3815,6 +3859,16 @@ onMounted(() => {
color: #606266;
line-height: 1.6;
}
+/* R90:当前筛选后口径(与全量口径同排显示,用主色区分) */
+.team-summary-filtered { color: #409eff; font-weight: 600; }
+/* R90:口径说明(解释「选手列表激活人数」与「已激活小组成员数」的差额来源) */
+.team-summary-hint {
+ flex-basis: 100%;
+ font-size: 12px;
+ color: #909399;
+ line-height: 1.6;
+ margin-top: 4px;
+}
/* 小组视图:未填写学校时的占位样式(区别于有值文本) */
.team-school-missing { color: #c0c4cc; }