From 1a1c8e71fcd14858f595029f089b2d4a00202b32 Mon Sep 17 00:00:00 2001
From: ogi <Administrator@S-OGI-PC>
Date: Fri, 05 Dec 2025 09:24:16 +0900
Subject: [PATCH] プロジェクトファイルを追加。

---
 HotelPms.Client.Blazor/Models/RoomViewData.cs |  368 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 368 insertions(+), 0 deletions(-)

diff --git a/HotelPms.Client.Blazor/Models/RoomViewData.cs b/HotelPms.Client.Blazor/Models/RoomViewData.cs
new file mode 100644
index 0000000..0c50d65
--- /dev/null
+++ b/HotelPms.Client.Blazor/Models/RoomViewData.cs
@@ -0,0 +1,368 @@
+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
+{
+    /// <summary>
+    /// 客室状況を持つデータ
+    /// </summary>
+    public class RoomViewData
+    {
+        /// <summary>
+        /// 現在選択されているTabのインデックス
+        /// </summary>
+        public int ActiveTabIndex { get; set; } = 0;
+
+        /// <summary>
+        /// 全部行数
+        /// </summary>
+        public int RowCount { get; set; } = 0;
+
+        /// <summary>
+        /// 全部列数
+        /// </summary>
+        public int ColCount { get; set; } = 0;
+
+        /// <summary>
+        /// 部屋タブ一覧
+        /// </summary>
+        public List<RoomViewTab> Tabs { get; set; } = new List<RoomViewTab>();
+
+        /// <summary>
+        /// 選択されているタブのレイアウトデータ
+        /// 行⇒列
+        /// </summary>
+        public List<List<RoomViewLayout>> Data { get; set; } = new List<List<RoomViewLayout>>();
+
+        /// <summary>
+        /// 現在のセルレイアウト
+        /// </summary>
+        public List<RoomCell> Cells { get; set; } = new List<RoomCell>();
+
+        /// <summary>
+        /// Tab毎のレイアウトを持つ
+        /// M_RoomCellを編集されたら、SignalRより受信し、更新される
+        /// </summary>
+        public ConcurrentDictionary<int, List<RoomCell>> CellsBuffer = new ConcurrentDictionary<int, List<RoomCell>>();
+
+        /// <summary>
+        /// 部屋ID, 部屋属性データ
+        /// </summary>
+        public Dictionary<int, RoomViewAtt> RoomData = new Dictionary<int, RoomViewAtt>();
+
+        /// <summary>
+        /// 部屋ID, [SortKey, 利用データ]
+        /// </summary>
+        public Dictionary<int, SortedDictionary<string, RoomViewUse>> UseData = new Dictionary<int, SortedDictionary<string, RoomViewUse>>();
+
+        /// <summary>
+        /// メニュー
+        /// </summary>
+        public RoomViewMenu Menu = new RoomViewMenu();
+
+        /// <summary>
+        /// 現在の利用日
+        /// </summary>
+        public DateTime UseDate { get; set; } = DateTime.Today;
+
+        public RoomViewData()
+        {
+        }
+
+        /// <summary>
+        /// 表示Tabのデータクリア
+        /// </summary>
+        private void Clear()
+        {
+            Data.Clear();
+            RoomData.Clear();
+            UseData.Clear();
+            RowCount = 0;
+            ColCount = 0;
+        }
+
+        /// <summary>
+        /// 客室状況画面初期化
+        /// </summary>
+        /// <returns></returns>
+        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]);
+        }
+
+        /// <summary>
+        /// 表示用データ
+        /// </summary>
+        /// <param name="channel"></param>
+        /// <returns></returns>
+        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]); }
+        }
+
+        /// <summary>
+        /// セルのレイアウト情報取得
+        /// </summary>
+        /// <param name="table"></param>
+        private void SetRoomCell(DataTable table)
+        {
+            List<RoomCell> list;    
+            if (CellsBuffer.TryGetValue(ActiveTabIndex, out list)) 
+            {
+                Cells = list;
+                return; 
+            }
+
+            list = new List<RoomCell>();
+            foreach (DataRow row in table.Rows)
+            {
+                RoomCell item = new RoomCell();
+                item.ConvertDataRow(row);
+                list.Add(item);
+            }
+            CellsBuffer[ActiveTabIndex] = list;
+            Cells = list;
+        }
+
+        /// <summary>
+        /// Tabの情報
+        /// </summary>
+        /// <param name="table"></param>
+        private void SetTabs(DataTable table)
+        {
+            Tabs.Clear();
+            foreach (DataRow row in table.Rows)
+            {
+                RoomViewTab item = new RoomViewTab();
+                item.ConvertDataRow(row);
+                Tabs.Add(item);
+            }
+        }
+
+        /// <summary>
+        /// レイアウトデータ
+        /// </summary>
+        /// <param name="table"></param>
+        private void SetLayoutData(DataTable table)
+        {
+            List<RoomViewLayout> rowData = new List<RoomViewLayout>();
+            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<RoomViewLayout>();
+                    Data.Add(rowData);
+                }
+
+                //行毎の各列
+                rowData.Add(item);
+            }
+        }
+
+        /// <summary>
+        /// 部屋状態・属性
+        /// </summary>
+        /// <param name="table"></param>
+        private void SetRoomData(DataTable table)
+        {
+            foreach (DataRow row in table.Rows)
+            {
+                RoomViewAtt room = new RoomViewAtt();
+                room.Read(row);
+                RoomData.Add(room.RoomID, room);
+            }
+        }
+
+        /// <summary>
+        /// 部屋の利用データ
+        /// </summary>
+        /// <param name="table"></param>
+        private void SetUseData(DataTable table)
+        {
+            foreach (DataRow row in table.Rows)
+            {
+                RoomViewUse use = new RoomViewUse();
+                use.Read(row);
+
+                SortedDictionary<string, RoomViewUse> dict;
+                if (!UseData.TryGetValue(use.RoomID, out dict))
+                {
+                    dict = new SortedDictionary<string, RoomViewUse>();
+                    UseData.Add(use.RoomID, dict);
+                }
+
+                dict.Add(use.SortKey, use);
+            }
+        }
+
+        /// <summary>
+        /// セルのアイテム毎の表示文言
+        /// </summary>
+        /// <param name="roomCell"></param>
+        /// <param name="roomID"></param>
+        /// <returns></returns>
+        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}";
+            }
+        }
+
+        /// <summary>
+        /// セル色
+        /// </summary>
+        /// <param name="item"></param>
+        /// <returns></returns>
+        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();
+        }
+
+        /// <summary>
+        /// セルのアイテム毎のスタイル
+        /// </summary>
+        /// <param name="roomCell"></param>
+        /// <returns></returns>
+        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();
+        }
+
+        /// <summary>
+        /// セルの文字寄せ
+        /// </summary>
+        /// <param name="roomCell"></param>
+        /// <returns></returns>
+        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;
+            }
+        }
+    }
+}

--
Gitblit v1.10.0