update from old git
This commit is contained in:
144
web/App_Code/Model/Partial/RegionAndRoomAndBedSchedule.cs
Normal file
144
web/App_Code/Model/Partial/RegionAndRoomAndBedSchedule.cs
Normal file
@@ -0,0 +1,144 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data.Entity;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using System.Web;
|
||||
|
||||
/// <summary>
|
||||
/// RegionAndRoomAndBedSchedule 的摘要描述
|
||||
/// </summary>
|
||||
namespace Model
|
||||
{
|
||||
public partial class RegionAndRoomAndBedSchedule
|
||||
{
|
||||
public enum SchedulePurpose
|
||||
{
|
||||
None = -1, // 無特定用途
|
||||
|
||||
// 區域相關
|
||||
Region_Repair = 10, // 區域修繕
|
||||
Region_Cleaning = 11, // 區域清潔
|
||||
// 客房相關
|
||||
Room_Reservation = 20, // 客房預訂
|
||||
Room_Cleaning = 21, // 客房清潔
|
||||
Room_Disinfection = 22, // 客房消毒
|
||||
Room_Repair = 23, // 客房維修
|
||||
|
||||
// 床位相關
|
||||
Bed_Reservation = 30, // 床位預訂
|
||||
Bed_Cleaning = 31, // 床位清潔
|
||||
Bed_Repair = 32, // 床位維修
|
||||
Bed_Disinfection = 33, // 床位消毒
|
||||
|
||||
// 其他用途
|
||||
Event_Use = 90, // 活動使用
|
||||
Other = 99 // 其他
|
||||
}
|
||||
|
||||
public enum StatusEnum
|
||||
{
|
||||
None = 0,
|
||||
Normal = 1,
|
||||
Cancel = 2,
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找指定时间段内可用床位(无排程占用)
|
||||
/// </summary>
|
||||
/// <param name="db">数据库上下文</param>
|
||||
/// <param name="start">查询开始时间</param>
|
||||
/// <param name="end">查询结束时间</param>
|
||||
/// <returns>可用床位列表</returns>
|
||||
public static async Task<List<RegionRoomBed>> GetAvailableBedsAsync(ezEntities db, DateTime start, DateTime? end)
|
||||
{
|
||||
start = start.Date;
|
||||
end = end?.Date;
|
||||
|
||||
// 找出在日期範圍內被占用的床位 Uuid(包括長期占用 ScheduleDate = null)
|
||||
var busyBedUuidsQuery = db.RegionAndRoomAndBedSchedule
|
||||
.Where(s => s.IsDeleted == false && s.IsActive
|
||||
&& (s.ScheduleDate == null
|
||||
|| (end.HasValue
|
||||
&& s.ScheduleDate >= start
|
||||
&& s.ScheduleDate <= end.Value)));
|
||||
|
||||
var busyBedUuids = await busyBedUuidsQuery
|
||||
.Select(s => s.TargetUuid)
|
||||
.Distinct()
|
||||
.ToListAsync();
|
||||
|
||||
// 空閒床位 = 所有床位 - 忙碌床位
|
||||
var availableBeds = await db.RegionRoomBed
|
||||
.Where(b => !busyBedUuids.Contains(b.Uuid))
|
||||
.ToListAsync();
|
||||
|
||||
return availableBeds;
|
||||
}
|
||||
public static async Task<bool> IsBedAvailableAsync(ezEntities db, Guid targetUuid, DateTime start, DateTime? end)
|
||||
{
|
||||
// 如果 end 為 null,表示長期占用,直接判斷是否已有長期占用
|
||||
if (end == null)
|
||||
{
|
||||
var hasLongTerm = await db.RegionAndRoomAndBedSchedule
|
||||
.AnyAsync(s => s.IsDeleted == false
|
||||
&& s.IsActive
|
||||
&& s.TargetUuid == targetUuid
|
||||
&& s.ScheduleDate == null);
|
||||
return !hasLongTerm;
|
||||
}
|
||||
|
||||
// 短期占用,查詢每日排程中有無衝突
|
||||
var totalDays = (end.Value.Date - start.Date).Days + 1;
|
||||
for (int i = 0; i < totalDays; i++)
|
||||
{
|
||||
var date = start.Date.AddDays(i);
|
||||
|
||||
var conflict = await db.RegionAndRoomAndBedSchedule
|
||||
.AnyAsync(s => s.IsDeleted == false
|
||||
&& s.IsActive
|
||||
&& s.TargetUuid == targetUuid
|
||||
&& s.ScheduleDate == date);
|
||||
|
||||
if (conflict)
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
public static async Task<object> GetAvailableBedCountsAsync(ezEntities db, DateTime start, DateTime end)
|
||||
{
|
||||
start = start.Date;
|
||||
end = end.Date;
|
||||
|
||||
// 找出所有在日期範圍內被占用的床位
|
||||
var busyBedUuids = await db.RegionAndRoomAndBedSchedule
|
||||
.Where(s => s.IsDeleted == false && s.IsActive
|
||||
&& (s.ScheduleDate == null // 長期占用
|
||||
|| (s.ScheduleDate >= start && s.ScheduleDate <= end)))
|
||||
.Select(s => s.TargetUuid)
|
||||
.Distinct()
|
||||
.ToListAsync();
|
||||
|
||||
// 可用床位 = 所有床位 - 忙碌床位
|
||||
var availableBeds = db.RegionRoomBed
|
||||
.Where(b => !busyBedUuids.Contains(b.Uuid));
|
||||
|
||||
var result = await availableBeds
|
||||
.GroupBy(b => b.Gender)
|
||||
.Select(g => new
|
||||
{
|
||||
Gender = g.Key,
|
||||
Count = g.Count()
|
||||
})
|
||||
.ToListAsync();
|
||||
|
||||
var male = result.Where(r => r.Gender == true).Select(r => r.Count).FirstOrDefault();
|
||||
var female = result.Where(r => r.Gender == false).Select(r => r.Count).FirstOrDefault();
|
||||
|
||||
return new { male, female };
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user