会议状态问题

This commit is contained in:
2025-12-28 10:51:39 +08:00
parent 5db025b10f
commit 1148e3368d
2 changed files with 88 additions and 16 deletions

View File

@@ -7,9 +7,9 @@
<div class="meeting-card-header"> <div class="meeting-card-header">
<div class="meeting-card-title">{{ meeting.meetingName }}</div> <div class="meeting-card-title">{{ meeting.meetingName }}</div>
<div class="meeting-card-status"> <div class="meeting-card-status">
<span v-if="meeting.status === 'scheduled'" class="status-badge status-scheduled">预定</span> <span v-if="isMeetingEnded" class="status-badge status-ended">已结束</span>
<span v-else-if="meeting.status === 'ongoing'" class="status-badge status-ongoing">进行中</span> <span v-else-if="meeting.status === 'ongoing'" class="status-badge status-ongoing">进行中</span>
<span v-else-if="meeting.status === 'ended'" class="status-badge status-ended">已结束</span> <span v-else-if="meeting.status === 'scheduled'" class="status-badge status-scheduled">预定</span>
</div> </div>
</div> </div>
<div class="meeting-card-time"> <div class="meeting-card-time">
@@ -117,6 +117,39 @@ function formatDateTime(dateStr?: string): string {
return `${month}-${day} ${hour}:${minute}` return `${month}-${day} ${hour}:${minute}`
} }
/**
* 判断会议是否已结束
* 满足以下任一条件即为已结束:
* 1. status是ended状态
* 2. 超过了endTime
* 3. actualEndTime存在
*/
const isMeetingEnded = computed(() => {
if (!meeting.value) {
return false
}
// 条件1: status是ended状态
if (meeting.value.status === 'ended') {
return true
}
// 条件3: actualEndTime存在
if (meeting.value.actualEndTime) {
return true
}
// 条件2: 超过了endTime
if (meeting.value.endTime) {
const endTime = new Date(meeting.value.endTime).getTime()
if (!isNaN(endTime) && currentTime.value > endTime) {
return true
}
}
return false
})
/** /**
* 计算倒计时文本 * 计算倒计时文本
*/ */
@@ -125,6 +158,11 @@ const countdownText = computed(() => {
return '' return ''
} }
// 统一判断会议是否已结束
if (isMeetingEnded.value) {
return '会议已结束'
}
const advanceMinutes = meeting.value.advance || 0 const advanceMinutes = meeting.value.advance || 0
const now = currentTime.value const now = currentTime.value
const startTime = new Date(meeting.value.startTime).getTime() const startTime = new Date(meeting.value.startTime).getTime()
@@ -137,10 +175,6 @@ const countdownText = computed(() => {
const advanceTime = startTime - advanceMinutes * 60 * 1000 const advanceTime = startTime - advanceMinutes * 60 * 1000
if (meeting.value.status === 'ended') {
return '会议已结束'
}
if (now < advanceTime) { if (now < advanceTime) {
// 未到提前入会时间 // 未到提前入会时间
const leftMs = advanceTime - now const leftMs = advanceTime - now
@@ -180,7 +214,8 @@ const canJoinMeeting = computed(() => {
return false return false
} }
if (meeting.value.status === 'ended') { // 统一判断会议是否已结束
if (isMeetingEnded.value) {
return false return false
} }
@@ -207,7 +242,8 @@ const buttonText = computed(() => {
if (!meeting.value) { if (!meeting.value) {
return '加载中' return '加载中'
} }
if (meeting.value.status === 'ended') { // 统一判断会议是否已结束
if (isMeetingEnded.value) {
return '会议已结束' return '会议已结束'
} }
if (!canJoinMeeting.value) { if (!canJoinMeeting.value) {

View File

@@ -7,9 +7,9 @@
<view class="meeting-card-header"> <view class="meeting-card-header">
<view class="meeting-card-title">{{ meeting.meetingName || '未命名会议' }}</view> <view class="meeting-card-title">{{ meeting.meetingName || '未命名会议' }}</view>
<view class="meeting-card-status"> <view class="meeting-card-status">
<text v-if="meeting.status === 'scheduled'" class="status-badge status-scheduled">预定</text> <text v-if="isMeetingEnded" class="status-badge status-ended">已结束</text>
<text v-else-if="meeting.status === 'ongoing'" class="status-badge status-ongoing">进行中</text> <text v-else-if="meeting.status === 'ongoing'" class="status-badge status-ongoing">进行中</text>
<text v-else-if="meeting.status === 'ended'" class="status-badge status-ended">已结束</text> <text v-else-if="meeting.status === 'scheduled'" class="status-badge status-scheduled">预定</text>
</view> </view>
</view> </view>
<view class="meeting-card-time"> <view class="meeting-card-time">
@@ -121,6 +121,39 @@ function formatDateTime(dateStr?: string): string {
return `${month}-${day} ${hour}:${minute}` return `${month}-${day} ${hour}:${minute}`
} }
/**
* 判断会议是否已结束
* 满足以下任一条件即为已结束:
* 1. status是ended状态
* 2. 超过了endTime
* 3. actualEndTime存在
*/
const isMeetingEnded = computed((): boolean => {
if (!meeting.value) {
return false
}
// 条件1: status是ended状态
if (meeting.value.status === 'ended') {
return true
}
// 条件3: actualEndTime存在
if (meeting.value.actualEndTime) {
return true
}
// 条件2: 超过了endTime
if (meeting.value.endTime) {
const endTime = new Date(meeting.value.endTime.replace(' ', 'T')).getTime()
if (!isNaN(endTime) && currentTime.value > endTime) {
return true
}
}
return false
})
/** /**
* 计算倒计时文本 * 计算倒计时文本
*/ */
@@ -129,6 +162,11 @@ const countdownText = computed((): string => {
return '' return ''
} }
// 统一判断会议是否已结束
if (isMeetingEnded.value) {
return '会议已结束'
}
// advance 默认为 0 // advance 默认为 0
const advanceMinutes = meeting.value.advance || 0 const advanceMinutes = meeting.value.advance || 0
@@ -144,10 +182,6 @@ const countdownText = computed((): string => {
const advanceTime = startTime - advanceMinutes * 60 * 1000 const advanceTime = startTime - advanceMinutes * 60 * 1000
if (meeting.value.status === 'ended') {
return '会议已结束'
}
if (now < advanceTime) { if (now < advanceTime) {
// 未到提前入会时间 // 未到提前入会时间
const leftMs = advanceTime - now const leftMs = advanceTime - now
@@ -187,7 +221,8 @@ const canJoinMeeting = computed((): boolean => {
return false return false
} }
if (meeting.value.status === 'ended') { // 统一判断会议是否已结束
if (isMeetingEnded.value) {
return false return false
} }
@@ -215,7 +250,8 @@ const buttonText = computed((): string => {
if (!meeting.value) { if (!meeting.value) {
return '加载中' return '加载中'
} }
if (meeting.value.status === 'ended') { // 统一判断会议是否已结束
if (isMeetingEnded.value) {
return '会议已结束' return '会议已结束'
} }
if (!canJoinMeeting.value) { if (!canJoinMeeting.value) {