From bf7c67daa9bf689cd600a587a9a46f9fe6d8631e Mon Sep 17 00:00:00 2001 From: zpc Date: Fri, 26 Sep 2025 16:47:57 +0800 Subject: [PATCH] 321 --- .../Controllers/SQController.cs | 103 +++++++++++++++++- 1 file changed, 99 insertions(+), 4 deletions(-) diff --git a/CoreCms.Net.Web.WebApi/Controllers/SQController.cs b/CoreCms.Net.Web.WebApi/Controllers/SQController.cs index 36e74ed..d2e1089 100644 --- a/CoreCms.Net.Web.WebApi/Controllers/SQController.cs +++ b/CoreCms.Net.Web.WebApi/Controllers/SQController.cs @@ -479,10 +479,6 @@ public class SQController : ControllerBase Msg = "房间不存在" }; } - - - - // 3. 检查房间是否可预约(不可用时间段) var hasUnavailable = await _sQRoomUnavailableTimesServices.QueryListByClauseAsync( t => t.room_id == dto.room_id && t.start_time < end_time && t.end_time > start_time, @@ -597,6 +593,105 @@ public class SQController : ControllerBase }; } + /// + /// 用户是否可以创建预约(仅校验,不创建) + /// + /// 创建预约所需参数 + /// 返回可否创建及原因 + [HttpPost] + [Authorize] + public async Task CanCreateSQReservation([FromBody] SQReservationsAddDto dto) + { + var userId = _user.ID; + var start_time = DateTimeOffset.FromUnixTimeSeconds(dto.start_time).AddHours(8).DateTime; + var end_time = DateTimeOffset.FromUnixTimeSeconds(dto.end_time).AddHours(8).DateTime; + + // 1. 参数校验 + if (dto == null || dto.room_id <= 0 || start_time >= end_time) + { + return new WebApiDto() + { + Code = 500, + Data = new { canCreate = false }, + Msg = "参数错误" + }; + } + + // 2. 检查房间是否存在 + var room = await _SQRoomsServices.QueryByClauseAsync(r => r.id == dto.room_id, r => r.id, OrderByType.Asc); + if (room == null) + { + return new WebApiDto() + { + Code = 500, + Data = new { canCreate = false }, + Msg = "房间不存在" + }; + } + + // 3. 检查房间是否可预约(不可用时间段) + var hasUnavailable = await _sQRoomUnavailableTimesServices.QueryListByClauseAsync( + t => t.room_id == dto.room_id && t.start_time < end_time && t.end_time > start_time, + t => t.id, OrderByType.Asc); + if (hasUnavailable != null && hasUnavailable.Count > 0) + { + return new WebApiDto() + { + Code = 500, + Data = new { canCreate = false }, + Msg = "该时间段房间不可预约" + }; + } + + // 2.1 校验用户是否有其它预约时间冲突(只查未开始或正在进行中的预约) + var now = DateTime.Now; + var hasConflict = await _SQReservationParticipantsServices.QueryMuchAsync( + (p, r) => new object[] + { + JoinType.Inner, p.reservation_id == r.id + }, + (p, r) => r.id, + (p, r) => + p.user_id == userId && + p.status == 0 && + r.status < 3 && + r.end_time > now && + r.start_time < end_time && r.end_time > start_time + ); + + if (hasConflict != null && hasConflict.Count > 0) + { + return new WebApiDto + { + Code = 402, + Data = new { canCreate = false }, + Msg = "您有其它预约时间冲突,无法创建该预约!" + }; + } + + // 4. 检查房间是否已被预约(未取消的预约,时间有重叠) + var hasReserved = await _SQReservationsServices.QueryListByClauseAsync( + r => r.room_id == dto.room_id && r.status < 2 && r.start_time < end_time && r.end_time > start_time, + r => r.id, OrderByType.Asc); + if (hasReserved != null && hasReserved.Count > 0) + { + return new WebApiDto() + { + Code = 500, + Data = new { canCreate = false }, + Msg = "该时间段房间已被预约" + }; + } + + // 全部通过 + return new WebApiDto() + { + Code = 0, + Data = new { canCreate = true }, + Msg = "ok" + }; + } + /// /// 用户加入预约接口 ///