using Dapper; using SolarPower.Helper; using SolarPower.Models; using SolarPower.Repository.Interface; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Threading.Tasks; namespace SolarPower.Repository.Implement { public class StationReportRepository : RepositoryBase, IStationReportRepository { public StationReportRepository(IDatabaseHelper databaseHelper) : base(databaseHelper) { tableName = "power_station"; } public async Task> GetInverterId(string DBname, Select_table post) { List result = new List(); using (IDbConnection conn = _databaseHelper.GetConnection()) { conn.Open(); try { string sql = @$"SELECT InverterId from {DBname}.inverter i left JOIN {DBname}.controller c ON i.ControllerId = c.Id WHERE i.Deleted != 1 AND c.PowerStationId = {post.PowerStation}"; result = (await conn.QueryAsync(sql)).ToList(); } catch (Exception exception) { throw exception; } finally { conn.Close(); } return result; } } public async Task Gettablebody(Select_table post) { using (IDbConnection conn = _databaseHelper.GetConnection()) { dynamic a; conn.Open(); try { string sql = ""; switch(post.FormType) { case 0: sql = @$" SET @sql = NULL; SELECT GROUP_CONCAT(DISTINCT CONCAT('max(case when INVERTERID = ''', INVERTERID, ''' then a.KWH end) ''inv_', right(INVERTERID, 4), '''') ) INTO @sql FROM inverter_history_hour where powerstationId = {post.PowerStation}; SET @sql = CONCAT('SELECT DATE_FORMAT(a.TIMESTAMP,''%m-%d %H'') report_date, ', @sql, ', b.KWH hourKWH, round((b.KWH / (SELECT MAX(TODAYKWH) FROM power_station_history_hour WHERE DATE_FORMAT(TIMESTAMP,''%Y-%m-%d'') = ''{post.Time}'' and powerstationid = {post.PowerStation}))*100,2) ''hourKWHp'', d.irradiance ''irradiance'', d.Temperature ''temperature'', b.money ''hourmoney'', c.TODAYKWH ''totKWH'', c.KWHKWP ''totKWHKWP'', c.money ''totmoney'', stationName, powerRate daymoney, c.SOLARHOUR tothour,round(b.PR, 2) as pr FROM inverter_history_hour a left join ( # 每小時加總 inv select powerStationid, DATE_FORMAT(TIMESTAMP,''%Y-%m-%d %H:%i'') 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 = {post.PowerStation} and DATE_FORMAT(TIMESTAMP,''%Y-%m-%d'') = ''{post.Time}'' ) b on a.powerStationid = b.powerStationid and DATE_FORMAT(a.TIMESTAMP,''%Y-%m-%d %H:%i'') = b.report_date left join ( # day select powerStationid, DATE_FORMAT(TIMESTAMP,''%Y-%m-%d'') report_date, sitetype, round(TODAYKWH, 2) TODAYKWH,round(KWHKWP, 2) KWHKWP , round(PR, 2) PR, round(money, 2) money , round(SOLARHOUR, 2) SOLARHOUR from power_station_history_day where powerstationid = {post.PowerStation} and DATE_FORMAT(TIMESTAMP,''%Y-%m-%d'') = ''{post.Time}'' ) 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 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 join ( select id, name stationName, powerRate from power_station where id = {post.PowerStation} )z on a.powerstationid = z.id where DATE_FORMAT(TIMESTAMP,''%Y-%m-%d'') = ''{post.Time}'' GROUP BY DATE_FORMAT(TIMESTAMP,''%Y-%m-%d %H:%i'') order by DATE_FORMAT(a.TIMESTAMP,''%Y-%m-%d %H:%i'') '); #select @sql as 'mySelect'; #顯示動態語法 PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;"; break; case 1: if(post.SearchType == 2) { sql = @$" SET @sql = NULL; SELECT GROUP_CONCAT(DISTINCT CONCAT('max(case when INVERTERID = ''', INVERTERID, ''' then round(a.KWH, 2) end) ''inv_', right(INVERTERID, 4), '''') ) INTO @sql FROM inverter_history_hour where powerstationId = {post.PowerStation}; SET @sql = CONCAT('SELECT DATE_FORMAT(a.TIMESTAMP,''%m/%d'') report_date, ', @sql, ',b.TODAYKWH ''dayKWH'', round((b.TODAYKWH / c.monthKWH)*100,2) ''dayKWHp'', b.SOLARHOUR ''tothour'', b.KWHKWP ''KWHKWP'', b.PR, d.irradiance ''irradiance'', d.Temperature ''temperature'', b.money ''soldmoney'', c.monthKWH ''monthKWH'', c.money ''monthmoney'', stationName, powerRate ''monthmoneyone'',SolarType,SiteDB FROM inverter_history_day a left join ( # 每日加總 inv select powerStationid, DATE_FORMAT(TIMESTAMP,''%Y-%m-%d'') report_date, siteid, sitetype, #, round(KWH, 2) KWH, round(todayKWH, 2) todayKWH,round(KWHKWP, 2) KWHKWP, round(PR, 2) PR, ifnull(round(money, 2),0) money, round(SOLARHOUR, 2) SOLARHOUR from power_station_history_day where powerstationid = {post.PowerStation} and DATE_FORMAT(TIMESTAMP,''%Y-%m'') = ''{post.Time}'' ) b on a.powerStationid = b.powerStationid and DATE_FORMAT(a.TIMESTAMP,''%Y-%m-%d'') = b.report_date left join ( # month select powerStationid, DATE_FORMAT(TIMESTAMP,''%Y-%m'') report_date, sitetype, round(monthKWH, 2) monthKWH,round(KWHKWP, 2) KWHKWP , round(PR, 2) PR, round(money, 2) money , round(SOLARHOUR, 2) SOLARHOUR from power_station_history_month where powerstationid = {post.PowerStation} and DATE_FORMAT(TIMESTAMP,''%Y-%m'') = ''{post.Time}'' ) c on a.powerStationid = c.powerStationid and DATE_FORMAT(a.TIMESTAMP,''%Y-%m'') = c.report_date left join ( select powerStationID, DATE_FORMAT(TIMESTAMP,''%Y-%m-%d'')report_date, irradiance, Temperature from sensor_history_day where powerstationid = {post.PowerStation} and DATE_FORMAT(TIMESTAMP,''%Y-%m'') = ''{post.Time}'' ) d on a.powerStationid = d.powerStationid and DATE_FORMAT(a.TIMESTAMP,''%Y-%m-%d'') = d.report_date join ( select id, name stationName, powerRate,SolarType,SiteDB from power_station where id = {post.PowerStation} )z on a.powerstationid = z.id where DATE_FORMAT(a.TIMESTAMP,''%Y-%m'') = ''{post.Time}'' GROUP BY DATE_FORMAT(a.TIMESTAMP,''%Y-%m-%d'') order by DATE_FORMAT(a.TIMESTAMP,''%Y-%m-%d'') '); # select @sql as 'mySelect'; #顯示動態語法 PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;"; } else { var times = post.Time.Replace('-', 'a').Replace('/', '-').Replace(" ", "").Split('a'); sql = @$"SET @sql = NULL; SELECT GROUP_CONCAT(DISTINCT CONCAT('max(case when INVERTERID = ''', INVERTERID, ''' then round(a.KWH, 2) end) ''inv_', right(INVERTERID, 4), '''') ) INTO @sql FROM inverter_history_hour where powerstationId = {post.PowerStation}; SET @sql = CONCAT('SELECT DATE_FORMAT(a.TIMESTAMP,''%m/%d'') report_date, ', @sql, ',b.TODAYKWH ''dayKWH'', round((b.TODAYKWH / c.monthKWH)*100,2) ''dayKWHp'', b.SOLARHOUR ''tothour'', b.KWHKWP ''KWHKWP'', b.PR, d.irradiance ''irradiance'', d.Temperature ''temperature'', b.money ''soldmoney'', c.monthKWH ''monthKWH'', c.money ''monthmoney'', stationName, powerRate ''monthmoneyone'',SolarType,SiteDB FROM inverter_history_day a left join ( # 每日加總 inv select powerStationid, DATE_FORMAT(TIMESTAMP,''%Y-%m-%d'') report_date, siteid, sitetype, #, round(KWH, 2) KWH, round(todayKWH, 2) todayKWH,round(KWHKWP, 2) KWHKWP, round(PR, 2) PR, ifnull(round(money, 2),0) money, round(SOLARHOUR, 2) SOLARHOUR from power_station_history_day where powerstationid = {post.PowerStation} and DATE_FORMAT(TIMESTAMP,''%Y-%m-%d'') BETWEEN ''{times[0]}'' AND ''{times[1]}'' ) b on a.powerStationid = b.powerStationid and DATE_FORMAT(a.TIMESTAMP,''%Y-%m-%d'') = b.report_date left join ( # month SELECT powerStationid, ROUND(AVG(TODAYKWH),2) AS monthKWH, ROUND(AVG(KWHKWP),2) AS KWHKWP, ROUND(AVG(PR),2) AS PR, ROUND(SUM(MONEY),2) AS money, ROUND(SUM(SOLARHOUR),2) AS SOLARHOUR FROM power_station_history_day where powerstationid = {post.PowerStation} and DATE_FORMAT(TIMESTAMP,''%Y-%m-%d'') BETWEEN ''{times[0]}'' AND ''{times[1]}'' ) c on a.powerStationid = c.powerStationid left join ( select powerStationID, DATE_FORMAT(TIMESTAMP,''%Y-%m-%d'')report_date, irradiance, Temperature from sensor_history_day where powerstationid = {post.PowerStation} and DATE_FORMAT(TIMESTAMP,''%Y-%m-%d'') BETWEEN ''{times[0]}'' AND ''{times[1]}'' ) d on a.powerStationid = d.powerStationid and DATE_FORMAT(a.TIMESTAMP,''%Y-%m-%d'') = d.report_date join ( select id, name stationName, powerRate, SolarType, SiteDB from power_station where id = {post.PowerStation} )z on a.powerstationid = z.id where DATE_FORMAT(TIMESTAMP,''%Y-%m-%d'') BETWEEN ''{times[0]}'' AND ''{times[1]}'' GROUP BY DATE_FORMAT(a.TIMESTAMP,''%Y-%m-%d'') order by DATE_FORMAT(a.TIMESTAMP,''%Y-%m-%d'') '); # select @sql as 'mySelect'; #顯示動態語法 PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;"; } break; } a = await conn.QueryAsync(sql); } catch (Exception exception) { throw exception; } finally { conn.Close(); } return a; } } public async Task> GetHire (PsIdAndSiteDB post) { List result = new List(); using (IDbConnection conn = _databaseHelper.GetConnection()) { conn.Open(); try { string sql = @$"SELECT LeaseRate,Landowner from {post.SiteDB}.land_building WHERE PowerStationId = {post.PowerstationId}"; result = (await conn.QueryAsync(sql)).ToList(); } catch (Exception exception) { throw exception; } finally { conn.Close(); } return result; } } public async Task> GetMaxtablebody(Select_table2 post) { List result = new List(); using (IDbConnection conn = _databaseHelper.GetConnection()) { conn.Open(); try { List ids = new List(); foreach (var i in post.PowerStation) { ids.Add(Convert.ToInt32(i.Value)); } string[] times = { }; if(post.SearchType == 1) { times = post.Time.Replace('-', 'a').Replace('/', '-').Replace(" ", "").Split('a'); } var wheretime = post.SearchType switch { 0 => $"AND DATE_FORMAT(ps.TIMESTAMP,'%Y-%m-%d') = '{post.Time}'", 1 => $"AND DATE_FORMAT(ps.TIMESTAMP,'%Y-%m-%d') BETWEEN '{times[0]}' AND '{times[1]}'", 2 => $"AND DATE_FORMAT(ps.TIMESTAMP,'%Y-%m') = '{post.Time}'", 3 => $"AND DATE_FORMAT(ps.TIMESTAMP,'%Y') = '{post.Time}'", _ => "" }; string sql = @$"SELECT c.Name AS 'CityName', a.Name AS 'AreaName', ps.Name AS 'PowerstationName', ps.SiteDB AS 'PowerstationDB', ps.SolarType AS 'PowerstationType', ps.Id as 'PowerStationId', n.* FROM power_station ps LEFT JOIN city c ON c.Id = ps.CityId LEFT JOIN area a ON a.Id = ps.AreaId left JOIN ( SELECT a.SolarHour ,a.Kwh ,b.PR AvgPR,b.KWHKWP AvgKWHKWP,c.Irradiance AvgIrradiance,b.TodayMoney as 'TodayMoney',a.Id,a.time FROM ( SELECT ps.Id,SUM(k.SolarHour) SolarHour,SUM(k.Kwh) Kwh , k.time FROM power_station ps LEFT JOIN ( SELECT Max(ps.SOLARHOUR) AS 'SolarHour',MAX(ps.TODAYKWH) 'Kwh' ,DATE_FORMAT(ps.TIMESTAMP,'%Y-%m-%d %H:%i') AS 'time', ps.PowerStationId FROM power_station_history_hour ps WHERE ps.PowerStationId IN @ids {wheretime} GROUP BY DATE_FORMAT(ps.TIMESTAMP,'%Y-%m-%d'),ps.PowerStationId ) k ON k.PowerStationId = ps.Id WHERE ps.Id IN @ids GROUP BY k.PowerStationId ) a LEFT JOIN ( SELECT ps.Id,AVG(n.PR) PR,AVG(n.KWHKWP) KWHKWP,SUM(n.TodayMoney) TodayMoney FROM power_station ps LEFT JOIN ( SELECT B.PR ,B.KWHKWP,B.TODAYMONEY AS 'TodayMoney', DATE_FORMAT(A.bb,'%Y-%m-%d') 'time' ,B.PowerStationId FROM ( SELECT Max(ps.TIMESTAMP) AS bb FROM power_station_history_hour ps WHERE ps.PowerStationId IN @ids {wheretime} GROUP BY DATE_FORMAT(ps.TIMESTAMP,'%Y-%m-%d'),ps.PowerStationId ) A LEFT JOIN power_station_history_hour B ON A.bb = B.TIMESTAMP GROUP BY B.PowerStationId ,DATE_FORMAT(A.bb,'%Y-%m-%d') )n ON ps.Id = n.PowerStationId WHERE ps.Id IN @ids GROUP BY n.PowerStationId ) b ON a.Id = b.Id LEFT JOIN ( SELECT SUM(ps.Irradiance) AS Irradiance , DATE_FORMAT(ps.TIMESTAMP,'%Y-%m-%d') AS TIME ,ps.PowerStationId from sensor_history_hour ps WHERE ps.PowerStationId IN @ids {wheretime} GROUP BY DATE_FORMAT(ps.TIMESTAMP,'%Y-%m-%d'),ps.PowerStationId ) c ON a.Id = c.PowerStationId GROUP BY a.Id,a.time ) n ON n.Id = ps.Id WHERE ps.Id IN @ids ORDER BY ps.CityId"; result = (await conn.QueryAsync(sql,new { ids = ids})).ToList(); } catch (Exception exception) { throw exception; } finally { conn.Close(); } return result; } } } }