302 lines
10 KiB
C#
302 lines
10 KiB
C#
using Model;
|
|
using PagedList;
|
|
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>
|
|
/// guadanOderController 的摘要描述
|
|
/// </summary>
|
|
[ezAuthorize]
|
|
public class guadanOrderController : ApiController
|
|
{
|
|
private Model.ezEntities _db = new Model.ezEntities();
|
|
[HttpPost]
|
|
[Route("api/guadan/list")]
|
|
public async Task<IHttpActionResult> getGuadanList([FromBody] guadan_order_search_dto search)
|
|
{
|
|
var lastCheckoutTime = _db.GuadanTimeSetting.FirstOrDefault();
|
|
string lastCheckoutTimeStr = null;
|
|
if (lastCheckoutTime != null)
|
|
{
|
|
lastCheckoutTimeStr = lastCheckoutTime.LatestCheckOut;
|
|
}
|
|
var query = _db.GuaDanOrder
|
|
.Where(a => a.IsCancel == false)
|
|
.Where(a => a.IsDeleted == false);
|
|
if(!string.IsNullOrEmpty(search.guaDanOrderNo))
|
|
{
|
|
query = query.Where(order => order.GuaDanOrderNo == search.guaDanOrderNo);
|
|
}
|
|
if (search.guadanUser != null)
|
|
{
|
|
query = query.Where(order => order.BookerName == search.guadanUser);
|
|
}
|
|
if (search.startDate != null && search.endDate != null)
|
|
{
|
|
query = query.Where(order => order.StartDate >= search.startDate)
|
|
.Where(order => order.EndDate <= search.endDate);
|
|
}
|
|
else
|
|
{
|
|
if (search.startDate != null)
|
|
{
|
|
query = query.Where(order => order.StartDate == search.startDate);
|
|
}
|
|
else if (search.endDate != null)
|
|
{
|
|
query = query.Where(order => order.EndDate == search.endDate);
|
|
}
|
|
}
|
|
var total = query.Count();
|
|
var data1 = await query.ToListAsync();
|
|
var data = data1
|
|
.OrderByDescending(b => b.CreatedAt)
|
|
.Select(a => new
|
|
{
|
|
uuid = a.Uuid,
|
|
guaDanOrderNo = a.GuaDanOrderNo,
|
|
start_date = a.StartDate,
|
|
end_date = a.EndDate,
|
|
created_at = a.CreatedAt,
|
|
updated_at = a.UpdatedAt,
|
|
notes = a.Notes,
|
|
is_timeout = !string.IsNullOrEmpty(lastCheckoutTimeStr) &&
|
|
_db.GuaDanOrderGuest
|
|
.Where(g => g.GuaDanOrderNo == a.GuaDanOrderNo && !g.IsDeleted && g.StatusCode == GuaDanOrderGuest.STATUS_CHECKED_IN)
|
|
.ToList()
|
|
.Any(g =>
|
|
g.CheckOutAt.HasValue &&
|
|
DateTime.Parse(g.CheckOutAt.Value.ToString("yyyy-MM-dd") + " " + lastCheckoutTimeStr) < DateTime.Now
|
|
),
|
|
activity = _db.activities
|
|
.Where(act => act.num == a.ActivityNum)
|
|
.Select(act => new
|
|
{
|
|
subject = act.subject
|
|
})
|
|
.FirstOrDefault(),
|
|
bookerName = a.BookerName,
|
|
guest_count = _db.GuaDanOrderGuest
|
|
.Where(c => c.GuaDanOrderNo == a.GuaDanOrderNo && c.IsDeleted == false)
|
|
.Where(c => c.RegionRoomBedStatus.Code != GuaDanOrderGuest.STATUS_CANCELLED)
|
|
.Count(),
|
|
guadan_status = _db.GuaDanOrderGuest
|
|
.Where(g => g.GuaDanOrderNo == a.GuaDanOrderNo && a.IsDeleted == false)
|
|
.Where(g => g.StatusCode != GuaDanOrderGuest.STATUS_CANCELLED)
|
|
.All(g => g.StatusCode == "401") ? new { code=501, name="預約" }:
|
|
_db.GuaDanOrderGuest
|
|
.Where(g => g.GuaDanOrderNo == a.GuaDanOrderNo && a.IsDeleted == false)
|
|
.Where(g => g.StatusCode != GuaDanOrderGuest.STATUS_CANCELLED)
|
|
.All(g => g.StatusCode == "403") ? new { code = 502, name = "全部退房" } :
|
|
_db.GuaDanOrderGuest
|
|
.Where(g => g.GuaDanOrderNo == a.GuaDanOrderNo && a.IsDeleted == false)
|
|
.Where(g => g.StatusCode != GuaDanOrderGuest.STATUS_CANCELLED)
|
|
.Any(g => g.StatusCode == "402" && a.IsCancel == false) ? new { code = 503, name = "正在入住" } :
|
|
new { code = 504, name = "部分退房" }
|
|
})
|
|
.Skip((search.page - 1) * search.pageSize)
|
|
.Take(search.pageSize)
|
|
.ToList();
|
|
return Ok(new
|
|
{
|
|
total,
|
|
data
|
|
});
|
|
}
|
|
[HttpGet]
|
|
[Route("api/guadan/getorderbyid")]
|
|
public async Task<IHttpActionResult> getGuadanOrderById(string orderId)
|
|
{
|
|
var order = await _db.GuaDanOrder
|
|
.Where(a => a.GuaDanOrderNo == orderId)
|
|
.Where(a => a.IsCancel == false && a.IsDeleted == false)
|
|
.FirstOrDefaultAsync();
|
|
if (order == null)
|
|
{
|
|
return BadRequest("未找到對應訂單");
|
|
}
|
|
var result = new
|
|
{
|
|
order.admin,
|
|
order.followers,
|
|
StartDate = order.StartDate?.ToString("yyyy-MM-dd"),
|
|
EndDate = order.EndDate?.ToString("yyyy-MM-dd"),
|
|
order.CreateUser,
|
|
order.CreatedAt,
|
|
order.UpdatedAt,
|
|
order.Notes,
|
|
order.GuaDanOrderNo,
|
|
order.BookerFollowerNum,
|
|
order.BookerName,
|
|
order.BookerPhone,
|
|
order.IsDeleted,
|
|
order.Uuid,
|
|
order.ActivityNum,
|
|
|
|
};
|
|
|
|
return Ok(result);
|
|
}
|
|
[HttpPost]
|
|
[Route("api/guadan/create")]
|
|
public async Task<IHttpActionResult> createGuadanOrder(GuaDanOrderView model)
|
|
{
|
|
if (model == null)
|
|
{
|
|
return BadRequest("掛單資料不可為空");
|
|
}
|
|
if (model.Uuid.HasValue)
|
|
{
|
|
return BadRequest("已存在對應掛單資料");
|
|
}
|
|
try
|
|
{
|
|
if (model.startdate > model.enddate)
|
|
{
|
|
return BadRequest("掛單結束時間不能再開始時間之前");
|
|
}
|
|
}
|
|
catch
|
|
{
|
|
|
|
}
|
|
|
|
var guadanorder = new GuaDanOrder
|
|
{
|
|
StartDate = model.startdate,
|
|
EndDate = model.enddate,
|
|
CreateUser = model.createuser,
|
|
CreatedAt = DateTime.Now,
|
|
UpdatedAt = DateTime.Now,
|
|
Notes = model.note,
|
|
GuaDanOrderNo = GuaDanOrder.GenerateStatusCode(),
|
|
BookerName = model.bookerName,
|
|
BookerPhone = model.bookerPhone,
|
|
Uuid = Guid.NewGuid(),
|
|
ActivityNum = model.activityNum,
|
|
};
|
|
_db.GuaDanOrder.Add(guadanorder);
|
|
await _db.SaveChangesAsync();
|
|
return Ok(guadanorder);
|
|
}
|
|
|
|
[HttpPost]
|
|
[Route("api/guadan/update")]
|
|
public async Task<IHttpActionResult> updateGuadanOrder(GuaDanOrderView model)
|
|
{
|
|
if (model == null)
|
|
{
|
|
return BadRequest("掛單資料不可為空");
|
|
}
|
|
if (!model.Uuid.HasValue)
|
|
{
|
|
return BadRequest("");
|
|
}
|
|
try
|
|
{
|
|
if (model.startdate > model.enddate)
|
|
{
|
|
return BadRequest("掛單結束時間不能再開始時間之前");
|
|
}
|
|
}
|
|
catch
|
|
{
|
|
|
|
}
|
|
var order = await _db.GuaDanOrder.FindAsync(model.Uuid.Value);
|
|
if (order == null)
|
|
{
|
|
return BadRequest("未找到對應掛單資料");
|
|
}
|
|
order.StartDate = model.startdate;
|
|
order.EndDate = model.enddate;
|
|
order.Notes = model.note;
|
|
order.BookerName = model.bookerName;
|
|
order.BookerPhone = model.bookerPhone;
|
|
order.ActivityNum = model.activityNum;
|
|
await _db.SaveChangesAsync();
|
|
return Ok(model);
|
|
}
|
|
[HttpPost]
|
|
[Route("api/guadan/cancel")]
|
|
public async Task<IHttpActionResult> CancelGuadanOrder([FromUri] Guid uuid)
|
|
{
|
|
var guadan = await _db.GuaDanOrder.FindAsync(uuid);
|
|
if (guadan == null)
|
|
{
|
|
return NotFound();
|
|
}
|
|
if (_db.GuaDanOrderGuest.Any(a => (a.GuaDanOrderNo == guadan.GuaDanOrderNo) && a.StatusCode != "404"))
|
|
{
|
|
return BadRequest($"該掛單已經存在掛單蓮友,不能取消!");
|
|
}
|
|
using (var transaction = _db.Database.BeginTransaction())
|
|
{
|
|
try
|
|
{
|
|
var guadanGuests = await _db.GuaDanOrderGuest
|
|
.Where(a => a.GuaDanOrderNo == guadan.GuaDanOrderNo)
|
|
.ToListAsync();
|
|
if (guadanGuests.Any())
|
|
{
|
|
foreach (var guest in guadanGuests)
|
|
{
|
|
guest.StatusCode = "404";
|
|
// 取消所有相關的排程
|
|
if (guest.RegionAndRoomAndBedSchedule != null && guest.RegionAndRoomAndBedSchedule.Any())
|
|
{
|
|
foreach (var schedule in guest.RegionAndRoomAndBedSchedule)
|
|
{
|
|
schedule.IsCancel = true;
|
|
}
|
|
}
|
|
}
|
|
await _db.SaveChangesAsync();
|
|
}
|
|
guadan.IsCancel = true;
|
|
await _db.SaveChangesAsync();
|
|
transaction.Commit();
|
|
|
|
return Ok(new { message = "取消成功" });
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
transaction.Rollback();
|
|
return InternalServerError(ex);
|
|
}
|
|
}
|
|
}
|
|
|
|
public class guadan_order_dto
|
|
{
|
|
public int id { get; set; }
|
|
public int room_id { get; set; }
|
|
public int bed_id { get; set; }
|
|
public int guest_id { get; set; }
|
|
public DateTime start_date { get; set; }
|
|
public DateTime? end_date { get; set; }
|
|
public int? create_user { get; set; }
|
|
public DateTime created_at { get; set; }
|
|
public DateTime updated_at { get; set; }
|
|
public string notes { get; set; }
|
|
public int? follower_num { get; set; }
|
|
|
|
public Room room { get; set; } = null;
|
|
public RegionRoomBed bed { get; set; } = null;
|
|
}
|
|
|
|
public class guadan_order_search_dto
|
|
{
|
|
public DateTime? startDate { get; set; }
|
|
public DateTime? endDate { get; set; }
|
|
public string guadanUser { get; set; }
|
|
public int page { get; set; } = 1;
|
|
public int pageSize { get; set; } = 10;
|
|
public string guaDanOrderNo { get; set; } = null;
|
|
}
|
|
|
|
} |