成绩管理左侧修改为项目列表展示&不展示排名
This commit is contained in:
parent
05d0328228
commit
ce8440edf3
@ -9,15 +9,15 @@
|
||||
<template v-if="activeTab !== 'corrections'">
|
||||
<div class="workspace">
|
||||
<aside class="session-panel">
|
||||
<div class="session-head"><b>比赛场次</b><el-button text type="primary" :loading="loadingSessions" @click="loadSessions">刷新</el-button></div>
|
||||
<div class="session-head"><b>比赛项目</b><el-button text type="primary" :loading="loadingSessions" @click="loadSessions">刷新</el-button></div>
|
||||
<div class="session-list">
|
||||
<button v-for="(session, index) in sessions" :key="session.sessionId" class="session-switch" :class="{ active: selectedSession?.sessionId === session.sessionId }" @click="selectSession(session)">
|
||||
<button v-for="(project, index) in sessionGroups" :key="project.key" class="session-switch" :class="{ active: selectedProjectId === project.key }" @click="selectProject(project)">
|
||||
<span class="session-sequence">{{ String(index + 1).padStart(2, '0') }}</span>
|
||||
<div class="session-info"><strong>{{ formatSessionName(session, index) }}</strong><span>{{ session.projectName || '未命名项目' }}</span><small>{{ session.groupName || '混合组别' }} · {{ session.venueName || '场地待定' }}</small></div>
|
||||
<span class="session-count">{{ session.completedEntries || 0 }}/{{ session.totalEntries || 0 }}</span>
|
||||
<i><span :style="{ width: progress(session) + '%' }"></span></i>
|
||||
<div class="session-info"><strong>{{ project.projectName }}</strong><span>{{ project.groupCount }} 个组别 · {{ project.sessions.length }} 个场次</span><small>{{ project.groupSummary }}</small></div>
|
||||
<span class="session-count">{{ project.completedEntries }}/{{ project.totalEntries }}</span>
|
||||
<i><span :style="{ width: progress(project) + '%' }"></span></i>
|
||||
</button>
|
||||
<el-empty v-if="!loadingSessions && !sessions.length" :image-size="70" description="暂无场次" />
|
||||
<el-empty v-if="!loadingSessions && !sessionGroups.length" :image-size="70" description="暂无项目" />
|
||||
</div>
|
||||
</aside>
|
||||
|
||||
@ -59,7 +59,6 @@
|
||||
<el-table-column v-if="showRequiredScore" :label="showFactorScores ? '规定系数 Q' : requiredScoreLabel" min-width="110" align="center"><template #default="{ row }">{{ score(row.result?.requiredScore) }}</template></el-table-column>
|
||||
<el-table-column :label="showFactorScores ? '得分系数 M' : deductionScoreLabel" min-width="110" align="center"><template #default="{ row }">{{ deductionScoreText(row.result, row._session?.scoreRuleCode) }}</template></el-table-column>
|
||||
<el-table-column label="总分" width="96" align="center"><template #default="{ row }"><b class="total" :class="{ dq: row.result?.isDisqualified }">{{ row.result?.isDisqualified ? 'DQ' : score(row.result?.totalScore ?? row.result?.scoreText) }}</b></template></el-table-column>
|
||||
<el-table-column label="排名" width="72" align="center"><template #default="{ row }"><span v-if="row.result?.rank" :class="['rank-number', `rank-${row.result.rank}`]">{{ row.result.rank }}</span><span v-else class="muted">—</span></template></el-table-column>
|
||||
<el-table-column label="状态" width="96" fixed="right" align="center"><template #default="{ row }"><el-tag v-if="row.result" :type="resultTag(row.result.resultStatus)" effect="light">{{ row.result.resultStatusName }}</el-tag><span v-else class="muted">计算中</span></template></el-table-column>
|
||||
<el-table-column label="操作" :width="activeTab === 'screen' ? 190 : 250" fixed="right" align="center"><template #default="{ row }">
|
||||
<div v-if="activeTab === 'screen'" class="row-actions"><el-tooltip :content="castDisabledReason(row)" :disabled="canCastForKind(row)"><span><el-button size="small" type="primary" :loading="actionLoading && rowActionId === row.sessionEntryId" :disabled="!canCastForKind(row)" @click="castScore(row)">投出{{ castEntityLabel }}成绩</el-button></span></el-tooltip><el-button size="small" @click="showDetail(row)">评分详情</el-button></div>
|
||||
@ -157,7 +156,7 @@ const scoreScreenWindowName='yd-event-score-screen';
|
||||
const scoreScreenChannelName=computed(()=>`yd-event-score-screen-${eventId.value}`);
|
||||
|
||||
const resultStatuses=[{value:0,label:'计算中'},{value:10,label:'待复核'},{value:20,label:'已确认'},{value:30,label:'已投屏'},{value:40,label:'已更正'},{value:90,label:'已作废'}];
|
||||
// 左侧逐场次展示接口顺序;右侧仍按项目合并同项目的场次成绩。
|
||||
// 按场次首次出现的顺序排列项目,左侧每个项目只显示一次,右侧汇总其全部场次。
|
||||
const sessionGroups=computed(()=>{
|
||||
const groups=new Map();
|
||||
sessions.value.forEach((session,index)=>{
|
||||
@ -167,7 +166,10 @@ const sessionGroups=computed(()=>{
|
||||
group.sessions.push({...session,_sourceIndex:index});
|
||||
if(session.groupName)group.groupNames.add(session.groupName);
|
||||
});
|
||||
return [...groups.values()].map(group=>({...group,groupCount:group.groupNames.size||1}));
|
||||
return [...groups.values()].map(group=>{
|
||||
const groupLabels=[...group.groupNames];
|
||||
return {...group,groupCount:groupLabels.length||1,groupSummary:groupLabels.length?`${groupLabels.slice(0,3).join('、')}${groupLabels.length>3?'等':''}`:'混合组别',completedEntries:group.sessions.reduce((sum,session)=>sum+(Number(session.completedEntries)||0),0),totalEntries:group.sessions.reduce((sum,session)=>sum+(Number(session.totalEntries)||0),0)};
|
||||
});
|
||||
});
|
||||
const selectedProject=computed(()=>sessionGroups.value.find(project=>project.key===selectedProjectId.value)||null);
|
||||
const selectedProjectSessions=computed(()=>selectedProject.value?.sessions||[]);
|
||||
@ -310,9 +312,10 @@ async function loadSessions(){
|
||||
const sessionRows=validResponse(res);
|
||||
if(!Array.isArray(sessionRows))throw new Error('比赛场次数据格式错误');
|
||||
// 刷新全部场次时保留当前场次;场次消失才回退到列表首项。
|
||||
const previousSessionId=selectedSession.value?.sessionId;
|
||||
const previousSessionId=selectedSession.value?.sessionId,previousProjectId=selectedProjectId.value;
|
||||
sessions.value=sessionRows;
|
||||
const currentSession=sessions.value.find(session=>session.sessionId===previousSessionId)||sessions.value[0]||null;
|
||||
const fallbackSessionId=sessionGroups.value.find(project=>project.key===previousProjectId)?.sessions[0]?.sessionId;
|
||||
const currentSession=sessions.value.find(session=>session.sessionId===previousSessionId)||sessions.value.find(session=>session.sessionId===fallbackSessionId)||sessions.value[0]||null;
|
||||
const currentProject=sessionGroups.value.find(project=>project.sessions.some(session=>session.sessionId===currentSession?.sessionId));
|
||||
if(selectedProjectId.value!==currentProject?.key){clearResultSelection();entries.value=[];entriesSyncError.value=false;entriesFailureCount=0;entriesNextRetryAt=0}
|
||||
selectedProjectId.value=currentProject?.key||'';
|
||||
@ -348,6 +351,11 @@ async function selectSession(session){
|
||||
if(selectedProjectId.value!==project.key){clearResultSelection();entries.value=[];entriesSyncError.value=false;entriesFailureCount=0;entriesNextRetryAt=0}
|
||||
selectedProjectId.value=project.key;selectedSession.value=session;await loadEntries();
|
||||
}
|
||||
function selectProject(project){
|
||||
if(selectedProjectId.value===project.key)return;
|
||||
const firstSession=project.sessions[0];
|
||||
if(firstSession)void selectSession(firstSession);
|
||||
}
|
||||
function selectSessionById(sessionId){const session=sessions.value.find(item=>item.sessionId===sessionId);if(session)selectSession(session)}
|
||||
function compareIntegerText(left,right){
|
||||
const a=String(left??'').replace(/^0+/,'')||'0',b=String(right??'').replace(/^0+/,'')||'0';
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user