update:成绩管理

This commit is contained in:
ltx 2026-09-23 10:00:19 +08:00
parent 17f432625e
commit 9bc1465646

View File

@ -69,7 +69,7 @@
<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>
<div v-else class="row-actions"><el-button v-if="canConfirm(row)" size="small" type="success" :loading="actionLoading && rowActionId === row.sessionEntryId" @click="confirmOne(row)">确认成绩</el-button><el-button v-else-if="canCast(row)" size="small" type="primary" :loading="actionLoading && rowActionId === row.sessionEntryId" @click="castScore(row)">投出成绩</el-button><el-button v-else size="small" disabled>等待成绩</el-button><el-button size="small" @click="showDetail(row)">详情</el-button><el-dropdown trigger="click" @command="command => handleRowCommand(command, row)"><el-button size="small" class="more-button"><span class="more-button-content">更多<el-icon><ArrowDown /></el-icon></span></el-button><template #dropdown><el-dropdown-menu><el-dropdown-item command="correction" :disabled="!row.judgeScores?.length">发起成绩修正</el-dropdown-item><el-dropdown-item command="rematch" divided>安排重赛</el-dropdown-item><el-dropdown-item command="export">导出本场评分单</el-dropdown-item><el-dropdown-item command="void" divided class="danger-menu-item">作废成绩</el-dropdown-item></el-dropdown-menu></template></el-dropdown></div>
<div v-else class="row-actions"><el-button v-if="canConfirm(row)" size="small" type="success" :loading="actionLoading && rowActionId === row.sessionEntryId" @click="confirmOne(row)">确认成绩</el-button><el-button v-else-if="canCast(row)" size="small" type="primary" :loading="actionLoading && rowActionId === row.sessionEntryId" @click="castScore(row)">投出成绩</el-button><el-button v-else size="small" disabled>等待成绩</el-button><el-button size="small" @click="showDetail(row)">详情</el-button><el-dropdown trigger="click" @command="command => handleRowCommand(command, row)"><el-button size="small" class="more-button"><span class="more-button-content">更多<el-icon><ArrowDown /></el-icon></span></el-button><template #dropdown><el-dropdown-menu><el-dropdown-item command="correction" :disabled="!hasSubmittedJudgeScores(row)">发起成绩修正</el-dropdown-item><el-dropdown-item command="rematch" divided>安排重赛</el-dropdown-item><el-dropdown-item command="export">导出本场评分单</el-dropdown-item><el-dropdown-item command="void" divided class="danger-menu-item">作废成绩</el-dropdown-item></el-dropdown-menu></template></el-dropdown></div>
</template></el-table-column>
</el-table></div>
</main>
@ -166,11 +166,9 @@ const judgeMatrixGroups=computed(()=>{
});
const detailColumns=computed(()=>{const map=new Map();for(const sheet of detailRow.value?.judgeScores||[])for(const item of sheet.scoreItems||[]){const key=`${item.itemCode}:${item.subjectCode||''}`;if(!map.has(key))map.set(key,{key,label:item.subjectCode?`${item.itemName}-${item.subjectCode}`:item.itemName,sort:item.sort})}return [...map.values()].sort((a,b)=>a.sort-b.sort)});
const detailRows=computed(()=>(detailRow.value?.judgeScores||[]).map(sheet=>({...sheet,itemValues:Object.fromEntries((sheet.scoreItems||[]).map(item=>[`${item.itemCode}:${item.subjectCode||''}`,item.inputValue??item.countValue??item.subtotal]))})));
// const correctionGroups=computed(()=>{const groups=new Map();for(const sheet of correctionRow.value?.judgeScores||[]){const key=sheet.judgeRoleType||sheet.judgeRoleName;if(key&&!groups.has(key))groups.set(key,{judgeRoleType:key,judgeRoleName:sheet.judgeRoleName||key})}return [...groups.values()]});
// const correctionSheetOptions=computed(()=>(correctionRow.value?.judgeScores||[]).filter(sheet=>(sheet.judgeRoleType||sheet.judgeRoleName)===correctionForm.value.judgeRoleType));
const correctionStatuses=[{value:0,label:'已申请'},{value:10,label:'已批准'},{value:20,label:'已拒绝'},{value:30,label:'裁判修改中'},{value:40,label:'已完成'}];
const correctionGroups=computed(()=>{const map=new Map();for(const s of correctionRow.value?.judgeScores||[]){if(s.judgeRoleType!==undefined&&!map.has(s.judgeRoleType)){map.set(s.judgeRoleType,{judgeRoleType:s.judgeRoleType,judgeRoleName:s.judgeRoleName||`${s.judgeRoleType}号类型`})}}return [...map.values()]});
const correctionSheetOptions=computed(()=>(correctionRow.value?.judgeScores||[]).filter(s=>s.judgeRoleType===correctionForm.value.judgeRoleType));
const correctionGroups=computed(()=>{const map=new Map();for(const s of correctionRow.value?.judgeScores||[]){if(s.scoreSheetId>0&&s.sheetStatus>=10&&s.judgeRoleType!==undefined&&!map.has(s.judgeRoleType)){map.set(s.judgeRoleType,{judgeRoleType:s.judgeRoleType,judgeRoleName:s.judgeRoleName||`${s.judgeRoleType}号类型`})}}return [...map.values()]});
const correctionSheetOptions=computed(()=>(correctionRow.value?.judgeScores||[]).filter(s=>s.scoreSheetId>0&&s.sheetStatus>=10&&s.judgeRoleType===correctionForm.value.judgeRoleType));
function isCorrectionSheetAvailable(x){return Boolean(x&&x.sheetStatus>=10&&x.sheetStatus<90&&!x.hasPendingCorrection)}
function onCorrectionRoleChange(){correctionForm.value.scoreSheetId=null}
const tabTitle=computed(()=>({screen:'成绩投屏',results:'成绩管理',corrections:'成绩修正申请'})[activeTab.value]);
@ -274,6 +272,7 @@ async function loadCorrections(){if(!eventId.value)return;loadingCorrections.val
function resetFilters(){entryKeyword.value='';resultStatus.value=null;loadEntries()}
function progress(x){return x.totalEntries?Math.round(x.completedEntries*100/x.totalEntries):0}
function submittedCount(row){return (row.judgeScores||[]).filter(x=>x.sheetStatus>=10&&x.sheetStatus<90).length}
function hasSubmittedJudgeScores(row){return (row.judgeScores||[]).some(x=>x.scoreSheetId>0&&x.sheetStatus>=10&&x.sheetStatus<90)}
function allSubmitted(row){return !!row.judgeScores?.length&&submittedCount(row)===row.judgeScores.length}
function judgeScoreFor(row,key){return (row.judgeScores||[]).find(judge=>`${judge.judgeRoleType||judge.judgeRoleName||'其他'}:${judge.judgeRole||judge.scoreSheetId}`===key)}
function canCast(row){return !!row.result&&allSubmitted(row)&&row.result.resultStatus>=20&&row.result.resultStatus<90&&!row.result.isDisqualified}