353 lines
12 KiB
C#
353 lines
12 KiB
C#
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;
|
||
|
||
/// <summary>
|
||
/// guadanOrderGuest 的摘要描述
|
||
/// </summary>
|
||
[ezAuthorize]
|
||
public class guadanOrderGuestController: ApiController
|
||
{
|
||
private Model.ezEntities _db = new Model.ezEntities();
|
||
[HttpGet]
|
||
[Route("api/guadanorderguest/get")]
|
||
public async Task<IHttpActionResult> Get()
|
||
{
|
||
var data = await _db.GuaDanOrderGuest.ToListAsync();
|
||
return Ok(data);
|
||
}
|
||
[HttpGet]
|
||
[Route("api/guadanorderguest/getbyorderno")]
|
||
public async Task<IHttpActionResult> 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.follower,
|
||
statusUuid = a.statusUuid,
|
||
statusName = a.RegionRoomBedStatus?.Name,
|
||
}).ToList();
|
||
|
||
return Ok(data);
|
||
}
|
||
|
||
[HttpPost]
|
||
[Route("api/guadanorderguest/create")]
|
||
public async Task<IHttpActionResult> 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<IHttpActionResult> 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<IHttpActionResult> 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; }
|
||
}
|
||
|
||
} |