using Grpc.Net.Client; using HotelPms.Client.Blazor.Util; using HotelPms.Data.Master; using HotelPms.DataAccessGrpc.Client; using HotelPms.Share.Util; using Microsoft.VisualBasic; using MudBlazor; using System.Collections.Concurrent; using System.Data; using System.Text; using System.Threading.Channels; using static MudBlazor.CategoryTypes; using static System.Net.Mime.MediaTypeNames; namespace HotelPms.Client.Blazor.Models { /// /// 客室状況を持つデータ /// public class RoomViewData { /// /// 現在選択されているTabのインデックス /// public int ActiveTabIndex { get; set; } = 0; /// /// 全部行数 /// public int RowCount { get; set; } = 0; /// /// 全部列数 /// public int ColCount { get; set; } = 0; /// /// 部屋タブ一覧 /// public List Tabs { get; set; } = new List(); /// /// 選択されているタブのレイアウトデータ /// 行⇒列 /// public List> Data { get; set; } = new List>(); /// /// 現在のセルレイアウト /// public List Cells { get; set; } = new List(); /// /// Tab毎のレイアウトを持つ /// M_RoomCellを編集されたら、SignalRより受信し、更新される /// public ConcurrentDictionary> CellsBuffer = new ConcurrentDictionary>(); /// /// 部屋ID, 部屋属性データ /// public Dictionary RoomData = new Dictionary(); /// /// 部屋ID, [SortKey, 利用データ] /// public Dictionary> UseData = new Dictionary>(); /// /// メニュー /// public RoomViewMenu Menu = new RoomViewMenu(); /// /// 現在の利用日 /// public DateTime UseDate { get; set; } = DateTime.Today; public RoomViewData() { } /// /// 表示Tabのデータクリア /// private void Clear() { Data.Clear(); RoomData.Clear(); UseData.Clear(); RowCount = 0; ColCount = 0; } /// /// 客室状況画面初期化 /// /// public async Task Init() { using RoomViewLayoutAccess access = new RoomViewLayoutAccess(EnvironmentSetting.GrpcChannel); using DataSet ds = await access.GetRoomViewData($"NULL,0,1"); //データを取得してから、クリア:データを取得時、画面再表示されないように Clear(); //レイアウトデータ SetLayoutData(ds.Tables[0]); //部屋状態・属性 SetRoomData(ds.Tables[1]); //部屋の利用データ SetUseData(ds.Tables[2]); //レイアウト SetRoomCell(ds.Tables[3]); //ホテル日 UseDate = (DateTime)ds.Tables[4].Rows[0][0]; //Tab一覧 SetTabs(ds.Tables[5]); } /// /// 表示用データ /// /// /// public async Task GetData(DateTime useDate, bool tabChanged) { Clear(); int tabID = Tabs[ActiveTabIndex].ID; using RoomViewLayoutAccess access = new RoomViewLayoutAccess(EnvironmentSetting.GrpcChannel); using DataSet ds = await access.GetRoomViewData($"{CConvert.ToDateString(useDate)},{tabID},{(tabChanged ? 2 : 0)}"); //レイアウトデータ SetLayoutData(ds.Tables[0]); //部屋状態・属性 SetRoomData(ds.Tables[1]); //部屋の利用データ SetUseData(ds.Tables[2]); //レイアウト if (tabChanged) { SetRoomCell(ds.Tables[3]); } } /// /// セルのレイアウト情報取得 /// /// private void SetRoomCell(DataTable table) { List list; if (CellsBuffer.TryGetValue(ActiveTabIndex, out list)) { Cells = list; return; } list = new List(); foreach (DataRow row in table.Rows) { RoomCell item = new RoomCell(); item.ConvertDataRow(row); list.Add(item); } CellsBuffer[ActiveTabIndex] = list; Cells = list; } /// /// Tabの情報 /// /// private void SetTabs(DataTable table) { Tabs.Clear(); foreach (DataRow row in table.Rows) { RoomViewTab item = new RoomViewTab(); item.ConvertDataRow(row); Tabs.Add(item); } } /// /// レイアウトデータ /// /// private void SetLayoutData(DataTable table) { List rowData = new List(); foreach (DataRow row in table.Rows) { RoomViewLayout item = new RoomViewLayout(); item.Read(row); if (item.Row > RowCount) { RowCount = item.Row; } if (item.Col > ColCount) { ColCount = item.Col; } if (item.Col == 1) { //改行 rowData = new List(); Data.Add(rowData); } //行毎の各列 rowData.Add(item); } } /// /// 部屋状態・属性 /// /// private void SetRoomData(DataTable table) { foreach (DataRow row in table.Rows) { RoomViewAtt room = new RoomViewAtt(); room.Read(row); RoomData.Add(room.RoomID, room); } } /// /// 部屋の利用データ /// /// private void SetUseData(DataTable table) { foreach (DataRow row in table.Rows) { RoomViewUse use = new RoomViewUse(); use.Read(row); SortedDictionary dict; if (!UseData.TryGetValue(use.RoomID, out dict)) { dict = new SortedDictionary(); UseData.Add(use.RoomID, dict); } dict.Add(use.SortKey, use); } } /// /// セルのアイテム毎の表示文言 /// /// /// /// public string GetText(Data.Master.RoomCell roomCell, int roomID) { try { if (roomCell.ID == 0) { return roomCell.Content; } else if (roomCell.ID == 1) { return roomID.ToString(); } else if (roomCell.ID == 9) { return RoomData.ContainsKey(roomID) ? RoomData[roomID].RoomName : string.Empty; } else { return UseData.ContainsKey(roomID) ? UseData[roomID].FirstOrDefault().Value.UseData[$"F{roomCell.ID}"] : string.Empty; } } catch { return $"error:{roomCell.ID}"; } } /// /// セル色 /// /// /// public string GetCellColor(Data.Master.RoomViewLayout item) { int roomID = item.RoomID; StringBuilder text = new StringBuilder(); //優先順位:部屋状態>利用状態>固定色 string backColor = item.BackColor, foreColor = item.ForeColor; if (roomID > 0) { int maidType = RoomData.ContainsKey(roomID) ? RoomData[roomID].MaidType : 0; if (maidType > 0) { foreColor = RoomData[roomID].ForeColor; backColor = RoomData[roomID].BackColor; } else if (UseData.ContainsKey(roomID)) { var use = UseData[roomID].FirstOrDefault().Value; foreColor = use.ForeColor; backColor = use.BackColor; } } text.Append($"color:{CConvert.ToHtmlColor(foreColor)};"); text.Append($"background:{CConvert.ToHtmlColor(backColor)};"); return text.ToString(); } /// /// セルのアイテム毎のスタイル /// /// /// public string GetRoomCellStyle(Data.Master.RoomCell roomCell) { StringBuilder text = new StringBuilder(); text.Append("position: absolute;"); text.Append($"left: {roomCell.Left}px;"); text.Append($"top: {roomCell.Top}px;"); text.Append($"width:{roomCell.Width}px;"); text.Append($"height:{roomCell.Heigh}px;"); text.Append($"font-family:{roomCell.FontName};"); text.Append($"font-size:{roomCell.FontSize}pt;"); if (roomCell.FontItalic) { text.Append("font-style:italic;"); } if (roomCell.FontBold) { text.Append("font-weight:bold;"); } string backColor = roomCell.BackColor, foreColor = roomCell.ForeColor; text.Append($"color:{CConvert.ToHtmlColor(foreColor)};"); if (!CConvert.IsTransparent(backColor)) { text.Append($"background:{CConvert.ToHtmlColor(backColor)};"); } if(roomCell.FontUnderline) { text.Append("text-decoration: underline;"); text.Append("text-underline-offset: 0.2em;"); } return text.ToString(); } /// /// セルの文字寄せ /// /// /// public Align ToTextAlignCSS(Data.Master.RoomCell roomCell) { //TopLeft = 1, //TopCenter = 2, //TopRight = 4, //MiddleLeft = 16, //MiddleCenter = 32, //MiddleRight = 64, //BottomLeft = 256, //BottomCenter = 512, //BottomRight = 1024, if (roomCell.TextAlign == 1 || roomCell.TextAlign == 16 || roomCell.TextAlign == 256) { return Align.Left; } else if (roomCell.TextAlign == 4 || roomCell.TextAlign == 64 || roomCell.TextAlign == 1024) { return Align.Right; } else { return Align.Center; } } } }