[WebApi]歷史資料新增CSV功能
This commit is contained in:
parent
812ee2ffc0
commit
85b5c468db
@ -311,6 +311,68 @@ namespace FrontendWebApi.ApiControllers
|
|||||||
return File(ms, "application/vnd.ms-excel", fileName);
|
return File(ms, "application/vnd.ms-excel", fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[HttpPost]
|
||||||
|
[Route("api/ExportCSV")]
|
||||||
|
public async Task<IActionResult> ExportCSV(PostHistoryRawDataFilter input)
|
||||||
|
{
|
||||||
|
ApiResult<string> apiResult = new ApiResult<string>();
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var apiData = await GetHistoryRealTime(input);
|
||||||
|
if (apiData.Value == null)
|
||||||
|
{
|
||||||
|
var msg = new { Code = "0003", Msg = "無資料可匯出。" };
|
||||||
|
return StatusCode(400, msg);
|
||||||
|
}
|
||||||
|
var rawData = apiData.Value.Data;
|
||||||
|
var FileName = $"歷史資料_{DateTime.Now}.csv";
|
||||||
|
// 生成CSV文件
|
||||||
|
string Csv = null;
|
||||||
|
|
||||||
|
if (rawData.Count > 0)
|
||||||
|
{
|
||||||
|
StringBuilder csv = new StringBuilder();
|
||||||
|
|
||||||
|
// 添加CSV標題行
|
||||||
|
csv.AppendLine("區域,系統大類,系統小類,設備編號,設備名稱,設備項目,數值,紀錄時間");
|
||||||
|
|
||||||
|
// 添加數據行
|
||||||
|
foreach (var item in rawData)
|
||||||
|
{
|
||||||
|
csv.AppendLine($"{item.Building_name},{item.Main_system_name},{item.Sub_system_name},{item.Device_number},{item.Item_name},{item.Points},{item.Value},{item.Timestamp}");
|
||||||
|
}
|
||||||
|
Csv = csv.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 返回CSV文件
|
||||||
|
if (Csv != null)
|
||||||
|
{
|
||||||
|
using (var electricMemoryStream = new MemoryStream())
|
||||||
|
{
|
||||||
|
using (var streamWriter = new StreamWriter(electricMemoryStream, Encoding.UTF8))
|
||||||
|
{
|
||||||
|
streamWriter.Write(Csv);
|
||||||
|
}
|
||||||
|
return File(electricMemoryStream.ToArray(), "text/csv", FileName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var msg = new { Code = "0003", Msg = "無資料可匯出。" };
|
||||||
|
return StatusCode(400, msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception exception)
|
||||||
|
{
|
||||||
|
apiResult.Code = "9999";
|
||||||
|
apiResult.Msg = "系統內部錯誤,請聯絡管理者。 Msg: " + exception.Message;
|
||||||
|
Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message);
|
||||||
|
return Json(apiResult);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 即時趨勢條件過濾條件面板
|
/// 即時趨勢條件過濾條件面板
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -395,7 +457,7 @@ namespace FrontendWebApi.ApiControllers
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var devices = dbsub.Where(x => x.main_system_tag == main.Select(m => m.main_system_tag).FirstOrDefault() && x.sub_system_tag == sub.Select(x => x.sub_system_tag).FirstOrDefault() && x.device_number != null).OrderBy(x=>x.device_full_name.Length).ThenBy(x=>x.device_full_name).ToList();
|
var devices = dbsub.Where(x => x.main_system_tag == main.Select(m => m.main_system_tag).FirstOrDefault() && x.sub_system_tag == sub.Select(x => x.sub_system_tag).FirstOrDefault() && x.device_number != null).OrderBy(x => x.device_full_name.Length).ThenBy(x => x.device_full_name).ToList();
|
||||||
history_Sub_System.device = devices.Count > 0 ? new List<Device>() : null;
|
history_Sub_System.device = devices.Count > 0 ? new List<Device>() : null;
|
||||||
foreach (var d in devices)
|
foreach (var d in devices)
|
||||||
{
|
{
|
||||||
@ -406,13 +468,13 @@ namespace FrontendWebApi.ApiControllers
|
|||||||
history_Sub_System.device.Add(device);
|
history_Sub_System.device.Add(device);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (history_Sub_System.is_show_history==1)
|
if (history_Sub_System.is_show_history == 1)
|
||||||
{
|
{
|
||||||
history_Main_System.History_Sub_systems.Add(history_Sub_System);
|
history_Main_System.History_Sub_systems.Add(history_Sub_System);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
apiResult.Data.history_Main_Systems.Add(history_Main_System);
|
apiResult.Data.history_Main_Systems.Add(history_Main_System);
|
||||||
}
|
}
|
||||||
apiResult.Data.history_Builds = dbbuilding;
|
apiResult.Data.history_Builds = dbbuilding;
|
||||||
apiResult.Code = "0000";
|
apiResult.Code = "0000";
|
||||||
@ -1091,7 +1153,7 @@ namespace FrontendWebApi.ApiControllers
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 取得歷史資料
|
/// 取得歷史資料(從Niagara拿資料)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="post"></param>
|
/// <param name="post"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
@ -1319,26 +1381,27 @@ namespace FrontendWebApi.ApiControllers
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 即使歷史資料(前7天)
|
/// 即時歷史資料(從MSSQL拿資料)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="input"></param>
|
/// <param name="input"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
[Route("api/HistoryRealTime")]
|
[Route("api/HistoryRealTime")]
|
||||||
public async Task<ActionResult<ApiResult<List<HistoryRawData>>>> GetHistoryRealTime (PostHistoryRawDataFilter input)
|
public async Task<ActionResult<ApiResult<List<HistoryRawData>>>> GetHistoryRealTime(PostHistoryRawDataFilter input)
|
||||||
{
|
{
|
||||||
ApiResult<List<HistoryRawData>> apiResult = new ApiResult<List<HistoryRawData>>(jwt_str);
|
ApiResult<List<HistoryRawData>> apiResult = new ApiResult<List<HistoryRawData>>(jwt_str);
|
||||||
apiResult.Data = new List<HistoryRawData>();
|
apiResult.Data = new List<HistoryRawData>();
|
||||||
|
List<string> noDataDevice = new List<string>();
|
||||||
if (!jwtlife)
|
if (!jwtlife)
|
||||||
{
|
{
|
||||||
apiResult.Code = "5000";
|
apiResult.Code = "5000";
|
||||||
return BadRequest(apiResult);
|
return apiResult;
|
||||||
}
|
}
|
||||||
if (input.HistoryItems.Count == 0)
|
if (input.HistoryItems == null)
|
||||||
{
|
{
|
||||||
apiResult.Code = "9998";
|
apiResult.Code = "9998";
|
||||||
apiResult.Msg = "沒有設備被選擇";
|
apiResult.Msg = "沒有設備被選擇";
|
||||||
return BadRequest(apiResult);
|
return apiResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
try
|
try
|
||||||
@ -1387,7 +1450,7 @@ namespace FrontendWebApi.ApiControllers
|
|||||||
var sql = $@"select '{device_item_info.Building_name}' as Building_name, '{device_item_info.Main_system_name}' as Main_system_name,
|
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.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.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, timestamp as Timestamp,
|
'{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
|
{(valueType.Equals("bit") ? "Case when value = 1 then 'true' when value = 0 then 'false' else 'Unknow' End" : "round(value, 2)")} as Value
|
||||||
from {tableName}
|
from {tableName}
|
||||||
where replace(convert(varchar, [timestamp], 111), '/', '-') >= @startTime
|
where replace(convert(varchar, [timestamp], 111), '/', '-') >= @startTime
|
||||||
@ -1396,21 +1459,23 @@ namespace FrontendWebApi.ApiControllers
|
|||||||
await backgroundServiceMsSqlRepository.GetAllAsync<HistoryRawData>(sql, new { startTime = input.Start_timestamp, endTime = input.End_timestamp })
|
await backgroundServiceMsSqlRepository.GetAllAsync<HistoryRawData>(sql, new { startTime = input.Start_timestamp, endTime = input.End_timestamp })
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
//foreach (var tn in tableName)
|
else
|
||||||
//{
|
{
|
||||||
//}
|
noDataDevice.Add(hi.Device_number_point);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
apiResult.Code = "0000";
|
apiResult.Code = "0000";
|
||||||
apiResult.Data = apiResult.Data.OrderBy(x => x.Device_number).ThenBy(x => x.Timestamp).ToList();
|
apiResult.Msg = @$"DB無資料的設備:{string.Join(".", noDataDevice)}";
|
||||||
|
apiResult.Data = apiResult.Data.OrderBy(x => x.Device_number).ThenByDescending(x => x.Timestamp).ToList();
|
||||||
}
|
}
|
||||||
catch (Exception exception)
|
catch (Exception exception)
|
||||||
{
|
{
|
||||||
apiResult.Code = "9999";
|
apiResult.Code = "9999";
|
||||||
apiResult.Msg = "系統內部錯誤,請聯絡管理者。";
|
apiResult.Msg = "系統內部錯誤,請聯絡管理者。";
|
||||||
Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message);
|
Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message + exception.StackTrace);
|
||||||
return Ok(apiResult);
|
return apiResult;
|
||||||
}
|
}
|
||||||
return Ok(apiResult);
|
return apiResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<Dictionary<string, object>> ArrangeRawData(DeviceNumberPoint deviceNumberPoint, JObject jsonResult)
|
private List<Dictionary<string, object>> ArrangeRawData(DeviceNumberPoint deviceNumberPoint, JObject jsonResult)
|
||||||
|
Loading…
Reference in New Issue
Block a user