From 251abdc9f377bbc07e974ef4ea26ac92bdec43d7 Mon Sep 17 00:00:00 2001 From: zhangrui Date: Thu, 7 May 2026 09:43:26 +0800 Subject: [PATCH] =?UTF-8?q?=E6=97=A5=E5=B8=B8=E5=8A=9E=E5=85=AC-=E5=9C=BA?= =?UTF-8?q?=E5=9C=B0=E9=A2=84=E7=BA=A6:=20=E5=B7=B2=E8=BF=87=E7=9A=84?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E6=AE=B5=E5=BA=94=E8=AF=A5=E4=B8=8D=E8=83=BD?= =?UTF-8?q?=E9=80=89=E6=8B=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/SiteCugApplyController.java | 19 +++++++++++++- .../zhgh/dayofficework/siteCug/apply/apply.js | 25 ++++++++++++++++--- 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/siteCug/controller/SiteCugApplyController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/siteCug/controller/SiteCugApplyController.java index a7923c08..f95e3eef 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/siteCug/controller/SiteCugApplyController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/siteCug/controller/SiteCugApplyController.java @@ -457,9 +457,13 @@ public class SiteCugApplyController { return result; } + /** + * 当预约日期就是今天时,已经过了开始时间的时间块直接标记为不可预约, + * 这样全天候和分段预约在前端展示时都会统一变成禁用状态。 + */ private NutMap buildAvailabilityBlock(String day, int startMinute, int endMinute, List reservedRanges, List 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 holidaySet) { if (isWeekend(day)) { return true; diff --git a/src/main/resources/views/platform/zhgh/dayofficework/siteCug/apply/apply.js b/src/main/resources/views/platform/zhgh/dayofficework/siteCug/apply/apply.js index a488b672..ecd499b3 100644 --- a/src/main/resources/views/platform/zhgh/dayofficework/siteCug/apply/apply.js +++ b/src/main/resources/views/platform/zhgh/dayofficework/siteCug/apply/apply.js @@ -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) {