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"
+ };
+ }
+
///
/// 用户加入预约接口
///