184 lines
5.9 KiB
C#
184 lines
5.9 KiB
C#
using Model;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Drawing;
|
|
using System.Linq;
|
|
using System.Web;
|
|
using System.Web.Http;
|
|
using System.Web.Http.Results;
|
|
using static GuaDanStatusCode;
|
|
|
|
/// <summary>
|
|
/// HandleBedInUsedController 的摘要描述
|
|
/// </summary>
|
|
public class HandleBedInUsedController : ApiController
|
|
{
|
|
private Model.ezEntities _db = new Model.ezEntities();
|
|
public HandleBedInUsedController()
|
|
{
|
|
//
|
|
// TODO: 在這裡新增建構函式邏輯
|
|
//
|
|
}
|
|
[HttpPost]
|
|
[Route("api/bed/inuse/list")]
|
|
public IHttpActionResult Get([FromBody] UuidModel uuidModel)
|
|
{
|
|
//獲取已被預約或者正在入住的床位,如果有指定就會查詢指定條件,如果沒有指定就會返回所有
|
|
var query = _db.GuaDanOrderGuest
|
|
.Where(gd => gd.StatusCode == GuaDanStatusCode.Guadan.CheckedIn
|
|
|| gd.StatusCode == GuaDanStatusCode.Guadan.Booked).ToList();
|
|
if (uuidModel.bedUuid.HasValue)
|
|
{
|
|
// 優先按床位查詢
|
|
query = query.Where(g => g.BedUuid == uuidModel.bedUuid.Value).ToList();
|
|
}
|
|
else if (uuidModel.roomUuid.HasValue)
|
|
{
|
|
// 如果沒有 bed,但有 room
|
|
query = query.Where(g => g.RoomUuid == uuidModel.roomUuid.Value).ToList();
|
|
}
|
|
else if (uuidModel.regionUuid.HasValue)
|
|
{
|
|
// 如果只有 region
|
|
//query = query.Where(g => g.Room.RegionUuid == uuidModel.regionUuid.Value);
|
|
query = query.Where(g => IsRegionOrAncestor(g.Room, uuidModel.regionUuid.Value)).ToList();
|
|
|
|
}
|
|
var data = query.Select(g => new
|
|
{
|
|
g.BedUuid,
|
|
g.RoomUuid,
|
|
g.Room.RegionUuid,
|
|
g.GuaDanOrderNo,
|
|
g.RegionRoomBed.Name,
|
|
fullName = GetFullBedName(g.BedUuid.Value),
|
|
g.followers.u_name,
|
|
guadan_during = new { g.CheckInAt, g.CheckOutAt },
|
|
status = new { g.StatusCode, g.RegionRoomBedStatus.Name }
|
|
});
|
|
return Ok(data.ToList());
|
|
}
|
|
|
|
[HttpPost]
|
|
[Route("api/bed/inuse/cancel/singlebed/booking")]
|
|
public IHttpActionResult CancelSingleBedBooking([FromBody] UuidModel uuidModel)
|
|
{
|
|
if (uuidModel?.bedUuid == null)
|
|
return BadRequest("床位ID不能為空");
|
|
|
|
using (var transaction = _db.Database.BeginTransaction())
|
|
{
|
|
try
|
|
{
|
|
// 查詢符合條件的訂單
|
|
var orders = _db.GuaDanOrderGuest
|
|
.Where(g => g.BedUuid == uuidModel.bedUuid)
|
|
.Where(g => g.StatusCode == GuaDanStatusCode.Guadan.Booked || g.StatusCode == GuaDanStatusCode.Guadan.CheckedIn)
|
|
.ToList();
|
|
|
|
if (!orders.Any())
|
|
return NotFound();
|
|
|
|
// 更新狀態
|
|
foreach (var order in orders)
|
|
{
|
|
if (!StatusTransitionManager.CanTransition(order.StatusCode, GuaDanStatusCode.Guadan.Cancelled))
|
|
{
|
|
return BadRequest("當前狀態不能被取消");
|
|
}
|
|
|
|
|
|
order.StatusCode = GuaDanStatusCode.Guadan.Cancelled; // 假設Cancelled是取消狀態
|
|
}
|
|
var schedules = _db.RegionAndRoomAndBedSchedule
|
|
.Where(s => s.TargetUuid == uuidModel.bedUuid)
|
|
.Where(s => s.GuaDanOrderGuest.StatusCode == GuaDanStatusCode.Guadan.Booked
|
|
|| s.GuaDanOrderGuest.StatusCode == GuaDanStatusCode.Guadan.CheckedIn)
|
|
.ToList();
|
|
foreach (var schedule in schedules)
|
|
{
|
|
schedule.IsCancel = true;
|
|
}
|
|
_db.SaveChanges();
|
|
transaction.Commit();
|
|
|
|
return Ok(new { message = "取消成功", cancelledCount = orders.Count });
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
transaction.Rollback();
|
|
return InternalServerError(ex);
|
|
}
|
|
}
|
|
}
|
|
[HttpGet]
|
|
[Route("api/bed/inuse/region/list")]
|
|
public IHttpActionResult GetRegionList()
|
|
{
|
|
var regions = _db.Region
|
|
.Select(r => new
|
|
{
|
|
r.Uuid,
|
|
r.Name,
|
|
})
|
|
.ToList();
|
|
return Ok(regions);
|
|
}
|
|
[HttpGet]
|
|
[Route("api/bed/inuse/room/list")]
|
|
public IHttpActionResult GetRoomList([FromUri] Guid? regionUuid = null)
|
|
{
|
|
var room = _db.Room.Where(r => !r.IsDeleted && r.IsActive.Value).ToList();
|
|
if (regionUuid != null)
|
|
{
|
|
room = room.Where(r => IsRegionOrAncestor(r, regionUuid.Value)).ToList();
|
|
}
|
|
var data = room.Select(r => new
|
|
{
|
|
r.Uuid,
|
|
r.Name,
|
|
fullName = r.Region.Name + "/" + r.Name,
|
|
}).ToList();
|
|
return Ok(data);
|
|
}
|
|
public string GetFullBedName(Guid bedUuid)
|
|
{
|
|
var bed = _db.RegionRoomBed.Find(bedUuid);
|
|
if (bed == null)
|
|
return "";
|
|
var name = bed.Name;
|
|
var room = bed.Room;
|
|
if (room == null)
|
|
return name;
|
|
name = room.Name + "/" + name;
|
|
|
|
var region = room?.Region;
|
|
while (region != null)
|
|
{
|
|
name = region.Name + "/" + name;
|
|
region = region.Region2; // 遞迴向上
|
|
}
|
|
|
|
return name;
|
|
}
|
|
bool IsRegionOrAncestor(Model.Room room, Guid regionUuid)
|
|
{
|
|
//判斷傳入的regionuuid是否是room的祖先
|
|
if (room.RegionUuid == regionUuid)
|
|
return true;
|
|
var region = room.Region;
|
|
while (region != null)
|
|
{
|
|
if (region.Uuid == regionUuid) return true;
|
|
region = region.Region2;
|
|
}
|
|
return false;
|
|
}
|
|
public class UuidModel
|
|
{
|
|
public Guid? regionUuid = null;
|
|
public Guid? roomUuid = null;
|
|
public Guid? bedUuid = null;
|
|
}
|
|
} |