Compare commits
2 Commits
27665c2186
...
3085616605
| Author | SHA1 | Date | |
|---|---|---|---|
| 3085616605 | |||
| 092910404a |
@@ -170,6 +170,19 @@
|
||||
<el-table-column label="组别" min-width="100" align="center">
|
||||
<template #default="{ row }">{{ groupMap[row.group] || row.group }}</template>
|
||||
</el-table-column>
|
||||
<!-- R90 新增:与「小组视图」对照用(人工测试反馈:选手列表缺小组编号,横向对比不便) -->
|
||||
<el-table-column label="小组编号" min-width="200">
|
||||
<template #default="{ row }">
|
||||
<span v-if="accountTeamLabel(row)">{{ accountTeamLabel(row) }}</span>
|
||||
<span v-else class="team-school-missing">— 无小组</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="所属学校" min-width="220">
|
||||
<template #default="{ row }">
|
||||
<span v-if="row.schoolName">{{ row.schoolName }}</span>
|
||||
<span v-else class="team-school-missing">— 未填写</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="状态" min-width="100" align="center">
|
||||
<template #default="{ row }">
|
||||
<el-tag :type="row.activated ? 'success' : 'info'" size="small">{{ row.activated ? '已激活' : '未激活' }}</el-tag>
|
||||
@@ -209,7 +222,9 @@
|
||||
|
||||
<!-- ===== 视图二:小组视图(R84 续六新增)===== -->
|
||||
<!-- 需求:查看已激活/未激活小组,且必须携带小组所属学校名称。
|
||||
口径:小组键 = 组别 + 队伍号;激活 = 全组成员均已激活;
|
||||
口径:小组键 = 组别 + 队伍号;
|
||||
**「已激活」= 组内至少 1 名成员已激活(= 可以参赛)**,故「部分激活」组归入已激活侧
|
||||
(R90 续三修正,旧口径为「全员激活」);
|
||||
学校 = aggregation.organization_cn(同一小组多校时并列显示并标「多校」)。 -->
|
||||
<template v-else>
|
||||
<div class="toolbar">
|
||||
@@ -220,16 +235,23 @@
|
||||
<el-option label="教师组" value="jiaoshi" />
|
||||
</el-select>
|
||||
<el-select v-model="teamActivatedFilter" placeholder="激活状态" clearable @change="onTeamFilterChange" class="filter-select">
|
||||
<el-option label="已激活(全组已激活)" value="true" />
|
||||
<el-option label="未激活(含部分激活)" value="false" />
|
||||
<el-option label="已有成员激活(可参赛)" value="true" />
|
||||
<el-option label="暂无成员激活" value="false" />
|
||||
</el-select>
|
||||
<el-checkbox v-model="teamIncludeTest" class="import-test-flag" @change="onTeamFilterChange">
|
||||
含测试数据
|
||||
</el-checkbox>
|
||||
<el-button size="small" type="info" plain :loading="teamsLoading" @click="fetchTeams">刷新</el-button>
|
||||
<span class="team-summary" v-if="teamSummary">
|
||||
共 {{ teamSummary.total }} 个小组 · 已激活 {{ teamSummary.activated }} · 部分激活 {{ teamSummary.partial }} · 未激活 {{ teamSummary.inactive }}
|
||||
共 {{ teamSummary.total }} 个小组 · 全员激活 {{ teamSummary.activated }} · 部分激活 {{ teamSummary.partial }} · 未激活 {{ teamSummary.inactive }}
|
||||
|成员 {{ teamSummary.memberActivated }}/{{ teamSummary.memberTotal }} 已激活
|
||||
<template v-if="teamActivatedFilter !== ''">
|
||||
|<span class="team-summary-filtered">当前筛选后 {{ teamFilteredSummary.total }} 个小组<span v-if="teamActivatedFilter === 'true'">(全员激活 {{ teamFilteredSummary.activated }} · 部分激活 {{ teamFilteredSummary.partial }})</span> · 成员 {{ teamFilteredSummary.memberActivated }}/{{ teamFilteredSummary.memberTotal }} 已激活</span>
|
||||
</template>
|
||||
</span>
|
||||
<!-- R90 续三:「已激活」= 小组内至少 1 名成员已完成激活(即可参赛),故「部分激活」组也一并计入 -->
|
||||
<span class="team-summary-hint" v-if="teamActivatedFilter === 'true' && teamFilteredSummary.partial > 0">
|
||||
说明:「已有成员激活」= 该小组至少 1 名成员已完成激活(即可参赛);其中 {{ teamFilteredSummary.partial }} 个小组为「部分激活」,组内尚有成员未激活。
|
||||
</span>
|
||||
</div>
|
||||
<el-table :data="teams" stripe v-loading="teamsLoading" class="admin-table" style="width: 100%">
|
||||
@@ -1869,6 +1891,20 @@ const teamActivatedFilter = ref('')
|
||||
const teamIncludeTest = ref(false)
|
||||
const teamSummary = ref(null)
|
||||
|
||||
// R90:双口径汇总的读取辅助(防御式——后端未同步时自动退回全量口径,不显示 undefined)
|
||||
// R90 续三:补 activated / partial 两项(筛选后三态分布),用于「已有成员激活」筛选下标注全员/部分激活构成
|
||||
const teamFilteredSummary = computed(() => {
|
||||
const s = teamSummary.value
|
||||
if (!s) return { total: 0, memberTotal: 0, memberActivated: 0, activated: 0, partial: 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,
|
||||
activated: s.filteredActivated === undefined ? 0 : s.filteredActivated,
|
||||
partial: s.filteredPartial === undefined ? 0 : s.filteredPartial,
|
||||
}
|
||||
})
|
||||
|
||||
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; }
|
||||
|
||||
|
||||
Reference in New Issue
Block a user