From ebad44be714b24fe3ed18eb2c7f007e0474ef9d0 Mon Sep 17 00:00:00 2001 From: HUANGBANGLIN Date: Mon, 15 Sep 2025 14:16:12 +0800 Subject: [PATCH 1/8] =?UTF-8?q?=E6=8C=82=E5=8D=95=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/App_Code/api/ShuWenController.cs | 58 ++++++------ web/App_Code/api/regionController.cs | 3 +- web/App_Code/guadanGuestQueryController.cs | 40 ++++++++- web/admin/guadan/guest/index.aspx | 100 ++++++++++++++------- web/admin/shuwen/shuwen.aspx | 2 +- 5 files changed, 142 insertions(+), 61 deletions(-) diff --git a/web/App_Code/api/ShuWenController.cs b/web/App_Code/api/ShuWenController.cs index e82b2dd..3a36897 100644 --- a/web/App_Code/api/ShuWenController.cs +++ b/web/App_Code/api/ShuWenController.cs @@ -222,34 +222,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/regionController.cs b/web/App_Code/api/regionController.cs index f1783b1..5adf1c0 100644 --- a/web/App_Code/api/regionController.cs +++ b/web/App_Code/api/regionController.cs @@ -105,8 +105,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") + .OrderByDescending(a => a.ScheduleDate) .Select(s => new { s.Uuid, diff --git a/web/App_Code/guadanGuestQueryController.cs b/web/App_Code/guadanGuestQueryController.cs index 7a3c5ae..58acec1 100644 --- a/web/App_Code/guadanGuestQueryController.cs +++ b/web/App_Code/guadanGuestQueryController.cs @@ -29,8 +29,33 @@ public class guadanGuestQueryController: ApiController { query = query.Where(guest => guest.followers.u_name.Contains(search.SearchName)); } - var data = await query.ToListAsync(); - var data1 = data.Select(a => new + if(search.searchCheckInDate != null) + { + query = query.Where(guest => guest.CheckInAt == search.searchCheckInDate); + } + 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, @@ -41,9 +66,8 @@ public class guadanGuestQueryController: ApiController return Ok(new { items = data1, - total = data1.Count(), + total = totalCount, }); - } public string GetRoomAndBedString(RegionRoomBed bed) { @@ -66,5 +90,13 @@ public class guadanGuestQueryController: ApiController 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/admin/guadan/guest/index.aspx b/web/admin/guadan/guest/index.aspx index cbb5410..cdf72b6 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)" > - +
@@ -123,23 +142,29 @@ button:hover { loading: false, search: { searchName: null, - + searchCheckInDateStart: null,//入住日期开始 + searchCheckInDateEnd: null,//入住日期的结束 + searchCheckOutDateStart: null,//退房日期的开始 + searchCheckOutDateEnd: null,//退房日期的结束 + searchCheckInDate: null, + searchCheckOutDate: null, + }, options: { - page: 1, // 当前页 - itemsPerPage: 1, // 每页条数 + page: 1, // 當前頁 + itemsPerPage: 10, // 每頁條數 sortBy: [], sortDesc: [] }, headers: [ { text: '姓名', value: 'name' }, - { text: '挂单单号', value: 'guadanorderno'}, + { text: '掛單單號', value: 'guadanorderno' }, { text: '入住日期', value: 'checkindate' }, - { text: '退房日期', value: 'checkoutdate'}, - { text: '房间号', value: 'roomName' }, + { text: '退房日期', value: 'checkoutdate' }, + { text: '房間號', value: 'roomName' }, ], - guests: [], // 表格数据 + guests: [], // 表格數據 total: 0, } }, @@ -157,9 +182,19 @@ button:hover { }, clearSearch() { this.search.searchName = null; + this.search.searchCheckInDate = null; + this.search.searchCheckOutDate = null; + this.search.searchCheckInDateStart = null; + this.search.searchCheckInDateEnd = null; + this.search.searchCheckOutDateStart = null; + this.search.searchCheckOutDateEnd = null; this.resetTableOptions(); }, fetchGuests() { + if (this.search.searchName && this.search.searchName.includes(' ')) { + alert('搜索內容不能包含空格'); + return; // 阻止繼續執行 + } if (this.loading) return; this.loading = true; axios.post('/api/guadan/guest/query/list', @@ -167,19 +202,25 @@ button:hover { page: this.options.page, pageSize: this.options.itemsPerPage, searchName: this.search.searchName, - date: this.search.date + searchCheckInDate: this.search.searchCheckInDate, + searchCheckOutDate: this.search.searchCheckOutDate, + searchCheckInDateStart: this.search.searchCheckInDateStart, + searchCheckInDateEnd: this.search.searchCheckInDateEnd, + searchCheckOutDateStart: this.search.searchCheckOutDateStart, + searchCheckOutDateEnd: this.search.searchCheckOutDateEnd, + }).then(res => { - this.guests = res.data.items; // 数据 - this.total = res.data.total; // 总数 - }).finally(() => { - this.loading = false; - }); + this.guests = res.data.items; // 數據 + this.total = res.data.total; // 總數 + }).finally(() => { + this.loading = false; + }); } }, watch: { options: { handler() { - this.fetchGuests(); // 监听分页、排序变化,自动加载数据 + this.fetchGuests(); // 監聽分頁、排序變化,自動載入數據 }, deep: true, } @@ -194,5 +235,4 @@ button:hover { } }) -
- + \ No newline at end of file diff --git a/web/admin/shuwen/shuwen.aspx b/web/admin/shuwen/shuwen.aspx index b25a4ff..c141e46 100644 --- a/web/admin/shuwen/shuwen.aspx +++ b/web/admin/shuwen/shuwen.aspx @@ -18,7 +18,7 @@
{{updateShuWenLoading ? '更新中': '更新疏文'}} - 下載疏文Word檔 + ?activitynum='+currentActivityNum" class="btn btn-outline-primary btn-print">下載疏文Word檔
From 72db7ca92802e343366e597bd3140f350bde7ace Mon Sep 17 00:00:00 2001 From: HUANGBANGLIN Date: Mon, 15 Sep 2025 14:24:31 +0800 Subject: [PATCH 2/8] =?UTF-8?q?=E6=8C=82=E5=8D=95=E6=A8=A1=E5=9D=97URL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/SQL/guadan_item_insert_script.sql | Bin 0 -> 4102 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 data/SQL/guadan_item_insert_script.sql diff --git a/data/SQL/guadan_item_insert_script.sql b/data/SQL/guadan_item_insert_script.sql new file mode 100644 index 0000000000000000000000000000000000000000..caa1a795d15fd68365eb783857b82e5952bc3250 GIT binary patch literal 4102 zcmeHK%}x_h7(FXvOne7+g#@S->A;F$6w`nuq10fSLZr+!ujs}mKnzh*4->-=Kg;7%st39j>aSy-4TZzy~j2? zXtDVR(&~?}X}7EG`Yqv{9U_ck=y6Xh?m`n&#QY4)SVNurQ)6vX@3E{}MFF21ORZ1G zx155;AuXpUa-|Oc*y4Ic+ErZDA{ME&SnKdBeew?j?y-p;`5JJpZ*@5+*SYeV*PdLS z$Gq-$xpytZM^5FeVKLa>;r7$@^UaU#FZHkXs(BOsTpoM$FOyH7433l2a)i?mbvDmR zLe|z^C`eU;zq#I$dx(L1frp51d_Vu7!kE0i`@3Xa;#^c^oZN@;9L1Bq`YY;*!s`gP z(=i-HJ{EqKzHZbRTQqEgEqcWIN`MHnq_VC5K_upy* zH8bqK$;w}pP2ul=idfW4O6gzot%4V=VI&%O5MWMM=X7K}qH`ji_BZ8DwkBDnWa@E` z%};kXYd3g5iu#ynLuqU8EUSMd>4V&{Oy=}*n~CrIO*KB(iu5yiVT8w@Z-3OXawxH* Yw7&nZjIHEh`;*F#;|{)pm63b>6 Date: Mon, 15 Sep 2025 16:23:38 +0800 Subject: [PATCH 3/8] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=B5=84=E6=96=99?= =?UTF-8?q?=E5=BA=93=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/SQL/guadan_script.sql | Bin 41142 -> 60036 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/data/SQL/guadan_script.sql b/data/SQL/guadan_script.sql index ffa1fa929634252697bda9b071127b5b803ffe01..089b5919705c3045b82b5d5f479ab997ee3c93b4 100644 GIT binary patch literal 60036 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 delta 463 zcmZp<%Dn9$(}YcumJA9E+?l6@kx5KqZqG>{6R7AjLEJz)GIYY5U}K E0H?ofvH$=8 From 40da17b414cccb67215758a175bfc509eaf104fb Mon Sep 17 00:00:00 2001 From: HUANGBANGLIN Date: Tue, 16 Sep 2025 11:49:02 +0800 Subject: [PATCH 4/8] =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=8C=82=E5=8D=95?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1=EF=BC=8C=E4=BF=AE=E6=94=B9=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E5=8C=BA=E5=9F=9F=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{ => api}/guadanGuestQueryController.cs | 4 + .../api/guadanOrderGuestController.cs | 50 +++--- .../api/guadanStatisticsController.cs | 72 +++++---- .../api/guadanStatisticsTableController.cs | 15 -- web/App_Code/api/regionController.cs | 2 +- web/admin/guadan/index.aspx | 8 +- web/admin/guadan/statistics.aspx | 143 ------------------ web/admin/guadan/statistics.aspx.cs | 14 -- web/admin/guadan/statistics_table.aspx | 129 ++++++++++++---- web/admin/region/bed/index.aspx | 74 ++++----- web/admin/region/index.aspx | 3 +- 11 files changed, 220 insertions(+), 294 deletions(-) rename web/App_Code/{ => api}/guadanGuestQueryController.cs (95%) delete mode 100644 web/admin/guadan/statistics.aspx delete mode 100644 web/admin/guadan/statistics.aspx.cs diff --git a/web/App_Code/guadanGuestQueryController.cs b/web/App_Code/api/guadanGuestQueryController.cs similarity index 95% rename from web/App_Code/guadanGuestQueryController.cs rename to web/App_Code/api/guadanGuestQueryController.cs index 58acec1..4749bf0 100644 --- a/web/App_Code/guadanGuestQueryController.cs +++ b/web/App_Code/api/guadanGuestQueryController.cs @@ -33,6 +33,10 @@ public class guadanGuestQueryController: ApiController { 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); 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..289d647 100644 --- a/web/App_Code/api/guadanStatisticsTableController.cs +++ b/web/App_Code/api/guadanStatisticsTableController.cs @@ -63,16 +63,6 @@ public class guadanStatisticsTableController: ApiController .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 +73,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/regionController.cs b/web/App_Code/api/regionController.cs index 5adf1c0..7d7eb61 100644 --- a/web/App_Code/api/regionController.cs +++ b/web/App_Code/api/regionController.cs @@ -107,7 +107,7 @@ public class regionController : ApiController && (s.ScheduleDate == null || (s.ScheduleDate >= startDate))) .Where(s => s.GuaDanOrderGuest.StatusCode != "403" && s.GuaDanOrderGuest.StatusCode != "404") - .OrderByDescending(a => a.ScheduleDate) + .OrderBy(a => a.ScheduleDate) .Select(s => new { s.Uuid, diff --git a/web/admin/guadan/index.aspx b/web/admin/guadan/index.aspx index a792648..76ef1cf 100644 --- a/web/admin/guadan/index.aspx +++ b/web/admin/guadan/index.aspx @@ -6,6 +6,9 @@ +
+ +
@@ -27,10 +30,10 @@ {{item.status}}