From 491b7cdb36c82fd2aaefc71cbaa18ca2a3a4c581 Mon Sep 17 00:00:00 2001 From: keke Date: Tue, 29 Aug 2023 13:26:26 +0800 Subject: [PATCH] =?UTF-8?q?[FE=20API]=20=E6=9B=B4=E6=96=B0=E5=90=84?= =?UTF-8?q?=E5=88=86=E8=A1=A8=E7=B8=BD=E8=A1=A8=E6=9F=A5=E8=A9=A2=E6=96=B9?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ApiControllers/HydroMeterController.cs | 224 ++++++++---------- FrontendWebApi/Models/HydroMeter.cs | 27 +++ 2 files changed, 121 insertions(+), 130 deletions(-) diff --git a/FrontendWebApi/ApiControllers/HydroMeterController.cs b/FrontendWebApi/ApiControllers/HydroMeterController.cs index 58b9b3b..2a50cc6 100644 --- a/FrontendWebApi/ApiControllers/HydroMeterController.cs +++ b/FrontendWebApi/ApiControllers/HydroMeterController.cs @@ -17,6 +17,7 @@ using System.Collections.Immutable; using System.Text; using iTextSharp.text; using System.Collections; +using Google.Protobuf.Collections; namespace FrontendWebApi.ApiControllers { @@ -837,7 +838,7 @@ namespace FrontendWebApi.ApiControllers } input.building_tag = fix_buildingTag.ToString().TrimEnd(',', ' '); - result.Add(ElectricListEachTotal(input).Result.Value.Data.ToList()); + // result.Add(ElectricListEachTotal(input).Result.Value.Data.ToList()); // --- 8/24 修改到這裡囉 --- @@ -998,9 +999,9 @@ namespace FrontendWebApi.ApiControllers [HttpPost] [Route("api/ElectricListEachTotal")] - public async Task>>> ElectricListEachTotal([FromBody] HydroMeterInput input) + public async Task>>> ElectricListEachTotal([FromBody] HydroMeterInput input) { - ApiResult> apiResult = new ApiResult>(jwt_str); + ApiResult> apiResult = new ApiResult>(jwt_str); if (!jwtlife) { apiResult.Code = "5000"; @@ -1019,183 +1020,146 @@ namespace FrontendWebApi.ApiControllers { // 利用今年當月的字串,產生今年上月及去年同月的字串 DateTime date = DateTime.ParseExact(input.startTime, "yyyy-MM", null); // 2023-08 - DateTime start = date.AddYears(-1).AddMonths(-1); - DateTime end = date.AddMonths(1); DateTime previousYear = date.AddYears(-1); DateTime previousMonth = date.AddMonths(-1); //Console.WriteLine(previousYear.ToString("yyyy-MM")); // 2022-08 //Console.WriteLine(previousMonth.ToString("yyyy-MM")); // 2023-07 - var startTime = start.ToString("yyyy-MM") + "-01"; // 查詢月份的去年 (去年同月) - var endTime = end.ToString("yyyy-MM") + "-01"; // 查詢月份的上個月 - var lastYear = previousYear.ToString("yyyy-MM"); - var lastMonth = previousMonth.ToString("yyyy-MM"); - var searchTime = input.startTime; // 欲查詢的月份 + var start_year = date.ToString("yyyy"); // 查詢年 + var start_month = date.ToString("MM"); // 查詢月 + var last_year = previousYear.ToString("yyyy"); // 上個查詢年 + var last_month = previousMonth.ToString("MM"); // 上個查詢月 string sqlWhere = ""; - string sqlGroup = ""; - string sqlAvgRawData = ""; - string buildingSql = ""; string tag_quantity = await backendRepository.GetOneAsync("select system_value from variable where system_type = 'obixConfig' and system_key = 'tag_quantity' and deleted = 0"); switch (input.Mode) { case HydroMeterInputSearchMode.All: + sqlWhere = @$" a.priority <> 0 "; break; case HydroMeterInputSearchMode.Custom: - sqlWhere = @$" and device_number in (SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(system_value, '/', -1), '_', 8) COLLATE utf8mb4_0900_ai_ci as val FROM variable where system_type = 'dashboard_total_elec')"; + sqlWhere = @$" a.device_number in (SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(system_value, '/', -1), '_', 8) COLLATE utf8mb4_0900_ai_ci as val FROM variable where system_type = 'dashboard_total_elec')"; break; default: break; } - // 將棟別字串前處理 (後續 SQL 語法可以使用 IN 的格式) - string[] parts_buildingtag = input.building_tag.Split(','); - StringBuilder fix_buildingtag = new StringBuilder(); - foreach (string part in parts_buildingtag) - { - fix_buildingtag.Append("'").Append(part.Trim()).Append("', "); - } - input.building_tag = fix_buildingtag.ToString().TrimEnd(',', ' '); - - if (tag_quantity == "5") - buildingSql = @$" and SUBSTRING_INDEX(device_number, '_', 1) in ({input.building_tag}) "; - else - buildingSql = @$" and SUBSTRING_INDEX(SUBSTRING_INDEX(device_number, '_', 2), '_', -1) in (select building_tag COLLATE utf8mb4_0900_ai_ci from building) "; - - sqlAvgRawData = " round(kwh_result, 2) as avg_rawdata, start_timestamp, end_timestamp "; - var table = "archive_electric_meter_month"; var schema = await backendRepository.GetOneAsync($"select system_value from variable where system_type = 'project_name'"); var isTable = await backendRepository.GetOneAsync($"select table_name from information_schema.tables where table_name = '{table}' and table_schema = '{schema.Split('/')[0]}'"); if (string.IsNullOrEmpty(isTable)) //check for has table or not { apiResult.Code = "0000"; - apiResult.Data = new List() { }; + apiResult.Data = new List() { }; return Ok(apiResult); } - var dateFormat = input.tableType == "day" || input.tableType == "week" ? "%Y-%m-%d" : input.tableType == "month" ? "%Y-%m" : input.tableType == "year" ? "%Y" : null; - var aemmEndDate = input.tableType == "year" ? $"year(DATE_ADD(fd.date, INTERVAL +1 {input.tableType}))" : $"DATE_ADD(fd.date, INTERVAL +1 {input.tableType})"; - var aemmStaDate = input.tableType == "year" ? "year(fd.date)" : "fd.date"; + string header_now = start_year + "_" + start_month; + string header_lastM = start_year + "_" + last_month; + string header_lastY = last_year + "_" + start_month; + var sql = $@" -set @i = -1; -select fd.device_number, case when aemm.avg_rawdata = -1.0 then 'NaN' when aemm.avg_rawdata is null then 0.00 else aemm.avg_rawdata end as avg_rawdata, DATE_FORMAT(fd.date, '{dateFormat}') as timestamp -from ( - select * - from ( - ( - SELECT DATE(ADDDATE(@startTime, INTERVAL @i:=@i+1 {input.tableType})) AS date - FROM {table} - HAVING @i < TIMESTAMPDIFF({input.tableType}, @startTime, ADDDATE(@endTime, INTERVAL -1 DAY)) - ) d, - ( - select device_number - from {table} - where start_timestamp >= @startTime and end_timestamp < @endTime and point = 'KWH' {buildingSql} - {sqlWhere} - group by device_number - ) dn - ) -) fd -left join ( - select device_number, {sqlAvgRawData} - from {table} - where start_timestamp >= @startTime and end_timestamp < @endTime and point = 'KWH' {buildingSql} - {sqlWhere} {sqlGroup} -) aemm on aemm.start_timestamp >= {aemmStaDate} and aemm.end_timestamp < {aemmEndDate} and aemm.device_number = fd.device_number -where DATE_FORMAT(fd.date, '%Y-%m') = '{searchTime}' or DATE_FORMAT(fd.date, '%Y-%m') = '{lastMonth}' or DATE_FORMAT(fd.date, '%Y-%m') = '{lastYear}' -order by fd.device_number, fd.date desc"; - Logger.LogInformation("SQL = " + sql + " startTime=" + startTime + " endTime=" + endTime + " building=" + input.building_tag + " floor_tag = " + input.floor_tag); - var rawData = await backendRepository.GetAllAsync(sql, - new { startTime = startTime, endtime = endTime, building_tag = input.building_tag, dateFormat = dateFormat }); +select e.full_name building_name, a.device_number, {header_now} searchMT, ifnull(b.{header_now}, 0) searchM, {header_lastM} lastMT, ifnull(c.{header_lastM}, 0) lastM, {header_lastY} lastYT, ifnull(d.{header_lastY}, 0) lastY +from device a +left join (select device_number, sum(kwh_result) {header_now} from archive_electric_meter_month where year(start_timestamp) = {start_year} and month(start_timestamp) = {start_month} group by device_number) b on a.device_number COLLATE utf8mb4_0900_ai_ci = b.device_number -- month1 +left join (select device_number, sum(kwh_result) {header_lastM} from archive_electric_meter_month where year(start_timestamp) = {start_year} and month(start_timestamp) = {last_month} group by device_number) c on a.device_number COLLATE utf8mb4_0900_ai_ci = c.device_number -- month2 +left join (select device_number, sum(kwh_result) {header_lastY} from archive_electric_meter_month where year(start_timestamp) = {last_year} and month(start_timestamp) = {start_month} group by device_number) d on a.device_number COLLATE utf8mb4_0900_ai_ci = d.device_number -- last Month +join building e on a.device_building_tag = e.building_tag +where {sqlWhere} +order by a.priority"; + Logger.LogInformation("SQL = " + sql + " building=" + input.building_tag + " floor_tag = " + input.floor_tag); + var rawData = await backendRepository.GetAllAsync(sql); - List Result = new List(); - if (tag_quantity == "5") - { - Result = rawData - .GroupBy(x => new { building_tag = x.device_number.Split("_")[0], floor_tag = x.device_number.Split("_")[2], device_serial_tag = x.device_number.Split("_")[4], device_number = x.device_number }) - .Select(x => new HydroMeterOutput { building_tag = x.Key.building_tag, floor_tag = x.Key.floor_tag, device_serial_tag = x.Key.device_serial_tag, device_number = x.Key.device_number }) - .ToList(); - } - else - { - Result = rawData - .GroupBy(x => new { building_tag = x.device_number.Split("_")[1], floor_tag = x.device_number.Split("_")[4], device_master = x.device_number.Split("_")[5], device_serial_tag = x.device_number.Split("_")[7], device_number = x.device_number }) - .Select(x => new HydroMeterOutput { building_tag = x.Key.building_tag, floor_tag = x.Key.floor_tag, device_serial_tag = x.Key.device_serial_tag, device_master = x.Key.device_master, device_number = x.Key.device_number }) - .ToList(); - } + List ResultData = new List(); + + //if (tag_quantity == "5") + //{ + // Result = rawData + // .GroupBy(x => new { building_tag = x.device_number.Split("_")[0], floor_tag = x.device_number.Split("_")[2], device_serial_tag = x.device_number.Split("_")[4], device_number = x.device_number }) + // .Select(x => new HydroMeterOutput { building_tag = x.Key.building_tag, floor_tag = x.Key.floor_tag, device_serial_tag = x.Key.device_serial_tag, device_number = x.Key.device_number }) + // .ToList(); + //} + //else + //{ + // Result = rawData + // .GroupBy(x => new { building_tag = x.device_number.Split("_")[1], floor_tag = x.device_number.Split("_")[4], device_master = x.device_number.Split("_")[5], device_serial_tag = x.device_number.Split("_")[7], device_number = x.device_number }) + // .Select(x => new HydroMeterOutput { building_tag = x.Key.building_tag, floor_tag = x.Key.floor_tag, device_serial_tag = x.Key.device_serial_tag, device_master = x.Key.device_master, device_number = x.Key.device_number }) + // .ToList(); + //} - foreach (var l in Result) + foreach (var l in rawData) { - l.rawData = new List(); - l.device_full_name = await backendRepository.GetOneAsync($"select full_name from device where device_number = '{l.device_number}'"); - if (tag_quantity == "5") + //l.rawData = new List(); + //l.device_full_name = await backendRepository.GetOneAsync($"select full_name from device where device_number = '{l.device_number}'"); + + //l. + + //l.building_name = l.building_name; + //l.total = l.rawData.Where(x => x.avg_rawdata != "NaN").Sum(x => decimal.Parse(x.avg_rawdata ?? "0", System.Globalization.NumberStyles.Float)).ToString(); + + HydroMeterRawDataEachTotalOutput newData1 = new HydroMeterRawDataEachTotalOutput { - l.rawData.AddRange( - rawData.Where(x => x.device_number.Split("_")[0] == l.building_tag && x.device_number.Split("_")[2] == l.floor_tag && x.device_number.Split("_")[4] == l.device_serial_tag) - ); - } - else - { - l.rawData.AddRange( - rawData.Where(x => x.device_number.Split("_")[1] == l.building_tag && x.device_number.Split("_")[4] == l.floor_tag && x.device_number.Split("_")[5] == l.device_master && x.device_number.Split("_")[7] == l.device_serial_tag) - ); - } + building_name = l.building_name, + device_number = l.device_number, + searchMT = header_now, + searchM = l.searchM, + lastM = l.lastM, + lastY = l.lastY, + lastMT= header_lastM, + lastYT = header_lastY + }; + + + ResultData.Add(newData1); //var lastYear = previousYear.ToString("yyyy-MM"); //var lastMonth = previousMonth.ToString("yyyy-MM"); //var searchTime = input.startTime; // 欲查詢的月份 // 找到符合 searchTime 和 lastMonth 條件的資料 - var searchTimeData = l.rawData.FirstOrDefault(x => x.timeStamp == searchTime); - var lastMonthData = l.rawData.FirstOrDefault(x => x.timeStamp == lastMonth); - var lastYearData = l.rawData.FirstOrDefault(x => x.timeStamp == lastYear); + //var searchTimeData = l.rawData.FirstOrDefault(x => x.timeStamp == searchTime); + //var lastMonthData = l.rawData.FirstOrDefault(x => x.timeStamp == lastMonth); + //var lastYearData = l.rawData.FirstOrDefault(x => x.timeStamp == lastYear); - if (searchTimeData != null && lastMonthData != null && lastYearData != null) - { - // 將 avg_rawdata 字串轉換為 double 型別 - double searchTimeValue = Convert.ToDouble(searchTimeData.avg_rawdata); - double lastMonthValue = Convert.ToDouble(lastMonthData.avg_rawdata); - double lastYearValue = Convert.ToDouble(lastYearData.avg_rawdata); + //if (searchTimeData != null && lastMonthData != null && lastYearData != null) + //{ + // // 將 avg_rawdata 字串轉換為 double 型別 + // double searchTimeValue = Convert.ToDouble(searchTimeData.avg_rawdata); + // double lastMonthValue = Convert.ToDouble(lastMonthData.avg_rawdata); + // double lastYearValue = Convert.ToDouble(lastYearData.avg_rawdata); - // 計算差值 - double month_diff = searchTimeValue - lastMonthValue; - double year_diff = searchTimeValue - lastYearValue; + // // 計算差值 + // double month_diff = searchTimeValue - lastMonthValue; + // double year_diff = searchTimeValue - lastYearValue; - // 創建新的 HydroMeterRawDataOutput - HydroMeterRawDataOutput newData1 = new HydroMeterRawDataOutput - { - timeStamp = "last month different", - device_number = searchTimeData.device_number, - avg_rawdata = month_diff.ToString() - }; + // // 創建新的 HydroMeterRawDataOutput + // HydroMeterRawDataOutput newData1 = new HydroMeterRawDataOutput + // { + // timeStamp = "last month different", + // device_number = searchTimeData.device_number, + // avg_rawdata = month_diff.ToString() + // }; - HydroMeterRawDataOutput newData2 = new HydroMeterRawDataOutput - { - timeStamp = "last year different", - device_number = searchTimeData.device_number, - avg_rawdata = year_diff.ToString() - }; + // HydroMeterRawDataOutput newData2 = new HydroMeterRawDataOutput + // { + // timeStamp = "last year different", + // device_number = searchTimeData.device_number, + // avg_rawdata = year_diff.ToString() + // }; + + // // 將新資料加入到 l.rawData 中 + // l.rawData.Add(newData1); + // l.rawData.Add(newData2); + //} - // 將新資料加入到 l.rawData 中 - l.rawData.Add(newData1); - l.rawData.Add(newData2); - } - l.building_name = await backendRepository.GetOneAsync("select full_name from building where building_tag = @building_tag and deleted = 0", - new { building_tag = l.building_tag }); - l.total = l.rawData.Where(x => x.avg_rawdata != "NaN").Sum(x => decimal.Parse(x.avg_rawdata ?? "0", System.Globalization.NumberStyles.Float)).ToString(); - l.price = input.price.HasValue - ? (Math.Round(input.price.Value, 2)).ToString() - : Math.Round((await backendRepository.GetOneAsync("select system_value from variable where system_type = 'ElectricPrice' and deleted = 0")), 2).ToString(); - l.total_price = Math.Round((Decimal.Parse(l.total) * Decimal.Parse(l.price)), 2).ToString(); } apiResult.Code = "0000"; - apiResult.Data = Result; + apiResult.Data = ResultData; } catch (Exception exception) { diff --git a/FrontendWebApi/Models/HydroMeter.cs b/FrontendWebApi/Models/HydroMeter.cs index 7422efe..08a402e 100644 --- a/FrontendWebApi/Models/HydroMeter.cs +++ b/FrontendWebApi/Models/HydroMeter.cs @@ -49,6 +49,33 @@ namespace FrontendWebApi.Models public string avg_rawdata { get; set; } } + public class HydroMeterEachTotalOutput + { + public string building_name { get; set; } + public string building_tag { get; set; } + public string floor_tag { get; set; } + public string device_serial_tag { get; set; } + public string device_master { get; set; } + public string device_number { get; set; } + public string device_full_name { get; set; } + public string total { get; set; } + public string price { get; set; } + public string total_price { get; set; } + public List rawData { get; set; } + } + + public class HydroMeterRawDataEachTotalOutput + { + public string building_name { get; set; } + public string device_number { get; set; } + public string searchMT { get; set; } + public string searchM { get; set; } + public string lastM { get; set; } + public string lastY { get; set; } + public string lastMT { get; set; } + public string lastYT { get; set; } + } + public class HydroMeterPriceInput { public string type { get; set; }