diff --git a/.gitignore b/.gitignore index e89a1b4..1abf800 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,5 @@ packages obj/ *.user -*.log \ No newline at end of file +*.log +**website.publishproj \ No newline at end of file diff --git a/data/SQL/guadan_item_insert_script.sql b/data/SQL/guadan_item_insert_script.sql new file mode 100644 index 0000000..caa1a79 Binary files /dev/null and b/data/SQL/guadan_item_insert_script.sql differ diff --git a/data/SQL/guadan_script.sql b/data/SQL/guadan_script.sql index ffa1fa9..089b591 100644 Binary files a/data/SQL/guadan_script.sql and b/data/SQL/guadan_script.sql differ diff --git a/web/App_Code/api/ShuWenController.cs b/web/App_Code/api/ShuWenController.cs index e82b2dd..295ab4a 100644 --- a/web/App_Code/api/ShuWenController.cs +++ b/web/App_Code/api/ShuWenController.cs @@ -74,9 +74,11 @@ public class ShuWenController : ApiController { shuwen.ShuWenList = ProcessDesserts2(_db.pro_order_detail.Where(a => a.pro_order.activity_num == activitynum.Value).ToList()); } - catch + catch (Exception ex) { - + shuwen.IsGenerating = false; + _db.SaveChanges(); + return BadRequest("生成舒文失败:" + ex.Message); } shuwen.IsGenerating = false; shuwen.UpdateTime = DateTime.Now; @@ -222,34 +224,42 @@ public class ShuWenController : ApiController [Route("api/shuwen/download")] public HttpResponseMessage DownloadShuWenWord(int? activitynum) { - var data = _db.ShuWen.Where(a => a.ActivityNum == activitynum).FirstOrDefault(); - if (data == null) + try { - //return; - } - string json = data.ShuWenList; - string ActivityName = _db.activities.Where(a => a.num == data.ActivityNum).FirstOrDefault().subject; - if (json == null) - { - //return; - } - string fileName = $"疏文名單_{DateTime.Now:yyyyMMddHHmmss}.docx"; - - var stream = new MemoryStream(); - GenerateShuWenWord_OpenXml(json, stream, ActivityName); - stream.Position = 0; - var response = new HttpResponseMessage(HttpStatusCode.OK) - { - Content = new StreamContent(stream) - }; - response.Content.Headers.ContentType = - new System.Net.Http.Headers.MediaTypeHeaderValue("application/vnd.openxmlformats-officedocument.wordprocessingml.document"); - response.Content.Headers.ContentDisposition = - new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment") + var data = _db.ShuWen.Where(a => a.ActivityNum == activitynum).FirstOrDefault(); + if (data == null) { - FileName = fileName + return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "活動編號不能為空"); + } + string json = data.ShuWenList; + string ActivityName = _db.activities.Where(a => a.num == data.ActivityNum).FirstOrDefault().subject; + if (json == null) + { + return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "疏文列表为空,无法生成 Word"); + } + string fileName = $"疏文名單_{DateTime.Now:yyyyMMddHHmmss}.docx"; + + var stream = new MemoryStream(); + GenerateShuWenWord_OpenXml(json, stream, ActivityName); + stream.Position = 0; + var response = new HttpResponseMessage(HttpStatusCode.OK) + { + Content = new StreamContent(stream) }; - return response; + response.Content.Headers.ContentType = + new System.Net.Http.Headers.MediaTypeHeaderValue("application/vnd.openxmlformats-officedocument.wordprocessingml.document"); + response.Content.Headers.ContentDisposition = + new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment") + { + FileName = fileName + }; + return response; + } + catch (Exception ex) + { + return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, ex.Message); + } + } public void GenerateShuWenWord_OpenXml(string json, Stream outputStream, string ActivityName ="") diff --git a/web/App_Code/api/guadanGuestQueryController.cs b/web/App_Code/api/guadanGuestQueryController.cs new file mode 100644 index 0000000..e86a447 --- /dev/null +++ b/web/App_Code/api/guadanGuestQueryController.cs @@ -0,0 +1,139 @@ +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; + +/// +/// guadanGuestQueryController 的摘要描述 +/// +public class guadanGuestQueryController: ApiController +{ + private Model.ezEntities _db = new Model.ezEntities(); + public guadanGuestQueryController() + { + // + // TODO: 在這裡新增建構函式邏輯 + // + } + [HttpPost] + [Route("api/guadan/guest/query/list")] + public async Task GetList([FromBody] SearchGuestModel search) + { + var query = _db.GuaDanOrderGuest + .Where(guest => guest.StatusCode != "404"); + if(search.SearchName != null) + { + query = query.Where(guest => guest.followers.u_name.Contains(search.SearchName)); + } + if(search.searchCheckInDate != null) + { + query = query.Where(guest => guest.CheckInAt == search.searchCheckInDate); + } + if(search.searchCheckOutDate != null) + { + query = query.Where(guest => guest.CheckOutAt == search.searchCheckOutDate); + } + if(search.searchCheckInDateStart != null) + { + query = query.Where(guest => guest.CheckInAt >= search.searchCheckInDateStart); + } + if (search.searchCheckInDateEnd != null) + { + query = query.Where(guest => guest.CheckInAt <= search.searchCheckInDateEnd); + } + if (search.searchCheckOutDateStart != null) + { + query = query.Where(guest => guest.CheckOutAt >= search.searchCheckOutDateStart); + } + if (search.searchCheckOutDateEnd != null) + { + query = query.Where(guest => guest.CheckOutAt <= search.searchCheckOutDateEnd); + } + var totalCount = await query.CountAsync(); + var pagedData = await query + .OrderByDescending(a => a.CheckInAt) // 可根据需要排序 + .Skip((search.Page - 1) * search.PageSize) + .Take(search.PageSize) + .ToListAsync(); + var data1 = pagedData.Select(a => new + { + name = a.followers != null ? a.followers.u_name : null, + checkindate = a.CheckInAt, + checkoutdate = a.CheckOutAt, + guadanorderno = a.GuaDanOrderNo, + roomName = GetRoomAndBedString(a.RegionRoomBed), + }).ToList(); + return Ok(new + { + items = data1, + total = totalCount, + }); + } + + [HttpGet] + [Route("api/guadan/guest/checkin/list")] + public async Task GetCheckInGuest([FromUri] DateTime date) + { + var today = DateTime.Now.Date; + var data = await _db.GuaDanOrderGuest + .Where(guest => guest.StatusCode == "402") + .Where(guest => guest.RegionAndRoomAndBedSchedule + .Any(s => s.ScheduleDate == date.Date && s.ScheduleDate == today) == true) + .Select(guest => new + { + name = guest.followers.u_name, + gender = guest.followers.sex, + }) + .ToListAsync(); + return Ok(data); + } + [HttpGet] + [Route("api/guadan/guest/booking/list")] + public async Task GetBookingGuest([FromUri] DateTime date) + { + var data = await _db.GuaDanOrderGuest + .Where(guest => guest.StatusCode == "402" || guest.StatusCode == "401") + .Where(guest => guest.RegionAndRoomAndBedSchedule.Any(s => s.ScheduleDate == date.Date) == true) + .Select(guest => new + { + name = guest.followers.u_name, + gender = guest.followers.sex, + }) + .ToListAsync(); + return Ok(data); + } + public string GetRoomAndBedString(RegionRoomBed bed) + { + if (bed == null || bed.Room == null) return ""; + var room = bed.Room; + var region = room.Region; + var name = room.Name + "/" + bed.Name; + if(region != null) + { + name = region.Name + "/" + name; + } + var parentRegion = region.Region2; + while (parentRegion != null) + { + name = parentRegion.Name + "/" + name; + parentRegion = parentRegion.Region2; + } + return name; + } + public class SearchGuestModel + { + public string SearchName = null; + public int Page = 1; + public int PageSize = 10; + public DateTime? searchCheckInDateStart = null;//入住日期的开始 + public DateTime? searchCheckInDateEnd = null;//入住日期的结束 + public DateTime? searchCheckOutDateStart = null;//退房日期的开始 + public DateTime? searchCheckOutDateEnd = null;//退房日期的结束 + public DateTime? searchCheckInDate = null; + public DateTime? searchCheckOutDate = null; + } +} \ No newline at end of file diff --git a/web/App_Code/api/guadanOrderController.cs b/web/App_Code/api/guadanOrderController.cs index dbf7a6a..07b63f8 100644 --- a/web/App_Code/api/guadanOrderController.cs +++ b/web/App_Code/api/guadanOrderController.cs @@ -1,4 +1,5 @@ using Model; +using PagedList; using System; using System.Collections.Generic; using System.Data.Entity; @@ -15,12 +16,36 @@ using static regionController; public class guadanOrderController : ApiController { private Model.ezEntities _db = new Model.ezEntities(); - [HttpGet] + [HttpPost] [Route("api/guadan/list")] - public async Task getGuadanList() + public async Task getGuadanList([FromBody] guadan_order_search_dto search) { - var data = await _db.GuaDanOrder + + var query = _db.GuaDanOrder .Where(a => a.IsCancel == false) + .Where(a => a.IsDeleted == false); + 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 data = await query .OrderByDescending(b => b.CreatedAt) .Select(a => new { @@ -36,8 +61,15 @@ public class guadanOrderController : ApiController .Where(c => c.GuaDanOrderNo == a.GuaDanOrderNo && c.IsDeleted == false) .Where(c => c.RegionRoomBedStatus.Code != GuaDanOrderGuest.STATUS_CANCELLED) .Count(), - }).ToListAsync(); - return Ok(data); + }) + .Skip((search.page - 1) * search.pageSize) + .Take(search.pageSize) + .ToListAsync(); + return Ok(new + { + total, + data + }); } [HttpGet] [Route("api/guadan/getorderbyid")] @@ -221,4 +253,13 @@ public class guadanOrderController : ApiController 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; + } + } \ No newline at end of file diff --git a/web/App_Code/api/guadanOrderGuestController.cs b/web/App_Code/api/guadanOrderGuestController.cs index aca81d9..fac10e7 100644 --- a/web/App_Code/api/guadanOrderGuestController.cs +++ b/web/App_Code/api/guadanOrderGuestController.cs @@ -116,7 +116,7 @@ public class guadanOrderGuestController : ApiController return BadRequest("床位在該時間段內已被占用"); if (model.followerNum.HasValue) { - if (_db.GuaDanOrderGuest.Any(a => a.FollowerNum == model.followerNum + if (_db.GuaDanOrderGuest.Any(a => a.FollowerNum == model.followerNum && a.GuaDanOrderNo == model.orderNo && a.StatusCode != "404" )) @@ -330,31 +330,31 @@ public class guadanOrderGuestController : ApiController [Route("api/guadanorderguest/xuzhu")] public async Task ExtendStay([FromBody] XuZhuModel model) { - //续住方法 + //續住方法 if (model == null) - return BadRequest("请求数据为空"); + return BadRequest("請求數據為空"); if (model.GuestUuid == Guid.Empty || model.GuestBedUuid == Guid.Empty) - return BadRequest("GuestUuid 或 GuestBedUuid 无效"); - var guest= await _db.GuaDanOrderGuest.FindAsync(model.GuestUuid); + return BadRequest("GuestUuid 或 GuestBedUuid 無效"); + var guest = await _db.GuaDanOrderGuest.FindAsync(model.GuestUuid); if (guest == null) { - return BadRequest("挂单不存在"); + return BadRequest("掛單不存在"); } - if(guest.BedUuid != model.GuestBedUuid) + if (guest.BedUuid != model.GuestBedUuid) { - return BadRequest("床位不正确"); + return BadRequest("床位不正確"); } - var bedIsCanUse = await RegionAndRoomAndBedSchedule.IsBedAvailableAsync(_db,model.GuestBedUuid, model.CurrentCheckoutDate, model.NewCheckoutDate); - if(!bedIsCanUse) + var bedIsCanUse = await RegionAndRoomAndBedSchedule.IsBedAvailableAsync(_db, model.GuestBedUuid, model.CurrentCheckoutDate, model.NewCheckoutDate); + if (!bedIsCanUse) { - return BadRequest("该床位在续住时间段内被预定,无法续住"); + return BadRequest("該床位在續住時間段內被預定,無法續住"); } var newStartDate = model.CurrentCheckoutDate.Date; var newEndDate = model.NewCheckoutDate.Date.AddDays(-1); if (newEndDate < newStartDate) - return BadRequest("续住日期区间无效"); + return BadRequest("續住日期區間無效"); for (var date = newStartDate; date <= newEndDate; date = date.AddDays(1)) { var newSchedule = new RegionAndRoomAndBedSchedule @@ -364,8 +364,8 @@ public class guadanOrderGuestController : ApiController TargetUuid = model.GuestBedUuid, GuaDanOrderGuestUuid = model.GuestUuid, ScheduleDate = date, - Title = "续住挂单", // 一天一条,开始和结束是同一天 - Description = "续住挂单", + Title = "續住掛單", // 一天一條,開始和結束是同一天 + Description = "續住掛單", UseType = 30, CreatedAt = DateTime.UtcNow }; @@ -373,8 +373,8 @@ public class guadanOrderGuestController : ApiController _db.RegionAndRoomAndBedSchedule.Add(newSchedule); } guest.CheckOutAt = model.NewCheckoutDate.Date; - await _db.SaveChangesAsync(); // 保存数据库操作 - return Ok(new { message = "续住成功" }); + await _db.SaveChangesAsync(); // 保存資料庫操作 + return Ok(new { message = "續住成功" }); } [HttpPost] [Route("api/guadanorderguest/cancel")] @@ -495,13 +495,13 @@ public class guadanOrderGuestController : ApiController //更新未來排程為取消 var latestCheckoutStr = _db.GuadanTimeSetting - .Select(a => a.LatestCheckOut) // 字符串 "HH:mm" + .Select(a => a.LatestCheckOut) // 字串 "HH:mm" .FirstOrDefault(); TimeSpan? latestCheckoutTime = null; if (!string.IsNullOrEmpty(latestCheckoutStr)) { - // 尝试解析字符串 + // 嘗試解析字串 if (TimeSpan.TryParse(latestCheckoutStr, out var ts)) { latestCheckoutTime = ts; @@ -588,7 +588,7 @@ public class guadanOrderGuestController : ApiController if (guest.BedUuid != null) { var bed = _db.RegionRoomBed.FirstOrDefault(b => b.Uuid == guest.BedUuid); - if(bed == null) + if (bed == null) { return BadRequest("入住床位不存在"); } @@ -598,10 +598,10 @@ public class guadanOrderGuestController : ApiController } else { - return BadRequest($"当前床位状态:{bed.RegionRoomBedStatus.Name} 不能入住"); + return BadRequest($"當前床位狀態:{bed.RegionRoomBedStatus.Name} 不能入住"); } } - else if(guest.BedUuid == null) + else if (guest.BedUuid == null) { return BadRequest("入住床位不存在"); } @@ -653,10 +653,10 @@ public class guadanOrderGuestController : ApiController } public class XuZhuModel { - public Guid GuestUuid { get; set; } // 不可为空 - public Guid GuestBedUuid { get; set; } // 不可为空 - public DateTime CurrentCheckoutDate { get; set; } // 当前退房时间 - public DateTime NewCheckoutDate { get; set; } // 新退房时间 + public Guid GuestUuid { get; set; } // 不可為空 + public Guid GuestBedUuid { get; set; } // 不可為空 + public DateTime CurrentCheckoutDate { get; set; } // 當前退房時間 + public DateTime NewCheckoutDate { get; set; } // 新退房時間 } } \ No newline at end of file diff --git a/web/App_Code/api/guadanStatisticsController.cs b/web/App_Code/api/guadanStatisticsController.cs index 0832389..a42ad98 100644 --- a/web/App_Code/api/guadanStatisticsController.cs +++ b/web/App_Code/api/guadanStatisticsController.cs @@ -21,39 +21,49 @@ public class guadanStatisticsController: ApiController //挂单统计:房间,床位,挂单笔数,挂单人数的统计 var now = DateTime.Now; - var roomCount = await _db.Room.Where(a => a.IsDeleted == false).CountAsync(); - var rooms = await _db.Room.Include(r => r.RegionRoomBed).ToListAsync(); - - var emptyRoomCount = rooms - .Where(r => r.RegionRoomBed.All(b => b.IsAvailableDuring(now, now, _db))) // 這裡就能用方法 - .Count(); - var bedCount = await _db.RegionRoomBed.Where(a => a.IsDeleted == false).CountAsync(); - var maleBedCount = await _db.RegionRoomBed.Where(a => a.IsDeleted == false && a.Gender == true).CountAsync(); - var femaleBedCount = await _db.RegionRoomBed.Where(a => a.IsDeleted == false && a.Gender == false).CountAsync(); - - var guadanTotalCount = await _db.GuaDanOrder.Where(a => a.IsDeleted == false).CountAsync(); - var guadanPeopleTotal = await _db.GuaDanOrderGuest.Where(a => a.IsDeleted == false).CountAsync(); - var guadanPeopleMale = await _db.GuaDanOrderGuest.Where(a => a.IsDeleted == false && a.followers.sex == "男眾").CountAsync(); - var guadanPeopleFemale = await _db.GuaDanOrderGuest.Where(a => a.IsDeleted == false && a.followers.sex == "女眾").CountAsync(); - dynamic bedCounts = await RegionAndRoomAndBedSchedule.GetAvailableBedCountsAsync(_db, DateTime.Now, DateTime.Now); - var guadanCurrentCount = await _db.GuaDanOrder.Where(a => now < a.EndDate).CountAsync(); - var guadanPeopleCurrent = await _db.GuaDanOrderGuest.Where( a => a.CheckOutAt > now).CountAsync(); - var guadanPeopleCurrentMale = await _db.GuaDanOrderGuest.Where(a => a.CheckOutAt > now && a.followers.sex == "男眾").CountAsync(); - var guadanPeopleCurrentFemale = await _db.GuaDanOrderGuest.Where(a => a.CheckOutAt > now && a.followers.sex == "女眾").CountAsync(); + var guadanTotalCount = await _db.GuaDanOrder + .Where(a => a.IsDeleted == false) + .Where(a => a.IsCancel == false) + .CountAsync(); + var guadanCurrentCount = await _db.GuaDanOrderGuest + .Where(guest => guest.StatusCode != "403") + .Where(guest => guest.StatusCode != "404") + .Select(guest => guest.GuaDanOrderNo) + .Distinct() + .CountAsync(); + var guadanPeopleTotal = await _db.GuaDanOrderGuest + .Where(a => a.IsDeleted == false) + .Where(guest => guest.StatusCode != "404") + .CountAsync(); + var guadanPeopleMale = await _db.GuaDanOrderGuest + .Where(guest => guest.StatusCode != "404") + .Where(a => a.IsDeleted == false && a.followers.sex == "男眾") + .CountAsync(); + var guadanPeopleFemale = await _db.GuaDanOrderGuest + .Where(guest => guest.StatusCode != "404") + .Where(a => a.IsDeleted == false && a.followers.sex == "女眾") + .CountAsync(); + var guadanPeopleCurrent = await _db.GuaDanOrderGuest + .Where(a => a.IsDeleted == false) + .Where(guest => guest.StatusCode != "404") + .Where(guest => guest.StatusCode != "403") + .Where( a => a.CheckOutAt >= now.Date) + .CountAsync(); + var guadanPeopleCurrentMale = await _db.GuaDanOrderGuest + .Where(a => a.IsDeleted == false) + .Where(guest => guest.StatusCode != "404") + .Where(guest => guest.StatusCode != "403") + .Where(a => a.CheckOutAt >= now.Date && a.followers.sex == "男眾") + .CountAsync(); + var guadanPeopleCurrentFemale = await _db.GuaDanOrderGuest + .Where(a => a.IsDeleted == false) + .Where(guest => guest.StatusCode != "404") + .Where(guest => guest.StatusCode != "403") + .Where(a => a.CheckOutAt >= now.Date && a.followers.sex == "女眾") + .CountAsync(); var result = new { - roomStatistics = new - { - roomCount = roomCount, - emptyRoomCount = emptyRoomCount, - bedCount = bedCount, - maleBedCount = maleBedCount, - femaleBedCount = femaleBedCount, - emptyBedCount = bedCounts.male + bedCounts.female, - emptyMaleBedCount = bedCounts.male, - emptyFemaleBedCount = bedCounts.female - }, guadanStatistics = new { guadanTotalCount = guadanTotalCount, // 总挂单次数 @@ -61,7 +71,7 @@ public class guadanStatisticsController: ApiController guadanPeopleTotal = guadanPeopleTotal, // 总挂单人数 guadanPeopleMale = guadanPeopleMale, guadanPeopleFemale = guadanPeopleFemale, - guadanPeopleCurrent = guadanPeopleCurrent, // 当前挂单人数 + guadanPeopleCurrent = guadanPeopleCurrent, // 已預約掛單人數 guadanPeopleCurrentMale = guadanPeopleCurrentMale, guadanPeopleCurrentFemale = guadanPeopleCurrentFemale } diff --git a/web/App_Code/api/guadanStatisticsTableController.cs b/web/App_Code/api/guadanStatisticsTableController.cs index ab521b3..aa2bf23 100644 --- a/web/App_Code/api/guadanStatisticsTableController.cs +++ b/web/App_Code/api/guadanStatisticsTableController.cs @@ -59,20 +59,22 @@ public class guadanStatisticsTableController: ApiController ? g.Count(x => x.GuaDanOrderGuest.RegionRoomBedStatus.Code == "402" || x.GuaDanOrderGuest.RegionRoomBedStatus.Code == "403") : 0, + checkinfemale = g.Key <= DateTime.Today + ? g.Count(x => (x.GuaDanOrderGuest.RegionRoomBedStatus.Code == "402" + || x.GuaDanOrderGuest.RegionRoomBedStatus.Code == "403") + && x.GuaDanOrderGuest.followers.sex == "女眾") + : 0, + checkinmale = g.Key <= DateTime.Today + ? g.Count(x => (x.GuaDanOrderGuest.RegionRoomBedStatus.Code == "402" + || x.GuaDanOrderGuest.RegionRoomBedStatus.Code == "403") + && x.GuaDanOrderGuest.followers.sex == "男眾") + : 0, + bookfemale = g.Count(x => x.GuaDanOrderGuest.followers.sex == "女眾"), + bookmale = g.Count(x => x.GuaDanOrderGuest.followers.sex == "男眾") }) .OrderBy(x => x.date) .ToList(); var todayDate = DateTime.Today; - dynamic today = statistics.FirstOrDefault(x => x.date == todayDate); - - if (today == null) - { - var todayCount = _db.RegionAndRoomAndBedSchedule - .Where(s => s.ScheduleDate == todayDate && !s.IsCancel) - .Count(); - - today = new { date = todayDate, todaytotalbookers = todayCount }; - } var bedcount = _db.RegionRoomBed .Where(a => a.IsDeleted == false) @@ -83,11 +85,6 @@ public class guadanStatisticsTableController: ApiController bedcount, roomcount, statistics, - today, - totalbookers = _db.RegionAndRoomAndBedSchedule - .Where(s => s.IsCancel == false) - .Where(s => s.ScheduleDate >= DateTime.Today) - .Count(), }; return Ok(result); diff --git a/web/App_Code/api/orderdetailController.cs b/web/App_Code/api/orderdetailController.cs index aee31c7..8d265c5 100644 --- a/web/App_Code/api/orderdetailController.cs +++ b/web/App_Code/api/orderdetailController.cs @@ -22,94 +22,14 @@ public class orderdetailController:ApiController public IHttpActionResult GetList([FromBody] Model.ViewModel.pro_order q, int page, int pageSize = 10, string sortBy = "", bool sortDesc = false) { int activity_num = Convert.ToInt32(q.activity_num); - + //現在的牌位預覽只會出現功德主,修改為所有人都會出現 //var aIDt = _db.actItems.AsEnumerable().Where(f => f.subject.Contains(q.actItemTxt.Trim())).Select(f => f.num);//品項 - var OrderList = _db.pro_order.Where(u => u.activity_num == activity_num).Select(j => j.order_no).ToList(); - var gdzOrderList = _db.pro_order_detail.Where(o => OrderList.Contains(o.order_no) && o.print_id.Contains("主")).Select(o => o.order_no).Distinct().ToList(); - var qry = _db.pro_order.Where(u => gdzOrderList.Contains(u.order_no)).AsEnumerable(); - if (!string.IsNullOrEmpty(q.order_no)) - qry = qry.Where(o => o.order_no.Contains(q.order_no.Trim())); - if (!string.IsNullOrEmpty(q.keyin1)) - qry = qry.Where(o => o.keyin1.Contains(q.keyin1)); - if (q.f_num.HasValue && q.f_num > 0) - qry = qry.Where(o => o.f_num == q.f_num); - if (q.activity_num.HasValue && q.activity_num > 0) - qry = qry.Where(o => o.activity_num == q.activity_num); - if (q.up_time1.HasValue) - qry = qry.Where(o => o.up_time >= q.up_time1.Value); - if (q.up_time2.HasValue) - qry = qry.Where(o => o.up_time < Convert.ToDateTime(q.up_time2.Value).AddDays(1)); - if (!string.IsNullOrEmpty(q.address)) - qry = qry.Where(o => o.address.Contains(q.address.Trim())); - if (!string.IsNullOrEmpty(q.subject)) - qry = qry.Where(o => o.activity_num.HasValue && o.activity.subject.Contains(q.subject?.Trim())); - if (!string.IsNullOrEmpty(q.u_name)) - qry = qry.Where(o => o.f_num.HasValue && o.follower.u_name.Contains(q.u_name?.Trim())); - if (!string.IsNullOrEmpty(q.introducerTxt)) - qry = qry.Where(o => o.introducer.HasValue && o.follower1.u_name.Contains(q.introducerTxt?.Trim())); - - if (!string.IsNullOrEmpty(q.actItemTxt)) - { - //qry = qry.Where(o => o.pro_order_detail.Where(f2 => f2.order_no == o.order_no && aIDt.ToArray().Contains(f2.actItem_num?.ToString())).Count() > 0); - // qry = qry.Where(o => o.pro_order_detail.Where(f2 => f2.order_no == o.order_no && aIDt.Any(x => x == f2.actItem_num)).Count() > 0); - - qry = qry.Where(o => o.pro_order_detail.Where(f2 => f2.actItem_num.HasValue && f2.actItem.subject.Contains(q.actItemTxt?.Trim())).Count() > 0); - - } - - if (!string.IsNullOrEmpty(q.country)) - qry = qry.Where(o => o.f_num != null && o.follower?.country == q.country); - if (!string.IsNullOrEmpty(q.country2)) - { - if (q.country2 == "1") - { - qry = qry.Where(o => o.f_num != null && o.follower?.country == "158"); - } - else if (q.country2 == "2") - { - qry = qry.Where(o => o.f_num != null && o.follower?.country != "158"); - - } - } - - - if (sortBy.Equals("order_no")) - { - if (sortDesc) - qry = qry.OrderByDescending(o => o.order_no); - else - qry = qry.OrderBy(o => o.order_no); - } - else if (sortBy.Equals("keyin1_txt")) - { - if (sortDesc) - qry = qry.OrderByDescending(o => o.keyin1); - else - qry = qry.OrderBy(o => o.keyin1); - } - else if (sortBy.Equals("up_time")) - { - if (sortDesc) - qry = qry.OrderByDescending(o => o.up_time); - else - qry = qry.OrderBy(o => o.up_time); - } - else if (sortBy.Equals("u_name")) - { - if (sortDesc) - qry = qry.OrderByDescending(o => o.follower?.u_name); - else - qry = qry.OrderBy(o => o.follower?.u_name); - } - else if (sortBy.Equals("subject")) - { - if (sortDesc) - qry = qry.OrderByDescending(o => o.activity?.subject); - else - qry = qry.OrderBy(o => o.activity?.subject); - } - else - qry = qry.OrderByDescending(o => o.reg_time); + //var OrderList = _db.pro_order.Where(u => u.activity_num == activity_num).Select(j => j.order_no).ToList(); + //var gdzOrderList = _db.pro_order_detail.Where(o => OrderList.Contains(o.order_no) && o.print_id.Contains("主")).Select(o => o.order_no).Distinct().ToList(); + //var qry = _db.pro_order.Where(u => gdzOrderList.Contains(u.order_no)).AsEnumerable(); + var qry = _db.pro_order.Where( u => u.activity_num == activity_num).AsEnumerable(); + + qry = qry.OrderByDescending(o => o.reg_time); var count = qry.Count(); //pageSize = count;//一次取回?? var ret = new @@ -125,7 +45,11 @@ public class orderdetailController:ApiController up_time = x.up_time, keyin1_txt = Model.pro_order.keyin1_value_to_text(x.keyin1), //detail = x.pro_order_detail.Where(u => u.printed_files != null) - detail = new { count = x.pro_order_detail.Where(u => u.actItem.act_bom.Count() == 0).Count(), + detail = new { count = x.pro_order_detail + .Where(u => (u.parent_num != null) + || u.actItem.subject.Contains("牌") + || !string.IsNullOrEmpty(u.f_num_tablet)) + .Count(), actItem = x.pro_order_detail.Where(u => u.printed_files != null).FirstOrDefault()?.print_id } }), count = count diff --git a/web/App_Code/api/regionController.cs b/web/App_Code/api/regionController.cs index f1783b1..d830ffb 100644 --- a/web/App_Code/api/regionController.cs +++ b/web/App_Code/api/regionController.cs @@ -39,8 +39,9 @@ public class regionController : ApiController var startDate = filter.StartDate.Date; var endDate = filter.EndDate.Date; - var query = _db.Region + var query = _db.Region//区域状态是否启用这里只设置了过滤了有客房的区域,是否要过滤所有 .Where(r => !r.IsDeleted) + .Where(r => r.IsActive) .Where(r => r.Room.Any()); if (filter.Gender != null) @@ -105,8 +106,9 @@ public class regionController : ApiController .Where(s => s.TargetUuid == bed.Uuid && s.IsDeleted == false && (s.ScheduleDate == null - || (s.ScheduleDate >= startDate && s.ScheduleDate <= endDate))) + || (s.ScheduleDate >= startDate))) .Where(s => s.GuaDanOrderGuest.StatusCode != "403" && s.GuaDanOrderGuest.StatusCode != "404") + .OrderBy(a => a.ScheduleDate) .Select(s => new { s.Uuid, @@ -372,6 +374,10 @@ public class regionController : ApiController var region = _db.Region.FirstOrDefault(r => r.Uuid == dto.Uuid); if (region == null) return NotFound(); + if(dto.RoomCount < region.Room.Count()) + { + return BadRequest("客房數量小於已存在的客房數量"); + } region.Name = dto.Name; region.Description = dto.Description; region.SortOrder = dto.SortOrder; diff --git a/web/App_Code/api/regionRoomBedController.cs b/web/App_Code/api/regionRoomBedController.cs index a2c74e6..eecd783 100644 --- a/web/App_Code/api/regionRoomBedController.cs +++ b/web/App_Code/api/regionRoomBedController.cs @@ -379,13 +379,14 @@ public class regionRoomBedController : ApiController RoomUuid = roomUuid, CheckInAt = allocationStart, CheckOutAt = allocationEnd, + StatusCode = "401", }; _db.GuaDanOrderGuest.Add(guest); // 新增每日排程 if (allocationEnd.HasValue) { - for (var date = allocationStart; date <= allocationEnd.Value; date = date.AddDays(1)) + for (var date = allocationStart; date < allocationEnd.Value; date = date.AddDays(1)) { var newSchedule = new RegionAndRoomAndBedSchedule { @@ -396,7 +397,9 @@ public class regionRoomBedController : ApiController IsDeleted = false, CreatedBy = "系统自动分配", CreatedAt = DateTime.Now, - GuaDanOrderNo = guest.GuaDanOrderNo + GuaDanOrderNo = guest.GuaDanOrderNo, + Title = "掛單", + GuaDanOrderGuestUuid = guest.Uuid, }; _db.RegionAndRoomAndBedSchedule.Add(newSchedule); } @@ -413,7 +416,9 @@ public class regionRoomBedController : ApiController IsDeleted = false, CreatedBy = "系统自动分配", CreatedAt = DateTime.Now, - GuaDanOrderNo = guest.GuaDanOrderNo + GuaDanOrderNo = guest.GuaDanOrderNo, + Title = "掛單", + GuaDanOrderGuestUuid = guest.Uuid, }; _db.RegionAndRoomAndBedSchedule.Add(newSchedule); } diff --git a/web/App_Code/api/regionRoomController.cs b/web/App_Code/api/regionRoomController.cs index dc0e2a9..33cc4f5 100644 --- a/web/App_Code/api/regionRoomController.cs +++ b/web/App_Code/api/regionRoomController.cs @@ -38,6 +38,15 @@ public class regionRoomController : ApiController { return BadRequest("請輸入床位數量"); } + var region = _db.Region.Find(room.RegionUuid); + if(region == null) + { + return BadRequest("未找到客房所屬的區域"); + } + if(region.Room.Count() >= region.RoomCount) + { + return BadRequest("當前區域客房數量已經達到上限"); + } var newRoom = new Room(); newRoom.Name = room.Name; newRoom.RegionUuid = room.RegionUuid; @@ -103,15 +112,43 @@ public class regionRoomController : ApiController [Route("api/region/room/delete")] public async Task deleteRoom([FromBody] Room rm) { - var room = await _db.Room.FindAsync(rm.Uuid); - if (room == null) return BadRequest("房間不存在"); + using (var transaction = _db.Database.BeginTransaction()) + { + try + { + var room = await _db.Room.FindAsync(rm.Uuid); + if (room == null) return BadRequest("房間不存在"); - var beds = _db.RegionRoomBed.Where(b => b.RoomUuid == room.Uuid); - _db.RegionRoomBed.RemoveRange(beds); + var beds = _db.RegionRoomBed.Where(b => b.RoomUuid == room.Uuid); + _db.RegionRoomBed.RemoveRange(beds); - _db.Room.Remove(room); - await _db.SaveChangesAsync(); - return Ok(new { message = "刪除成功" }); + _db.Room.Remove(room); + + await _db.SaveChangesAsync(); + transaction.Commit(); + + return Ok(new { message = "刪除成功" }); + } + catch (System.Data.Entity.Infrastructure.DbUpdateException ex) + { + transaction.Rollback(); + + // 判断是否为外键约束错误 + if (ex.InnerException?.InnerException is System.Data.SqlClient.SqlException sqlEx && + sqlEx.Number == 547) // 547 = 外键冲突 + { + return BadRequest("房間或床位正在被使用,不能刪除"); + } + + return InternalServerError(ex); + } + catch (Exception ex) + { + transaction.Rollback(); + return InternalServerError(ex); + } + } } + } \ No newline at end of file diff --git a/web/App_Code/guadanGuestQueryController.cs b/web/App_Code/guadanGuestQueryController.cs deleted file mode 100644 index 7a3c5ae..0000000 --- a/web/App_Code/guadanGuestQueryController.cs +++ /dev/null @@ -1,70 +0,0 @@ -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; - -/// -/// guadanGuestQueryController 的摘要描述 -/// -public class guadanGuestQueryController: ApiController -{ - private Model.ezEntities _db = new Model.ezEntities(); - public guadanGuestQueryController() - { - // - // TODO: 在這裡新增建構函式邏輯 - // - } - [HttpPost] - [Route("api/guadan/guest/query/list")] - public async Task GetList([FromBody] SearchGuestModel search) - { - var query = _db.GuaDanOrderGuest - .Where(guest => guest.StatusCode != "404"); - if(search.SearchName != null) - { - query = query.Where(guest => guest.followers.u_name.Contains(search.SearchName)); - } - var data = await query.ToListAsync(); - var data1 = data.Select(a => new - { - name = a.followers != null ? a.followers.u_name : null, - checkindate = a.CheckInAt, - checkoutdate = a.CheckOutAt, - guadanorderno = a.GuaDanOrderNo, - roomName = GetRoomAndBedString(a.RegionRoomBed), - }).ToList(); - return Ok(new - { - items = data1, - total = data1.Count(), - }); - - } - public string GetRoomAndBedString(RegionRoomBed bed) - { - if (bed == null || bed.Room == null) return ""; - var room = bed.Room; - var region = room.Region; - var name = room.Name + "/" + bed.Name; - if(region != null) - { - name = region.Name + "/" + name; - } - var parentRegion = region.Region2; - while (parentRegion != null) - { - name = parentRegion.Name + "/" + name; - parentRegion = parentRegion.Region2; - } - return name; - } - public class SearchGuestModel - { - public string SearchName = null; - } -} \ No newline at end of file diff --git a/web/admin/guadan/create.aspx b/web/admin/guadan/create.aspx index 01d212d..e6fc61c 100644 --- a/web/admin/guadan/create.aspx +++ b/web/admin/guadan/create.aspx @@ -1146,6 +1146,10 @@ .then(res => { this.resetAutomaticBedAllocation(); this.getGuadanOrderGuestByOrderNo(); + }).catch((error) => { + this.$refs.messageModal.open({ + message: (error.response?.data?.message || error.message) + }); }); }, diff --git a/web/admin/guadan/guest/index.aspx b/web/admin/guadan/guest/index.aspx index cbb5410..ac07da3 100644 --- a/web/admin/guadan/guest/index.aspx +++ b/web/admin/guadan/guest/index.aspx @@ -4,24 +4,40 @@ +
+ + +
+
+ + - + +
+
+ + - + +
+ +
+ + +
+
+
{{item.checkoutdate|timeString('YYYY-MM-DD')}} + @@ -67,7 +86,7 @@ :max="pageCount" @input="options.page = parseInt($event, 10)" > - +
@@ -76,7 +95,7 @@ -