using System; using System.Collections.Generic; using System.Text; using MySql.Data.MySqlClient; using Dapper; using solarApp.Model; using System.Configuration; using System.Threading.Tasks; //using Microsoft.Extensions.Logging; using Serilog; using Serilog.Events; //using solarApp.Service.proArchiveLog; namespace solarApp.Service { public class procInvSvc { string Connection1 = string.Empty; private ILogger logger = Log.ForContext(); public procInvSvc(string Connection_parame = null) { if (!string.IsNullOrEmpty(Connection_parame)) { Connection1 = Connection_parame; } else { Connection1 = ConfigurationManager.ConnectionStrings["mySql"].ConnectionString; } //if (logger != null) //{ // _logger = logger; //} } public string _siteID { get; set; } public string _siteDB { get; set; } public string _siteID01 { get; set; } public string _date1 { get; set; } //public string _date2 { get; set; } public string _powerStationID { get; set; } procArchiveLog arclog = new procArchiveLog(); public bool clearData() { bool result = false; MySqlCommand cmd = new MySqlCommand(); using (MySqlConnection conn = new MySqlConnection(Connection1)) { conn.Open(); try { //if (_logger != null) //{ // logger.Information("【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) ;"; string sql = @" delete from inverter_history_15min where powerstationID = @powerStationID and CrdDate = @date1; delete from inverter_history_hour where powerstationID = @powerStationID and CrdDate = @date1; delete from inverter_history_day where powerstationID = @powerStationID and CrdDate = @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 }); cmd.Connection = conn; cmd.CommandTimeout = 360; cmd.Parameters.AddWithValue("@date1", _date1); cmd.Parameters.AddWithValue("@PowerStationID", _powerStationID); cmd.CommandText = sql; cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); logger.Information(@$"【ProcInvSvc】執行完成[{_siteID}]在 {_date1} 逆變器清除資料表的資料"); result = true; } catch (Exception ex) { logger.Error("【ProcInvSvc】執行失敗[{0}]在{1}逆變器清除資料表的資料", _siteID, _date1); logger.Error("【ProcInvSvc】執行失敗[{0}]在{1}逆變器清除資料表的資料 - [Exception]:{2}", _siteID, _date1, ex.ToString()); //throw ex; arclog.insert_log(_powerStationID, "step0 del inv ", 0, "inv", "del inv error", "0", "", "", conn, cmd); } conn.Close(); } return result; } public bool archiveData(string siteID, string date1) { bool result = false; _siteID = siteID; _date1 = date1; get_siteInfo(); clearData(); insert_inv(); //日報表 //insert_report_invDay(); //get_ck_invDay_list return result; } public bool report_invDay(string siteID, string date1) { bool result = false; _siteID = siteID; _date1 = date1; get_siteInfo(); //日報表 insert_report_invDay(); //get_ck_invDay_list result = true; return result; } public bool get_siteInfo() { bool result = false; using (MySqlConnection conn = new MySqlConnection(Connection1)) { conn.Open(); try { logger.Information("【ProcInvSvc】開始執行[{0}]在{1}逆變器取得電站編號", _siteID, _date1); #region 取得 PowerStationID string sql = @" select id , `code` siteID, siteDB, `name` siteName from solar_master.power_station where `code` = @siteID"; var ds = conn.Query(sql, new { siteID = _siteID }).AsList(); foreach (var item in ds) { _powerStationID = item.id; _siteDB = item.SiteDB; _siteID01 = item.SiteID + "01"; } logger.Information("【ProcInvSvc】執行完成[{0}]在{1}逆變器取得電站編號 - {2}", _siteID, _date1, _powerStationID); #endregion result = true; } catch (Exception ex) { logger.Error("【ProcInvSvc】執行失敗[{0}]在{1}逆變器取得電站編號", _siteID, _date1); logger.Error("【ProcInvSvc】執行失敗[{0}]在{1}逆變器取得電站編號 - [Exception]:{2}", _siteID, _date1, ex.ToString()); arclog.insert_log(_powerStationID, "step0 select stationID ", 0, "stationID", "select stationID", "0", "", "", conn, null); } conn.Close(); } return result; } bool insert_inv() { bool result = false; MySqlCommand cmd = new MySqlCommand(); //try //{ using (MySqlConnection conn = new MySqlConnection(Connection1)) { conn.Open(); string ss = @"SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY,',''));"; conn.Execute(ss); string sql = string.Empty; #region 15 min try { logger.Information("【ProcInvSvc】開始執行[{0}]在{1}逆變器15min補償", _siteID, _date1); sql = @$"DROP TABLE IF EXISTS del_Inv_day_" + _powerStationID + @"_s1; CREATE TABLE del_Inv_day_" + _powerStationID + @"_s1 select * from " + _siteDB + ".s" + _siteID01 + @"_inv a WHERE left(crdTime, 10) = @date1; # 2. add index ALTER TABLE del_Inv_day_" + _powerStationID + @"_s1 ADD INDEX `temp_index` (crdTime, inverterid);"; //int ct = conn.Execute(sql, new { date1 = _date1 }); cmd.Connection = conn; cmd.CommandTimeout = 360; cmd.Parameters.AddWithValue("@date1", _date1); cmd.CommandText = sql; cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); 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 del_Inv_day_" + _powerStationID + @"_s1 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 del_Inv_day_" + _powerStationID + @"_s1 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 del_Inv_day_" + _powerStationID + @"_s1 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 del_Inv_day_" + _powerStationID + @"_s1 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 }); cmd.Parameters.AddWithValue("@date1", _date1); cmd.Parameters.AddWithValue("@PowerStationID", _powerStationID); cmd.CommandText = sql; cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); cmd.Dispose(); logger.Information("【ProcInvSvc】執行完成[{0}]在{1}逆變器15min補償", _siteID, _date1); } catch (Exception ex) { logger.Error("【ProcInvSvc】執行失敗[{0}]在{1}逆變器15min補償", _siteID, _date1); logger.Error("【ProcInvSvc】執行失敗[{0}]在{1}逆變器15min補償 - [Exception]:{2}", _siteID, _date1, ex.ToString()); arclog.insert_log(_powerStationID, "step1 insert inverter_15min history " + _date1, 0, "inverter_history_15min", "insert inverter_15min history", "1", "", "", conn, cmd); } #endregion #region hour try { logger.Information("【ProcInvSvc】開始執行[{0}]在{1}逆變器hour補償", _siteID, _date1); sql = @$"DROP TEMPORARY TABLE IF EXISTS Inv_day_" + _powerStationID + @"_s2; CREATE TEMPORARY TABLE Inv_day_" + _powerStationID + @"_s2 SELECT " + _powerStationID + @" powerStationID, a.INVERTERID, a.reportDate,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.RA1, a.RA2, a.RA3, a.RA4, a.RA5, a.KWH, a.TODAYKWH, a.TOTALKWH, IFNULL(Irradiance, 0) irr, IFNULL(IrrDay, 0) IrrDay, 0 as PR, ((DC1W + DC2W + DC3W + DC4W + DC5W) / 1000) DCKW, ((AC1W + AC2W + AC3W) / 1000) ACKW, (a.KWH / i.Capacity) AS KWHKWP from (-- 取得該時間區間的KWH SELECT concat(left(crdTime, 13), ':00:00') reportDate, INVERTERID, AVG(AC1V) AS AC1V, AVG(AC1A) AS AC1A, round(SUM(AC1W), 5) AS AC1W, AVG(AC1F) AS AC1F, SUM(AC1WH) AS AC1WH, AVG(AC2V) AS AC2V, AVG(AC2A) AS AC2A, round(SUM(AC2W), 5) AS AC2W, AVG(AC2F) AS AC2F, SUM(AC2WH) AS AC2WH, AVG(AC3V) AS AC3V, AVG(AC3A) AS AC3A, round(SUM(AC3W), 5) AS AC3W, AVG(AC3F) AS AC3F, SUM(AC3WH) AS AC3WH, AVG(DC1V) AS DC1V, AVG(DC1A) AS DC1A, SUM(DC1W) AS DC1W, SUM(DC1WH) AS DC1WH, AVG(DC2V) AS DC2V, AVG(DC2A) AS DC2A, SUM(DC2W) AS DC2W, SUM(DC2WH) AS DC2WH, AVG(DC3V) AS DC3V, AVG(DC3A) AS DC3A, AVG(DC3W) AS DC3W, AVG(DC3WH) AS DC3WH, AVG(DC4V) AS DC4V, AVG(DC4A) AS DC4A, SUM(DC4W) AS DC4W, SUM(DC4WH) AS DC4WH, AVG(DC5V) AS DC5V, AVG(DC5A) AS DC5A, SUM(DC5W) AS DC5W, SUM(DC5WH) AS DC5WH, AVG(RA1) AS RA1, AVG(RA2) AS RA2, AVG(RA3) AS RA3, AVG(RA4) AS RA4, AVG(RA5) AS RA5, MAX(TODAYKWH) AS TODAYKWH, MAX(TOTALKWH) AS TOTALKWH, (SUM(WH) / 1000) AS KWH FROM del_Inv_day_" + _powerStationID + @"_s1 GROUP BY left(crdTime, 13), INVERTERID ) a -- 取得逆變器容量 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, IrrDay from sensor_history_hour where powerstationID = " + _powerStationID + @" and DATE_FORMAT(`TIMESTAMP`, '%Y-%m-%d') = @date1 )irr on a.reportDate = irr.reportDate where i.enabled = 1;"; //int ct = conn.Execute(sql, new { date1 = _date1 }); cmd.Connection = conn; cmd.CommandTimeout = 720; cmd.Parameters.AddWithValue("@date1", _date1); cmd.Parameters.AddWithValue("@PowerStationID", _powerStationID); cmd.CommandText = sql; cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); //# 3. insert ans sql = @$" INSERT INTO solar_master.inverter_history_hour(`powerStationID`, `INVERTERID`, `TIMESTAMP`, `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`, `RA1`, `RA2`, `RA3`, `RA4`, `RA5`, `KWH`, `TODAYKWH`, `TOTALKWH`, `Irradiance`, `PR`, `DCKW`, `ACKW`, `KWHKWP`, IrrDay) select `powerStationID`, a.`INVERTERID`, a.`reportDate`, `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`, `RA1`, `RA2`, `RA3`, `RA4`, `RA5`, `KWH`, `TODAYKWH`, `TOTALKWH`, `irr`, inv_pr.`PR`, `DCKW`, `ACKW`, `KWHKWP` , IrrDay from Inv_day_" + _powerStationID + @"_s2 a left JOIN( -- 取得整點值PR SELECT concat(left(crdTime, 13), ':00:00') AS reportDate, inv.INVERTERID, inv.PR FROM del_Inv_day_" + _powerStationID + @"_s1 inv WHERE minute(crdtime) = '55' GROUP BY left(crdTime, 13), inv.INVERTERID ) inv_pr ON a.reportDate = inv_pr.reportDate AND a.INVERTERID = inv_pr.INVERTERID;"; //ct = conn.Execute(sql, new { date1 = _date1 }); cmd.CommandText = sql; cmd.ExecuteNonQuery(); logger.Information("【ProcInvSvc】執行完成[{0}]在{1}逆變器hour補償", _siteID, _date1); sql = @$"DROP TABLE IF EXISTS del_Inv_day_" + _powerStationID + @"_s1; "; //conn.Execute(ss); cmd.CommandText = sql; cmd.ExecuteNonQuery(); } catch (Exception ex) { logger.Error("【ProcInvSvc】執行失敗[{0}]在{1}逆變器hour補償", _siteID, _date1); logger.Error("【ProcInvSvc】執行失敗[{0}]在{1}逆變器hour補償 - [Exception]:{2}", _siteID, _date1, ex.ToString()); arclog.insert_log(_powerStationID, "inverter_history_hour step1 " + _date1, 0, "inverter_history_hour", "insert inverter_history_hour error", "0", "", "", conn, cmd); // throw ex; } #endregion hour #region day try { logger.Information("【ProcInvSvc】開始執行[{0}]在{1}逆變器day補償", _siteID, _date1); sql = @" INSERT INTO solar_master.inverter_history_day(PowerStationId, INVERTERID, TIMESTAMP, Irradiance, IrrDay, 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), IFNULL(IrrDay, 0) IrrDay, 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, IrrDay 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 where i.enabled = 1;"; // conn.Execute(sql, new { date1 = _date1, PowerStationID = _powerStationID }); cmd.Connection = conn; cmd.CommandTimeout = 360; cmd.Parameters.AddWithValue("@date1", _date1); cmd.Parameters.AddWithValue("@PowerStationID", _powerStationID); cmd.CommandText = sql; cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); cmd.Dispose(); logger.Information("【ProcInvSvc】執行完成[{0}]在{1}逆變器day補償", _siteID, _date1); } catch (Exception ex) { logger.Error("【ProcInvSvc】執行失敗[{0}]在{1}逆變器day補償", _siteID, _date1); logger.Error("【ProcInvSvc】執行失敗[{0}]在{1}逆變器day補償 - [Exception]:{2}", _siteID, _date1, ex.ToString()); //throw ex; arclog.insert_log(_powerStationID, "inverter_history_day step1 ", 0, "inverter_history_day", "insert inverter_history_day error", "0", "", ex.Message, conn, cmd); } #endregion day #region month try { logger.Information("【ProcInvSvc】開始執行[{0}]在{1}逆變器month補償", _siteID, _date1); 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, IrrDay, 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), IFNULL(IrrDay, 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, IrrDay 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 where i.enabled = 1;"; //conn.Execute(sql, new { date1 = _date1.Substring(0, 7), PowerStationID = _powerStationID }); cmd.Connection = conn; cmd.CommandTimeout = 360; cmd.Parameters.AddWithValue("@date1", _date1.Substring(0, 7)); cmd.Parameters.AddWithValue("@PowerStationID", _powerStationID); cmd.CommandText = sql; cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); logger.Information("【ProcInvSvc】執行完成[{0}]在{1}逆變器month補償", _siteID, _date1); } catch (Exception ex) { logger.Error("【ProcInvSvc】執行失敗[{0}]在{1}逆變器month補償", _siteID, _date1); logger.Error("【ProcInvSvc】執行失敗[{0}]在{1}逆變器month補償 - [Exception]:{2}", _siteID, _date1, ex.ToString()); arclog.insert_log(_powerStationID, "inverter_history_month step1 ", 0, "inverter_history_month", "insert inverter_history_month error", "0", "", ex.Message, conn, cmd); // throw ex; } #endregion month conn.Close(); } result = true; //} //catch (Exception ex) //{ // throw ex; //} return result; } void ck_empty_archivedData(string siteID, string date1) { _siteID = siteID; _date1 = date1; get_siteInfo(); } //建立日報表 bool insert_report_invDay() { bool result = false; procArchiveLog arclog = new procArchiveLog(); using (MySqlConnection conn = new MySqlConnection(Connection1)) { conn.Open(); MySqlCommand cmd = new MySqlCommand(); cmd.Connection = conn; cmd.CommandTimeout = 720; DateTime dt_start = DateTime.Now; arclog.insert_log(_powerStationID, "report_day step > 開始執行", (DateTime.Now - dt_start).TotalSeconds, "inverter_history_hour", "temp_invDay", "0", "", "日報 開始執行", conn, cmd); string sql = @$"delete from report_invday where powerstationid = {_powerStationID} and left(report_date, 10) = '{_date1}'"; conn.Execute(sql); arclog.insert_log(_powerStationID, "report_day step > 刪除 report_invday", (DateTime.Now - dt_start).TotalSeconds, "inverter_history_hour", "temp_invDay", "1", "", "日報 刪除 report_invday", conn, cmd); #region get SQL //try //{ logger.Information("【Proc_inv_日報 】開始執行[{0}]在{1}inv_get_SQLStatement", _siteID, _date1); arclog.insert_log(_powerStationID, "report_day step > table 開始建立", (DateTime.Now - dt_start).TotalSeconds, "inverter_history_hour", "temp_invDay", "0", "", "日報 開始建立table", conn, cmd); #region 建立 temp table sql = @$"DROP TABLE IF EXISTS temp_invDay{_powerStationID}_s1; CREATE TABLE temp_invDay{_powerStationID}_s1 select a.`TIMESTAMP` report_date, a.powerstationId, a.INVERTERID, a.kwh , round(TODAYKWH, 6) TODAYKWH, round(KWHKWP, 6) KWHKWP, round(PR, 6) PR from solar_master.inverter_history_hour a WHERE powerstationid = {_powerStationID} and crdDate = '{_date1}'; # 2. add index ALTER TABLE `temp_invDay{_powerStationID}_s1` ADD INDEX `temp_indexs1` (report_date, inverterid);"; //conn.Execute(ss); arclog.insert_log(_powerStationID, "report_day step > table 建立完成 " + _date1, (DateTime.Now - dt_start).TotalSeconds, "inverter_history_hour", "temp_invDay", "1", "", "日報 建立table完成", conn, cmd); try { arclog.insert_log(_powerStationID, "report_day step try", (DateTime.Now - dt_start).TotalSeconds, "inverter_history_hour", "temp_invDay", "1", "", "start 日報 try", conn, cmd); cmd.CommandText = sql; cmd.ExecuteNonQuery(); cmd.CommandText = @$"select count(*) ct from temp_invDay{_powerStationID}_s1"; var rowCT = cmd.ExecuteScalar(); //select LAST_INSERT_ID() TimeSpan duration = DateTime.Now - dt_start; arclog.insert_log(_powerStationID, "report_day step1 " + _date1, duration.TotalSeconds, "inverter_history_hour", "temp_invDay", "1", "", rowCT.ToString(), conn, cmd); } catch (Exception ex) { TimeSpan duration = DateTime.Now - dt_start; arclog.insert_log(_powerStationID, "report_day step1", duration.TotalSeconds, "inverter_history_hour", "temp_invDay", "0", "", ex.Message, conn, cmd); } #endregion #region 先新增 inv_no01 string inv01 = _siteID01 + "0001"; sql = @$" insert report_invday(`report_date`, `PowerStationID`, inv_01, `hourKWH`, `hourKWHp`, `irradiance`, `temperature`, `hourmoney`, `pr`, createTime, IrrDay, IrrDayHour ) select a.report_date, a.powerstationId , ifnull(round(a.kwh, 6), 0) inv_01, ifnull(b.KWH, 0) hourKWH, ifnull(round((b.KWH / (SELECT MAX(TODAYKWH) FROM power_station_history_hour WHERE DATE_FORMAT(TIMESTAMP,'%Y-%m-%d') = '{_date1}' and powerstationid = {_powerStationID} ))*100,2) , 0) 'hourKWHp', ifnull(d.irradiance, 0) 'irradiance', ifnull(d.Temperature, 0) 'temperature', ifnull(b.money, 0) 'hourmoney', ifnull(round(b.PR, 2), 0) as pr, now() createTime, ifnull(d.IrrDay, 0)IrrDay, ifnull(d.IrrDayHour, 0)IrrDayHour from temp_invDay{_powerStationID}_s1 a join ( # 每小時加總 inv select powerStationid, `TIMESTAMP` report_date, siteid, sitetype, round(KWH, 2) KWH, round(TODAYKWH, 2) TODAYKWH,round(KWHKWP, 2) KWHKWP, round(PR, 2) PR, round(money, 2) money from power_station_history_hour where powerstationid = {_powerStationID} and left(`TIMESTAMP`,10) = '{_date1}' ) b on a.powerStationid = b.powerStationid and a.`report_date` = b.report_date left join ( select powerStationID, LEFT(`TIMESTAMP`, 13) report_date, irradiance, Temperature, IrrDay, IrrDayHour from sensor_history_hour where powerstationid = {_powerStationID} and left(`TIMESTAMP`,10) = '{_date1}' ) d on a.powerStationid = d.powerStationid and LEFT(a.`report_date`, 13) = d.report_date where a.inverterid = '{inv01}' # right(a.inverterid, 4) = '0001' GROUP BY left(a.report_date, 13) order by a.report_date ;"; DateTime dt_start2 = DateTime.Now; try { cmd.CommandText = sql; int rowCT = cmd.ExecuteNonQuery(); //cmd.CommandText = @$"select count(*) ct from report_invday where powerStationID = {_powerStationID} and left(`TIMESTAMP`,10) = '{_date1}'"; //var rowCT = cmd.ExecuteScalar(); TimeSpan duration = DateTime.Now - dt_start2 ; arclog.insert_log(_powerStationID, "report_day step2 inv_no01", duration.TotalSeconds, "inverter_history_hour", "report_invday", "1", "", rowCT.ToString(), conn, cmd); } catch (Exception ex) { TimeSpan duration = DateTime.Now - dt_start2 ; arclog.insert_log(_powerStationID, "report_day step2 inv_no01", duration.TotalSeconds, "inverter_history_hour", "report_invday", "0", "", ex.Message, conn, cmd); } // conn.Execute(sql); #endregion #region inv_02 之後的 kwh #region 取得 inv 數量 sql = $@" select b.id PowerStationId, b.`name` station_name, inverterid, b.`code` station_code from v_company_inv a join power_station b on left(a.inverterid, 9) = b.`code` where b.`id` = '{_powerStationID}' and b.Deleted = 0 and a.`enabled` = 1 and b.`status` = 1 # 啟用 "; var ds = conn.Query(sql).AsList(); #endregion StringBuilder sb = new StringBuilder(); StringBuilder sb_column = new StringBuilder(); StringBuilder sb_select = new StringBuilder(); StringBuilder sb_update_columns = new StringBuilder(); DateTime dt_start3 = DateTime.Now; for (int i = 0; i < ds.Count; i++) { if (i == 0) continue; if (i < 9) { sb_column.Append(@$", `inv_0{(i + 1).ToString()}`"); if (i == 1) { sb.Append(@" update report_invday a join ( select a02.powerstationID, a02.report_date, ifnull(a02.inv_02, 0) inv_02"); sb_select.Append(@$" from (select powerstationID, report_date, ifnull(round(kwh , 6), 0) inv_02 from temp_invDay{_powerStationID}_s1 a where right(a.inverterid, 4) = '000{(i + 1).ToString()}') a0{(i + 1).ToString()} "); sb_update_columns.Append($@" ) b on a.powerstationid = b.powerstationid and a.report_date = b.report_date set a.inv_02 = b.inv_02 "); } else { sb.Append(@$" , ifnull(a0{(i + 1).ToString()}.inv_0{(i + 1).ToString()}, 0) inv_0{(i + 1).ToString()}"); sb_select.Append($@" left join (select report_date, ifnull(round(kwh , 6), 0) inv_0{(i + 1).ToString()} from temp_invDay{_powerStationID}_s1 a where right(a.inverterid, 4) = '000{(i + 1).ToString()}') a0{(i + 1).ToString()} on a02.report_date = a0{(i + 1).ToString()}.report_date "); sb_update_columns.Append($@", a.inv_0{(i + 1).ToString()} = b.inv_0{(i + 1).ToString()}"); } } else { sb.Append(@$" , ifnull(a{(i + 1).ToString()}.inv_{(i + 1).ToString()}, 0) inv_{(i + 1).ToString()} "); sb_column.Append(@$", `inv_{(i + 1).ToString()}`"); sb_select.Append($@" left join (select report_date, ifnull(round(kwh , 6), 0) inv_{(i + 1).ToString()} from temp_invDay{_powerStationID}_s1 a where right(a.inverterid, 4) = '00{(i + 1).ToString()}') a{(i + 1).ToString()} on a02.report_date = a{(i + 1).ToString()}.report_date "); sb_update_columns.Append($@", a.inv_{(i + 1).ToString()} = b.inv_{(i + 1).ToString()}"); } } // sb.Append(", `hourKWH`, `hourKWHp`, `irradiance`, `temperature`, `hourmoney`, `pr`)"); #endregion #region insert report_invDay sb_column.Clear(); sql = sb.ToString() + sb_select.ToString() + sb_update_columns.ToString(); try { int rowCT = 0; if (!String.IsNullOrEmpty(sql)) { cmd.CommandText = sql; rowCT = cmd.ExecuteNonQuery(); } sql = @$"DROP TABLE IF EXISTS temp_invDay{_powerStationID}_s1; "; //conn.Execute(ss); cmd.CommandText = sql; cmd.ExecuteNonQuery(); logger.Information("【Proc_inv_日報 table 】執行完成[{0}]在{1} inv_get_SQLStatement", _siteID, _date1); TimeSpan duration = DateTime.Now - dt_start3; arclog.insert_log(_powerStationID, "report_day step3 update inv02", duration.TotalSeconds, "inverter_history_hour", "report_invday", "1", "", rowCT.ToString(), conn, cmd); } catch (Exception ex) { TimeSpan duration = DateTime.Now - dt_start3 ; arclog.insert_log(_powerStationID, "report_day step3 update inv02", duration.TotalSeconds, "inverter_history_hour", "report_invday", "0", "", ex.Message, conn, cmd); logger.Error("【Proc_inv_日報 table】執行失敗[{0}]在{1}inv_get_SQLStatement", _siteID, _date1); logger.Error("【Proc_inv_日報 table】執行失敗[{0}]在{1}inv_get_SQLStatement - [Exception]:{2}", _siteID, _date1, ex.ToString()); } #endregion //} //catch (Exception ex) //{ //} #endregion conn.Close(); } //using (MySqlConnection conn = new MySqlConnection(Connection1)) result = true; return result; } } }