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.GrpcService/Services/GrpcTableService.cs |  310 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 310 insertions(+), 0 deletions(-)

diff --git a/HotelPms.GrpcService/Services/GrpcTableService.cs b/HotelPms.GrpcService/Services/GrpcTableService.cs
new file mode 100644
index 0000000..1da2e50
--- /dev/null
+++ b/HotelPms.GrpcService/Services/GrpcTableService.cs
@@ -0,0 +1,310 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Data;
+using System.Data.Common;
+using System.Data.SqlClient;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Google.Protobuf;
+using Grpc.Core;
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.Logging;
+using HotelPms.Data;
+using HotelPms.GrpcService.Util;
+using HotelPms.Share.Data;
+using HotelPms.Share.IO;
+using HotelPms.Share.Util;
+using HotelPms.Data.Common;
+using Org.BouncyCastle.Asn1.Ocsp;
+
+namespace HotelPms.GrpcService
+{
+    public class GrpcTableService : GrpcTableCore.GrpcTableCoreBase
+    {
+        private readonly ILogger<GrpcTableService> _logger;
+        private IConfiguration m_Configuration;
+
+        public GrpcTableService(ILogger<GrpcTableService> logger, IConfiguration configuration)
+        {
+            _logger = logger;
+            m_Configuration = configuration;
+        }
+
+        private static byte[] GetFieldValue(SqlDataReader reader, int index, Type type, bool isNull)
+        {
+            if (type == typeof(System.Int32)) { return CConvert.GetBytes((int)(isNull ? 0 : reader.GetInt32(index))); }
+            else if (type == typeof(bool)) { return CConvert.GetBytes((bool)(isNull ? false : reader.GetBoolean(index))); }
+            else if (type == typeof(DateTime)) { return CConvert.GetBytes((DateTime)(isNull ? DateTime.MinValue : reader.GetDateTime(index))); }
+            else if (type == typeof(float)) { return CConvert.GetBytes((float)(isNull ? 0F : reader.GetFloat(index))); }
+            else if (type == typeof(double)) { return CConvert.GetBytes((double)(isNull ? 0D : reader.GetDouble(index))); }
+            else if (type == typeof(decimal)) { return CConvert.GetBytes((decimal)(isNull ? 0M : reader.GetDecimal(index))); }
+            else if (type == typeof(System.Byte)) { return CConvert.GetBytes((byte)(isNull ? 0x00 : reader.GetByte(index))); }
+            else if (type == typeof(System.Int16)) { return CConvert.GetBytes((short)(isNull ? 0 : reader.GetInt16(index))); }
+            else
+            {
+                byte[] data = Encoding.UTF8.GetBytes(isNull ? string.Empty : reader.GetString(index));
+                byte[] endFlg = new byte[data.Length + 1];
+                Array.Copy(data, 0, endFlg, 0, data.Length);
+                return endFlg;
+            }
+
+            //object value = reader.GetValue(index);
+            //return GetValue(type, value);
+        }
+
+        private string GetSql(DataRequest request)
+        {
+            string[] fields;
+            StringBuilder sql = new StringBuilder();
+            if (request.ActionType == (int)ETableActionType.CustomSql)
+            {
+                sql.Append(request.Data);
+            }
+            else if (request.ActionType == (int)ETableActionType.RoomTypeMasterGrid)
+            {
+                sql.Append($"SELECT A.*,dbo.FN_GetRoomKind(A.Kind) KindName FROM M_RoomType A WITH(NOLOCK) {(string.IsNullOrEmpty(request.Data) ? string.Empty : $"WHERE {request.Data}")} ORDER BY A.ID");
+            }
+            else if (request.ActionType == (int)ETableActionType.BuildingMasterGrid)
+            {
+                sql.Append($"SELECT A.* FROM M_Building A WITH(NOLOCK) {(string.IsNullOrEmpty(request.Data) ? string.Empty : $"WHERE {request.Data}")} ORDER BY A.ID");
+            }
+            else if (request.ActionType == (int)ETableActionType.RoomStatusMasterGrid)
+            {
+                sql.Append($"SELECT A.* FROM M_RoomStatus A WITH(NOLOCK) {(string.IsNullOrEmpty(request.Data) ? string.Empty : $"WHERE {request.Data}")} ORDER BY A.SortID");
+            }
+            else if (request.ActionType == (int)ETableActionType.HotelMasterGrid)
+            {
+                sql.Append($"SELECT A.* FROM S_Hotel A WITH(NOLOCK) {(string.IsNullOrEmpty(request.Data) ? string.Empty : $"WHERE {request.Data}")} ORDER BY A.ID");
+            }            
+            else if (request.ActionType == (int)ETableActionType.UpdateRoomStatus)
+            {
+                fields = request.Data.Split(new char[] { ',' });
+                sql.Append($"EXECUTE SetRoomStatus '{fields[0]}',{fields[1]},{fields[2]}");
+            }           
+            else if (request.ActionType == (int)ETableActionType.DemoMasterGrid)
+            {
+                sql.Append($"SELECT A.* FROM M_Demo A WITH(NOLOCK) {(string.IsNullOrEmpty(request.Data) ? string.Empty : $"WHERE {request.Data}")} ORDER BY A.ID");
+            }
+            else if (request.ActionType == (int)ETableActionType.RoomViewTabMasterGrid)
+            {
+                sql.Append($"SELECT A.* FROM M_RoomViewTab A WITH(NOLOCK) {(string.IsNullOrEmpty(request.Data) ? string.Empty : $"WHERE {request.Data}")} ORDER BY A.ID");
+            }
+            else if (request.ActionType == (int)ETableActionType.RoomViewLayoutGrid)
+            {
+                sql.Append($"SELECT A.* FROM M_RoomViewLayout A WITH(NOLOCK) {(string.IsNullOrEmpty(request.Data) ? string.Empty : $"WHERE {request.Data}")} ORDER BY A.TabID,A.Row,A.Col");
+            }
+            else if (request.ActionType == (int)ETableActionType.RoomViewState)
+            {
+                fields = request.Data.Split(new char[] { ',' });
+                sql.Append($"EXECUTE GetRoomState '{fields[0]}',{fields[1]}");
+            }
+            else if (request.ActionType == (int)ETableActionType.ReportMaster)
+            {
+                sql.Append($"SELECT Name FROM S_Report WITH(NOLOCK) {(string.IsNullOrEmpty(request.Data) ? string.Empty : $"WHERE {request.Data}")} ORDER BY ID");
+            }
+            else if (request.ActionType == (int)ETableActionType.PostNoSearch)
+            {
+                sql.Append($"SELECT ZipCode,Address FROM M_Address WITH(NOLOCK) {(string.IsNullOrEmpty(request.Data) ? string.Empty : $"WHERE ZipCode LIKE '{request.Data}%'")} ORDER BY ZipCode");
+            }
+            else if (request.ActionType == (int)ETableActionType.AddressSearch)
+            {
+                sql.Append($"SELECT ZipCode,Address FROM M_Address WITH(NOLOCK) {(string.IsNullOrEmpty(request.Data) ? string.Empty : $"WHERE Address LIKE '%{request.Data}%'")} ORDER BY ZipCode");
+            }
+            else if (request.ActionType == (int)ETableActionType.HotelDate)
+            {
+                sql.Append($"SELECT TOP 1 HotelDate FROM S_Hotel WITH(NOLOCK)");
+            }
+            else if (request.ActionType == (int)ETableActionType.Sequence)
+            {
+                sql.Append($"SELECT NEXT VALUE FOR dbo.{GetSequence(CConvert.ToInt(request.Data))}");
+            }
+            else if (request.ActionType == (int)ETableActionType.TaxRate)
+            {
+                fields = request.Data.Split(new char[] { ',' });
+                sql.Append($"SELECT dbo.GetTax('{fields[0]}',{fields[1]})");
+            }
+            else if (request.ActionType == (int)ETableActionType.MasterName)
+            {
+                fields = request.Data.Split(new char[] { ',' });
+                sql.Append($"SELECT Name FROM M_{fields[0]} WITH(NOLOCK) WHERE ID = {fields[1]}");
+            }
+            else if (request.ActionType == (int)ETableActionType.RoomTypeBase)
+            {
+                sql.Append($"SELECT Name,Kind FROM M_RoomType WITH(NOLOCK) WHERE ID = {CConvert.ToInt(request.Data)}");
+            }
+            else if (request.ActionType == (int)ETableActionType.RoomTypeList)
+            {
+                sql.Append($"SELECT ID コード,Name 名称,ShortName 略称 FROM M_RoomType WITH(NOLOCK)");
+            }
+            else if (request.ActionType == (int)ETableActionType.SalesLoginList)
+            {
+                sql.Append($"SELECT ID コード,Name 名称 FROM M_Login WITH(NOLOCK) WHERE DataType = 1");
+            }
+            else if (request.ActionType == (int)ETableActionType.SalesLoginName)
+            {
+                sql.Append($"SELECT Name FROM M_Login WITH(NOLOCK) WHERE ID = {request.Data} AND DataType = 1");
+            }
+            return sql.ToString();
+        }
+
+        private string GetSequence(int type)
+        {
+            return $"Seq{((ESeqType)type).ToString()}";
+        }
+
+        private string GetDB(DataRequest request)
+{
+            if (request.ActionType == (int)ETableActionType.PostNoSearch
+                || request.ActionType == (int)ETableActionType.AddressSearch)
+            {
+                return Setting.SystemCenterDB;
+            }
+            else if (request.ActionType == (int)ETableActionType.ReportMaster)
+            {
+                return Setting.HotelCommonDB;
+            }
+            else
+            {
+                return Setting.HotelPmsDB;
+            }
+        }
+
+        public static void SetTable(GrpcTable table, SqlDataReader reader)
+        {
+            OperationLog.Instance.WriteLog($"SetTable Begin:{DateTime.Now.ToString("HH:mm:ss fff")}");
+            List<Type> fieldTypes = new List<Type>();
+            //List<string> sqlTypes = new List<string>();
+
+            #region Col
+
+            OperationLog.Instance.WriteLog("Col Begin");
+            for (int colIdx = 0; colIdx < reader.FieldCount; colIdx++)
+            {
+                //sqlTypes.Add(reader.GetDataTypeName(colIdx));
+                fieldTypes.Add(reader.GetFieldType(colIdx));
+                int fieldTypeInt = CConvert.ToTypeInt(fieldTypes[colIdx]);
+                string name = reader.GetName(colIdx);
+                //_logger.LogInformation($"{name}:{fieldTypes[colIdx].Name} = {fieldTypeInt}");
+                table.Cols.Add(new GrpcCol() { Name = name, FieldType = fieldTypeInt, PrimaryKey = false });
+            }
+
+            #endregion
+
+            #region Row
+
+            OperationLog.Instance.WriteLog("Row Begin");
+            while (reader.Read())
+            {
+                int fieldCount = reader.FieldCount;
+                bool[] isNullCache = new bool[fieldCount];
+                for (int i = 0; i < fieldCount; i++)
+                {
+                    isNullCache[i] = reader.IsDBNull(i);
+                }
+
+                using (MemoryStream stream = new MemoryStream())
+                {
+                    for (int i = 0; i < fieldCount; i++)
+                    {
+                        stream.Write(GetFieldValue(reader, i, fieldTypes[i], isNullCache[i]));
+                    }
+
+                    stream.Seek(0, SeekOrigin.Begin);
+                    table.Rows.Add(new GrpcRow() { Data = ByteString.FromStream(stream) });
+                }
+            }
+            OperationLog.Instance.WriteLog($"Row End⇒{table.Rows.Count}件");
+
+            #endregion
+
+            OperationLog.Instance.WriteLog($"SetTable End:{DateTime.Now.ToString("HH:mm:ss fff")}");
+        }
+
+
+        private GrpcTable Get(DataRequest request)
+        {
+            GrpcTable table = new GrpcTable() { ErrNo = 0, ErrData = string.Empty };
+            OperationLog.Instance.WriteLog(request.ToString());
+
+            using (MsSqlNet msSqlNet = new MsSqlNet(GetDB(request)))
+            {
+                using (SqlConnection dbConnect = msSqlNet.Open())
+                {
+                    string sql = GetSql(request);
+                    using (SqlCommand command = new SqlCommand(sql, dbConnect))
+                    {
+                        OperationLog.Instance.WriteLog(sql);
+                        command.CommandTimeout = 60000 * 100;
+                        using (SqlDataReader reader = command.ExecuteReader(CommandBehavior.Default))
+                        {
+                            //エラーまだ対応していない                                    
+                            if (reader == null)
+                            {
+                                OperationLog.Instance.WriteLog("null");
+                                table.ErrNo = msSqlNet.ErrNo;
+                                table.ErrData = msSqlNet.ErrInfo;
+                            }
+                            else
+                            {
+                                while (true)
+                                {
+                                    SetTable(table, reader);
+                                    if (!reader.NextResult()) { break; }
+                                }
+                            }
+                            reader.Close();
+                        }
+                    }
+                }
+            }
+
+            if(table.ErrNo == 0)
+            {
+                table.ErrData = "";   //総行数を返す
+            }
+            return table;
+        }
+
+        public override Task<GrpcTable> GetData(DataRequest request, ServerCallContext context)
+        {
+            OperationLog.Instance.WriteLog("GetData Start");
+            return Task.FromResult(Get(request));
+        }
+
+        /// <summary>
+        /// データ取得
+        /// </summary>
+        /// <param name="requestStream"></param>
+        /// <param name="responseStream"></param>
+        /// <param name="context"></param>
+        /// <returns></returns>
+        public async override Task GetDataStream(IAsyncStreamReader<DataRequest> requestStream, IServerStreamWriter<GrpcTable> responseStream, ServerCallContext context)
+        {
+            DataRequest request = null;
+            await foreach (var message in requestStream.ReadAllAsync())
+            {
+                request = message;
+                break;
+            }
+
+            //データ送信
+            GrpcTable table = Get(request);
+            await responseStream.WriteAsync(table);
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="requestStream"></param>
+        /// <param name="responseStream"></param>
+        /// <param name="context"></param>
+        /// <returns></returns>
+        public override Task SetData(IAsyncStreamReader<GrpcTable> requestStream, IServerStreamWriter<DataResult> responseStream, ServerCallContext context)
+        {
+            return base.SetData(requestStream, responseStream, context);
+        }
+    }
+}

--
Gitblit v1.10.0