From c853fd8edffd092322d2ad7a7bdf203b49045c9c Mon Sep 17 00:00:00 2001 From: MSuMshk <2039814060@qq.com> Date: Wed, 18 Feb 2026 20:36:33 +0800 Subject: [PATCH] fix(store-hours): reject overlapping holiday date ranges --- .../Controllers/StoreHoursController.cs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/Api/TakeoutSaaS.TenantApi/Controllers/StoreHoursController.cs b/src/Api/TakeoutSaaS.TenantApi/Controllers/StoreHoursController.cs index 18591b2..9010299 100644 --- a/src/Api/TakeoutSaaS.TenantApi/Controllers/StoreHoursController.cs +++ b/src/Api/TakeoutSaaS.TenantApi/Controllers/StoreHoursController.cs @@ -164,6 +164,22 @@ public sealed class StoreHoursController( } var holidayId = StoreApiHelpers.ParseSnowflakeOrNull(holidayInput.Id); + + // 同一门店的特殊日期范围不允许重叠(编辑时排除自身)。 + var hasOverlap = await dbContext.StoreHolidays + .AsNoTracking() + .AnyAsync( + x => x.TenantId == tenantId + && x.StoreId == parsedStoreId + && (!holidayId.HasValue || x.Id != holidayId.Value) + && x.Date <= endDate + && (x.EndDate ?? x.Date) >= startDate, + cancellationToken); + if (hasOverlap) + { + throw new BusinessException(ErrorCodes.ValidationFailed, "日期范围与已有节假日/特殊日期冲突,请勿重复设置"); + } + var entity = holidayId.HasValue ? await dbContext.StoreHolidays.FirstOrDefaultAsync( x => x.Id == holidayId.Value && x.TenantId == tenantId && x.StoreId == parsedStoreId,