fix:添加评审时间控制

This commit is contained in:
zhonghua 2026-04-17 13:50:52 +08:00
parent 41e0550589
commit 39f0d074a2

View File

@ -5,36 +5,34 @@
</a-card>
<!-- 数据表格 -->
<a-table
:columns="columns"
:data-source="dataSource"
:loading="loading"
:pagination="false"
row-key="contestId"
>
<a-table :columns="columns" :data-source="dataSource" :loading="loading" :pagination="false" row-key="contestId">
<template #bodyCell="{ column, record, index }">
<template v-if="column.key === 'index'">
{{ index + 1 }}
</template>
<template v-else-if="column.key === 'contestName'">
<a @click="handleViewDetail(record)">{{ record.contestName }}</a>
<span v-if="!isWithinReviewWindow(record)">{{ record.contestName }}</span>
<a v-else @click="handleViewDetail(record)">{{ record.contestName }}</a>
</template>
<template v-else-if="column.key === 'progress'">
<a-progress
:percent="getProgressPercent(record)"
:status="getProgressStatus(record)"
size="small"
style="width: 120px"
/>
<a-progress :percent="getProgressPercent(record)" :status="getProgressStatus(record)" size="small"
style="width: 120px" />
<span class="progress-text">{{ record.reviewed }}/{{ record.totalAssigned }}</span>
</template>
<template v-else-if="column.key === 'reviewStatus'">
<a-tag v-if="record.totalAssigned > 0 && record.pending === 0" color="success">已完成</a-tag>
<a-tag v-else-if="record.totalAssigned === 0" color="default">无分配</a-tag>
<a-tag v-else-if="!isWithinReviewWindow(record)" color="processing">评审待开始</a-tag>
<a-tag v-else color="processing">评审中</a-tag>
</template>
<template v-else-if="column.key === 'action'">
<a-button type="link" size="small" @click="handleViewDetail(record)">
<a-tooltip v-if="!isWithinReviewWindow(record)" :title="getReviewActionTooltip(record)">
<span class="review-action-wrap">
<a-button type="link" size="small" disabled>进入评审</a-button>
</span>
</a-tooltip>
<a-button v-else type="link" size="small" @click="handleViewDetail(record)">
进入评审
</a-button>
</template>
@ -107,6 +105,43 @@ const getProgressStatus = (record: any) => {
return "active"
}
/** 与后端 getJudgeContests 返回的 reviewStartTime / reviewEndTime 对齐;均未配置时不限制 */
const isWithinReviewWindow = (record: {
reviewStartTime?: string | null
reviewEndTime?: string | null
}): boolean => {
const now = Date.now()
const tStart = record.reviewStartTime
? new Date(record.reviewStartTime).getTime()
: null
const tEnd = record.reviewEndTime ? new Date(record.reviewEndTime).getTime() : null
if (tStart == null && tEnd == null) return true
if (tStart != null && !Number.isNaN(tStart) && now < tStart) return false
if (tEnd != null && !Number.isNaN(tEnd) && now > tEnd) return false
return true
}
const fmtTime = (iso?: string | null) => {
if (!iso) return ""
const d = new Date(iso)
return Number.isNaN(d.getTime()) ? String(iso) : d.toLocaleString("zh-CN", { hour12: false })
}
const getReviewActionTooltip = (record: any): string => {
const now = Date.now()
const tStart = record.reviewStartTime
? new Date(record.reviewStartTime).getTime()
: null
const tEnd = record.reviewEndTime ? new Date(record.reviewEndTime).getTime() : null
if (tStart != null && !Number.isNaN(tStart) && now < tStart) {
return `评审尚未开始${record.reviewStartTime ? `${fmtTime(record.reviewStartTime)} 起)` : ""}`
}
if (tEnd != null && !Number.isNaN(tEnd) && now > tEnd) {
return `评审已结束${record.reviewEndTime ? `(已于 ${fmtTime(record.reviewEndTime)} 截止)` : ""}`
}
return "当前不在评审时间范围内"
}
//
const fetchList = async () => {
loading.value = true
@ -220,4 +255,9 @@ $gradient-primary: linear-gradient(135deg, $primary 0%, $primary-dark 100%);
font-size: 12px;
color: #666;
}
.review-action-wrap {
display: inline-block;
cursor: not-allowed;
}
</style>