diff --git a/FrontendWebApi/ApiControllers/HistoryController.cs b/FrontendWebApi/ApiControllers/HistoryController.cs index e65d2cf..9ebc514 100644 --- a/FrontendWebApi/ApiControllers/HistoryController.cs +++ b/FrontendWebApi/ApiControllers/HistoryController.cs @@ -76,6 +76,21 @@ namespace FrontendWebApi.ApiControllers var device = backendRepository.GetAllAsync($"select * from device where deleted = 0 and is_link = 1 and device_number = '{lhe.device_number}'").Result; var devicePoint = backendRepository.GetAllAsync($"select * from device_item where deleted = 0 and is_link = 1 and is_show_history = 1 and device_building_tag = '{lhe.building_tag}'").Result; #endregion + + #region combine device and point + List listDevicePoint = new List(); + var dp = devicePoint.Where(x => x.device_building_tag == lhe.device_number.Split("_")[1]).ToList(); + foreach (var point in dp) + { + DeviceNumberPoint deviceNumberPoint = new DeviceNumberPoint(); + deviceNumberPoint.DeviceNumber = lhe.device_number; + deviceNumberPoint.Point = point.points; + deviceNumberPoint.FullDeviceNumberPoint = string.Format("{0}_{1}", lhe.device_number, point.points); + + listDevicePoint.Add(deviceNumberPoint); + } + #endregion + #region get data from niagara var startTimestamp = string.Format("{0}T00:00:00.000+08:00", lhe.starttime.ToString("yyyy-MM-dd")); var endTimestamp = string.Format("{0}T23:59:59.000+08:00", lhe.endtime?.ToString("yyyy-MM-dd")); @@ -86,47 +101,67 @@ namespace FrontendWebApi.ApiControllers "; List he = new List(); - - var archiveRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{lhe.deviceComName}/{lhe.device_number.Replace("$3", "")}_{lhe.device_item}/~historyRollup/"); - archiveRequest.Method = "POST"; - archiveRequest.Headers.Add("Authorization", "Basic " + encoded); - archiveRequest.PreAuthenticate = true; + List jd = new List(); - byte[] byteArray = Encoding.UTF8.GetBytes(historyQueryFilter); - using (Stream reqStream = archiveRequest.GetRequestStream()) + if (listDevicePoint.Count > 0) { - reqStream.Write(byteArray, 0, byteArray.Length); + foreach (var d in listDevicePoint) + { + var archiveRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{lhe.deviceComName}/{d.FullDeviceNumberPoint.Replace("$3", "")}/~historyRollup/"); + archiveRequest.Method = "POST"; + archiveRequest.Headers.Add("Authorization", "Basic " + encoded); + archiveRequest.PreAuthenticate = true; + + byte[] byteArray = Encoding.UTF8.GetBytes(historyQueryFilter); + using (Stream reqStream = archiveRequest.GetRequestStream()) + { + reqStream.Write(byteArray, 0, byteArray.Length); + } + + var archiveResponse = (HttpWebResponse)archiveRequest.GetResponse(); + var archiveResponseContent = new StreamReader(archiveResponse.GetResponseStream()).ReadToEnd(); + archiveResponse.Dispose(); + archiveResponse.Close(); + + XmlDocument xmlDocument = new XmlDocument(); + xmlDocument.LoadXml(archiveResponseContent); + var archiveJson = JsonConvert.SerializeXmlNode(xmlDocument); + var archiveJsonResult = (JObject)JsonConvert.DeserializeObject(archiveJson); + + if (!archiveJsonResult.ContainsKey("err")) + { + var jsonDevice = new JsonDevice(); + jsonDevice.deviceNumberPoint = d; + jsonDevice.json = archiveJsonResult; + jsonDevice.building_tag = lhe.building_tag; + jd.Add(jsonDevice); + } + } } - var archiveResponse = (HttpWebResponse)archiveRequest.GetResponse(); - var archiveResponseContent = new StreamReader(archiveResponse.GetResponseStream()).ReadToEnd(); - archiveResponse.Dispose(); - archiveResponse.Close(); - - XmlDocument xmlDocument = new XmlDocument(); - xmlDocument.LoadXml(archiveResponseContent); - var archiveJson = JsonConvert.SerializeXmlNode(xmlDocument); - var archiveJsonResult = (JObject)JsonConvert.DeserializeObject(archiveJson); - - if (!archiveJsonResult.ContainsKey("err")) + if (jd != null && jd.Count > 0) { - var ArrangeRawDatas = ArrangeRawData(new DeviceNumberPoint() { DeviceNumber = lhe.device_number, Point = lhe.device_item, FullDeviceNumberPoint = lhe.device_number + "_" + lhe.device_item}, archiveJsonResult); - if (ArrangeRawDatas != null && ArrangeRawDatas.Count > 0) + foreach (var d in jd) { - foreach (var ard in ArrangeRawDatas) + var ArrangeRawDatas = ArrangeRawData(d.deviceNumberPoint, d.json); + if (ArrangeRawDatas != null && ArrangeRawDatas.Count > 0) { - HistoryExport hed = new HistoryExport(); - hed.type = devicePoint.Where(x => x.device_building_tag == lhe.building_tag && x.points == ard["@point"].ToString()).Select(x => x.full_name).FirstOrDefault(); - hed.deviceName = device.Where(x => x.device_number == ard["@device_number"].ToString()).Select(x => x.full_name).FirstOrDefault(); - hed.value = ard["@avg_rawdata"].ToString() == "-1" ? "NaN" : Math.Round(Decimal.Parse(ard["@avg_rawdata"].ToString(), System.Globalization.NumberStyles.Float), 2).ToString(); - hed.timestamp = Convert.ToDateTime(ard["@start_timestamp"].ToString()); - hed.building_tag = lhe.building_tag; - he.Add(hed); + foreach (var ard in ArrangeRawDatas) + { + HistoryExport hed = new HistoryExport(); + hed.type = devicePoint.Where(x => x.device_building_tag == d.building_tag && x.points == ard["@point"].ToString()).Select(x => x.full_name).FirstOrDefault(); + hed.deviceName = device.Where(x => x.device_number == ard["@device_number"].ToString()).Select(x => x.full_name).FirstOrDefault(); + hed.value = ard["@avg_rawdata"].ToString() == "-1" ? "NaN" : Math.Round((decimal.Parse(ard["@avg_rawdata"].ToString(), System.Globalization.NumberStyles.Float)), 2).ToString(); + hed.timestamp = Convert.ToDateTime(ard["@start_timestamp"].ToString()); + hed.building_tag = d.building_tag; + he.Add(hed); + } } } } #endregion + #region export file progress #region excel設定 IFont font12 = workbook.CreateFont(); font12.FontName = "新細明體"; @@ -168,55 +203,94 @@ namespace FrontendWebApi.ApiControllers stylein12.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin; stylein12.WrapText = true; #endregion - - ISheet sheet = workbook.CreateSheet("歷史資料"); - int RowPosition = 0; - #region set cell - IRow row = sheet.CreateRow(RowPosition); - sheet.SetColumnWidth(0, 4 * 160 * 12); - sheet.SetColumnWidth(1, 4 * 160 * 12); - sheet.SetColumnWidth(2, 4 * 160 * 12); - sheet.SetColumnWidth(3, 4 * 160 * 12); - ICell cell = row.CreateCell(0); - cell.SetCellValue("類型"); - cell.CellStyle = styleLine12; - cell = row.CreateCell(1); - cell.SetCellValue("設備名稱"); - cell.CellStyle = styleLine12; - cell = row.CreateCell(2); - cell.SetCellValue("數值"); - cell = row.CreateCell(3); - cell.SetCellValue("記錄時間"); - cell.CellStyle = styleLine12; - #endregion - - foreach (var d in he) + var data = he.ToList(); + if (data.Count > 0) { - RowPosition += 1; + string lastDeviceItem = string.Empty; + int RowPosition = 0; + IRow row; + ISheet sheet; + #region set cell + sheet = workbook.CreateSheet($"{data[0].type}"); row = sheet.CreateRow(RowPosition); - for (var i = 0; i < 4; i++) + sheet.SetColumnWidth(0, 4 * 160 * 12); + sheet.SetColumnWidth(1, 4 * 160 * 12); + sheet.SetColumnWidth(2, 4 * 160 * 12); + sheet.SetColumnWidth(3, 4 * 160 * 12); + ICell cell = row.CreateCell(0); + cell.SetCellValue("類型"); + cell.CellStyle = styleLine12; + cell = row.CreateCell(1); + cell.SetCellValue("設備名稱"); + cell.CellStyle = styleLine12; + cell = row.CreateCell(2); + cell.SetCellValue("數值"); + cell = row.CreateCell(3); + cell.SetCellValue("記錄時間"); + cell.CellStyle = styleLine12; + #endregion + + foreach (var d in data) { - cell = row.CreateCell(i); - if (i == 0) + if (RowPosition == 0 && lastDeviceItem == "") { - cell.SetCellValue(d.type); + lastDeviceItem = d.type; //第一次不用建立 sheet; } - if (i == 1) + if (d.type != lastDeviceItem) { - cell.SetCellValue(d.deviceName); + lastDeviceItem = d.type; + sheet = workbook.CreateSheet($"{d.type}"); + #region set cell + row = sheet.CreateRow(RowPosition); + sheet.SetColumnWidth(0, 4 * 160 * 12); + sheet.SetColumnWidth(1, 4 * 160 * 12); + sheet.SetColumnWidth(2, 4 * 160 * 12); + sheet.SetColumnWidth(3, 4 * 160 * 12); + cell = row.CreateCell(0); + cell.SetCellValue("類型"); + cell.CellStyle = styleLine12; + cell = row.CreateCell(1); + cell.SetCellValue("設備名稱"); + cell.CellStyle = styleLine12; + cell = row.CreateCell(2); + cell.SetCellValue("數值"); + cell = row.CreateCell(3); + cell.SetCellValue("記錄時間"); + cell.CellStyle = styleLine12; + #endregion + RowPosition = 0; } - if (i == 2) + else { - cell.SetCellValue(d.value); - } - if (i == 3) - { - cell.SetCellValue(d.timestamp.ToString("yyyy-MM-dd HH:mm") + ":00");// + RowPosition += 1; } - cell.CellStyle = style12; + row = sheet.CreateRow(RowPosition); + for (var i = 0; i < 4; i++) + { + cell = row.CreateCell(i); + if (i == 0) + { + cell.SetCellValue(d.type); + } + if (i == 1) + { + cell.SetCellValue(d.deviceName); + } + if (i == 2) + { + cell.SetCellValue(d.value); + } + if (i == 3) + { + cell.SetCellValue(d.timestamp.ToString("yyyy-MM-dd HH:mm") + ":00");// + } + + cell.CellStyle = style12; + } } } + #endregion } catch (Exception exception) { diff --git a/FrontendWebApi/Models/HistoryClass.cs b/FrontendWebApi/Models/HistoryClass.cs index bb04e69..b062150 100644 --- a/FrontendWebApi/Models/HistoryClass.cs +++ b/FrontendWebApi/Models/HistoryClass.cs @@ -1,4 +1,5 @@ -using System; +using Newtonsoft.Json.Linq; +using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; @@ -326,4 +327,11 @@ namespace FrontendWebApi.Models public byte is_link { get; set; } public int is_show_history { get; set; } } + + public class JsonDevice + { + public DeviceNumberPoint deviceNumberPoint { get; set; } + public JObject json { get; set; } + public string building_tag { get; set; } + } } diff --git a/FrontendWebApi/wwwroot/excel/operation/維修_2023-01-01_2023-08-03.xlsx b/FrontendWebApi/wwwroot/excel/operation/維修_2023-01-01_2023-08-03.xlsx new file mode 100644 index 0000000..a828359 Binary files /dev/null and b/FrontendWebApi/wwwroot/excel/operation/維修_2023-01-01_2023-08-03.xlsx differ