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,