日常办公-场地预约:
已过的时间段应该不能选择
This commit is contained in:
+18
-1
@@ -457,9 +457,13 @@ public class SiteCugApplyController {
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 当预约日期就是今天时,已经过了开始时间的时间块直接标记为不可预约,
|
||||
* 这样全天候和分段预约在前端展示时都会统一变成禁用状态。
|
||||
*/
|
||||
private NutMap buildAvailabilityBlock(String day, int startMinute, int endMinute, List<int[]> reservedRanges, List<int[]> disabledRanges, boolean siteClosed, int groupIndex, String groupLabel) {
|
||||
String status = "available";
|
||||
if (siteClosed || intersectsAny(startMinute, endMinute, disabledRanges)) {
|
||||
if (siteClosed || isExpiredAvailabilityBlock(day, startMinute) || intersectsAny(startMinute, endMinute, disabledRanges)) {
|
||||
status = "closed";
|
||||
} else if (intersectsAny(startMinute, endMinute, reservedRanges)) {
|
||||
status = "reserved";
|
||||
@@ -478,6 +482,19 @@ public class SiteCugApplyController {
|
||||
.addv("endDateTime", day + " " + formatMinutes(endMinute) + ":00");
|
||||
}
|
||||
|
||||
/**
|
||||
* 仅在当天按“时间块开始时间是否已经过去”判断是否失效,
|
||||
* 避免用户继续选中已经开始或已经结束的预约时段。
|
||||
*/
|
||||
private boolean isExpiredAvailabilityBlock(String day, int startMinute) {
|
||||
String today = DateUtil.today();
|
||||
if (!StrUtil.equals(today, day)) {
|
||||
return false;
|
||||
}
|
||||
DateTime blockStart = DateUtil.parseDateTime(day + " " + formatMinutes(startMinute) + ":00");
|
||||
return !blockStart.isAfter(DateUtil.date());
|
||||
}
|
||||
|
||||
private boolean isSiteClosed(SiteCugInfo siteInfo, String day, Set<String> holidaySet) {
|
||||
if (isWeekend(day)) {
|
||||
return true;
|
||||
|
||||
@@ -800,18 +800,37 @@ const apply = {
|
||||
.filter(index => index > -1)
|
||||
},
|
||||
getBlockClass(block) {
|
||||
const expired = this.isExpiredAvailabilityBlock(block)
|
||||
return {
|
||||
'apply-block': true,
|
||||
'apply-block--available': block.status === 'available' && !this.selectedBlockKeys.includes(block.key),
|
||||
'apply-block--available': block.status === 'available' && !expired && !this.selectedBlockKeys.includes(block.key),
|
||||
'apply-block--reserved': block.status === 'reserved',
|
||||
'apply-block--closed': block.status === 'closed',
|
||||
'apply-block--closed': block.status === 'closed' || expired,
|
||||
'apply-block--selected': this.selectedBlockKeys.includes(block.key),
|
||||
}
|
||||
},
|
||||
/**
|
||||
* 前端按当天当前时间再做一层兜底判断,避免预约弹窗长时间停留后,
|
||||
* 之前可选的全天候时间块在开始后仍被继续点选。
|
||||
*/
|
||||
isExpiredAvailabilityBlock(block) {
|
||||
if (!block || !block.startDateTime) {
|
||||
return false
|
||||
}
|
||||
const start = this.$moment(block.startDateTime)
|
||||
if (!start.isValid()) {
|
||||
return false
|
||||
}
|
||||
return start.isSame(this.$moment(), 'day') && !start.isAfter(this.$moment())
|
||||
},
|
||||
onAvailabilityBlockClick(block) {
|
||||
if (!block || !block.key) {
|
||||
return
|
||||
}
|
||||
if (this.isExpiredAvailabilityBlock(block) && !this.selectedBlockKeys.includes(block.key)) {
|
||||
this.$message.warning('该时段开始时间已过,请选择其他时段')
|
||||
return
|
||||
}
|
||||
if (block.status !== 'available' && !this.selectedBlockKeys.includes(block.key)) {
|
||||
this.$message.warning(block.status === 'reserved' ? '该时段已被预约,请选择其他时段' : '该时段当前不可预约')
|
||||
return
|
||||
@@ -860,7 +879,7 @@ const apply = {
|
||||
}
|
||||
for (let i = startIndex; i <= endIndex; i++) {
|
||||
const block = this.availabilityBlocks[i]
|
||||
if (!block || block.status !== 'available') {
|
||||
if (!block || block.status !== 'available' || this.isExpiredAvailabilityBlock(block)) {
|
||||
return false
|
||||
}
|
||||
if (i > startIndex) {
|
||||
|
||||
Reference in New Issue
Block a user