Files
17168ERP/web/App_Code/api/guadanOrderGuestController.cs
2025-09-05 00:37:48 +08:00

353 lines
12 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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; }
}
}