[Webapi]修正緊急壓扣少樓層問題,歷史資料加上千分位

This commit is contained in:
張家睿 2024-10-15 14:14:09 +08:00
parent 9f2a1b4825
commit 4895975a46
4 changed files with 47 additions and 28 deletions

View File

@ -359,12 +359,22 @@ namespace FrontendWebApi.ApiControllers
var sub_system = await backendRepository.GetOneAsync<BuildMenuSql>(@$"select v.system_key subfull_name,me.* from building_menu me
left join variable v on v.system_value = me.sub_system_tag and v.system_type = 'device_system_category_layer3' and v.deleted = 0
where me.building_tag = '{get.building_tag}' and me.main_system_tag = '{get.main_system_tag}' and me.sub_system_tag = '{get.sub_system_tag}' order by me.priority");
List<Floor> Floors = new List<Floor>();
get.sub_system_tag = get.sub_system_tag == "P" ? $"'{get.sub_system_tag}','B'" : $"'{get.sub_system_tag}'"; // 巨蛋緊急壓扣(P)跟閃光喇吧被視為同一類
List <Floor> Floors = new List<Floor>();
var floorsql = await backendRepository.GetAllAsync<Floorsql>($@"
select * from (select * from sub_system_floor ssf where ssf.deleted = 0 and ssf.status = 0 and ssf.building_tag = '{get.building_tag}' and ssf.main_system_tag = '{get.main_system_tag}' and ssf.sub_system_tag = '{get.sub_system_tag}' and ssf.is_link = 1) a
select * from (select *,
CASE
WHEN ssf.sub_system_tag IN ({get.sub_system_tag}) THEN 'P_B' -- 'P' 'B'
ELSE ssf.sub_system_tag --
END AS merged_sub_system_tag
from sub_system_floor ssf where ssf.deleted = 0 and ssf.status = 0
and ssf.building_tag = '{get.building_tag}'
and ssf.main_system_tag = '{get.main_system_tag}'
and ssf.sub_system_tag in ({get.sub_system_tag})
and ssf.is_link = 1) a
left join floor on floor.full_name = a.floor_tag and a.building_tag = floor.building_tag
where floor.deleted = 0
GROUP BY a.floor_tag, a.building_tag, a.merged_sub_system_tag
order by floor.priority");
Sub_system sub_System = new Sub_system()
{
@ -402,6 +412,7 @@ namespace FrontendWebApi.ApiControllers
catch (Exception exception)
{
apiResult.Code = "9999";
apiResult.Msg = "9999";
Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message);
return Ok(apiResult);
}

View File

@ -319,6 +319,7 @@ namespace FrontendWebApi.ApiControllers
try
{
input.EnableLimit = false; // CSV關閉5W筆限制
var apiData = await GetHistoryRealTime(input);
if (apiData.Value == null)
{
@ -1394,6 +1395,7 @@ namespace FrontendWebApi.ApiControllers
ApiResult<List<HistoryRawData>> apiResult = new ApiResult<List<HistoryRawData>>(jwt_str);
apiResult.Data = new List<HistoryRawData>();
List<string> noDataDevice = new List<string>();
if (!jwtlife)
{
apiResult.Code = "5000";
@ -1439,41 +1441,40 @@ namespace FrontendWebApi.ApiControllers
int totalRecordCount = 0;
// 先計算總記錄數
foreach (var hi in input.HistoryItems)
if (input.EnableLimit)
{
var device_number = hi.Device_number_point.Split(":")[0];
var point = hi.Device_number_point.Split(":")[1];
var stationName = await backendRepository.GetOneAsync<string>($"select distinct parent_path from import_niagara_item_history where device_building_tag = '{device_number.Split('_')[0]}' limit 1");
var tableName = await backgroundServiceMsSqlRepository.GetOneAsync<string>($"select table_name from INFORMATION_SCHEMA.TABLES where table_name like '%{stationName}_{device_number}_{point}%'");
if (!string.IsNullOrEmpty(tableName))
foreach (var hi in input.HistoryItems)
{
var sqlCount = $@"select count(*) from {tableName}
var device_number = hi.Device_number_point.Split(":")[0];
var point = hi.Device_number_point.Split(":")[1];
var stationName = await backendRepository.GetOneAsync<string>($"select distinct parent_path from import_niagara_item_history where device_building_tag = '{device_number.Split('_')[0]}' limit 1");
var tableName = await backgroundServiceMsSqlRepository.GetOneAsync<string>($"select table_name from INFORMATION_SCHEMA.TABLES where table_name like '%{stationName}_{device_number}_{point}%'");
if (!string.IsNullOrEmpty(tableName))
{
var sqlCount = $@"select count(*) from {tableName}
where replace(convert(varchar, [timestamp], 111), '/', '-') >= @startTime
and replace(convert(varchar, [timestamp], 111), '/', '-') <= @endTime";
var recordCount = await backgroundServiceMsSqlRepository.GetOneAsync<int>(sqlCount, new { startTime = input.Start_timestamp, endTime = input.End_timestamp });
totalRecordCount += recordCount;
var recordCount = await backgroundServiceMsSqlRepository.GetOneAsync<int>(sqlCount, new { startTime = input.Start_timestamp, endTime = input.End_timestamp });
totalRecordCount += recordCount;
if (totalRecordCount > 50000)
{
// 如果總記錄數超過5萬筆返回提示信息
apiResult.Code = "5000";
apiResult.Msg = "資料量超過5萬筆請減少選擇區間或設備";
return apiResult;
if (totalRecordCount > 50000)
{
// 如果總記錄數超過5萬筆返回提示信息
apiResult.Code = "5000";
apiResult.Msg = "資料量超過5萬筆請減少選擇區間或設備";
return apiResult;
}
}
}
else
{
noDataDevice.Add(hi.Device_number_point);
}
}
// 正式撈取資料
foreach (var hi in input.HistoryItems)
{
var device_number = hi.Device_number_point.Split(":")[0];
var point = hi.Device_number_point.Split(":")[1];
var stationName = await backendRepository.GetOneAsync<string>($"select distinct parent_path from import_niagara_item_history where device_building_tag = '{device_number.Split('_')[0]}' limit 1");
var stationName = await backendRepository.GetOneAsync<string>($"select distinct parent_path from import_niagara_item_history where device_number = '{device_number}' limit 1");
var tableName = await backgroundServiceMsSqlRepository.GetOneAsync<string>($"select table_name from INFORMATION_SCHEMA.TABLES where table_name like '%{stationName}_{device_number}_{point}%'");
if (!string.IsNullOrEmpty(tableName))
{
@ -1486,6 +1487,8 @@ namespace FrontendWebApi.ApiControllers
// 檢查 valueFacets 是否包含 "range=E"
string valueDisplaySql = string.Empty;
// 直接給千分位數值會讓前台套件顯示有問題故頁面千分位顯示由前端處理CSV千分位後端處理
string DisplaySql = input.EnableLimit ? "ROUND(value, 2) AS Value" : " FORMAT(ROUND(value, 2), 'N2') AS Value";
if (valueFacets != null)
{
@ -1531,6 +1534,8 @@ namespace FrontendWebApi.ApiControllers
caseWhenStatements.Add($"when value = {correspondingValue} then '{chineseCharacters}'");
}
}
valueDisplaySql = $"Case {string.Join(" ", caseWhenStatements)} else 'Unknow' End as Value";
}
// 處理 trueText 和 falseText 的部分
else if (valueFacets.Contains("trueText=s:") && valueFacets.Contains("falseText=s:"))
@ -1556,16 +1561,17 @@ namespace FrontendWebApi.ApiControllers
// 添加 Case When 語句
caseWhenStatements.Add($"when value = 1 then '{trueTextPart}'");
caseWhenStatements.Add($"when value = 0 then '{falseTextPart}'");
valueDisplaySql = $"Case {string.Join(" ", caseWhenStatements)} else 'Unknow' End as Value";
}
else
{
// 使用原始的顯示方式
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";
: DisplaySql;
}
// 最後的 SQL 語句
valueDisplaySql = $"Case {string.Join(" ", caseWhenStatements)} else 'Unknow' End as Value";
}
@ -1591,7 +1597,7 @@ namespace FrontendWebApi.ApiControllers
apiResult.Code = "0000";
apiResult.Msg = @$"DB無資料的設備{string.Join(".", noDataDevice)}";
apiResult.Data = apiResult.Data.OrderBy(x => x.Device_number).ThenByDescending(x => x.Timestamp).ToList();
apiResult.Data = apiResult.Data.OrderBy(x => x.Device_number).ThenBy(x => x.Points).ThenByDescending(x => x.Timestamp).ToList();
}
catch (Exception exception)
{

View File

@ -197,6 +197,7 @@ namespace FrontendWebApi.Models
public string point_name { get; set; }
public string points { get; set; }
public byte points_is_bool { get; set; }
public int is_RTSP { get; set; } // 巨蛋監視器控制項
public List<DeviceNode> Device_nodes { get; set; }
public List<DeviceItem> deviceItems { get; set; }
}

View File

@ -259,6 +259,7 @@ namespace FrontendWebApi.Models
{
public string Start_timestamp { get; set; }
public string End_timestamp { get; set; }
public bool EnableLimit { get; set; } = true; // 控制是否需要限制查詢筆數
public List<HistoryItem> HistoryItems { get; set; }
}