From 3c61e79575499a5a7f125cebb2ee5916a1f73ce4 Mon Sep 17 00:00:00 2001 From: Kai Date: Tue, 2 Nov 2021 10:55:16 +0800 Subject: [PATCH 1/9] =?UTF-8?q?1.=20=E4=BF=AE=E6=94=B9=E9=80=86=E8=AE=8A?= =?UTF-8?q?=E5=99=A8=E5=88=86=E6=9E=90=20=E8=AE=80=E5=8F=96rawdata?= =?UTF-8?q?=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SolarPower/Controllers/AnalysisInverterController.cs | 8 +++++++- SolarPower/Quartz/Jobs/CalcAvgPowerStationJob.cs | 2 +- .../Repository/Implement/PowerStationRepository.cs | 11 +++++++---- .../Repository/Interface/IPowerStationRepository.cs | 2 +- 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/SolarPower/Controllers/AnalysisInverterController.cs b/SolarPower/Controllers/AnalysisInverterController.cs index 2539ff3..27e603f 100644 --- a/SolarPower/Controllers/AnalysisInverterController.cs +++ b/SolarPower/Controllers/AnalysisInverterController.cs @@ -110,7 +110,13 @@ namespace SolarPower.Controllers StationCodeWithInverterIdsList.Add(stationCodeWithInverterIds); } - inverterHistories = await powerStationRepository.GetInverterHistoryRowData(post.SelectedDate, StationCodeWithInverterIdsList); + var date_start = Convert.ToDateTime(post.SelectedDate.Trim() + " 00:00:00"); + var date_end = Convert.ToDateTime(post.SelectedDate.Trim() + " 23:59:59"); + + var start_timestamp = (long)date_start.Subtract(new DateTime(1970, 1, 1).AddHours(8)).TotalMilliseconds; + var end_timestamp = (long)date_end.Subtract(new DateTime(1970, 1, 1).AddHours(8)).TotalMilliseconds; + + inverterHistories = await powerStationRepository.GetInverterHistoryRowData(start_timestamp, end_timestamp, StationCodeWithInverterIdsList); analysisInverter.XAxis = inverterHistories.Select(x => x.TIMESTAMP).Distinct().ToList(); diff --git a/SolarPower/Quartz/Jobs/CalcAvgPowerStationJob.cs b/SolarPower/Quartz/Jobs/CalcAvgPowerStationJob.cs index 06398f5..dca722f 100644 --- a/SolarPower/Quartz/Jobs/CalcAvgPowerStationJob.cs +++ b/SolarPower/Quartz/Jobs/CalcAvgPowerStationJob.cs @@ -870,7 +870,7 @@ namespace SolarPower.Quartz.Jobs #endregion #region 寄送日月報 - var users = userRepository.GetAllAsync(); + var users = userRepository.GetAllAsync(); var ttt = new List() { "s506488@gmail.com", "cesarliuc@gmail.com" diff --git a/SolarPower/Repository/Implement/PowerStationRepository.cs b/SolarPower/Repository/Implement/PowerStationRepository.cs index 1e91b32..be82d22 100644 --- a/SolarPower/Repository/Implement/PowerStationRepository.cs +++ b/SolarPower/Repository/Implement/PowerStationRepository.cs @@ -4402,7 +4402,7 @@ namespace SolarPower.Repository.Implement } } - public async Task> GetInverterHistoryRowData(string nowDay, List entities) + public async Task> GetInverterHistoryRowData(long start_timestamp, long end_timestamp, List entities) { List result; using (IDbConnection conn = this._databaseHelper.GetConnection()) @@ -4466,16 +4466,19 @@ namespace SolarPower.Repository.Implement inv.RA4, inv.RA5 FROM {table_name} inv - LEFT JOIN {sensor_table_name} sen ON FROM_UNIXTIME(inv.TIMESTAMP/1000, '%Y-%m-%d %H:%i') = FROM_UNIXTIME(sen.TIMESTAMP/1000, '%Y-%m-%d %H:%i') + LEFT JOIN (select * from {sensor_table_name} where TIMESTAMP between @start_timestamp and @end_timestamp)sen + ON FROM_UNIXTIME(inv.TIMESTAMP/1000, '%Y-%m-%d %H:%i') = FROM_UNIXTIME(sen.TIMESTAMP/1000, '%Y-%m-%d %H:%i') + -- LEFT JOIN {sensor_table_name} sen ON FROM_UNIXTIME(inv.TIMESTAMP/1000, '%Y-%m-%d %H:%i') = FROM_UNIXTIME(sen.TIMESTAMP/1000, '%Y-%m-%d %H:%i') LEFT JOIN {entity.SiteDB}.inverter i ON inv.INVERTERID = i.InverterId - WHERE FROM_UNIXTIME(inv.TIMESTAMP/1000, '%Y-%m-%d') = @NowDay + WHERE inv.`TIMESTAMP` between @start_timestamp and @end_timestamp + -- WHERE FROM_UNIXTIME(inv.TIMESTAMP/1000, '%Y-%m-%d') = @NowDay AND inv.INVERTERID IN ('{inverterIds}')"; sql_perSiteDB.Add(temp_sql); } sql = "SELECT * FROM (" + string.Join(" UNION ", sql_perSiteDB) + ") a ORDER BY a.TIMESTAMP ASC"; - result = (await conn.QueryAsync(sql, new { NowDay = nowDay }, commandTimeout: 300)).ToList(); + result = (await conn.QueryAsync(sql, new { start_timestamp = start_timestamp, end_timestamp = end_timestamp }, commandTimeout: 300)).ToList(); } catch (Exception exception) { diff --git a/SolarPower/Repository/Interface/IPowerStationRepository.cs b/SolarPower/Repository/Interface/IPowerStationRepository.cs index 8b585a9..5d02c26 100644 --- a/SolarPower/Repository/Interface/IPowerStationRepository.cs +++ b/SolarPower/Repository/Interface/IPowerStationRepository.cs @@ -574,7 +574,7 @@ namespace SolarPower.Repository.Interface Task> GetPowerStationsByCompanyId(MyUser myUser); Task> GetPowerStationInverter(Dictionary> dic, string filter); Task> GetPowerStationDevice(Dictionary> dic, string filter); - Task> GetInverterHistoryRowData(string nowDay, List entities); + Task> GetInverterHistoryRowData(long start_timestamp, long end_timestamp, List entities); Task> GetInverterHistoryByDate(string startDay, string endDay, List entities); Task> GetInverterHistoryByYear(string year, List entities); Task> GetPowerStationsByCompanyIdWithfilter(MyUser myUser, string filter); From 422299572465bf70d2d7d78e4f10ee704e76c49a Mon Sep 17 00:00:00 2001 From: Kai Date: Wed, 3 Nov 2021 18:26:53 +0800 Subject: [PATCH 2/9] =?UTF-8?q?solarApp=20=E5=8A=A0=E5=85=A5log=20part1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SolarPower/Quartz/Jobs/CalcPowerStationJob.cs | 26 ++++++++++++++----- solarApp/Program.cs | 11 ++++++++ solarApp/Service/procInvSvc.cs | 6 ++++- solarApp/solarApp.csproj | 2 ++ 4 files changed, 38 insertions(+), 7 deletions(-) diff --git a/SolarPower/Quartz/Jobs/CalcPowerStationJob.cs b/SolarPower/Quartz/Jobs/CalcPowerStationJob.cs index b62c84c..e6fa27e 100644 --- a/SolarPower/Quartz/Jobs/CalcPowerStationJob.cs +++ b/SolarPower/Quartz/Jobs/CalcPowerStationJob.cs @@ -44,7 +44,7 @@ namespace SolarPower.Quartz.Jobs if (this.environment.IsDevelopment()) { - dateTime = "2021-08-16 09"; + dateTime = "2021-11-02 10"; } logger.LogInformation("【CalcPowerStationJob】【任務開始】"); @@ -107,12 +107,18 @@ namespace SolarPower.Quartz.Jobs { logger.LogInformation("【CalcPowerStationJob】【開始取得電站[{0}]在{1}的每小時歷史資料】", powerStation.Code, dateTime); var history = await powerStationRepository.GetPowerStationHistoryPerHour(dateTime, full_table_name); - logger.LogInformation("【CalcPowerStationJob】【取得成功電站[{0}]在{1}的每小時歷史資料】", powerStation.Code, dateTime); - logger.LogInformation("【CalcPowerStationJob】【電站[{0}]在{1}的每小時歷史資料】 - {2}", powerStation.Code, dateTime, System.Text.Json.JsonSerializer.Serialize(history)); - var lastmoneyhistorybyhour = await powerStationRepository.GetLastMoneyAndCarbonInHour(powerStation.Id, 0, dateTime); + // 當前用不到 + // var lastmoneyhistorybyhour = await powerStationRepository.GetLastMoneyAndCarbonInHour(powerStation.Id, 0, dateTime); - if (history != null) + if (history == null) { + logger.LogWarning("【CalcPowerStationJob】【查無電站[{0}]在{1}的每小時歷史資料】", powerStation.Code, dateTime); + } + else + { + logger.LogInformation("【CalcPowerStationJob】【取得成功電站[{0}]在{1}的每小時歷史資料】", powerStation.Code, dateTime); + logger.LogInformation("【CalcPowerStationJob】【電站[{0}]在{1}的每小時歷史資料】 - {2}", powerStation.Code, dateTime, System.Text.Json.JsonSerializer.Serialize(history)); + logger.LogInformation("【CalcPowerStationJob】【開始計算電站[{0}]在{1}的每小時歷史資料】", powerStation.Code, dateTime); history.PowerStationId = powerStation.Id; history.Timestamp = Convert.ToDateTime(history.Timestamp + ":00:00").ToString("yyyy-MM-dd HH:mm:ss"); @@ -303,8 +309,12 @@ namespace SolarPower.Quartz.Jobs //pyrheliometerHistory.Timestamp = Convert.ToDateTime(pyrheliometerHistory.Timestamp + ":00:00").ToString("yyyy-MM-dd HH:mm:ss"); //pyrheliometerHistory.PowerStationId = powerStation.Id; //pyrheliometerHistoriesHour.Add(pyrheliometerHistory); + logger.LogInformation("【CalcPowerStationJob】【計算完成電站[{0}]在{1}的日照計的平均值】", powerStation.Code, dateTime); + } + else + { + logger.LogWarning("【CalcPowerStationJob】【查無結果電站[{0}]在{1}的日照計的平均值】", powerStation.Code, dateTime); } - logger.LogInformation("【CalcPowerStationJob】【計算完成電站[{0}]在{1}的日照計的平均值】", powerStation.Code, dateTime); } } catch (Exception ex) @@ -334,6 +344,10 @@ namespace SolarPower.Quartz.Jobs logger.LogInformation("【CalcPowerStationJob】【計算完成電站[{0}]在{1}的模組溫度計的平均值】", powerStation.Code, dateTime); } + else + { + logger.LogWarning("【CalcPowerStationJob】【查無結果電站[{0}]在{1}的模組溫度計的平均值】", powerStation.Code, dateTime); + } } } catch (Exception ex) diff --git a/solarApp/Program.cs b/solarApp/Program.cs index 782bb0f..4533ef9 100644 --- a/solarApp/Program.cs +++ b/solarApp/Program.cs @@ -1,3 +1,4 @@ +using Serilog; using System; using System.Collections.Generic; using System.Linq; @@ -14,12 +15,22 @@ namespace solarApp [STAThread] static void Main() { + Log.Logger = new LoggerConfiguration() + .MinimumLevel.Verbose() // ]w̧Cܼh w]: Information + .WriteTo.File("Logs/solarApp/log-.log", + rollingInterval: RollingInterval.Day, // CѤ@ɮ + outputTemplate: "{Timestamp:HH:mm:ss} [{Level:u5}] {Message:lj}{NewLine}{Exception}" + ) // Xɮ ɦWd: log-20211005.log + .CreateLogger(); + Application.SetHighDpiMode(HighDpiMode.SystemAware); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); //Application.Run(new fmExcel()); Application.Run(new fmArchive()); //Application.Run(new fmMain()); + + Log.CloseAndFlush(); } } } diff --git a/solarApp/Service/procInvSvc.cs b/solarApp/Service/procInvSvc.cs index e8ebfc7..5c5cf89 100644 --- a/solarApp/Service/procInvSvc.cs +++ b/solarApp/Service/procInvSvc.cs @@ -6,6 +6,7 @@ using Dapper; using solarApp.Model; using System.Configuration; using System.Threading.Tasks; +using Serilog; namespace solarApp.Service { @@ -116,6 +117,7 @@ namespace solarApp.Service string ss = @"SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY,',''));"; conn.Execute(ss); + Log.Information("開始執行[{0}]在{1}逆變器15min補償", _siteID, _date1); #region 15 min string sql = @" INSERT INTO solar_master.inverter_history_15min( PowerStationId, TIMESTAMP, INVERTERID, KWH, TODAYKWH, KWHKWP) @@ -146,10 +148,12 @@ namespace solarApp.Service group by FROM_UNIXTIME(`TIMESTAMP`/1000,'%Y-%m-%d %H') , inverterid ) a join " + _siteDB + @".inverter b on a.inverterid = b.inverterid"; var ds = conn.Execute(sql, new { date1 = _date1, PowerStationID = _powerStationID }); + + Log.Information("執行完成[{0}]在{1}逆變器15min補償", _siteID, _date1); #endregion #region hour - sql = @" + sql = @" insert into solar_master.inverter_history_hour (PowerStationId, INVERTERID, TIMESTAMP, Irradiance, AC1V, AC1A, AC1W, AC1F, AC1WH, AC2V, AC2A, AC2W, AC2F, AC2WH, AC3V, AC3A, AC3W, AC3F, AC3WH, DC1V, DC1A, DC1W, DC1WH, DC2V, DC2A, DC2W, DC2WH, DC3V, DC3A, DC3W, DC3WH, DC4V, DC4A, DC4W, DC4WH, DC5V, DC5A, DC5W, DC5WH, PR, RA1, RA2, RA3, RA4, RA5, DCKW, ACKW, KWH, TODAYKWH, TOTALKWH, KWHKWP) diff --git a/solarApp/solarApp.csproj b/solarApp/solarApp.csproj index dcee98b..c75fd44 100644 --- a/solarApp/solarApp.csproj +++ b/solarApp/solarApp.csproj @@ -21,6 +21,8 @@ + + \ No newline at end of file From 8c8a64bb39032c09d4bb25ca99913b2968aa3be7 Mon Sep 17 00:00:00 2001 From: Kai Date: Thu, 4 Nov 2021 11:17:05 +0800 Subject: [PATCH 3/9] =?UTF-8?q?solarApp=20=E5=8A=A0=E5=85=A5log=20part2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Quartz/Jobs/CalcAvgPowerStationJob.cs | 2 +- solarApp/Service/procInvSvc.cs | 371 +++++++++++------- 2 files changed, 227 insertions(+), 146 deletions(-) diff --git a/SolarPower/Quartz/Jobs/CalcAvgPowerStationJob.cs b/SolarPower/Quartz/Jobs/CalcAvgPowerStationJob.cs index dca722f..d210ac6 100644 --- a/SolarPower/Quartz/Jobs/CalcAvgPowerStationJob.cs +++ b/SolarPower/Quartz/Jobs/CalcAvgPowerStationJob.cs @@ -793,7 +793,7 @@ namespace SolarPower.Quartz.Jobs var end_date = DateTimeNow.AddDays(-1); logger.LogInformation("【CalcAvgPowerStationJob】【開始執行補償機制】"); procSensorSvc sensorSvc = new procSensorSvc(Connection_string); - procInvSvc invSvc = new procInvSvc(Connection_string); + procInvSvc invSvc = new procInvSvc(Connection_string, logger); procStationSvc siteSvc = new procStationSvc(Connection_string); foreach (var powerStation in powerStations) { diff --git a/solarApp/Service/procInvSvc.cs b/solarApp/Service/procInvSvc.cs index 5c5cf89..8b2a63b 100644 --- a/solarApp/Service/procInvSvc.cs +++ b/solarApp/Service/procInvSvc.cs @@ -6,15 +6,16 @@ using Dapper; using solarApp.Model; using System.Configuration; using System.Threading.Tasks; -using Serilog; +using Microsoft.Extensions.Logging; namespace solarApp.Service { public class procInvSvc { string Connection1 = string.Empty; + ILogger _logger; - public procInvSvc(string Connection_parame = null) + public procInvSvc(string Connection_parame = null, ILogger logger = null) { if (!string.IsNullOrEmpty(Connection_parame)) { @@ -24,6 +25,11 @@ namespace solarApp.Service { Connection1 = ConfigurationManager.ConnectionStrings["mySql"].ConnectionString; } + + if (logger != null) + { + _logger = logger; + } } public string _siteID { get; set; } @@ -38,7 +44,7 @@ namespace solarApp.Service { bool result = false; try - { + { using (MySqlConnection conn = new MySqlConnection(Connection1)) { conn.Open(); @@ -60,7 +66,7 @@ namespace solarApp.Service } public bool archiveData(string siteID, string date1) - { + { bool result = false; try { @@ -68,7 +74,7 @@ namespace solarApp.Service _date1 = date1; get_siteInfo(); clearData(); - insert_inv(); + insert_inv(); result = true; } catch (Exception ex) @@ -117,158 +123,233 @@ namespace solarApp.Service string ss = @"SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY,',''));"; conn.Execute(ss); - Log.Information("開始執行[{0}]在{1}逆變器15min補償", _siteID, _date1); + string sql = string.Empty; #region 15 min - string sql = @" - INSERT INTO solar_master.inverter_history_15min( PowerStationId, TIMESTAMP, INVERTERID, KWH, TODAYKWH, KWHKWP) - select PowerStationId, reportdate, a.inverterid, KWH, TODAYKWH, (kwh/(capacity/4)) kwpkwp from - ( - select @PowerStationId PowerStationId, CONCAT(FROM_UNIXTIME(`TIMESTAMP`/1000,'%Y-%m-%d %H'), ':00:00')reportdate, inverterid, - (sum(WH)/1000) KWH, max(TODAYKWH) TODAYKWH - from " + _siteDB + ".s" + _siteID01 + @"_inv - where FROM_UNIXTIME(`TIMESTAMP`/1000,'%Y-%m-%d') = @date1 and right(FROM_UNIXTIME(`TIMESTAMP`/1000,'%Y-%m-%d %H:%i') , 2) between '00' and '10' - group by FROM_UNIXTIME(`TIMESTAMP`/1000,'%Y-%m-%d %H') , inverterid - union - select @PowerStationId PowerStationId, CONCAT(FROM_UNIXTIME(`TIMESTAMP`/1000,'%Y-%m-%d %H'), ':15:00')reportdate, inverterid, - (sum(WH)/1000) KWH, max(TODAYKWH) TODAYKWH - from " + _siteDB + ".s" + _siteID01 + @"_inv - where FROM_UNIXTIME(`TIMESTAMP`/1000,'%Y-%m-%d') = @date1 and right(FROM_UNIXTIME(`TIMESTAMP`/1000,'%Y-%m-%d %H:%i') , 2) between '15' and '25' - group by FROM_UNIXTIME(`TIMESTAMP`/1000,'%Y-%m-%d %H') , inverterid - union - select @PowerStationId PowerStationId, CONCAT(FROM_UNIXTIME(`TIMESTAMP`/1000,'%Y-%m-%d %H'), ':30:00')reportdate, inverterid, - (sum(WH)/1000) KWH, max(TODAYKWH) TODAYKWH - from " + _siteDB + ".s" + _siteID01 + @"_inv - where FROM_UNIXTIME(`TIMESTAMP`/1000,'%Y-%m-%d') = @date1 and right(FROM_UNIXTIME(`TIMESTAMP`/1000,'%Y-%m-%d %H:%i') , 2) between '30' and '40' - group by FROM_UNIXTIME(`TIMESTAMP`/1000,'%Y-%m-%d %H') , inverterid - union - select @PowerStationId PowerStationId, CONCAT(FROM_UNIXTIME(`TIMESTAMP`/1000,'%Y-%m-%d %H'), ':45:00')reportdate, inverterid, - (sum(WH)/1000) KWH, max(TODAYKWH) TODAYKWH - from " + _siteDB + ".s" + _siteID01 + @"_inv - where FROM_UNIXTIME(`TIMESTAMP`/1000,'%Y-%m-%d') = @date1 and right(FROM_UNIXTIME(`TIMESTAMP`/1000,'%Y-%m-%d %H:%i') , 2) between '45' and '55' - group by FROM_UNIXTIME(`TIMESTAMP`/1000,'%Y-%m-%d %H') , inverterid - ) a join " + _siteDB + @".inverter b on a.inverterid = b.inverterid"; - var ds = conn.Execute(sql, new { date1 = _date1, PowerStationID = _powerStationID }); + try + { + if (_logger != null) + { + _logger.LogInformation("【ProcInvSvc】開始執行[{0}]在{1}逆變器15min補償", _siteID, _date1); + } - Log.Information("執行完成[{0}]在{1}逆變器15min補償", _siteID, _date1); + sql = @" + INSERT INTO solar_master.inverter_history_15min( PowerStationId, TIMESTAMP, INVERTERID, KWH, TODAYKWH, KWHKWP) + select PowerStationId, reportdate, a.inverterid, KWH, TODAYKWH, (kwh/(capacity/4)) kwpkwp from + ( + select @PowerStationId PowerStationId, CONCAT(FROM_UNIXTIME(`TIMESTAMP`/1000,'%Y-%m-%d %H'), ':00:00')reportdate, inverterid, + (sum(WH)/1000) KWH, max(TODAYKWH) TODAYKWH + from " + _siteDB + ".s" + _siteID01 + @"_inv + where FROM_UNIXTIME(`TIMESTAMP`/1000,'%Y-%m-%d') = @date1 and right(FROM_UNIXTIME(`TIMESTAMP`/1000,'%Y-%m-%d %H:%i') , 2) between '00' and '10' + group by FROM_UNIXTIME(`TIMESTAMP`/1000,'%Y-%m-%d %H') , inverterid + union + select @PowerStationId PowerStationId, CONCAT(FROM_UNIXTIME(`TIMESTAMP`/1000,'%Y-%m-%d %H'), ':15:00')reportdate, inverterid, + (sum(WH)/1000) KWH, max(TODAYKWH) TODAYKWH + from " + _siteDB + ".s" + _siteID01 + @"_inv + where FROM_UNIXTIME(`TIMESTAMP`/1000,'%Y-%m-%d') = @date1 and right(FROM_UNIXTIME(`TIMESTAMP`/1000,'%Y-%m-%d %H:%i') , 2) between '15' and '25' + group by FROM_UNIXTIME(`TIMESTAMP`/1000,'%Y-%m-%d %H') , inverterid + union + select @PowerStationId PowerStationId, CONCAT(FROM_UNIXTIME(`TIMESTAMP`/1000,'%Y-%m-%d %H'), ':30:00')reportdate, inverterid, + (sum(WH)/1000) KWH, max(TODAYKWH) TODAYKWH + from " + _siteDB + ".s" + _siteID01 + @"_inv + where FROM_UNIXTIME(`TIMESTAMP`/1000,'%Y-%m-%d') = @date1 and right(FROM_UNIXTIME(`TIMESTAMP`/1000,'%Y-%m-%d %H:%i') , 2) between '30' and '40' + group by FROM_UNIXTIME(`TIMESTAMP`/1000,'%Y-%m-%d %H') , inverterid + union + select @PowerStationId PowerStationId, CONCAT(FROM_UNIXTIME(`TIMESTAMP`/1000,'%Y-%m-%d %H'), ':45:00')reportdate, inverterid, + (sum(WH)/1000) KWH, max(TODAYKWH) TODAYKWH + from " + _siteDB + ".s" + _siteID01 + @"_inv + where FROM_UNIXTIME(`TIMESTAMP`/1000,'%Y-%m-%d') = @date1 and right(FROM_UNIXTIME(`TIMESTAMP`/1000,'%Y-%m-%d %H:%i') , 2) between '45' and '55' + group by FROM_UNIXTIME(`TIMESTAMP`/1000,'%Y-%m-%d %H') , inverterid + ) a join " + _siteDB + @".inverter b on a.inverterid = b.inverterid"; + var ds = conn.Execute(sql, new { date1 = _date1, PowerStationID = _powerStationID }); + + if (_logger != null) + { + _logger.LogInformation("【ProcInvSvc】執行完成[{0}]在{1}逆變器15min補償", _siteID, _date1); + } + } + catch (Exception ex) + { + _logger.LogError("【ProcInvSvc】執行失敗[{0}]在{1}逆變器15min補償", _siteID, _date1); + _logger.LogError("【ProcInvSvc】執行失敗[{0}]在{1}逆變器15min補償 - [Exception]:{2}", _siteID, _date1, ex.ToString()); + throw ex; + } #endregion - #region hour - sql = @" - insert into solar_master.inverter_history_hour (PowerStationId, INVERTERID, TIMESTAMP, Irradiance, AC1V, AC1A, AC1W, AC1F, AC1WH, AC2V, AC2A, AC2W, AC2F, AC2WH, - AC3V, AC3A, AC3W, AC3F, AC3WH, DC1V, DC1A, DC1W, DC1WH, DC2V, DC2A, DC2W, DC2WH, DC3V, DC3A, DC3W, DC3WH, DC4V, DC4A, DC4W, DC4WH, DC5V, DC5A, DC5W, DC5WH, - PR, RA1, RA2, RA3, RA4, RA5, DCKW, ACKW, KWH, TODAYKWH, TOTALKWH, KWHKWP) + #region hour + try + { + if (_logger != null) + { + _logger.LogInformation("【ProcInvSvc】開始執行[{0}]在{1}逆變器hour補償", _siteID, _date1); + } + + sql = @" + insert into solar_master.inverter_history_hour (PowerStationId, INVERTERID, TIMESTAMP, Irradiance, AC1V, AC1A, AC1W, AC1F, AC1WH, AC2V, AC2A, AC2W, AC2F, AC2WH, + AC3V, AC3A, AC3W, AC3F, AC3WH, DC1V, DC1A, DC1W, DC1WH, DC2V, DC2A, DC2W, DC2WH, DC3V, DC3A, DC3W, DC3WH, DC4V, DC4A, DC4W, DC4WH, DC5V, DC5A, DC5W, DC5WH, + PR, RA1, RA2, RA3, RA4, RA5, DCKW, ACKW, KWH, TODAYKWH, TOTALKWH, KWHKWP) + + SELECT @powerstationID powerStationID, a.INVERTERID, a.reportDate, IFNULL(Irradiance, 0), a.AC1V, a.AC1A, a.AC1W, a.AC1F, a.AC1WH, a.AC2V, a.AC2A, a.AC2W, a.AC2F, a.AC2WH, + a.AC3V, a.AC3A, a.AC3W, a.AC3F, a.AC3WH, a.DC1V, a.DC1A, a.DC1W, a.DC1WH, a.DC2V, a.DC2A, a.DC2W, a.DC2WH, a.DC3V, a.DC3A, a.DC3W, + a.DC3WH, a.DC4V, a.DC4A, a.DC4W, a.DC4WH, a.DC5V, a.DC5A, a.DC5W, a.DC5WH, + inv_pr.PR, a.RA1, a.RA2, a.RA3, a.RA4, a.RA5, ((DC1W + DC2W + DC3W + DC4W+ DC5W) / 1000) DCKW, + ((AC1W + AC2W + AC3W) / 1000) ACKW, a.KWH, a.TODAYKWH, a.TOTALKWH, (a.KWH / i.Capacity) AS KWHKWP + from + ( -- 取得該時間區間的KWH + SELECT concat(FROM_UNIXTIME(a.TIMESTAMP/1000,'%Y-%m-%d %H'), ':00:00') reportDate, a.INVERTERID, + AVG(a.AC1V) AS AC1V, AVG(a.AC1A) AS AC1A, round(SUM(a.AC1W), 5) AS AC1W, AVG(a.AC1F) AS AC1F, SUM(a.AC1WH) AS AC1WH, AVG(a.AC2V) AS AC2V, + AVG(a.AC2A) AS AC2A, round(SUM(a.AC2W), 5) AS AC2W, AVG(a.AC2F) AS AC2F, SUM(a.AC2WH) AS AC2WH,AVG(a.AC3V) AS AC3V, AVG(a.AC3A) AS AC3A, + round(SUM(a.AC3W),5) AS AC3W, AVG(a.AC3F) AS AC3F, SUM(a.AC3WH) AS AC3WH, AVG(a.DC1V) AS DC1V, AVG(a.DC1A) AS DC1A, SUM(a.DC1W) AS DC1W, + SUM(a.DC1WH) AS DC1WH, AVG(a.DC2V) AS DC2V, AVG(a.DC2A) AS DC2A, SUM(a.DC2W) AS DC2W, SUM(a.DC2WH) AS DC2WH, AVG(a.DC3V) AS DC3V, + AVG(a.DC3A) AS DC3A, AVG(a.DC3W) AS DC3W, AVG(a.DC3WH) AS DC3WH, AVG(a.DC4V) AS DC4V, AVG(a.DC4A) AS DC4A, SUM(a.DC4W) AS DC4W, + SUM(a.DC4WH) AS DC4WH,AVG(a.DC5V) AS DC5V, AVG(a.DC5A) AS DC5A, SUM(a.DC5W) AS DC5W, SUM(a.DC5WH) AS DC5WH, + AVG(a.RA1) AS RA1, AVG(a.RA2) AS RA2, AVG(a.RA3) AS RA3, + AVG(a.RA4) AS RA4, AVG(a.RA5) AS RA5, MAX(a.TODAYKWH) AS TODAYKWH, MAX(a.TOTALKWH) AS TOTALKWH, (SUM(a.WH)/1000) AS KWH + FROM " + _siteDB + ".s" + _siteID01 + @"_inv a + WHERE left(FROM_UNIXTIME(a.TIMESTAMP / 1000, '%Y-%m-%d'), 10) = @date1 + GROUP BY left(FROM_UNIXTIME(a.TIMESTAMP/ 1000, '%Y-%m-%d %H'), 13), a.INVERTERID + ) a + LEFT JOIN( -- 取得整點值PR + SELECT concat(FROM_UNIXTIME(inv.TIMESTAMP/1000,'%Y-%m-%d %H'), ':00:00') AS reportDate, inv.INVERTERID, inv.PR + FROM " + _siteDB + ".s" + _siteID01 + @"_inv inv + WHERE left(DATE_FORMAT(FROM_UNIXTIME(inv.TIMESTAMP / 1000), '%Y-%m-%d %H:%i'), 10) = @date1 + and right(DATE_FORMAT(FROM_UNIXTIME(inv.TIMESTAMP / 1000), '%Y-%m-%d %H:%i'), 2) = '55' + GROUP BY FROM_UNIXTIME(inv.TIMESTAMP/ 1000, '%Y-%m-%d %H'), inv.INVERTERID + ) inv_pr + ON a.reportDate = inv_pr.reportDate AND a.INVERTERID = inv_pr.INVERTERID + -- 取得逆變器容量 + LEFT JOIN " + _siteDB + @".inverter i ON a.INVERTERID = i.InverterId + -- 取日照度 --------------------- + left join ( + select concat(DATE_FORMAT(`TIMESTAMP`,'%Y-%m-%d %H'), ':00:00') AS reportDate, Irradiance + from sensor_history_hour a + where powerstationID = @powerstationID and DATE_FORMAT(`TIMESTAMP`,'%Y-%m-%d') = @date1 + )irr on a.reportDate = irr.reportDate + order by a.INVERTERID, a.reportDate;"; + int ct = conn.Execute(sql, new { date1 = _date1, PowerStationID = _powerStationID }); + + if (_logger != null) + { + _logger.LogInformation("【ProcInvSvc】執行完成[{0}]在{1}逆變器hour補償", _siteID, _date1); + } + } + catch (Exception ex) + { + _logger.LogError("【ProcInvSvc】執行失敗[{0}]在{1}逆變器hour補償", _siteID, _date1); + _logger.LogError("【ProcInvSvc】執行失敗[{0}]在{1}逆變器hour補償 - [Exception]:{2}", _siteID, _date1, ex.ToString()); + throw ex; + } - SELECT @powerstationID powerStationID, a.INVERTERID, a.reportDate, IFNULL(Irradiance, 0), a.AC1V, a.AC1A, a.AC1W, a.AC1F, a.AC1WH, a.AC2V, a.AC2A, a.AC2W, a.AC2F, a.AC2WH, - a.AC3V, a.AC3A, a.AC3W, a.AC3F, a.AC3WH, a.DC1V, a.DC1A, a.DC1W, a.DC1WH, a.DC2V, a.DC2A, a.DC2W, a.DC2WH, a.DC3V, a.DC3A, a.DC3W, - a.DC3WH, a.DC4V, a.DC4A, a.DC4W, a.DC4WH, a.DC5V, a.DC5A, a.DC5W, a.DC5WH, - inv_pr.PR, a.RA1, a.RA2, a.RA3, a.RA4, a.RA5, ((DC1W + DC2W + DC3W + DC4W+ DC5W) / 1000) DCKW, - ((AC1W + AC2W + AC3W) / 1000) ACKW, a.KWH, a.TODAYKWH, a.TOTALKWH, (a.KWH / i.Capacity) AS KWHKWP - from - ( -- 取得該時間區間的KWH - SELECT concat(FROM_UNIXTIME(a.TIMESTAMP/1000,'%Y-%m-%d %H'), ':00:00') reportDate, a.INVERTERID, - AVG(a.AC1V) AS AC1V, AVG(a.AC1A) AS AC1A, round(SUM(a.AC1W), 5) AS AC1W, AVG(a.AC1F) AS AC1F, SUM(a.AC1WH) AS AC1WH, AVG(a.AC2V) AS AC2V, - AVG(a.AC2A) AS AC2A, round(SUM(a.AC2W), 5) AS AC2W, AVG(a.AC2F) AS AC2F, SUM(a.AC2WH) AS AC2WH,AVG(a.AC3V) AS AC3V, AVG(a.AC3A) AS AC3A, - round(SUM(a.AC3W),5) AS AC3W, AVG(a.AC3F) AS AC3F, SUM(a.AC3WH) AS AC3WH, AVG(a.DC1V) AS DC1V, AVG(a.DC1A) AS DC1A, SUM(a.DC1W) AS DC1W, - SUM(a.DC1WH) AS DC1WH, AVG(a.DC2V) AS DC2V, AVG(a.DC2A) AS DC2A, SUM(a.DC2W) AS DC2W, SUM(a.DC2WH) AS DC2WH, AVG(a.DC3V) AS DC3V, - AVG(a.DC3A) AS DC3A, AVG(a.DC3W) AS DC3W, AVG(a.DC3WH) AS DC3WH, AVG(a.DC4V) AS DC4V, AVG(a.DC4A) AS DC4A, SUM(a.DC4W) AS DC4W, - SUM(a.DC4WH) AS DC4WH,AVG(a.DC5V) AS DC5V, AVG(a.DC5A) AS DC5A, SUM(a.DC5W) AS DC5W, SUM(a.DC5WH) AS DC5WH, - AVG(a.RA1) AS RA1, AVG(a.RA2) AS RA2, AVG(a.RA3) AS RA3, - AVG(a.RA4) AS RA4, AVG(a.RA5) AS RA5, MAX(a.TODAYKWH) AS TODAYKWH, MAX(a.TOTALKWH) AS TOTALKWH, (SUM(a.WH)/1000) AS KWH - FROM " + _siteDB + ".s" + _siteID01 + @"_inv a - WHERE left(FROM_UNIXTIME(a.TIMESTAMP / 1000, '%Y-%m-%d'), 10) = @date1 - GROUP BY left(FROM_UNIXTIME(a.TIMESTAMP/ 1000, '%Y-%m-%d %H'), 13), a.INVERTERID - ) a - LEFT JOIN( -- 取得整點值PR - SELECT concat(FROM_UNIXTIME(inv.TIMESTAMP/1000,'%Y-%m-%d %H'), ':00:00') AS reportDate, inv.INVERTERID, inv.PR - FROM " + _siteDB + ".s" + _siteID01 + @"_inv inv - WHERE left(DATE_FORMAT(FROM_UNIXTIME(inv.TIMESTAMP / 1000), '%Y-%m-%d %H:%i'), 10) = @date1 - and right(DATE_FORMAT(FROM_UNIXTIME(inv.TIMESTAMP / 1000), '%Y-%m-%d %H:%i'), 2) = '55' - GROUP BY FROM_UNIXTIME(inv.TIMESTAMP/ 1000, '%Y-%m-%d %H'), inv.INVERTERID - ) inv_pr - ON a.reportDate = inv_pr.reportDate AND a.INVERTERID = inv_pr.INVERTERID - -- 取得逆變器容量 - LEFT JOIN " + _siteDB + @".inverter i ON a.INVERTERID = i.InverterId - -- 取日照度 --------------------- - left join ( - select concat(DATE_FORMAT(`TIMESTAMP`,'%Y-%m-%d %H'), ':00:00') AS reportDate, Irradiance - from sensor_history_hour a - where powerstationID = @powerstationID and DATE_FORMAT(`TIMESTAMP`,'%Y-%m-%d') = @date1 - )irr on a.reportDate = irr.reportDate - order by a.INVERTERID, a.reportDate;"; - int ct = conn.Execute(sql, new { date1 = _date1, PowerStationID = _powerStationID }); - #endregion hour #region day - sql = @" - INSERT INTO solar_master.inverter_history_day(PowerStationId, INVERTERID, TIMESTAMP, Irradiance, AC1V, AC1A, AC1W, AC1F, AC1WH, AC2V, AC2A, AC2W, AC2F, AC2WH, - AC3V, AC3A, AC3W, AC3F, AC3WH, DC1V, DC1A, DC1W, DC1WH, DC2V, DC2A, DC2W, DC2WH, DC3V, DC3A, DC3W, - DC3WH, DC4V, DC4A, DC4W, DC4WH, DC5V, DC5A, DC5W, DC5WH, PR, RA1, RA2, RA3, RA4, RA5, `DCKW`, `ACKW`, KWH, TODAYKWH, TOTALKWH, KWHKWP) + try + { + if (_logger != null) + { + _logger.LogInformation("【ProcInvSvc】開始執行[{0}]在{1}逆變器day補償", _siteID, _date1); + } - SELECT @powerStationID powerStationID, a.INVERTERID, concat(a.reportDate,' 00:00:00') reportDate, IFNULL(Irradiance, 0), a.AC1V, a.AC1A, a.AC1W, a.AC1F, a.AC1WH, a.AC2V, a.AC2A, a.AC2W, a.AC2F, a.AC2WH, - a.AC3V, a.AC3A, a.AC3W, a.AC3F, a.AC3WH, a.DC1V, a.DC1A, a.DC1W, a.DC1WH, a.DC2V, a.DC2A, a.DC2W, a.DC2WH, a.DC3V, a.DC3A, a.DC3W, - a.DC3WH, a.DC4V, a.DC4A, a.DC4W, a.DC4WH, a.DC5V, a.DC5A, a.DC5W, a.DC5WH, a.PR, a.RA1, a.RA2, a.RA3, a.RA4, a.RA5, - DCKW, ACKW, a.KWH, a.TODAYKWH, a.TOTALKWH, (a.KWH / i.Capacity) AS KWHKWP - from - ( -- 取得該時間區間的KWH - SELECT DATE_FORMAT(a.TIMESTAMP, '%Y-%m-%d') AS reportDate, a.INVERTERID, - AVG(a.AC1V) AS AC1V, AVG(a.AC1A) AS AC1A, SUM(a.AC1W) AS AC1W, AVG(a.AC1F) AS AC1F, SUM(a.AC1WH) AS AC1WH, AVG(a.AC2V) AS AC2V, - AVG(a.AC2A) AS AC2A, SUM(a.AC2W) AS AC2W, AVG(a.AC2F) AS AC2F, SUM(a.AC2WH) AS AC2WH,AVG(a.AC3V) AS AC3V, AVG(a.AC3A) AS AC3A, - SUM(a.AC3W) AS AC3W, AVG(a.AC3F) AS AC3F, SUM(a.AC3WH) AS AC3WH, AVG(a.DC1V) AS DC1V, AVG(a.DC1A) AS DC1A, SUM(a.DC1W) AS DC1W, - SUM(a.DC1WH) AS DC1WH, AVG(a.DC2V) AS DC2V, AVG(a.DC2A) AS DC2A, SUM(a.DC2W) AS DC2W, SUM(a.DC2WH) AS DC2WH, AVG(a.DC3V) AS DC3V, - AVG(a.DC3A) AS DC3A, AVG(a.DC3W) AS DC3W, AVG(a.DC3WH) AS DC3WH, AVG(a.DC4V) AS DC4V, AVG(a.DC4A) AS DC4A, SUM(a.DC4W) AS DC4W, - SUM(a.DC4WH) AS DC4WH,AVG(a.DC5V) AS DC5V, AVG(a.DC5A) AS DC5A, SUM(a.DC5W) AS DC5W, SUM(a.DC5WH) AS DC5WH, max(PR) AS PR, - AVG(a.RA1) AS RA1, AVG(a.RA2) AS RA2, AVG(a.RA3) AS RA3, AVG(a.RA4) AS RA4, AVG(a.RA5) AS RA5, avg(DCKW) as DCKW, avg(ACKW) as ACKW, - MAX(a.TODAYKWH) AS TODAYKWH, MAX(a.TOTALKWH) AS TOTALKWH, SUM(a.KWH) AS KWH - FROM solar_master.inverter_history_hour a - WHERE powerstationID = @powerstationID and DATE_FORMAT(a.TIMESTAMP, '%Y-%m-%d') = @date1 - GROUP BY DATE_FORMAT(a.TIMESTAMP, '%Y-%m-%d'), a.INVERTERID - ) a - LEFT JOIN " + _siteDB + @".inverter i ON a.INVERTERID = i.InverterId - -- 取日照度 ---------------------- - left join ( - select DATE_FORMAT(a.TIMESTAMP, '%Y-%m-%d') AS reportDate, Irradiance - from sensor_history_day a - where powerstationID = @powerstationID and DATE_FORMAT(a.TIMESTAMP, '%Y-%m-%d') = @date1 and Irradiance <> 0 limit 1 - )irr on a.reportDate = irr.reportDate ;"; - conn.Execute(sql, new { date1 = _date1, PowerStationID = _powerStationID }); + sql = @" + INSERT INTO solar_master.inverter_history_day(PowerStationId, INVERTERID, TIMESTAMP, Irradiance, AC1V, AC1A, AC1W, AC1F, AC1WH, AC2V, AC2A, AC2W, AC2F, AC2WH, + AC3V, AC3A, AC3W, AC3F, AC3WH, DC1V, DC1A, DC1W, DC1WH, DC2V, DC2A, DC2W, DC2WH, DC3V, DC3A, DC3W, + DC3WH, DC4V, DC4A, DC4W, DC4WH, DC5V, DC5A, DC5W, DC5WH, PR, RA1, RA2, RA3, RA4, RA5, `DCKW`, `ACKW`, KWH, TODAYKWH, TOTALKWH, KWHKWP) + + SELECT @powerStationID powerStationID, a.INVERTERID, concat(a.reportDate,' 00:00:00') reportDate, IFNULL(Irradiance, 0), a.AC1V, a.AC1A, a.AC1W, a.AC1F, a.AC1WH, a.AC2V, a.AC2A, a.AC2W, a.AC2F, a.AC2WH, + a.AC3V, a.AC3A, a.AC3W, a.AC3F, a.AC3WH, a.DC1V, a.DC1A, a.DC1W, a.DC1WH, a.DC2V, a.DC2A, a.DC2W, a.DC2WH, a.DC3V, a.DC3A, a.DC3W, + a.DC3WH, a.DC4V, a.DC4A, a.DC4W, a.DC4WH, a.DC5V, a.DC5A, a.DC5W, a.DC5WH, a.PR, a.RA1, a.RA2, a.RA3, a.RA4, a.RA5, + DCKW, ACKW, a.KWH, a.TODAYKWH, a.TOTALKWH, (a.KWH / i.Capacity) AS KWHKWP + from + ( -- 取得該時間區間的KWH + SELECT DATE_FORMAT(a.TIMESTAMP, '%Y-%m-%d') AS reportDate, a.INVERTERID, + AVG(a.AC1V) AS AC1V, AVG(a.AC1A) AS AC1A, SUM(a.AC1W) AS AC1W, AVG(a.AC1F) AS AC1F, SUM(a.AC1WH) AS AC1WH, AVG(a.AC2V) AS AC2V, + AVG(a.AC2A) AS AC2A, SUM(a.AC2W) AS AC2W, AVG(a.AC2F) AS AC2F, SUM(a.AC2WH) AS AC2WH,AVG(a.AC3V) AS AC3V, AVG(a.AC3A) AS AC3A, + SUM(a.AC3W) AS AC3W, AVG(a.AC3F) AS AC3F, SUM(a.AC3WH) AS AC3WH, AVG(a.DC1V) AS DC1V, AVG(a.DC1A) AS DC1A, SUM(a.DC1W) AS DC1W, + SUM(a.DC1WH) AS DC1WH, AVG(a.DC2V) AS DC2V, AVG(a.DC2A) AS DC2A, SUM(a.DC2W) AS DC2W, SUM(a.DC2WH) AS DC2WH, AVG(a.DC3V) AS DC3V, + AVG(a.DC3A) AS DC3A, AVG(a.DC3W) AS DC3W, AVG(a.DC3WH) AS DC3WH, AVG(a.DC4V) AS DC4V, AVG(a.DC4A) AS DC4A, SUM(a.DC4W) AS DC4W, + SUM(a.DC4WH) AS DC4WH,AVG(a.DC5V) AS DC5V, AVG(a.DC5A) AS DC5A, SUM(a.DC5W) AS DC5W, SUM(a.DC5WH) AS DC5WH, max(PR) AS PR, + AVG(a.RA1) AS RA1, AVG(a.RA2) AS RA2, AVG(a.RA3) AS RA3, AVG(a.RA4) AS RA4, AVG(a.RA5) AS RA5, avg(DCKW) as DCKW, avg(ACKW) as ACKW, + MAX(a.TODAYKWH) AS TODAYKWH, MAX(a.TOTALKWH) AS TOTALKWH, SUM(a.KWH) AS KWH + FROM solar_master.inverter_history_hour a + WHERE powerstationID = @powerstationID and DATE_FORMAT(a.TIMESTAMP, '%Y-%m-%d') = @date1 + GROUP BY DATE_FORMAT(a.TIMESTAMP, '%Y-%m-%d'), a.INVERTERID + ) a + LEFT JOIN " + _siteDB + @".inverter i ON a.INVERTERID = i.InverterId + -- 取日照度 ---------------------- + left join ( + select DATE_FORMAT(a.TIMESTAMP, '%Y-%m-%d') AS reportDate, Irradiance + from sensor_history_day a + where powerstationID = @powerstationID and DATE_FORMAT(a.TIMESTAMP, '%Y-%m-%d') = @date1 and Irradiance <> 0 limit 1 + )irr on a.reportDate = irr.reportDate ;"; + conn.Execute(sql, new { date1 = _date1, PowerStationID = _powerStationID }); + + if (_logger != null) + { + _logger.LogInformation("【ProcInvSvc】執行完成[{0}]在{1}逆變器day補償", _siteID, _date1); + } + } + catch (Exception ex) + { + _logger.LogError("【ProcInvSvc】執行失敗[{0}]在{1}逆變器day補償", _siteID, _date1); + _logger.LogError("【ProcInvSvc】執行失敗[{0}]在{1}逆變器day補償 - [Exception]:{2}", _siteID, _date1, ex.ToString()); + throw ex; + } #endregion day #region month - sql = @" - delete from inverter_history_month where powerstationID = @powerStationID and left(`TIMESTAMP`, 7) = left(@date1, 7) ; + try + { + if (_logger != null) + { + _logger.LogInformation("【ProcInvSvc】開始執行[{0}]在{1}逆變器month補償", _siteID, _date1); + } - INSERT INTO solar_master.inverter_history_month (PowerStationId, INVERTERID, TIMESTAMP, Irradiance, AC1V, AC1A, AC1W, AC1F, AC1WH, AC2V, AC2A, AC2W, AC2F, AC2WH, - AC3V, AC3A, AC3W, AC3F, AC3WH, DC1V, DC1A, DC1W, DC1WH, DC2V, DC2A, DC2W, DC2WH, DC3V, DC3A, DC3W, - DC3WH, DC4V, DC4A, DC4W, DC4WH, DC5V, DC5A, DC5W, DC5WH, PR, RA1, RA2, RA3, RA4, RA5, `DCKW`, `ACKW`, KWH, TODAYKWH, TOTALKWH, KWHKWP) + sql = @" + delete from inverter_history_month where powerstationID = @powerStationID and left(`TIMESTAMP`, 7) = left(@date1, 7) ; + + INSERT INTO solar_master.inverter_history_month (PowerStationId, INVERTERID, TIMESTAMP, Irradiance, AC1V, AC1A, AC1W, AC1F, AC1WH, AC2V, AC2A, AC2W, AC2F, AC2WH, + AC3V, AC3A, AC3W, AC3F, AC3WH, DC1V, DC1A, DC1W, DC1WH, DC2V, DC2A, DC2W, DC2WH, DC3V, DC3A, DC3W, + DC3WH, DC4V, DC4A, DC4W, DC4WH, DC5V, DC5A, DC5W, DC5WH, PR, RA1, RA2, RA3, RA4, RA5, `DCKW`, `ACKW`, KWH, TODAYKWH, TOTALKWH, KWHKWP) + + SELECT @powerStationID powerStationID, a.INVERTERID, concat(a.reportDate,'-01 00:00:00') reportDate, IFNULL(Irradiance, 0), a.AC1V, a.AC1A, a.AC1W, a.AC1F, a.AC1WH, a.AC2V, a.AC2A, a.AC2W, a.AC2F, a.AC2WH, + a.AC3V, a.AC3A, a.AC3W, a.AC3F, a.AC3WH, a.DC1V, a.DC1A, a.DC1W, a.DC1WH, a.DC2V, a.DC2A, a.DC2W, a.DC2WH, a.DC3V, a.DC3A, a.DC3W, + a.DC3WH, a.DC4V, a.DC4A, a.DC4W, a.DC4WH, a.DC5V, a.DC5A, a.DC5W, a.DC5WH, a.PR, a.RA1, a.RA2, a.RA3, a.RA4, a.RA5, DCKW, ACKW, a.KWH, a.TODAYKWH, a.TOTALKWH, + (a.KWH / i.Capacity) AS KWHKWP + from + ( -- 取得該時間區間的KWH + SELECT DATE_FORMAT(a.TIMESTAMP, '%Y-%m') AS reportDate, a.INVERTERID, + AVG(a.AC1V) AS AC1V, AVG(a.AC1A) AS AC1A, SUM(a.AC1W) AS AC1W, AVG(a.AC1F) AS AC1F, SUM(a.AC1WH) AS AC1WH, AVG(a.AC2V) AS AC2V, + AVG(a.AC2A) AS AC2A, SUM(a.AC2W) AS AC2W, AVG(a.AC2F) AS AC2F, SUM(a.AC2WH) AS AC2WH,AVG(a.AC3V) AS AC3V, AVG(a.AC3A) AS AC3A, + SUM(a.AC3W) AS AC3W, AVG(a.AC3F) AS AC3F, SUM(a.AC3WH) AS AC3WH, AVG(a.DC1V) AS DC1V, AVG(a.DC1A) AS DC1A, SUM(a.DC1W) AS DC1W, + SUM(a.DC1WH) AS DC1WH, AVG(a.DC2V) AS DC2V, AVG(a.DC2A) AS DC2A, SUM(a.DC2W) AS DC2W, SUM(a.DC2WH) AS DC2WH, AVG(a.DC3V) AS DC3V, + AVG(a.DC3A) AS DC3A, AVG(a.DC3W) AS DC3W, AVG(a.DC3WH) AS DC3WH, AVG(a.DC4V) AS DC4V, AVG(a.DC4A) AS DC4A, SUM(a.DC4W) AS DC4W, + SUM(a.DC4WH) AS DC4WH,AVG(a.DC5V) AS DC5V, AVG(a.DC5A) AS DC5A, SUM(a.DC5W) AS DC5W, SUM(a.DC5WH) AS DC5WH, avg(PR) AS PR, + AVG(a.RA1) AS RA1, AVG(a.RA2) AS RA2, AVG(a.RA3) AS RA3, AVG(a.RA4) AS RA4, AVG(a.RA5) AS RA5, avg(DCKW) as DCKW, avg(ACKW) as ACKW, + avg(a.TODAYKWH) AS TODAYKWH, MAX(a.TOTALKWH) AS TOTALKWH, SUM(a.KWH) AS KWH + FROM solar_master.inverter_history_day a + WHERE powerstationID = @powerstationID and DATE_FORMAT(a.TIMESTAMP, '%Y-%m') = @date1 + GROUP BY DATE_FORMAT(a.TIMESTAMP, '%Y-%m'), a.INVERTERID + ) a + LEFT JOIN " + _siteDB + @".inverter i ON a.INVERTERID = i.InverterId + -- 取日照度 ---------------------- + left join ( + select DATE_FORMAT(a.TIMESTAMP, '%Y-%m') AS reportDate, Irradiance + from sensor_history_month a + where powerstationID = @powerstationID and DATE_FORMAT(a.TIMESTAMP, '%Y-%m') = @date1 and Irradiance <> 0 + )irr on a.reportDate = irr.reportDate ;"; + conn.Execute(sql, new { date1 = _date1.Substring(0, 7), PowerStationID = _powerStationID }); + + if (_logger != null) + { + _logger.LogInformation("【ProcInvSvc】執行完成[{0}]在{1}逆變器month補償", _siteID, _date1); + } + } + catch (Exception ex) + { + _logger.LogError("【ProcInvSvc】執行失敗[{0}]在{1}逆變器month補償", _siteID, _date1); + _logger.LogError("【ProcInvSvc】執行失敗[{0}]在{1}逆變器month補償 - [Exception]:{2}", _siteID, _date1, ex.ToString()); + throw ex; + } - SELECT @powerStationID powerStationID, a.INVERTERID, concat(a.reportDate,'-01 00:00:00') reportDate, IFNULL(Irradiance, 0), a.AC1V, a.AC1A, a.AC1W, a.AC1F, a.AC1WH, a.AC2V, a.AC2A, a.AC2W, a.AC2F, a.AC2WH, - a.AC3V, a.AC3A, a.AC3W, a.AC3F, a.AC3WH, a.DC1V, a.DC1A, a.DC1W, a.DC1WH, a.DC2V, a.DC2A, a.DC2W, a.DC2WH, a.DC3V, a.DC3A, a.DC3W, - a.DC3WH, a.DC4V, a.DC4A, a.DC4W, a.DC4WH, a.DC5V, a.DC5A, a.DC5W, a.DC5WH, a.PR, a.RA1, a.RA2, a.RA3, a.RA4, a.RA5, DCKW, ACKW, a.KWH, a.TODAYKWH, a.TOTALKWH, - (a.KWH / i.Capacity) AS KWHKWP - from - ( -- 取得該時間區間的KWH - SELECT DATE_FORMAT(a.TIMESTAMP, '%Y-%m') AS reportDate, a.INVERTERID, - AVG(a.AC1V) AS AC1V, AVG(a.AC1A) AS AC1A, SUM(a.AC1W) AS AC1W, AVG(a.AC1F) AS AC1F, SUM(a.AC1WH) AS AC1WH, AVG(a.AC2V) AS AC2V, - AVG(a.AC2A) AS AC2A, SUM(a.AC2W) AS AC2W, AVG(a.AC2F) AS AC2F, SUM(a.AC2WH) AS AC2WH,AVG(a.AC3V) AS AC3V, AVG(a.AC3A) AS AC3A, - SUM(a.AC3W) AS AC3W, AVG(a.AC3F) AS AC3F, SUM(a.AC3WH) AS AC3WH, AVG(a.DC1V) AS DC1V, AVG(a.DC1A) AS DC1A, SUM(a.DC1W) AS DC1W, - SUM(a.DC1WH) AS DC1WH, AVG(a.DC2V) AS DC2V, AVG(a.DC2A) AS DC2A, SUM(a.DC2W) AS DC2W, SUM(a.DC2WH) AS DC2WH, AVG(a.DC3V) AS DC3V, - AVG(a.DC3A) AS DC3A, AVG(a.DC3W) AS DC3W, AVG(a.DC3WH) AS DC3WH, AVG(a.DC4V) AS DC4V, AVG(a.DC4A) AS DC4A, SUM(a.DC4W) AS DC4W, - SUM(a.DC4WH) AS DC4WH,AVG(a.DC5V) AS DC5V, AVG(a.DC5A) AS DC5A, SUM(a.DC5W) AS DC5W, SUM(a.DC5WH) AS DC5WH, avg(PR) AS PR, - AVG(a.RA1) AS RA1, AVG(a.RA2) AS RA2, AVG(a.RA3) AS RA3, AVG(a.RA4) AS RA4, AVG(a.RA5) AS RA5, avg(DCKW) as DCKW, avg(ACKW) as ACKW, - avg(a.TODAYKWH) AS TODAYKWH, MAX(a.TOTALKWH) AS TOTALKWH, SUM(a.KWH) AS KWH - FROM solar_master.inverter_history_day a - WHERE powerstationID = @powerstationID and DATE_FORMAT(a.TIMESTAMP, '%Y-%m') = @date1 - GROUP BY DATE_FORMAT(a.TIMESTAMP, '%Y-%m'), a.INVERTERID - ) a - LEFT JOIN " + _siteDB + @".inverter i ON a.INVERTERID = i.InverterId - -- 取日照度 ---------------------- - left join ( - select DATE_FORMAT(a.TIMESTAMP, '%Y-%m') AS reportDate, Irradiance - from sensor_history_month a - where powerstationID = @powerstationID and DATE_FORMAT(a.TIMESTAMP, '%Y-%m') = @date1 and Irradiance <> 0 - )irr on a.reportDate = irr.reportDate ;"; - conn.Execute(sql, new { date1 = _date1.Substring(0, 7), PowerStationID = _powerStationID }); #endregion month conn.Close(); @@ -276,10 +357,10 @@ namespace solarApp.Service result = true; } catch (Exception ex) - { + { throw ex; } return result; - } + } } } From a16468f22cd795de0af4e735162df01997148428 Mon Sep 17 00:00:00 2001 From: Kai Date: Fri, 5 Nov 2021 18:33:11 +0800 Subject: [PATCH 4/9] =?UTF-8?q?1.=20=E9=80=86=E8=AE=8A=E5=99=A8=E8=A3=9C?= =?UTF-8?q?=E5=84=9F=E5=8A=A0=E5=85=A5log?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- solarApp/Service/procInvSvc.cs | 35 ++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/solarApp/Service/procInvSvc.cs b/solarApp/Service/procInvSvc.cs index 8b2a63b..65243d1 100644 --- a/solarApp/Service/procInvSvc.cs +++ b/solarApp/Service/procInvSvc.cs @@ -48,18 +48,35 @@ namespace solarApp.Service using (MySqlConnection conn = new MySqlConnection(Connection1)) { conn.Open(); + + if (_logger != null) + { + _logger.LogInformation("【ProcInvSvc】開始執行[{0}]在{1}逆變器清除資料表的資料", _siteID, _date1); + } + string sql = @" delete from inverter_history_15min where powerstationID = @powerStationID and DATE_FORMAT(`TIMESTAMP`,'%Y-%m-%d') = @date1; delete from inverter_history_hour where powerstationID = @powerStationID and DATE_FORMAT(`TIMESTAMP`,'%Y-%m-%d') = @date1; delete from inverter_history_day where powerstationID = @powerStationID and DATE_FORMAT(`TIMESTAMP`,'%Y-%m-%d') = @date1; delete from inverter_history_month where powerstationID = @powerStationID and left(`TIMESTAMP`, 7) = left(@date1, 7) ;"; var ds = conn.Execute(sql, new { date1 = _date1, PowerStationID = _powerStationID }); + + if (_logger != null) + { + _logger.LogInformation("【ProcInvSvc】執行完成[{0}]在{1}逆變器清除資料表的資料", _siteID, _date1); + } + conn.Close(); } result = true; } catch (Exception ex) { + if (_logger != null) + { + _logger.LogError("【ProcInvSvc】執行失敗[{0}]在{1}逆變器清除資料表的資料", _siteID, _date1); + _logger.LogError("【ProcInvSvc】執行失敗[{0}]在{1}逆變器清除資料表的資料 - [Exception]:{2}", _siteID, _date1, ex.ToString()); + } throw ex; } return result; @@ -91,6 +108,12 @@ namespace solarApp.Service using (MySqlConnection conn = new MySqlConnection(Connection1)) { conn.Open(); + + if (_logger != null) + { + _logger.LogInformation("【ProcInvSvc】開始執行[{0}]在{1}逆變器取得電站編號", _siteID, _date1); + } + #region 取得 PowerStationID string sql = @" select id , `code` siteID, siteDB, `name` siteName from solar_master.power_station where `code` = @siteID"; @@ -101,6 +124,12 @@ namespace solarApp.Service _siteDB = item.SiteDB; _siteID01 = item.SiteID + "01"; } + + if (_logger != null) + { + _logger.LogInformation("【ProcInvSvc】執行完成[{0}]在{1}逆變器取得電站編號 - {2}", _siteID, _date1, _powerStationID); + } + #endregion conn.Close(); } @@ -108,6 +137,12 @@ namespace solarApp.Service } catch (Exception ex) { + if (_logger != null) + { + _logger.LogError("【ProcInvSvc】執行失敗[{0}]在{1}逆變器取得電站編號", _siteID, _date1); + _logger.LogError("【ProcInvSvc】執行失敗[{0}]在{1}逆變器取得電站編號 - [Exception]:{2}", _siteID, _date1, ex.ToString()); + } + throw ex; } return result; From 5676df94dd8a764391aacb0c318e5f4d30e3183e Mon Sep 17 00:00:00 2001 From: Kai Date: Thu, 11 Nov 2021 13:35:42 +0800 Subject: [PATCH 5/9] =?UTF-8?q?1.=20=E4=BF=AE=E6=94=B9=E9=9B=BB=E7=AB=99?= =?UTF-8?q?=E4=BA=A4=E5=8F=89=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AnalysisStationInfoController.cs | 152 ++++++++----- .../Quartz/Jobs/CalcAvgPowerStationJob.cs | 191 +--------------- .../Quartz/Jobs/OperationScheduleJob.cs | 208 +++++++++++++++++- .../Views/AnalysisStationInfo/Index.cshtml | 16 +- 4 files changed, 322 insertions(+), 245 deletions(-) diff --git a/SolarPower/Controllers/AnalysisStationInfoController.cs b/SolarPower/Controllers/AnalysisStationInfoController.cs index 0937a73..b501802 100644 --- a/SolarPower/Controllers/AnalysisStationInfoController.cs +++ b/SolarPower/Controllers/AnalysisStationInfoController.cs @@ -74,7 +74,7 @@ namespace SolarPower.Controllers temp.Add(powerStation); foreach (var device in psName_Group) { - if(!string.IsNullOrEmpty(device.DeviceId)) + if (!string.IsNullOrEmpty(device.DeviceId)) { temp.Add(device); } @@ -114,13 +114,17 @@ namespace SolarPower.Controllers Dictionary> deviceDic = new Dictionary>(); List meterDic = new List(); List selected_powerStationIds = new List(); + + List powerStationHistories = new List(); + List meterHistories = new List(); + foreach (var psId_Group in device_powerStationId_Group) { var powerStation = await powerStationRepository.GetOneAsync(psId_Group.Key); //區分電站總覽or設備 var temp_psIds = psId_Group.Where(x => x.DeviceType == "PWS").Select(x => Convert.ToInt32(x.DeviceId)).ToList(); - if(temp_psIds.Count() > 0) + if (temp_psIds.Count() > 0) { selected_powerStationIds.AddRange(temp_psIds); } @@ -170,13 +174,39 @@ namespace SolarPower.Controllers var XAxis = new List(); - #region 電站資料 + //針對x軸先進行處理,並同時抓取資料 if (selected_powerStationIds.Count() > 0) { - var powerStationHistories = await powerStationRepository.GetPowerStationHistory(post.SelectedDate, post.SearchType, selected_powerStationIds); + powerStationHistories = await powerStationRepository.GetPowerStationHistory(post.SelectedDate, post.SearchType, selected_powerStationIds); XAxis.AddRange(powerStationHistories.Select(x => x.Timestamp).Distinct().ToList()); + } + if (meterDic.Count() > 0) + { + meterHistories = await powerStationRepository.GetMeterHistory(post.SelectedDate, post.SearchType, meterDic); + XAxis.AddRange(meterHistories.Select(x => x.TIMESTAMP).Distinct().ToList()); + } + if (deviceDic.Count > 0) + { + foreach (var devices in deviceDic) + { + var result = await powerStationRepository.GetSensorAvgByDevices(post.SelectedDate, post.SearchType, devices.Value); + + foreach (var rows in result) + { + var fields = rows as IDictionary; + XAxis.Add(fields["TIMESTAMP"].ToString()); + } + + } + XAxis = XAxis.Distinct().ToList(); + } + XAxis.Sort(); + + #region 電站資料 + if (powerStationHistories.Count() > 0) + { var powerStationHistories_Id_Group = powerStationHistories.GroupBy(x => x.PowerStationId).ToList(); foreach (var item in powerStationHistories_Id_Group) @@ -189,9 +219,11 @@ namespace SolarPower.Controllers Irradiance.Name = string.Format("{0}:{1}", powerStation.Name, analysisDevice.MultipleYaxes["Irradiance"]); Irradiance.YaxesKey = "Irradiance"; Irradiance.Values = new List(); - foreach (var history in temp_item) + foreach (var xa in XAxis) { - if (XAxis.IndexOf(history.Timestamp) > -1) + var history = temp_item.Where(x => xa == x.Timestamp).FirstOrDefault(); + + if (history != null) { Irradiance.Values.Add(history.Irradiance); } @@ -206,11 +238,13 @@ namespace SolarPower.Controllers KWH.Name = string.Format("{0}:{1}", powerStation.Name, analysisDevice.MultipleYaxes["KWH"]); KWH.YaxesKey = "KWH"; KWH.Values = new List(); - foreach (var history in temp_item) + foreach (var xa in XAxis) { - if (XAxis.IndexOf(history.Timestamp) > -1) + var history = temp_item.Where(x => xa == x.Timestamp).FirstOrDefault(); + + if (history != null) { - KWH.Values.Add(Math.Round(history.KWH, 2)); + KWH.Values.Add(history.KWH); } else { @@ -223,9 +257,11 @@ namespace SolarPower.Controllers solarHour.Name = string.Format("{0}:{1}", powerStation.Name, analysisDevice.MultipleYaxes["SolarHour"]); solarHour.YaxesKey = "SolarHour"; solarHour.Values = new List(); - foreach (var history in temp_item) + foreach (var xa in XAxis) { - if (XAxis.IndexOf(history.Timestamp) > -1) + var history = temp_item.Where(x => xa == x.Timestamp).FirstOrDefault(); + + if (history != null) { solarHour.Values.Add(Math.Round(history.SolarHour, 2)); } @@ -240,9 +276,11 @@ namespace SolarPower.Controllers KWHKWP.Name = string.Format("{0}:{1}", powerStation.Name, analysisDevice.MultipleYaxes["KWHKWP"]); KWHKWP.YaxesKey = "KWHKWP"; KWHKWP.Values = new List(); - foreach (var history in temp_item) + foreach (var xa in XAxis) { - if (XAxis.IndexOf(history.Timestamp) > -1) + var history = temp_item.Where(x => xa == x.Timestamp).FirstOrDefault(); + + if (history != null) { KWHKWP.Values.Add(Math.Round(history.KWHKWP, 2)); } @@ -257,9 +295,11 @@ namespace SolarPower.Controllers PR.Name = string.Format("{0}:{1}", powerStation.Name, analysisDevice.MultipleYaxes["PR"]); PR.YaxesKey = "PR"; PR.Values = new List(); - foreach (var history in temp_item) + foreach (var xa in XAxis) { - if (XAxis.IndexOf(history.Timestamp) > -1) + var history = temp_item.Where(x => xa == x.Timestamp).FirstOrDefault(); + + if (history != null) { PR.Values.Add(Math.Round(history.PR, 2)); } @@ -274,9 +314,11 @@ namespace SolarPower.Controllers modelTemperature.Name = string.Format("{0}:{1}", powerStation.Name, analysisDevice.MultipleYaxes["Temperature"]); modelTemperature.YaxesKey = "Temperature"; modelTemperature.Values = new List(); - foreach (var history in temp_item) + foreach (var xa in XAxis) { - if (XAxis.IndexOf(history.Timestamp) > -1) + var history = temp_item.Where(x => xa == x.Timestamp).FirstOrDefault(); + + if (history != null) { modelTemperature.Values.Add(Math.Round(history.Temperature, 2)); } @@ -291,12 +333,8 @@ namespace SolarPower.Controllers #endregion #region 電錶資料 - if (meterDic.Count() > 0) + if (meterHistories.Count() > 0) { - var meterHistories = await powerStationRepository.GetMeterHistory(post.SelectedDate, post.SearchType, meterDic); - - XAxis.AddRange(meterHistories.Select(x => x.TIMESTAMP).Distinct().ToList()); - var meterHistories_Id_Group = meterHistories.GroupBy(x => x.METERID).ToList(); foreach (var item in meterHistories_Id_Group) @@ -307,9 +345,11 @@ namespace SolarPower.Controllers OUTPUT_KWH.Name = string.Format("{0}:{1}", item.Key, analysisDevice.MultipleYaxes["OUTPUT_KWH"]); OUTPUT_KWH.YaxesKey = "OUTPUT_KWH"; OUTPUT_KWH.Values = new List(); - foreach (var history in temp_item) + foreach (var xa in XAxis) { - if (XAxis.IndexOf(history.TIMESTAMP) > -1) + var history = temp_item.Where(x => xa == x.TIMESTAMP).FirstOrDefault(); + + if (history != null) { OUTPUT_KWH.Values.Add(Math.Round(history.OUTPUT_KWH, 2)); } @@ -324,9 +364,11 @@ namespace SolarPower.Controllers INPUT_KWH.Name = string.Format("{0}:{1}", item.Key, analysisDevice.MultipleYaxes["INPUT_KWH"]); INPUT_KWH.YaxesKey = "INPUT_KWH"; INPUT_KWH.Values = new List(); - foreach (var history in temp_item) + foreach (var xa in XAxis) { - if (XAxis.IndexOf(history.TIMESTAMP) > -1) + var history = temp_item.Where(x => xa == x.TIMESTAMP).FirstOrDefault(); + + if (history != null) { INPUT_KWH.Values.Add(Math.Round(history.INPUT_KWH, 2)); } @@ -341,9 +383,11 @@ namespace SolarPower.Controllers V_AB.Name = string.Format("{0}:{1}", item.Key, analysisDevice.MultipleYaxes["V_AB"]); V_AB.YaxesKey = "V_AB"; V_AB.Values = new List(); - foreach (var history in temp_item) + foreach (var xa in XAxis) { - if (XAxis.IndexOf(history.TIMESTAMP) > -1) + var history = temp_item.Where(x => xa == x.TIMESTAMP).FirstOrDefault(); + + if (history != null) { V_AB.Values.Add(Math.Round(history.V_AB, 2)); } @@ -358,9 +402,11 @@ namespace SolarPower.Controllers V_BC.Name = string.Format("{0}:{1}", item.Key, analysisDevice.MultipleYaxes["V_BC"]); V_BC.YaxesKey = "V_BC"; V_BC.Values = new List(); - foreach (var history in temp_item) + foreach (var xa in XAxis) { - if (XAxis.IndexOf(history.TIMESTAMP) > -1) + var history = temp_item.Where(x => xa == x.TIMESTAMP).FirstOrDefault(); + + if (history != null) { V_BC.Values.Add(Math.Round(history.V_BC, 2)); } @@ -375,9 +421,11 @@ namespace SolarPower.Controllers V_CA.Name = string.Format("{0}:{1}", item.Key, analysisDevice.MultipleYaxes["V_BC"]); V_CA.YaxesKey = "V_CA"; V_CA.Values = new List(); - foreach (var history in temp_item) + foreach (var xa in XAxis) { - if (XAxis.IndexOf(history.TIMESTAMP) > -1) + var history = temp_item.Where(x => xa == x.TIMESTAMP).FirstOrDefault(); + + if (history != null) { V_CA.Values.Add(Math.Round(history.V_CA, 2)); } @@ -392,9 +440,11 @@ namespace SolarPower.Controllers I_A.Name = string.Format("{0}:{1}", item.Key, analysisDevice.MultipleYaxes["I_A"]); I_A.YaxesKey = "I_A"; I_A.Values = new List(); - foreach (var history in temp_item) + foreach (var xa in XAxis) { - if (XAxis.IndexOf(history.TIMESTAMP) > -1) + var history = temp_item.Where(x => xa == x.TIMESTAMP).FirstOrDefault(); + + if (history != null) { I_A.Values.Add(Math.Round(history.I_A, 2)); } @@ -409,9 +459,11 @@ namespace SolarPower.Controllers I_B.Name = string.Format("{0}:{1}", item.Key, analysisDevice.MultipleYaxes["I_B"]); I_B.YaxesKey = "I_B"; I_B.Values = new List(); - foreach (var history in temp_item) + foreach (var xa in XAxis) { - if (XAxis.IndexOf(history.TIMESTAMP) > -1) + var history = temp_item.Where(x => xa == x.TIMESTAMP).FirstOrDefault(); + + if (history != null) { I_B.Values.Add(Math.Round(history.I_B, 2)); } @@ -426,9 +478,11 @@ namespace SolarPower.Controllers I_C.Name = string.Format("{0}:{1}", item.Key, analysisDevice.MultipleYaxes["I_C"]); I_C.YaxesKey = "I_C"; I_C.Values = new List(); - foreach (var history in temp_item) + foreach (var xa in XAxis) { - if (XAxis.IndexOf(history.TIMESTAMP) > -1) + var history = temp_item.Where(x => xa == x.TIMESTAMP).FirstOrDefault(); + + if (history != null) { I_C.Values.Add(Math.Round(history.I_C, 2)); } @@ -443,9 +497,11 @@ namespace SolarPower.Controllers P.Name = string.Format("{0}:{1}", item.Key, analysisDevice.MultipleYaxes["P"]); P.YaxesKey = "P"; P.Values = new List(); - foreach (var history in temp_item) + foreach (var xa in XAxis) { - if (XAxis.IndexOf(history.TIMESTAMP) > -1) + var history = temp_item.Where(x => xa == x.TIMESTAMP).FirstOrDefault(); + + if (history != null) { P.Values.Add(Math.Round(history.P, 2)); } @@ -460,9 +516,11 @@ namespace SolarPower.Controllers F.Name = string.Format("{0}:{1}", item.Key, analysisDevice.MultipleYaxes["F"]); F.YaxesKey = "F"; F.Values = new List(); - foreach (var history in temp_item) + foreach (var xa in XAxis) { - if (XAxis.IndexOf(history.TIMESTAMP) > -1) + var history = temp_item.Where(x => xa == x.TIMESTAMP).FirstOrDefault(); + + if (history != null) { F.Values.Add(Math.Round(history.F, 2)); } @@ -483,13 +541,7 @@ namespace SolarPower.Controllers { var result = await powerStationRepository.GetSensorAvgByDevices(post.SelectedDate, post.SearchType, devices.Value); - foreach (var rows in result) - { - var fields = rows as IDictionary; - XAxis.Add(fields["TIMESTAMP"].ToString()); - } - - + var powerStation = await powerStationRepository.GetOneAsync(devices.Key); foreach (var device in devices.Value) { DeviceHistoryInfo deviceHistoryInfo = new DeviceHistoryInfo(); @@ -525,7 +577,7 @@ namespace SolarPower.Controllers suffix = string.Empty; break; } - deviceHistoryInfo.Name = string.Format("{0}:{1}", device.Name, suffix); + deviceHistoryInfo.Name = string.Format("{0}:{1}({2})", powerStation.Name, device.Name, suffix); deviceHistoryInfo.YaxesKey = YaxesKey; deviceHistoryInfo.Values = new List(); foreach (var rows in result) diff --git a/SolarPower/Quartz/Jobs/CalcAvgPowerStationJob.cs b/SolarPower/Quartz/Jobs/CalcAvgPowerStationJob.cs index d210ac6..86c2cbb 100644 --- a/SolarPower/Quartz/Jobs/CalcAvgPowerStationJob.cs +++ b/SolarPower/Quartz/Jobs/CalcAvgPowerStationJob.cs @@ -869,196 +869,7 @@ namespace SolarPower.Quartz.Jobs logger.LogInformation("【CalcAvgPowerStationJob】【執行完成補償機制】"); #endregion - #region 寄送日月報 - var users = userRepository.GetAllAsync(); - var ttt = new List() { - "s506488@gmail.com", - "cesarliuc@gmail.com" - }; - - foreach (var user in users.Result) - { - try - { - logger.LogInformation("【CalcAvgPowerStationJob】【開始產生使用者[{0}({1})]的日月報】", user.Account, user.Name); - - List powerstations = new List(); - powerstations = await noticeScheduleRepository.GetPowerStationOperationPersonnel(user.Id); - if (powerstations.Count == 0) - { - continue; - } - List sentdaypowerstations = powerstations.Where(x => x.EmailDayReport == 1).Select(a => new Excelpowerstation { Name = a.Name, Value = a.PowerStationId.ToString() }).ToList(); - List sentMaxpowerstations = powerstations.Where(x => x.EmailComplexReport == 1).Select(a => new Excelpowerstation { Name = a.Name, Value = a.PowerStationId.ToString() }).ToList(); - - Controllers.StationReportController stationReportController = new Controllers.StationReportController(powerStationRepository, stationReportRepository); - //日報表 - if (sentdaypowerstations.Count != 0) - { - Excel dayexcel = new Excel() - { - FormType = 0, - PowerStation = sentdaypowerstations, - SearchType = 0, - Time = DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd"), - Userid = user.Id - }; - var stationReportName = stationReportController.ExportExcelBackDownload(JsonConvert.SerializeObject(dayexcel, Formatting.Indented)); - if (stationReportName != "") - { - NoticeSchedule DaySchedule = new NoticeSchedule() - { - UserId = user.Id, - EmailType = 0, - RecipientEmail = user.Email, - Subject = "日報表", - Attachment = stationReportName, - RecipientName = user.Name, - Type = 1 - }; - List properties = new List() - { - "UserId", - "EmailType", - "RecipientEmail", - "Subject", - "Attachment", - "RecipientName", - "Type" - }; - await noticeScheduleRepository.AddOneAsync(DaySchedule, properties); - } - } - //綜合報表 每日 - if (sentMaxpowerstations.Count != 0) - { - Select_table2 maxdayexcel = new Select_table2() - { - FormType = 0, - PowerStation = sentMaxpowerstations, - SearchType = 0, - Time = DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd"), - Userid = user.Id - }; - var stationMaxReportName = stationReportController.ExportExcelmaxtableBackDownload(JsonConvert.SerializeObject(maxdayexcel, Formatting.Indented)); - NoticeSchedule MaxSchedule = new NoticeSchedule() - { - UserId = user.Id, - EmailType = 2, - RecipientEmail = user.Email, - Subject = "綜合報表", - Attachment = stationMaxReportName, - RecipientName = user.Name, - Type = 1 - }; - List properties = new List() - { - "UserId", - "EmailType", - "RecipientEmail", - "Subject", - "Attachment", - "RecipientName", - "Type" - }; - await noticeScheduleRepository.AddOneAsync(MaxSchedule, properties); - - if (DateTime.Now.ToString("dd") == "01") - { - Select_table2 maxmonthexcel = new Select_table2() - { - FormType = 0, - PowerStation = sentMaxpowerstations, - SearchType = 0, - Time = DateTime.Now.AddDays(-1).ToString("yyyy-MM"), - Userid = user.Id - }; - var stationReportmaxmonthName = stationReportController.ExportExcelBackDownload(JsonConvert.SerializeObject(maxmonthexcel, Formatting.Indented)); - NoticeSchedule MaxmonthSchedule = new NoticeSchedule() - { - RecipientEmail = user.Email, - Subject = "綜合報表", - Attachment = stationReportmaxmonthName, - RecipientName = user.Name, - Type = 1, - UserId = user.Id, - EmailType = 2 - }; - List properties2 = new List() - { - "UserId", - "EmailType", - "RecipientEmail", - "Subject", - "Attachment", - "RecipientName", - "Type" - }; - await noticeScheduleRepository.AddOneAsync(MaxmonthSchedule, properties2); - } - - } - - if (DateTime.Now.ToString("dd") == "01") - { - List sentmonthpowerstations = powerstations.Where(x => x.EmailMonthReport == 1).Select(a => new Excelpowerstation { Name = a.Name, Value = a.PowerStationId.ToString() }).ToList(); - if (sentmonthpowerstations.Count == 0) - { - break; - } - Excel monthexcel = new Excel() - { - FormType = 1, - PowerStation = sentmonthpowerstations, - SearchType = 2, - Time = DateTime.Now.AddDays(-1).ToString("yyyy-MM"), - Userid = user.Id - }; - var stationReportmonthName = stationReportController.ExportExcelBackDownload(JsonConvert.SerializeObject(monthexcel, Formatting.Indented)); - if (stationReportmonthName != "") - { - NoticeSchedule MonthSchedule = new NoticeSchedule() - { - RecipientEmail = user.Email, - Subject = "月報表", - Attachment = stationReportmonthName, - RecipientName = user.Name, - Type = 1, - UserId = user.Id, - EmailType = 1 - }; - List properties2 = new List() - { - "UserId", - "EmailType", - "RecipientEmail", - "Subject", - "Attachment", - "RecipientName", - "Type" - }; - await noticeScheduleRepository.AddOneAsync(MonthSchedule, properties2); - } - - } - - logger.LogInformation("【CalcAvgPowerStationJob】【產生完成使用者[{0}({1})]的日月報】", user.Account, user.Name); - } - catch (Exception exception) - { - logger.LogError("【CalcAvgPowerStationJob】【產生失敗使用者[{0}({1})]的日月報】", user.Account, user.Name); - logger.LogError("【CalcAvgPowerStationJob】[Exception] - {0}", exception.Message); - if (exception.InnerException != null) - { - logger.LogError("【CalcAvgPowerStationJob】[InnerException] - {0}", exception.InnerException.Message); - } - - var line = new StackTrace(exception, true).GetFrame(0).GetFileLineNumber(); - logger.LogError("【CalcAvgPowerStationJob】[錯誤行數] - {0}", line); - } - } - - #endregion + logger.LogInformation("【CalcAvgPowerStationJob】【任務完成】"); diff --git a/SolarPower/Quartz/Jobs/OperationScheduleJob.cs b/SolarPower/Quartz/Jobs/OperationScheduleJob.cs index cba78bf..b1a9027 100644 --- a/SolarPower/Quartz/Jobs/OperationScheduleJob.cs +++ b/SolarPower/Quartz/Jobs/OperationScheduleJob.cs @@ -1,9 +1,11 @@ using Microsoft.Extensions.Logging; +using Newtonsoft.Json; using Quartz; using SolarPower.Models; using SolarPower.Repository.Interface; using System; using System.Collections.Generic; +using System.Diagnostics; using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -15,11 +17,24 @@ namespace SolarPower.Quartz.Jobs { private readonly ILogger logger; private IOperationRepository operationRepository; + private readonly IPowerStationRepository powerStationRepository; + private readonly IUserRepository userRepository; + private readonly INoticeScheduleRepository noticeScheduleRepository; + private readonly IStationReportRepository stationReportRepository; - public OperationScheduleJob(ILogger logger, IOperationRepository operationRepository) + public OperationScheduleJob(ILogger logger, + IOperationRepository operationRepository, + IPowerStationRepository powerStationRepository, + IUserRepository userRepository, + INoticeScheduleRepository noticeScheduleRepository, + IStationReportRepository stationReportRepository) { this.logger = logger; this.operationRepository = operationRepository; + this.powerStationRepository = powerStationRepository; + this.userRepository = userRepository; + this.noticeScheduleRepository = noticeScheduleRepository; + this.stationReportRepository = stationReportRepository; } public async Task Execute(IJobExecutionContext context) @@ -180,6 +195,197 @@ namespace SolarPower.Quartz.Jobs } + + #region 寄送日月報 + var users = userRepository.GetAllAsync(); + var ttt = new List() { + "s506488@gmail.com", + "cesarliuc@gmail.com" + }; + + foreach (var user in users.Result) + { + try + { + logger.LogInformation("【OperationScheduleJob】【開始產生使用者[{0}({1})]的日月報】", user.Account, user.Name); + + List powerstations = new List(); + powerstations = await noticeScheduleRepository.GetPowerStationOperationPersonnel(user.Id); + if (powerstations.Count == 0) + { + continue; + } + List sentdaypowerstations = powerstations.Where(x => x.EmailDayReport == 1).Select(a => new Excelpowerstation { Name = a.Name, Value = a.PowerStationId.ToString() }).ToList(); + List sentMaxpowerstations = powerstations.Where(x => x.EmailComplexReport == 1).Select(a => new Excelpowerstation { Name = a.Name, Value = a.PowerStationId.ToString() }).ToList(); + + Controllers.StationReportController stationReportController = new Controllers.StationReportController(powerStationRepository, stationReportRepository); + //日報表 + if (sentdaypowerstations.Count != 0) + { + Excel dayexcel = new Excel() + { + FormType = 0, + PowerStation = sentdaypowerstations, + SearchType = 0, + Time = DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd"), + Userid = user.Id + }; + var stationReportName = stationReportController.ExportExcelBackDownload(JsonConvert.SerializeObject(dayexcel, Formatting.Indented)); + if (stationReportName != "") + { + NoticeSchedule DaySchedule = new NoticeSchedule() + { + UserId = user.Id, + EmailType = 0, + RecipientEmail = user.Email, + Subject = "日報表", + Attachment = stationReportName, + RecipientName = user.Name, + Type = 1 + }; + List properties = new List() + { + "UserId", + "EmailType", + "RecipientEmail", + "Subject", + "Attachment", + "RecipientName", + "Type" + }; + await noticeScheduleRepository.AddOneAsync(DaySchedule, properties); + } + } + //綜合報表 每日 + if (sentMaxpowerstations.Count != 0) + { + Select_table2 maxdayexcel = new Select_table2() + { + FormType = 0, + PowerStation = sentMaxpowerstations, + SearchType = 0, + Time = DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd"), + Userid = user.Id + }; + var stationMaxReportName = stationReportController.ExportExcelmaxtableBackDownload(JsonConvert.SerializeObject(maxdayexcel, Formatting.Indented)); + NoticeSchedule MaxSchedule = new NoticeSchedule() + { + UserId = user.Id, + EmailType = 2, + RecipientEmail = user.Email, + Subject = "綜合報表", + Attachment = stationMaxReportName, + RecipientName = user.Name, + Type = 1 + }; + List properties = new List() + { + "UserId", + "EmailType", + "RecipientEmail", + "Subject", + "Attachment", + "RecipientName", + "Type" + }; + await noticeScheduleRepository.AddOneAsync(MaxSchedule, properties); + + if (DateTime.Now.ToString("dd") == "01") + { + Select_table2 maxmonthexcel = new Select_table2() + { + FormType = 0, + PowerStation = sentMaxpowerstations, + SearchType = 0, + Time = DateTime.Now.AddDays(-1).ToString("yyyy-MM"), + Userid = user.Id + }; + var stationReportmaxmonthName = stationReportController.ExportExcelBackDownload(JsonConvert.SerializeObject(maxmonthexcel, Formatting.Indented)); + NoticeSchedule MaxmonthSchedule = new NoticeSchedule() + { + RecipientEmail = user.Email, + Subject = "綜合報表", + Attachment = stationReportmaxmonthName, + RecipientName = user.Name, + Type = 1, + UserId = user.Id, + EmailType = 2 + }; + List properties2 = new List() + { + "UserId", + "EmailType", + "RecipientEmail", + "Subject", + "Attachment", + "RecipientName", + "Type" + }; + await noticeScheduleRepository.AddOneAsync(MaxmonthSchedule, properties2); + } + + } + + if (DateTime.Now.ToString("dd") == "01") + { + List sentmonthpowerstations = powerstations.Where(x => x.EmailMonthReport == 1).Select(a => new Excelpowerstation { Name = a.Name, Value = a.PowerStationId.ToString() }).ToList(); + if (sentmonthpowerstations.Count == 0) + { + break; + } + Excel monthexcel = new Excel() + { + FormType = 1, + PowerStation = sentmonthpowerstations, + SearchType = 2, + Time = DateTime.Now.AddDays(-1).ToString("yyyy-MM"), + Userid = user.Id + }; + var stationReportmonthName = stationReportController.ExportExcelBackDownload(JsonConvert.SerializeObject(monthexcel, Formatting.Indented)); + if (stationReportmonthName != "") + { + NoticeSchedule MonthSchedule = new NoticeSchedule() + { + RecipientEmail = user.Email, + Subject = "月報表", + Attachment = stationReportmonthName, + RecipientName = user.Name, + Type = 1, + UserId = user.Id, + EmailType = 1 + }; + List properties2 = new List() + { + "UserId", + "EmailType", + "RecipientEmail", + "Subject", + "Attachment", + "RecipientName", + "Type" + }; + await noticeScheduleRepository.AddOneAsync(MonthSchedule, properties2); + } + + } + + logger.LogInformation("【OperationScheduleJob】【產生完成使用者[{0}({1})]的日月報】", user.Account, user.Name); + } + catch (Exception exception) + { + logger.LogError("【OperationScheduleJob】【產生失敗使用者[{0}({1})]的日月報】", user.Account, user.Name); + logger.LogError("【OperationScheduleJob】[Exception] - {0}", exception.Message); + if (exception.InnerException != null) + { + logger.LogError("【OperationScheduleJob】[InnerException] - {0}", exception.InnerException.Message); + } + + var line = new StackTrace(exception, true).GetFrame(0).GetFileLineNumber(); + logger.LogError("【OperationScheduleJob】[錯誤行數] - {0}", line); + } + } + + #endregion } catch (Exception exception) { diff --git a/SolarPower/Views/AnalysisStationInfo/Index.cshtml b/SolarPower/Views/AnalysisStationInfo/Index.cshtml index e013ce5..d473a10 100644 --- a/SolarPower/Views/AnalysisStationInfo/Index.cshtml +++ b/SolarPower/Views/AnalysisStationInfo/Index.cshtml @@ -67,7 +67,7 @@
- + @**@
@@ -625,6 +625,13 @@ DeviceIdInfos: selected_device } + if (selected_device.length <= 0) { + toast_warning("請至少選擇一設備"); + return; + } + + $("#btn-analysis-stationinfo").html('').attr("disabled", true); + $.post(url, send_data, function (rel) { if (rel.code != "0000") { toast_error(rel.msg); @@ -641,6 +648,9 @@ $('input[name="compare_col[]"]').trigger('change'); + ReloadHighCharts() + $("#btn-analysis-stationinfo").html('查詢').attr("disabled", false); + }, 'json'); } @@ -710,9 +720,7 @@ height: 600, animation: false }, - title: { - text: '交叉分析圖表' - }, + title: false, tooltip: { formatter: function () { return '' + this.series.name + '
' + From 478e49f4c2b7bb0af6d1f4d55cab417e17a8b68a Mon Sep 17 00:00:00 2001 From: Kai Date: Thu, 11 Nov 2021 13:36:37 +0800 Subject: [PATCH 6/9] =?UTF-8?q?1.=20=E4=BF=AE=E6=94=B9=E9=9B=BB=E7=AB=99?= =?UTF-8?q?=E4=BA=A4=E5=8F=89=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SolarPower/Controllers/AnalysisStationInfoController.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/SolarPower/Controllers/AnalysisStationInfoController.cs b/SolarPower/Controllers/AnalysisStationInfoController.cs index b501802..c1dc71c 100644 --- a/SolarPower/Controllers/AnalysisStationInfoController.cs +++ b/SolarPower/Controllers/AnalysisStationInfoController.cs @@ -598,8 +598,6 @@ namespace SolarPower.Controllers } #endregion - analysisDevice.XAxis = XAxis.Distinct().ToList(); - apiResult.Code = "0000"; apiResult.Data = analysisDevice; From 8d20c0ca5424a6c9bae0938deb76c8dcae21acbc Mon Sep 17 00:00:00 2001 From: Kai Date: Thu, 11 Nov 2021 14:11:59 +0800 Subject: [PATCH 7/9] =?UTF-8?q?1.=20=E4=BF=AE=E6=94=B9=E9=9B=BB=E7=AB=99?= =?UTF-8?q?=E4=BA=A4=E5=8F=89=E5=88=86=E6=9E=90=202.=20=E4=BF=AE=E6=94=B9a?= =?UTF-8?q?ppsettings?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SolarPower/Controllers/AnalysisStationInfoController.cs | 3 ++- SolarPower/appsettings.Development.json | 2 +- SolarPower/appsettings.json | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/SolarPower/Controllers/AnalysisStationInfoController.cs b/SolarPower/Controllers/AnalysisStationInfoController.cs index c1dc71c..06a9ea5 100644 --- a/SolarPower/Controllers/AnalysisStationInfoController.cs +++ b/SolarPower/Controllers/AnalysisStationInfoController.cs @@ -204,6 +204,8 @@ namespace SolarPower.Controllers } XAxis.Sort(); + analysisDevice.XAxis = XAxis; + #region 電站資料 if (powerStationHistories.Count() > 0) { @@ -599,7 +601,6 @@ namespace SolarPower.Controllers #endregion apiResult.Code = "0000"; - apiResult.Data = analysisDevice; } catch (Exception exception) diff --git a/SolarPower/appsettings.Development.json b/SolarPower/appsettings.Development.json index a50b12a..01634b4 100644 --- a/SolarPower/appsettings.Development.json +++ b/SolarPower/appsettings.Development.json @@ -26,7 +26,7 @@ "BackgroundServiceCron": { "CalcPowerStationJob": "0 5 * * * ?", "CalcAvgPowerStationJob": "0 0 2 * * ?", - "OperationScheduleJob": "0 0 2 * * ?", + "OperationScheduleJob": "0 0 8 * * ?", "CalcInverter15minJob": "0 2/15 * * * ?", "SendEmailJob": "0 0/5 * * * ?", "ExceptionSchedule": "0 0/5 * * * ?" diff --git a/SolarPower/appsettings.json b/SolarPower/appsettings.json index e8efcfa..7c7e91c 100644 --- a/SolarPower/appsettings.json +++ b/SolarPower/appsettings.json @@ -27,7 +27,7 @@ "BackgroundServiceCron": { "CalcPowerStationJob": "0 5 * * * ?", "CalcAvgPowerStationJob": "0 0 2 * * ?", - "OperationScheduleJob": "0 0 2 * * ?", + "OperationScheduleJob": "0 0 8 * * ?", "CalcInverter15minJob": "0 2/15 * * * ?", "SendEmailJob": "0 0/5 * * * ?", "ExceptionSchedule": "0 0/5 * * * ?" From dcca7c4afcef847f2592e0c41dea85be7b27d645 Mon Sep 17 00:00:00 2001 From: Kai Date: Thu, 11 Nov 2021 18:11:45 +0800 Subject: [PATCH 8/9] =?UTF-8?q?1.=20=E9=80=86=E8=AE=8A=E5=99=A8=E4=BA=A4?= =?UTF-8?q?=E5=8F=89=E5=88=86=E6=9E=90bug=20fix=202.=20=E5=9C=B0=E5=9C=96?= =?UTF-8?q?=E7=B8=BD=E8=A6=BD=E6=89=8B=E6=A9=9F=E7=89=88=203.=20=E9=9B=BB?= =?UTF-8?q?=E7=AB=99=E4=BA=A4=E5=8F=89=E5=88=86=E6=9E=90=20=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=E6=97=A5=E7=85=A7=E3=80=81=E6=A8=A1=E7=B5=84=E6=BA=AB?= =?UTF-8?q?=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AnalysisStationInfoController.cs | 68 +++++++++---------- .../Implement/StationReportRepository.cs | 4 +- .../Views/AnalysisInverter/Index.cshtml | 13 ++-- .../Views/AnalysisStationInfo/Index.cshtml | 4 +- SolarPower/Views/MapOverview/Index.cshtml | 10 +-- 5 files changed, 50 insertions(+), 49 deletions(-) diff --git a/SolarPower/Controllers/AnalysisStationInfoController.cs b/SolarPower/Controllers/AnalysisStationInfoController.cs index 06a9ea5..bf7831f 100644 --- a/SolarPower/Controllers/AnalysisStationInfoController.cs +++ b/SolarPower/Controllers/AnalysisStationInfoController.cs @@ -217,24 +217,24 @@ namespace SolarPower.Controllers var temp_item = item.OrderBy(x => x.Timestamp).ToList(); - DeviceHistoryInfo Irradiance = new DeviceHistoryInfo(); - Irradiance.Name = string.Format("{0}:{1}", powerStation.Name, analysisDevice.MultipleYaxes["Irradiance"]); - Irradiance.YaxesKey = "Irradiance"; - Irradiance.Values = new List(); - foreach (var xa in XAxis) - { - var history = temp_item.Where(x => xa == x.Timestamp).FirstOrDefault(); + //DeviceHistoryInfo Irradiance = new DeviceHistoryInfo(); + //Irradiance.Name = string.Format("{0}:{1}", powerStation.Name, analysisDevice.MultipleYaxes["Irradiance"]); + //Irradiance.YaxesKey = "Irradiance"; + //Irradiance.Values = new List(); + //foreach (var xa in XAxis) + //{ + // var history = temp_item.Where(x => xa == x.Timestamp).FirstOrDefault(); - if (history != null) - { - Irradiance.Values.Add(history.Irradiance); - } - else - { - Irradiance.Values.Add(0); - } - } - analysisDevice.Series.Add(Irradiance); + // if (history != null) + // { + // Irradiance.Values.Add(history.Irradiance); + // } + // else + // { + // Irradiance.Values.Add(0); + // } + //} + //analysisDevice.Series.Add(Irradiance); DeviceHistoryInfo KWH = new DeviceHistoryInfo(); KWH.Name = string.Format("{0}:{1}", powerStation.Name, analysisDevice.MultipleYaxes["KWH"]); @@ -312,24 +312,24 @@ namespace SolarPower.Controllers } analysisDevice.Series.Add(PR); - DeviceHistoryInfo modelTemperature = new DeviceHistoryInfo(); - modelTemperature.Name = string.Format("{0}:{1}", powerStation.Name, analysisDevice.MultipleYaxes["Temperature"]); - modelTemperature.YaxesKey = "Temperature"; - modelTemperature.Values = new List(); - foreach (var xa in XAxis) - { - var history = temp_item.Where(x => xa == x.Timestamp).FirstOrDefault(); + //DeviceHistoryInfo modelTemperature = new DeviceHistoryInfo(); + //modelTemperature.Name = string.Format("{0}:{1}", powerStation.Name, analysisDevice.MultipleYaxes["Temperature"]); + //modelTemperature.YaxesKey = "Temperature"; + //modelTemperature.Values = new List(); + //foreach (var xa in XAxis) + //{ + // var history = temp_item.Where(x => xa == x.Timestamp).FirstOrDefault(); - if (history != null) - { - modelTemperature.Values.Add(Math.Round(history.Temperature, 2)); - } - else - { - modelTemperature.Values.Add(0); - } - } - analysisDevice.Series.Add(modelTemperature); + // if (history != null) + // { + // modelTemperature.Values.Add(Math.Round(history.Temperature, 2)); + // } + // else + // { + // modelTemperature.Values.Add(0); + // } + //} + //analysisDevice.Series.Add(modelTemperature); } } #endregion diff --git a/SolarPower/Repository/Implement/StationReportRepository.cs b/SolarPower/Repository/Implement/StationReportRepository.cs index 00adb1f..392de79 100644 --- a/SolarPower/Repository/Implement/StationReportRepository.cs +++ b/SolarPower/Repository/Implement/StationReportRepository.cs @@ -80,10 +80,10 @@ namespace SolarPower.Repository.Implement ) c on a.powerStationid = c.powerStationid and DATE_FORMAT(a.`TIMESTAMP`,''%Y-%m-%d'') = c.report_date left join ( - select powerStationID, DATE_FORMAT(TIMESTAMP,''%Y-%m-%d %H:%i'')report_date, irradiance, Temperature + select powerStationID, DATE_FORMAT(TIMESTAMP,''%Y-%m-%d %H:00'')report_date, irradiance, Temperature from sensor_history_hour where powerstationid = {post.PowerStation} and DATE_FORMAT(`TIMESTAMP`,''%Y-%m-%d'') = ''{post.Time}'' - ) d on a.powerStationid = d.powerStationid and DATE_FORMAT(a.TIMESTAMP,''%Y-%m-%d %H:%i'') = d.report_date + ) d on a.powerStationid = d.powerStationid and DATE_FORMAT(a.TIMESTAMP,''%Y-%m-%d %H:00'') = d.report_date join ( select id, name stationName, powerRate from power_station where id = {post.PowerStation} diff --git a/SolarPower/Views/AnalysisInverter/Index.cshtml b/SolarPower/Views/AnalysisInverter/Index.cshtml index cc4e6a2..efb5c7e 100644 --- a/SolarPower/Views/AnalysisInverter/Index.cshtml +++ b/SolarPower/Views/AnalysisInverter/Index.cshtml @@ -388,15 +388,16 @@ }); $('#js_list_accordion').on("change", 'input[name="selectedInverterId[]"]', function (event) { + var powerStationId = $(this).attr('data-power-station-id'); + if (this.checked) { - if ($.inArray(this.value, selected_inverter) < 0) { - var powerStationId = $(this).attr('data-power-station-id'); - selected_inverter.push({ powerStationId: powerStationId, InverterId: this.value }); + if ($.map(selected_inverter, function (item, index) { return item.InverterId }).indexOf(this.value) < 0) { + selected_inverter.push({ 'powerStationId': powerStationId, 'InverterId': this.value }); } } else { - if ($.inArray(this.value, selected_inverter) > -1) { - var powerStationId = $(this).attr('data-power-station-id'); - selected_inverter.splice($.inArray({ powerStationId: powerStationId, InverterId: this.value }, selected_inverter), 1); + var result = $.map(selected_inverter, function (item, index) { return item.InverterId }).indexOf(this.value) + if (result > -1) { + selected_inverter.splice(result, 1); } } }); diff --git a/SolarPower/Views/AnalysisStationInfo/Index.cshtml b/SolarPower/Views/AnalysisStationInfo/Index.cshtml index d473a10..2a4cd73 100644 --- a/SolarPower/Views/AnalysisStationInfo/Index.cshtml +++ b/SolarPower/Views/AnalysisStationInfo/Index.cshtml @@ -123,10 +123,10 @@ var selected_device = []; var PWS_compare_col = [ { key: "KWH", title: "發電量", default: true }, - { key: "Irradiance", title: "日照度", default: false }, + @*{ key: "Irradiance", title: "日照度", default: false },*@ { key: "KWHKWP", title: "有效日照時數", default: false }, { key: "PR", title: "PR %", default: false }, - { key: "Temperature", title: "模組溫度", default: false }, + @*{ key: "Temperature", title: "模組溫度", default: false },*@ { key: "SolarHour", title: "日照小時", default: false }, ] var PWR_compare_col = [ diff --git a/SolarPower/Views/MapOverview/Index.cshtml b/SolarPower/Views/MapOverview/Index.cshtml index 3af9f0e..4f33c0e 100644 --- a/SolarPower/Views/MapOverview/Index.cshtml +++ b/SolarPower/Views/MapOverview/Index.cshtml @@ -97,7 +97,7 @@
-
+

電站分佈圖

@@ -111,9 +111,9 @@
-
+
-
+

電站總數

@@ -125,7 +125,7 @@
-
+

總裝置容量

@@ -136,7 +136,7 @@
-
+

電站分佈小計

From c6ea225956e0071cad90407d96e9c2d524cffecc Mon Sep 17 00:00:00 2001 From: Kai Date: Tue, 16 Nov 2021 13:53:29 +0800 Subject: [PATCH 9/9] =?UTF-8?q?1.=20inv=E3=80=81sensor=5Favg=20=E8=87=AA?= =?UTF-8?q?=E5=8B=95=E5=8A=A0=E5=85=A5=E6=AC=84=E4=BD=8D=202.=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E9=80=86=E8=AE=8A=E5=99=A8=E6=AD=B8=E6=AA=94sql?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/PowerStationController.cs | 14 ++ .../Implement/PowerStationRepository.cs | 159 ++++++++++++++++-- .../Interface/IPowerStationRepository.cs | 4 + 3 files changed, 160 insertions(+), 17 deletions(-) diff --git a/SolarPower/Controllers/PowerStationController.cs b/SolarPower/Controllers/PowerStationController.cs index 5482d63..0fdab4a 100644 --- a/SolarPower/Controllers/PowerStationController.cs +++ b/SolarPower/Controllers/PowerStationController.cs @@ -3289,6 +3289,20 @@ namespace SolarPower.Controllers } else { + //檢查資料表是否有該欄位 + var check_inv_col = await powerStationRepository.CheckInvTableColumn(powerStation.SiteDB, powerStation.Code); + var check_sensor_avg_col = await powerStationRepository.CheckSensorAvgTableColumn(powerStation.SiteDB, powerStation.Code); + + if (check_inv_col != 1) + { + await powerStationRepository.AlertColInvTableColumn(powerStation.SiteDB, powerStation.Code); + } + + if (check_sensor_avg_col != 1) + { + await powerStationRepository.AlertColSensoravgTableColumn(powerStation.SiteDB, powerStation.Code); + } + await powerStationRepository.StationStatus(Id, 1); await powerStationRepository.StationStatus(Id, 1, powerStation.SiteDB + "."); apiResult.Msg = "電站啟用成功"; diff --git a/SolarPower/Repository/Implement/PowerStationRepository.cs b/SolarPower/Repository/Implement/PowerStationRepository.cs index bfd4377..f748416 100644 --- a/SolarPower/Repository/Implement/PowerStationRepository.cs +++ b/SolarPower/Repository/Implement/PowerStationRepository.cs @@ -2890,19 +2890,20 @@ namespace SolarPower.Repository.Implement var sql = $@"SELECT s.TIMESTAMP, s.INVERTERID, - a.KWH, + s.KWH, s.TODAYKWH, i.Capacity, - a.KWH/(i.Capacity/4) AS KWHKWP + s.KWH/(i.Capacity/4) AS KWHKWP FROM (SELECT MAX(FROM_UNIXTIME(sub_inv.TIMESTAMP/1000, '%Y-%m-%d %H:%i')) AS TIMESTAMP, sub_inv.INVERTERID, + SUM(sub_inv.WH)/1000 AS KWH, MAX(sub_inv.TODAYKWH) AS TODAYKWH FROM {table_name} sub_inv WHERE FROM_UNIXTIME(sub_inv.TIMESTAMP/1000, '%Y-%m-%d %H:%i') BETWEEN @StartDateTime AND @EndDateTime AND sub_inv.INVERTERID IN @InverterIds GROUP BY sub_inv.INVERTERID) s - LEFT JOIN ( + /*LEFT JOIN ( SELECT MAX(FROM_UNIXTIME(sub_inv.TIMESTAMP/1000, '%Y-%m-%d %H:%i')) AS TIMESTAMP, sub_inv.INVERTERID, SUM(sub_inv.WH)/1000 AS KWH @@ -2910,10 +2911,10 @@ namespace SolarPower.Repository.Implement WHERE FROM_UNIXTIME(sub_inv.TIMESTAMP/1000, '%Y-%m-%d %H:%i') BETWEEN @StartDateTime AND @EndDateTime AND sub_inv.INVERTERID IN @InverterIds GROUP BY sub_inv.INVERTERID) a - ON s.TIMESTAMP = a.TIMESTAMP AND s.INVERTERID = a. INVERTERID + ON s.TIMESTAMP = a.TIMESTAMP AND s.INVERTERID = a. INVERTERID*/ LEFT JOIN {db_name}.inverter i ON s.INVERTERID = REPLACE(i.InverterId, 's', '');"; - result = (await conn.QueryAsync(sql, new { StartDateTime = stratDateTime, EndDateTime = dateTime, InverterIds = inverterIds })).ToList(); + result = (await conn.QueryAsync(sql, new { StartDateTime = stratDateTime, EndDateTime = dateTime, InverterIds = inverterIds }, commandTimeout: 300)).ToList(); } catch (Exception exception) { @@ -3008,14 +3009,14 @@ namespace SolarPower.Repository.Implement AVG(s.RA3) AS RA3, AVG(s.RA4) AS RA4, AVG(s.RA5) AS RA5, - a.KWH, + SUM(s.WH)/1000 AS KWH, MAX(s.TODAYKWH) AS TODAYKWH, MAX(s.TOTALKWH) AS TOTALKWH, i.Capacity, - (a.KWH/i.Capacity) AS KWHKWP + ((SUM(s.WH)/1000) / i.Capacity) AS KWHKWP FROM {table_name} s -- 取得該時間區間的KWH - LEFT JOIN ( + /*LEFT JOIN ( SELECT FROM_UNIXTIME(inv.TIMESTAMP/1000, '%Y-%m-%d %H') AS TIMESTAMP, inv.INVERTERID, @@ -3024,26 +3025,26 @@ namespace SolarPower.Repository.Implement WHERE DATE_FORMAT(FROM_UNIXTIME(inv.TIMESTAMP/1000), '%Y-%m-%d %H') = @DateTime AND inv.INVERTERID IN @InverterIds GROUP BY FROM_UNIXTIME(inv.TIMESTAMP/1000, '%Y-%m-%d %H'), inv.INVERTERID) a - ON FROM_UNIXTIME(s.TIMESTAMP/1000, '%Y-%m-%d %H') = a.TIMESTAMP AND s.INVERTERID = a. INVERTERID + ON FROM_UNIXTIME(s.TIMESTAMP/1000, '%Y-%m-%d %H') = a.TIMESTAMP AND s.INVERTERID = a. INVERTERID*/ -- 取得整點值PR LEFT JOIN ( SELECT - FROM_UNIXTIME(inv.TIMESTAMP/1000, '%Y-%m-%d %H') AS TIMESTAMP, + inv.CrdTime AS TIMESTAMP, inv.INVERTERID, inv.PR FROM {table_name} inv - WHERE DATE_FORMAT(FROM_UNIXTIME(inv.TIMESTAMP/1000), '%Y-%m-%d %H:%i') = CONCAT(@DateTime, ':55') + WHERE left(inv.CrdTime, 16) = CONCAT(@DateTime, ':55') AND inv.INVERTERID IN @InverterIds - GROUP BY FROM_UNIXTIME(inv.TIMESTAMP/1000, '%Y-%m-%d %H'), inv.INVERTERID) inv_pr - ON FROM_UNIXTIME(s.TIMESTAMP/1000, '%Y-%m-%d %H') = inv_pr.TIMESTAMP AND s.INVERTERID = inv_pr. INVERTERID + GROUP BY left(inv.CrdTime, 13), inv.INVERTERID) inv_pr + ON left(s.CrdTime, 13) = inv_pr.TIMESTAMP AND s.INVERTERID = inv_pr. INVERTERID -- 取得逆變器容量 LEFT JOIN {db_name}.inverter i ON s.INVERTERID = i.InverterId - WHERE FROM_UNIXTIME(s.TIMESTAMP/1000, '%Y-%m-%d %H') = @DateTime + WHERE left(s.CrdTime, 13) = @DateTime AND s.INVERTERID IN @InverterIds - GROUP BY DATE_FORMAT(FROM_UNIXTIME(s.TIMESTAMP/1000), '%Y-%m-%d %H'), s.INVERTERID + GROUP BY left(s.CrdTime, 13), s.INVERTERID "; - result = (await conn.QueryAsync(sql, new { DateTime = dateTime, InverterIds = inverterIds })).ToList(); + result = (await conn.QueryAsync(sql, new { DateTime = dateTime, InverterIds = inverterIds }, commandTimeout: 300)).ToList(); } catch (Exception exception) { @@ -4467,7 +4468,7 @@ namespace SolarPower.Repository.Implement inv.RA5 FROM {table_name} inv LEFT JOIN (select * from {sensor_table_name} where TIMESTAMP between @start_timestamp and @end_timestamp)sen - ON FROM_UNIXTIME(inv.TIMESTAMP/1000, '%Y-%m-%d %H:%i') = FROM_UNIXTIME(sen.TIMESTAMP/1000, '%Y-%m-%d %H:%i') + ON inv.CrdTime = sen.CrdTime -- LEFT JOIN {sensor_table_name} sen ON FROM_UNIXTIME(inv.TIMESTAMP/1000, '%Y-%m-%d %H:%i') = FROM_UNIXTIME(sen.TIMESTAMP/1000, '%Y-%m-%d %H:%i') LEFT JOIN {entity.SiteDB}.inverter i ON inv.INVERTERID = i.InverterId WHERE inv.`TIMESTAMP` between @start_timestamp and @end_timestamp @@ -5837,5 +5838,129 @@ namespace SolarPower.Repository.Implement return resule; } } + + public async Task CheckInvTableColumn (string dbname, string code) + { + + using (IDbConnection conn = this._databaseHelper.GetConnection()) + { + conn.Open(); + + var resule = 0; + try + { + var sql = $@"SELECT count(*) FROM information_schema.columns WHERE table_schema='{dbname}' AND table_name = 's{code}01_inv' AND column_name = 'CrdTime'"; + resule = await conn.QueryFirstOrDefaultAsync(sql); + + } + catch (Exception exception) + { + throw exception; + } + finally + { + conn.Close(); + } + + return resule; + } + } + + public async Task CheckSensorAvgTableColumn(string dbname, string code) + { + + using (IDbConnection conn = this._databaseHelper.GetConnection()) + { + conn.Open(); + + var resule = 0; + try + { + var sql = $@"SELECT count(*) FROM information_schema.columns WHERE table_schema='{dbname}' AND table_name = 's{code}01_sensoravg' AND column_name = 'CrdTime'"; + resule = await conn.QueryFirstOrDefaultAsync(sql); + } + catch (Exception exception) + { + throw exception; + } + finally + { + conn.Close(); + } + + return resule; + } + } + + public async Task AlertColInvTableColumn(string dbname, string code) + { + using (IDbConnection conn = this._databaseHelper.GetConnection()) + { + conn.Open(); + + try + { + var sql = $@"ALTER TABLE {dbname}.s{code}01_inv ADD COLUMN CrdTime datetime; + use {dbname}; + create trigger trg01_s{code}01_inv + before insert on {dbname}.s{code}01_inv + FOR EACH ROW + begin + set new.CrdTime = FROM_UNIXTIME(new.`TIMESTAMP`/1000,'%Y-%m-%d %H:%i'); + end; + use solar_master; + + update {dbname}.s{code}01_inv set crdtime = FROM_UNIXTIME(`TIMESTAMP`/1000,'%Y-%m-%d %H:%i'); + + CREATE INDEX IDX02_s{code}01 ON {dbname}.s{code}01_inv(Inverterid, CrdTime);"; + + await conn.ExecuteAsync(sql); + } + catch (Exception exception) + { + throw exception; + } + finally + { + conn.Close(); + } + + } + } + + public async Task AlertColSensoravgTableColumn(string dbname, string code) + { + using (IDbConnection conn = this._databaseHelper.GetConnection()) + { + conn.Open(); + + try + { + var sql = $@"ALTER TABLE {dbname}.s{code}01_sensoravg ADD COLUMN CrdTime datetime; + use {dbname}; + create trigger trg01_s{code}01_sensoravg + before insert on {dbname}.s{code}01_sensoravg + FOR EACH ROW + begin + set new.CrdTime = FROM_UNIXTIME(new.`TIMESTAMP`/1000,'%Y-%m-%d %H:%i'); + end; + use solar_master; + + update {dbname}.s{code}01_sensoravg set crdtime = FROM_UNIXTIME(`TIMESTAMP`/1000,'%Y-%m-%d %H:%i'); + + CREATE INDEX IDX{code}01_sensoravg ON {dbname}.s{code}01_sensoravg(CrdTime);"; + await conn.ExecuteAsync(sql); + } + catch (Exception exception) + { + throw exception; + } + finally + { + conn.Close(); + } + + } + } } } diff --git a/SolarPower/Repository/Interface/IPowerStationRepository.cs b/SolarPower/Repository/Interface/IPowerStationRepository.cs index 2672704..5aed3fe 100644 --- a/SolarPower/Repository/Interface/IPowerStationRepository.cs +++ b/SolarPower/Repository/Interface/IPowerStationRepository.cs @@ -608,5 +608,9 @@ namespace SolarPower.Repository.Interface Task UpdateInvStatus(string siteDB, List codes, List inverterIds = null, byte status = 0); Task> GetInvStatusErr(List codes); Task Check4table(string code, string dbname); + Task CheckInvTableColumn(string dbname, string code); + Task CheckSensorAvgTableColumn(string dbname, string code); + Task AlertColInvTableColumn(string dbname, string code); + Task AlertColSensoravgTableColumn(string dbname, string code); } }