using FrontendWebApi.Models; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using Repository.BackendRepository.Interface; using Repository.FrontendRepository.Interface; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; namespace FrontendWebApi.ApiControllers { public class HydroMeterController : MyBaseApiController { private readonly IBackendRepository backendRepository; private readonly IFrontendRepository frontendRepository; public HydroMeterController(IBackendRepository backendRepository, IFrontendRepository frontendRepository) { this.backendRepository = backendRepository; this.frontendRepository = frontendRepository; } /// /// 電表 /// /// /// [HttpPost] [Route("api/MeterList")] public async Task>>> MeterList([FromBody] HydroMeterInput input) { ApiResult> apiResult = new ApiResult>(jwt_str); if (!jwtlife) { apiResult.Code = "5000"; return BadRequest(apiResult); } string tableType = "day week month year"; if (input.building_tag == null) { apiResult.Code = "9999"; apiResult.Msg = "棟別沒有被選取"; return BadRequest(apiResult); } else if (input.tableType == null || !tableType.Contains(input.tableType)) { apiResult.Code = "9999"; apiResult.Msg = "表單類別錯誤"; return BadRequest(apiResult); } try { var startTime = input.tableType == "day" || input.tableType == "week" ? input.startTime + "-01" : input.tableType == "month" || input.tableType == "year" ? input.startTime + "-01-01" : null; var endTime = input.tableType == "day" || input.tableType == "week" ? input.startTime.Split("-")[0] + "-" + (Int32.Parse(input.startTime.Split("-")[1]) + 1).ToString().PadLeft(2, '0') + "-01" : input.tableType == "month" ? (Int32.Parse(input.startTime.Split("-")[0]) + 1) + "-01-01" : input.tableType == "year" ? input.endTime + "-01-01" : null; string sqlWhere = ""; if (input.floor_tag.Count > 0) sqlWhere = $@" and substring_index(device_number, '_', 3) in @floor_tag"; var table = "archive_electric_meter_" + input.tableType; var dateFormat = input.tableType == "day" || input.tableType == "week" ? "%Y-%m-%d" : input.tableType == "month" ? "%Y-%m" : input.tableType == "year" ? "%Y" : null; var sql = $@"select device_number, avg_rawdata, DATE_FORMAT(start_timestamp, @dateFormat) as timeStamp from {table} where start_timestamp >= @startTime and end_timestamp < @endTime and point = 'KWH' and substring_index(device_number, '_', 1) = @building_tag {sqlWhere} order by created_at desc;"; var rawData = await backendRepository.GetAllAsync(sql, new { table = table, starTime = startTime, endtime = endTime, building_tag = input.building_tag, floor_tag = input.floor_tag }); var list = 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] }) .Select(x => new HydroMeterOutput { building_tag = x.Key.building_tag, floor_tag = x.Key.floor_tag, device_serial_tag = x.Key.device_serial_tag }) .ToList(); foreach (var l in list) { l.rawData = new List(); 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) ); 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.Count.ToString(); l.price = (await backendRepository.GetOneAsync("select system_value from variable where system_type = 'MeterPrice' and deleted = 0")).ToString(); l.total_price = (l.rawData.Count * Int32.Parse(l.price)).ToString(); } apiResult.Code = "0000"; apiResult.Data = list; } catch (Exception exception) { apiResult.Code = "9999"; apiResult.Msg = "系統內部錯誤,請聯絡管理者。"; string json = System.Text.Json.JsonSerializer.Serialize(input); Logger.LogError("【" + controllerName + "/" + actionName + "】" + json); Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message); } return apiResult; } /// /// 水表 /// /// /// [HttpPost] [Route("api/WaterList")] public async Task>>> WaterList([FromBody] HydroMeterInput input) { ApiResult> apiResult = new ApiResult>(jwt_str); if (!jwtlife) { apiResult.Code = "5000"; return BadRequest(apiResult); } string tableType = "day week month year"; if (input.building_tag == null) { apiResult.Code = "9999"; apiResult.Msg = "棟別沒有被選取"; return BadRequest(apiResult); } else if (input.tableType == null || tableType.Contains(input.tableType)) { apiResult.Code = "9999"; apiResult.Msg = "表單類別錯誤"; return BadRequest(apiResult); } try { var startTime = input.tableType == "day" || input.tableType == "week" ? input.startTime + "-01" : input.tableType == "month" || input.tableType == "month" ? input.startTime + "-01-01" : null; var endTime = input.tableType == "day" || input.tableType == "week" ? input.startTime.Split("-")[0] + "-" + (Int32.Parse(input.startTime.Split("-")[1]) + 1).ToString().PadLeft(2, '0') + "-01" : input.tableType == "month" ? (Int32.Parse(input.startTime.Split("-")[0]) + 1) + "-01-01" : input.tableType == "year" ? input.endTime + "-01-01" : null; string sqlWhere = ""; if (input.floor_tag.Count > 0) sqlWhere = $@" and substring_index(device_number, '_', 3) in @floor_tag"; var table = "archive_water_meter_" + input.tableType; var dateFormat = input.tableType == "day" || input.tableType == "week" ? "%Y-%m-%d" : input.tableType == "month" ? "%Y-%m" : null; var sql = $@"select device_number, avg_rawdata, DATE_FORMAT(start_timestamp, @dateFormat) as timeStamp from @table where start_timestamp >= @startTime and end_timestamp < @endTime and point = 'RCV' and substring_index(device_number, '_', 1) = @building_tag {sqlWhere} order by created_at desc;"; var rawData = await backendRepository.GetAllAsync(sql, new { table = table, starTime = startTime, endTime = endTime, building_tag = input.building_tag, floor_tag = input.floor_tag, dateFormat = dateFormat }); var list = 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] }) .Select(x => new HydroMeterOutput { building_tag = x.Key.building_tag, floor_tag = x.Key.floor_tag, device_serial_tag = x.Key.device_serial_tag }) .ToList(); foreach (var l in list) { l.rawData = new List(); 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) ); 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.Count.ToString(); l.price = (await backendRepository.GetOneAsync("select system_value from variable where system_type = 'WaterPrice' and deleted = 0")).ToString(); l.total_price = (l.rawData.Count * Int32.Parse(l.price)).ToString(); } apiResult.Code = "0000"; apiResult.Data = list; } catch (Exception exception) { apiResult.Code = "9999"; apiResult.Msg = "系統內部錯誤,請聯絡管理者。"; string json = System.Text.Json.JsonSerializer.Serialize(input); Logger.LogError("【" + controllerName + "/" + actionName + "】" + json); Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message); } return apiResult; } } }