diff --git a/FrontendWebApi/ApiControllers/HistoryController.cs b/FrontendWebApi/ApiControllers/HistoryController.cs index b0ceef2..812e82d 100644 --- a/FrontendWebApi/ApiControllers/HistoryController.cs +++ b/FrontendWebApi/ApiControllers/HistoryController.cs @@ -1463,8 +1463,12 @@ namespace FrontendWebApi.ApiControllers return apiResult; } } + else + { + noDataDevice.Add(hi.Device_number_point); + } } - + // 正式撈取資料 foreach (var hi in input.HistoryItems) { var device_number = hi.Device_number_point.Split(":")[0]; @@ -1474,18 +1478,75 @@ namespace FrontendWebApi.ApiControllers if (!string.IsNullOrEmpty(tableName)) { var device_item_infos = await frontendRepository.GetAllAsync(sqlDeviceItemInfo, new { Device_number = device_number }); - var device_item_info = device_item_infos.Where(x => x.Device_number == device_number && x.Points == point).FirstOrDefault(); + var valueType = await backgroundServiceMsSqlRepository.GetOneAsync($"select Data_Type from INFORMATION_SCHEMA.COLUMNS where table_name = '{tableName}' and column_name = 'Value'"); + var valueFacets = await backgroundServiceMsSqlRepository.GetOneAsync($"select VALUEFACETS from HISTORY_CONFIG WHERE TABLE_NAME = '{tableName}'"); + //valueFacets = "range=E:{$u5176$u4ed6$u72c0$u614b=1,$u6b63$u5e38=2,$u4f4e$u96fb$u4f4d=3,$u8017$u76e1=4,$u672a$u9023$u63a5=5,$u7570$u5e38=6}"; + + // 檢查 valueFacets 是否包含 "range=E" + string valueDisplaySql; + if (valueFacets != null && valueFacets.Contains("range=E")) + { + // 提取 "range=E:" 之後的部分 + string rangePart = valueFacets.Substring(valueFacets.IndexOf("range=E:") + "range=E:".Length); + + // 去除開頭和結尾的大括號 + rangePart = rangePart.Trim('{', '}'); + + // 分割各個條目 + var entries = rangePart.Split(','); + + // 存儲匹配條目的列表 + var caseWhenStatements = new List(); + + foreach (var entry in entries) + { + // 分割 Unicode 序列和數字 + var parts = entry.Split('='); + if (parts.Length == 2) + { + string unicodeSequence = parts[0]; + int correspondingValue = int.Parse(parts[1]); + + // 轉換 Unicode 序列為中文字符 + var chineseCharacters = new StringBuilder(); + var unicodeParts = unicodeSequence.Split("$u"); + foreach (var unicodePart in unicodeParts) + { + if (unicodePart.Length == 4) + { + var unicodeValue = Convert.ToInt32(unicodePart, 16); + chineseCharacters.Append(char.ConvertFromUtf32(unicodeValue)); + } + } + + // 添加 Case When 語句 + caseWhenStatements.Add($"when value = {correspondingValue} then '{chineseCharacters}'"); + } + } + + // 最後的 SQL 語句 + valueDisplaySql = $"Case {string.Join(" ", caseWhenStatements)} else 'Unknow' End as Value"; + } + else + { + // 如果不包含 range=E,使用原始的顯示方式 + valueDisplaySql = valueType.Equals("bit") + ? "Case when value = 1 then 'true' when value = 0 then 'false' else 'Unknow' End as Value" + : "round(value, 2) as Value"; + } + var sql = $@"select '{device_item_info.Building_name}' as Building_name, '{device_item_info.Main_system_name}' as Main_system_name, - '{device_item_info.Sub_system_name}' as Sub_system_name, '{device_item_info.Device_number}' as Device_number, - '{device_item_info.Device_name}' as Device_name, '{device_item_info.Item_name}' as Item_name, '{device_item_info.Points}' as Points, - '{device_item_info.Unit}' as Unit, FORMAT(timestamp, 'yyyy-MM-dd HH:mm:ss') as Timestamp, - {(valueType.Equals("bit") ? "Case when value = 1 then 'true' when value = 0 then 'false' else 'Unknow' End" : "round(value, 2)")} as Value - from {tableName} - where replace(convert(varchar, [timestamp], 111), '/', '-') >= @startTime - and replace(convert(varchar, [timestamp], 111), '/', '-') <= @endTime order by timestamp"; + '{device_item_info.Sub_system_name}' as Sub_system_name, '{device_item_info.Device_number}' as Device_number, + '{device_item_info.Device_name}' as Device_name, '{device_item_info.Item_name}' as Item_name, '{device_item_info.Points}' as Points, + '{device_item_info.Unit}' as Unit, FORMAT(timestamp, 'yyyy-MM-dd HH:mm:ss') as Timestamp, + {valueDisplaySql} + from {tableName} + where replace(convert(varchar, [timestamp], 111), '/', '-') >= @startTime + and replace(convert(varchar, [timestamp], 111), '/', '-') <= @endTime order by timestamp"; + apiResult.Data.AddRange( await backgroundServiceMsSqlRepository.GetAllAsync(sql, new { startTime = input.Start_timestamp, endTime = input.End_timestamp }) ); @@ -1495,6 +1556,8 @@ namespace FrontendWebApi.ApiControllers noDataDevice.Add(hi.Device_number_point); } } + + apiResult.Code = "0000"; apiResult.Msg = @$"DB無資料的設備:{string.Join(".", noDataDevice)}"; apiResult.Data = apiResult.Data.OrderBy(x => x.Device_number).ThenByDescending(x => x.Timestamp).ToList();