using Model; using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; using System.Threading.Tasks; using System.Web; using System.Web.Http; /// /// guadanOrderGuest 的摘要描述 /// [ezAuthorize] public class guadanOrderGuestController: ApiController { private Model.ezEntities _db = new Model.ezEntities(); [HttpGet] [Route("api/guadanorderguest/get")] public async Task Get() { var data = await _db.GuaDanOrderGuest.ToListAsync(); return Ok(data); } [HttpGet] [Route("api/guadanorderguest/getbyorderno")] public async Task getByOrderNo(string orderNo) { // 先查数据库,不做格式化 var qry = await _db.GuaDanOrderGuest .Where(a => a.GuaDanOrderNo == orderNo && a.IsDeleted == false) .ToListAsync(); // 拉到内存后再处理日期 var data = qry.Select(a => new guadan_order_guest_display_dto { Uuid = a.Uuid, name = null, followerNum = a.FollowerNum, roomUuid = a.RoomUuid, bedUuid = a.BedUuid, checkinat = a.CheckInAt.HasValue ? a.CheckInAt.Value.ToString("yyyy-MM-dd") : null, checkoutat = a.CheckOutAt.HasValue ? a.CheckOutAt.Value.ToString("yyyy-MM-dd") : null, phone = null, roomName = a.Room.Name, bedName = a.RegionRoomBed.Name, orderNo = a.GuaDanOrderNo, follower = a.followers, statusUuid = a.statusUuid, statusName = a.RegionRoomBedStatus?.Name, }).ToList(); return Ok(data); } [HttpPost] [Route("api/guadanorderguest/create")] public async Task create([FromBody] guadan_order_guest_dto model) { if (model == null) return BadRequest(""); // 驗證床位與蓮友 if (model.followerNum.HasValue && model.bedUuid.HasValue) { var bed = _db.RegionRoomBed.Find(model.bedUuid.Value); var follower = _db.followers.Find(model.followerNum.Value); if (bed == null || follower == null) return BadRequest("床位或蓮友不存在"); bool isMaleFollower; if (follower.sex == "男眾") isMaleFollower = true; else if (follower.sex == "女眾") isMaleFollower = false; else return BadRequest("蓮友性別未知"); if (bed.Gender != isMaleFollower) return BadRequest("床位性別與蓮友性別不同"); } if (!model.bedUuid.HasValue) return BadRequest("床位 UUID 不能为空"); if (!model.checkInAt.HasValue) return BadRequest("入住时间不能为空"); // 長期占用處理:checkOutAt 可為 null DateTime? checkOut = model.checkOutAt.Value.Date; if (checkOut.HasValue && model.checkInAt > checkOut) return BadRequest("掛單結束時間不能再開始時間之前"); if(model.checkInAt == model.checkOutAt) { return BadRequest("掛單結束時間和開始時間不能是同一天"); } // 檢查床位可用性 var bedIsCanUse = await RegionAndRoomAndBedSchedule.IsBedAvailableAsync( _db, model.bedUuid.Value, model.checkInAt.Value.Date, checkOut ); if (!bedIsCanUse) return BadRequest("床位在該時間段內已被占用"); // 建立掛單 var guest = new GuaDanOrderGuest { GuaDanOrderNo = model.orderNo, FollowerNum = model.followerNum, RoomUuid = model.roomUuid, BedUuid = model.bedUuid, CheckInAt = model.checkInAt?.Date, CheckOutAt = checkOut, Uuid = Guid.NewGuid(), statusUuid = model.statusUuid, }; if (model.followerNum.HasValue) { if (_db.GuaDanOrderGuest.Any(a => a.FollowerNum == model.followerNum && a.GuaDanOrderNo == model.orderNo)) return BadRequest("該蓮友已經在該掛單中"); } _db.GuaDanOrderGuest.Add(guest); await _db.SaveChangesAsync(); // 生成每日排程 if (checkOut.HasValue) { int totalDays = (checkOut.Value - model.checkInAt.Value.Date).Days; for (int i = 0; i < totalDays; i++) { var scheduleDate = model.checkInAt.Value.Date.AddDays(i); var schedul = new RegionAndRoomAndBedSchedule { Title = "掛單", Description = "床位掛單", ScheduleDate = scheduleDate, IsDeleted = false, IsActive = true, TargetUuid = guest.BedUuid, UseType = (int)RegionAndRoomAndBedSchedule.SchedulePurpose.Bed_Reservation, CreatedAt = DateTime.Now, GuaDanOrderNo = guest.GuaDanOrderNo, Uuid = Guid.NewGuid() }; _db.RegionAndRoomAndBedSchedule.Add(schedul); } } else { // 長期占用,ScheduleDate = null var schedul = new RegionAndRoomAndBedSchedule { Title = "掛單", Description = "床位掛單(長期占用)", ScheduleDate = null, IsDeleted = false, IsActive = true, TargetUuid = guest.BedUuid, UseType = (int)RegionAndRoomAndBedSchedule.SchedulePurpose.Bed_Reservation, CreatedAt = DateTime.Now, GuaDanOrderNo = guest.GuaDanOrderNo, Uuid = Guid.NewGuid() }; _db.RegionAndRoomAndBedSchedule.Add(schedul); } await _db.SaveChangesAsync(); await _db.SaveChangesAsync(); return Ok(); } [HttpPost] [Route("api/guadanorderguest/update")] public async Task update([FromBody] guadan_order_guest_dto model) { if (model == null) return BadRequest(""); // 驗證床位與蓮友 if (model.followerNum.HasValue && model.bedUuid.HasValue) { var bed = _db.RegionRoomBed.Find(model.bedUuid.Value); var follower = _db.followers.Find(model.followerNum.Value); if (bed == null || follower == null) return BadRequest("床位或蓮友不存在"); bool isMaleFollower; if (follower.sex == "男眾") isMaleFollower = true; else if (follower.sex == "女眾") isMaleFollower = false; else return BadRequest("蓮友性別未知"); if (bed.Gender != isMaleFollower) return BadRequest("床位性別與蓮友性別不同"); } if (!model.bedUuid.HasValue) return BadRequest("床位 UUID 不能为空"); if (!model.checkInAt.HasValue) return BadRequest("入住时间不能为空"); // 長期占用處理 DateTime? checkOut = model.checkOutAt?.Date; if (checkOut.HasValue && model.checkInAt > checkOut) return BadRequest("掛單結束時間不能再開始時間之前"); var guest = await _db.GuaDanOrderGuest.FindAsync(model.Uuid); if (guest == null) return BadRequest(); // 檢查床位可用性 var bedIsCanUse = await RegionAndRoomAndBedSchedule.IsBedAvailableAsync( _db, model.bedUuid.Value, model.checkInAt.Value.Date, checkOut ); if (!bedIsCanUse && guest.BedUuid != model.bedUuid) return BadRequest("床位在該時間段內已被占用"); if (model.followerNum.HasValue) { bool exists = await _db.GuaDanOrderGuest .Where(a => a.FollowerNum == model.followerNum && a.GuaDanOrderNo == model.orderNo && a.Uuid != model.Uuid) .AnyAsync(); if (exists) return BadRequest("該蓮友已經在該掛單中"); } // 更新掛單基本資料 guest.FollowerNum = model.followerNum; guest.RoomUuid = model.roomUuid; guest.BedUuid = model.bedUuid; guest.CheckInAt = model.checkInAt?.Date; guest.CheckOutAt = checkOut; guest.statusUuid = model.statusUuid; // 刪除原有每日排程 var oldSchedules = _db.RegionAndRoomAndBedSchedule .Where(s => s.GuaDanOrderNo == guest.GuaDanOrderNo) .ToList(); _db.RegionAndRoomAndBedSchedule.RemoveRange(oldSchedules); // 重新生成每日排程 if (checkOut.HasValue) { int totalDays = (checkOut.Value - model.checkInAt.Value.Date).Days; for (int i = 0; i < totalDays; i++) { var date = model.checkInAt.Value.Date.AddDays(i); var schedul = new RegionAndRoomAndBedSchedule { Title = "掛單", Description = "床位掛單", ScheduleDate = date, IsDeleted = false, IsActive = true, TargetUuid = guest.BedUuid, UseType = (int)RegionAndRoomAndBedSchedule.SchedulePurpose.Bed_Reservation, CreatedAt = DateTime.Now, GuaDanOrderNo = guest.GuaDanOrderNo, Uuid = Guid.NewGuid() }; _db.RegionAndRoomAndBedSchedule.Add(schedul); } } else { // 長期占用 var schedul = new RegionAndRoomAndBedSchedule { Title = "掛單", Description = "床位掛單(長期占用)", ScheduleDate = null, IsDeleted = false, IsActive = true, TargetUuid = guest.BedUuid, UseType = (int)RegionAndRoomAndBedSchedule.SchedulePurpose.Bed_Reservation, CreatedAt = DateTime.Now, GuaDanOrderNo = guest.GuaDanOrderNo, Uuid = Guid.NewGuid() }; _db.RegionAndRoomAndBedSchedule.Add(schedul); } await _db.SaveChangesAsync(); await _db.SaveChangesAsync(); return Ok(); } [HttpPost] [Route("api/guadanorderguest/delete")] public async Task deleteGuadanGuest([FromUri] Guid uuid) { var guest = await _db.GuaDanOrderGuest.FindAsync(uuid); if (guest == null) return BadRequest("未找到指定挂单资料"); // 删除所有与该 guest 相关的排程(每日排程或長期占用) var schedules = _db.RegionAndRoomAndBedSchedule .Where(s => s.GuaDanOrderNo == guest.GuaDanOrderNo) .ToList(); if (schedules.Any()) _db.RegionAndRoomAndBedSchedule.RemoveRange(schedules); _db.GuaDanOrderGuest.Remove(guest); await _db.SaveChangesAsync(); return Ok(new { message = "删除成功" }); } public class guadan_order_guest_dto { public Guid? Uuid { get; set; } public int? followerNum { get; set; } public string orderNo { get; set; } public Guid? roomUuid { get; set; } public Guid? bedUuid { get; set; } public DateTime? checkInAt { get; set; } public DateTime? checkOutAt { get; set; } public Guid? statusUuid { get; set; } } public class guadan_order_guest_display_dto { public Guid? Uuid { get; set; } public int? followerNum { get; set; } public string orderNo { get; set; } public string name { get; set; } public Guid? roomUuid { get; set; } public Guid? bedUuid { get;set; } public string checkinat { get;set; } public string checkoutat { get;set; } public int? gender { get; set; } public Guid? statusUuid { get; set; } public string statusName { get; set; } public string phone { get; set; } public string note { get; set; } public string roomName { get; set; } public string bedName { get; set; } public follower follower { get; set; } } }