using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using Quartz; using solarApp.Service; using SolarPower.Models; using SolarPower.Models.PowerStation; using SolarPower.Repository.Interface; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Net.Http; using System.Threading.Tasks; namespace SolarPower.Quartz.Jobs { [DisallowConcurrentExecution] public class CalcAvgPowerStationJob : IJob { private readonly ILogger logger; private readonly IPowerStationRepository powerStationRepository; private readonly IUserRepository userRepository; private readonly INoticeScheduleRepository noticeScheduleRepository; private readonly IStationReportRepository stationReportRepository; private readonly IOperationRepository operationRepository; private readonly IConfiguration Configuration; public CalcAvgPowerStationJob( ILogger logger, IPowerStationRepository powerStationRepository, IUserRepository userRepository, INoticeScheduleRepository noticeScheduleRepository, IStationReportRepository stationReportRepository, IOperationRepository operationRepository, IConfiguration Configuration) { this.logger = logger; this.powerStationRepository = powerStationRepository; this.userRepository = userRepository; this.noticeScheduleRepository = noticeScheduleRepository; this.stationReportRepository = stationReportRepository; this.operationRepository = operationRepository; this.Configuration = Configuration; } public async Task Execute(IJobExecutionContext context) { try { logger.LogInformation("【CalcAvgPowerStationJob】【任務開始】"); #region step1. 找出所有電站 logger.LogInformation("【CalcAvgPowerStationJob】【開始取得電站資料】"); var powerStations = await powerStationRepository.GetAllAsync(); logger.LogInformation("【CalcAvgPowerStationJob】【取得成功電站資料】"); logger.LogInformation("【CalcAvgPowerStationJob】【電站資料】 - {0}", System.Text.Json.JsonSerializer.Serialize(powerStations)); #endregion //電站資訊 List calcAvgPowerStations = new List(); List powerStationHistoryDays = new List(); List insertPowerStationHistoryMonths = new List(); List updatePowerStationHistoryMonths = new List(); //日照計、溫度資訊 List pyrheliometerHistoryDays = new List(); List insertPyrheliometerHistoryMonths = new List(); List updatePyrheliometerHistoryMonths = new List(); List pyrheliometer_history_properties = new List() { "PowerStationId", "Timestamp", "Irradiance", "Temperature" }; //逆變器 List allofInverterHistorDays = new List(); List insertInverterHistoryMonths = new List(); List updateInverterHistoryMonths = new List(); List inverter_history_properties = new List() { "PowerStationId", "TIMESTAMP", "INVERTERID", "Irradiance", "AC1V", "AC1A", "AC1W", "AC1F", "AC1WH", "AC2V", "AC2A", "AC2W", "AC2F", "AC2WH", "AC3V", "AC3A", "AC3W", "AC3F", "AC3WH", "DC1V", "DC1A", "DC1W", "DC1KW", "DC1WH", "DC2V", "DC2A", "DC2W", "DC2KW", "DC2WH", "DC3V", "DC3A", "DC3W", "DC3KW", "DC3WH", "DC4V", "DC4A", "DC4W", "DC4KW", "DC4WH", "DC5V", "DC5A", "DC5W", "DC5KW", "DC5WH", "PR", "RA1", "RA2", "RA3", "RA4", "RA5", "DCKW", "ACKW", "KWH", "TODAYKWH", "KWHKWP", }; //sensor List sensorAvgHistoryDays = new List(); List insertSensorAvgHistoryMonths = new List(); List updateSensorAvgHistoryMonths = new List(); List sensoravg_history_properties = new List() { "PowerStationId", "TIMESTAMP", "SENSORAVG01", "SENSORAVG02", "SENSORAVG03", "SENSORAVG04", "SENSORAVG05", "SENSORAVG06", "SENSORAVG07", "SENSORAVG08", "SENSORAVG09", "SENSORAVG10", "SENSORAVG11", "SENSORAVG12", "SENSORAVG13", "SENSORAVG14", "SENSORAVG15", "SENSORAVG16", "SENSORAVG17", "SENSORAVG18", "SENSORAVG19", "SENSORAVG20", "SENSORAVG21", "SENSORAVG22", "SENSORAVG23", "SENSORAVG24", "SENSORAVG25", "SENSORAVG26", "SENSORAVG27", "SENSORAVG28", "SENSORAVG29", "SENSORAVG30", "SENSORAVG31", "SENSORAVG32", "SENSORAVG33", "SENSORAVG34", "SENSORAVG35", "SENSORAVG36", "SENSORAVG37", "SENSORAVG38", "SENSORAVG39", "SENSORAVG40", "SENSORAVG41", "SENSORAVG42", "SENSORAVG43", "SENSORAVG44", "SENSORAVG45", "SENSORAVG46", "SENSORAVG47", "SENSORAVG48", "SENSORAVG49", "SENSORAVG50", }; //電錶 List meterHistoriesDays = new List(); List insertmeterHistoryMonths = new List(); List updatemeterHistoryMonths = new List(); List meter_history_properties = new List() { "PowerStationId", "TIMESTAMP", "METERID", "V_AB", "V_BC", "V_CA", "I_A", "I_B", "I_C", "I_C", "P", "F", "INPUT_KWH", "OUTPUT_KWH" }; List weatherForecasts = new List(); var DateTimeNow = DateTime.Now; var dateNowDay = DateTimeNow.AddDays(-1).ToString("yyyy-MM-dd"); var dateNowMonth = DateTimeNow.AddDays(-1).ToString("yyyy-MM"); Root2 observation = null; #region 氣象觀測(取資料) try { logger.LogInformation("【CalcAvgPowerStationJob】【開始取得氣象觀測】"); var client = new HttpClient(); var UVUri = "https://opendata.cwb.gov.tw/api/v1/rest/datastore/F-C0032-001?Authorization=CWB-EA24220B-DDCC-4188-84E5-AD37A0E03F80&elementName=Wx,PoP&sort=time"; HttpResponseMessage response = client.GetAsync(UVUri).Result; String jsonUVs = response.Content.ReadAsStringAsync().Result.ToString(); observation = JsonConvert.DeserializeObject(jsonUVs); logger.LogInformation("【CalcAvgPowerStationJob】【取得成功氣象觀測】"); } catch (Exception ex) { logger.LogError("【CalcAvgPowerStationJob】【取得失敗氣象觀測】"); logger.LogError("【{0}】{1}", "CalcPowerStationJob", ex.Message); observation = null; } #endregion if (observation != null) { foreach (var location in observation.Records.Location) { WeatherForecast weatherForecast = new WeatherForecast(); weatherForecast.LocationName = location.LocationName; List SubweatherForecasts = new List(); foreach (var a in location.WeatherElement) { if (a.ElementName == "Wx") { foreach (var time in a.Time) { int index = 0; if (location.WeatherElement[0].ElementName == "Wx") { weatherForecast = new WeatherForecast(); weatherForecast.LocationName = location.LocationName; weatherForecast.StartTime = time.StartTime.ToString(); weatherForecast.EndTime = time.EndTime.ToString(); weatherForecast.Wx = time.Parameter.ParameterName; weatherForecast.WxValue = time.Parameter.ParameterValue; SubweatherForecasts.Add(weatherForecast); } else { SubweatherForecasts[index].StartTime = time.StartTime.ToString(); SubweatherForecasts[index].EndTime = time.EndTime.ToString(); SubweatherForecasts[index].Wx = time.Parameter.ParameterName; SubweatherForecasts[index].WxValue = time.Parameter.ParameterValue; //SubweatherForecasts.Add(weatherForecast); index++; } //weatherForecasts.Add(weatherForecast); } } if (a.ElementName == "PoP") { int index = 0; foreach (var time in a.Time) { if (location.WeatherElement[0].ElementName == "PoP") { weatherForecast = new WeatherForecast(); weatherForecast.LocationName = location.LocationName; weatherForecast.PoP = time.Parameter.ParameterName; SubweatherForecasts.Add(weatherForecast); } else { SubweatherForecasts[index].PoP = time.Parameter.ParameterName; //SubweatherForecasts.Add(weatherForecast); index++; } } } } weatherForecasts.AddRange(SubweatherForecasts); } } List weather_forecast_properties = new List() { "LocationName", "StartTime", "EndTime", "Wx", "WxValue", "PoP" }; await powerStationRepository.AddWeatherForecast(weatherForecasts, weather_forecast_properties); #region 60天刪除operation_record var OperationDeletes = await powerStationRepository.GetAllDataList("operation_record", "Deleted = 1"); List deleteoperations = new List(); foreach(var deletes in OperationDeletes) { if(DateTime.Now.AddDays(-60) > Convert.ToDateTime(deletes.UpdatedAt)) { deleteoperations.Add(deletes.Id); } } await operationRepository.DeleteRecord(deleteoperations); #endregion #region step2. 歸檔電站的每日資訊 foreach (var powerStation in powerStations) { var calcPowerStation = new PowerStation(); calcPowerStation.Id = powerStation.Id; #region step2-1. 計算該電站的30天平均資料 var table_name = String.Format("s{1}01_station", powerStation.SiteDB, powerStation.Code); var full_table_name = String.Format("`{0}`.`{1}`", powerStation.SiteDB, table_name); var exist = await powerStationRepository.ExistTable(powerStation.SiteDB, table_name); if (!string.IsNullOrEmpty(exist)) { logger.LogInformation("【CalcAvgPowerStationJob】【開始計算電站[{0}]在{1}的30天平均資料】", powerStation.Code, dateNowDay); var history = await powerStationRepository.CalcAvgPowerStationHistory30day(dateNowDay, full_table_name); logger.LogInformation("【CalcAvgPowerStationJob】【取得成功電站[{0}]在{1}的30天平均資料】", powerStation.Code, dateNowDay); logger.LogInformation("【CalcAvgPowerStationJob】【電站[{0}]在{1}的30天平均資料】 - {2}", powerStation.Code, dateNowDay, System.Text.Json.JsonSerializer.Serialize(history)); if (history != null) { logger.LogInformation("【CalcAvgPowerStationJob】【開始計算電站[{0}]在{1}的30天平均資料】", powerStation.Code, dateNowDay); history.PowerStationId = powerStation.Id; #region 計算電站30天的 kWh/kWp 與 PR 值 #region 平均kWh/kWp //直接填寫 calcPowerStation.Avg_kwhkwp = history.AvgKWHKWP; #endregion #region 平均PR //直接填寫 calcPowerStation.Avg_PR = history.AvgPR; #endregion #endregion logger.LogInformation("【CalcAvgPowerStationJob】【計算完成電站[{0}]在{1}的30天平均資料】", powerStation.Code, dateNowDay); } #region 計算電站30天的日照計平均值 logger.LogInformation("【CalcAvgPowerStationJob】【開始計算電站[{0}]在{1}的30天日照計平均資料】", powerStation.Code, dateNowDay); var avgPyrheliometerHistory = await powerStationRepository.CalcAvgPyrheliometerHistory30day(dateNowDay, powerStation.Id); logger.LogInformation("【CalcAvgPowerStationJob】【取得成功電站[{0}]在{1}的30天日照計平均資料】", powerStation.Code, dateNowDay); logger.LogInformation("【CalcAvgPowerStationJob】【電站[{0}]在{1}的30天日照計平均資料】 - {2}", powerStation.Code, dateNowDay, System.Text.Json.JsonSerializer.Serialize(avgPyrheliometerHistory)); if (avgPyrheliometerHistory != null) { calcPowerStation.Avg_irradiance = avgPyrheliometerHistory.AvgIrradiance; } calcAvgPowerStations.Add(calcPowerStation); #endregion } #endregion #region step2-2. 計算該電站昨天的所有值總和 /*因修改為補償 而註解*/ //if (!string.IsNullOrEmpty(exist)) //{ // //電站資訊 // logger.LogInformation("【CalcAvgPowerStationJob】【開始取得電站[{0}]在{1}的所有值的總和】", powerStation.Code, dateNowDay); // var historyDay = await powerStationRepository.GetLastOnePowerStationHistoryByDay(dateNowDay, full_table_name); // logger.LogInformation("【CalcAvgPowerStationJob】【取得成功電站[{0}]在{1}的所有值的總和】", powerStation.Code, dateNowDay); // logger.LogInformation("【CalcAvgPowerStationJob】【電站[{0}]在{1}的所有值的總和】 - {2}", powerStation.Code, dateNowDay, System.Text.Json.JsonSerializer.Serialize(historyDay)); // var moneyandcarbon = await powerStationRepository.GetMoneyAndCarbonWithHistoryHour(powerStation.Id, dateNowDay, 1); // var lastmoneyhistory = await powerStationRepository.GetLastMoneyAndCarbonInHour(powerStation.Id, 1, ""); // if (historyDay != null) // { // historyDay.PowerStationId = powerStation.Id; // historyDay.CARBON = moneyandcarbon.CARBON; // historyDay.MONEY = moneyandcarbon.MONEY; // //historyDay.TODAYCARBON = lastmoneyhistory.TODAYCARBON; // //historyDay.TODAYMONEY = lastmoneyhistory.TODAYMONEY ; // if (lastmoneyhistory != null) // { // historyDay.TOTALCARBON = lastmoneyhistory.TOTALCARBON + moneyandcarbon.CARBON; // historyDay.TOTALMONEY = lastmoneyhistory.TOTALMONEY + moneyandcarbon.MONEY; // } // else // { // historyDay.TOTALCARBON = moneyandcarbon.CARBON; // historyDay.TOTALMONEY = moneyandcarbon.MONEY; // } // //日期轉換 // historyDay.Timestamp = Convert.ToDateTime(historyDay.Timestamp + ":00:00").ToString("yyyy-MM-dd"); // powerStationHistoryDays.Add(historyDay); // } //} ////日照計、溫度 //logger.LogInformation("【CalcAvgPowerStationJob】【開始計算電站[{0}]在{1}的日照計所有值的平均】", powerStation.Code, dateNowDay); //var pyrheliometerHistorDay = await powerStationRepository.CalcPyrheliometerHistoryDayDataByPowerStationId(dateNowDay, powerStation.Id); //logger.LogInformation("【CalcAvgPowerStationJob】【計算完成電站[{0}]在{1}的日照計所有值的平均】", powerStation.Code, dateNowDay); //if (pyrheliometerHistorDay != null) //{ // pyrheliometerHistoryDays.Add(pyrheliometerHistorDay); //} ////逆變器 //logger.LogInformation("【CalcAvgPowerStationJob】【開始計算電站[{0}]在{1}的逆變器所有值的平均】", powerStation.Code, dateNowDay); //var inverterHistoriesDay = await powerStationRepository.CalcInverterHistoryDayDataByPowerStationId(dateNowDay, powerStation.SiteDB, powerStation.Id); //logger.LogInformation("【CalcAvgPowerStationJob】【計算完成電站[{0}]在{1}的逆變器所有值的平均】", powerStation.Code, dateNowDay); //if (inverterHistoriesDay != null && inverterHistoriesDay.Count() > 0) //{ // foreach (var inverterHistoryDay in inverterHistoriesDay) // { // inverterHistoryDay.DC1KW = inverterHistoryDay.DC1W / 1000; // inverterHistoryDay.DC2KW = inverterHistoryDay.DC2W / 1000; // inverterHistoryDay.DC3KW = inverterHistoryDay.DC3W / 1000; // inverterHistoryDay.DC4KW = inverterHistoryDay.DC4W / 1000; // inverterHistoryDay.DC5KW = inverterHistoryDay.DC5W / 1000; // inverterHistoryDay.DCKW = (inverterHistoryDay.DC1W + inverterHistoryDay.DC2W + inverterHistoryDay.DC3W + inverterHistoryDay.DC4W + inverterHistoryDay.DC5W) / 1000; // inverterHistoryDay.ACKW = (inverterHistoryDay.AC1W + inverterHistoryDay.AC2W + inverterHistoryDay.AC3W) / 1000; // allofInverterHistorDays.Add(inverterHistoryDay); // } //} ////sensor avg //logger.LogInformation("【CalcAvgPowerStationJob】【開始計算電站[{0}]在{1}的Sensor Avg table所有值的平均】", powerStation.Code, dateNowDay); //var sensorAvgHistoryDay = await powerStationRepository.CalcSensorAvgDayDataByPowerStationId(dateNowDay, powerStation.Id); //logger.LogInformation("【CalcAvgPowerStationJob】【計算完成電站[{0}]在{1}的Sensor Avg table所有值的平均】", powerStation.Code, dateNowDay); //if (sensorAvgHistoryDay != null) //{ // sensorAvgHistoryDays.Add(sensorAvgHistoryDay); //} //meter logger.LogInformation("【CalcAvgPowerStationJob】【開始計算電站[{0}]在{1}的meter_hour所有值的平均】", powerStation.Code, dateNowDay); var meterHistoriesDay = await powerStationRepository.CalcMeterDayDataByPowerStationId(dateNowDay, powerStation.Id); logger.LogInformation("【CalcAvgPowerStationJob】【計算完成電站[{0}]在{1}的meter_hour所有值的平均】", powerStation.Code, dateNowDay); if (meterHistoriesDay != null && meterHistoriesDay.Count() > 0) { meterHistoriesDays.AddRange(meterHistoriesDay); } #endregion } #endregion #region step3. calcPowerStations UPDATE 到 power_station 資料表 List power_station_properties = new List() { "Id", "avg_kwhkwp", "avg_PR", "avg_irradiance" }; await powerStationRepository.UpdateList(calcAvgPowerStations, power_station_properties); #endregion #region step4. 將各電站的每日的資料insert資料表 //每日 - 電站歷史資料 List history_properties_day = new List() { "PowerStationId", "TIMESTAMP", "SITEID", "SITETYPE", "TODAYKWH", "TOTALKWH", "KWHKWP", "PR", "MP", "SolarHour", "MONEY", "CARBON", "TOTALMONEY", "TOTALCARBON" }; /*因修改為補償 而註解*/ //await powerStationRepository.AddPowerStationHistoryDayList(powerStationHistoryDays, history_properties_day); ////每日 - 日照溫度歷史資料 //await powerStationRepository.AddPyrheliometerHistoryDayList(pyrheliometerHistoryDays, pyrheliometer_history_properties); ////每日 - 逆變器歷史資料 //await powerStationRepository.AddInverterHistoryDayList(allofInverterHistorDays, inverter_history_properties); ////每日 - sensor avg //await powerStationRepository.AddSensorAvgHistoryDayList(sensorAvgHistoryDays, sensoravg_history_properties); ////每日 - meter //await powerStationRepository.AddMeterHistoryDayList(meterHistoriesDays, meter_history_properties); #endregion #region step5. 歸檔電站的每月資訊 foreach (var powerStation in powerStations) { ////電站該月份的歷史資料 //logger.LogInformation("【CalcAvgPowerStationJob】【開始計算電站[{0}]在{1}月份的歷史資料總和】", powerStation.Code, dateNowMonth); //var exist_history = await powerStationRepository.GetOnePowerStationHistoryByPowerStationIdAndMonth(powerStation.Id, dateNowMonth); //if (exist_history == null) //{ //新增 // var historyMonth = await powerStationRepository.ClacPowerStationHistoryMonthDataByPowerStationId(powerStation.Id, dateNowMonth); // var moneyandcarbonMon = await powerStationRepository.GetMoneyAndCarbonWithHistoryHour(powerStation.Id, dateNowMonth, 0); // var lastmoneyhistorymonth = await powerStationRepository.GetLastMoneyAndCarbonInHour(powerStation.Id, 2, ""); // if (historyMonth != null) // { // historyMonth.Timestamp = Convert.ToDateTime(historyMonth.Timestamp).ToString("yyyy-MM-dd"); // historyMonth.MONEY = moneyandcarbonMon.MONEY; // historyMonth.CARBON = moneyandcarbonMon.CARBON; // if (lastmoneyhistorymonth != null) // { // historyMonth.TOTALCARBON = lastmoneyhistorymonth.TOTALCARBON + moneyandcarbonMon.CARBON; // historyMonth.TOTALMONEY = lastmoneyhistorymonth.TOTALMONEY + moneyandcarbonMon.MONEY; // } // else // { // historyMonth.TOTALCARBON = moneyandcarbonMon.CARBON; // historyMonth.TOTALMONEY = moneyandcarbonMon.MONEY; // } // insertPowerStationHistoryMonths.Add(historyMonth); // } // logger.LogInformation("【CalcAvgPowerStationJob】【計算完成電站[{0}]在{1}月份的歷史資料總和】", powerStation.Code, dateNowMonth); //} //else //{ //修改 // var historyMonth = await powerStationRepository.ClacPowerStationHistoryMonthDataByPowerStationId(powerStation.Id, dateNowMonth); // var moneyandcarbonMon = await powerStationRepository.GetMoneyAndCarbonWithHistoryHour(powerStation.Id, dateNowMonth, 0); // var lastmoneyhistorymonth = await powerStationRepository.GetLastMoneyAndCarbonInHour(powerStation.Id, 2, ""); // if (historyMonth != null) // { // historyMonth.MONEY = historyMonth.MONEY + moneyandcarbonMon.MONEY; // historyMonth.CARBON = historyMonth.CARBON + moneyandcarbonMon.CARBON; // if (lastmoneyhistorymonth != null) // { // historyMonth.TOTALCARBON = lastmoneyhistorymonth.TOTALCARBON + moneyandcarbonMon.CARBON; // historyMonth.TOTALMONEY = lastmoneyhistorymonth.TOTALMONEY + moneyandcarbonMon.MONEY; // } // else // { // historyMonth.TOTALCARBON = moneyandcarbonMon.CARBON; // historyMonth.TOTALMONEY = moneyandcarbonMon.MONEY; // } // updatePowerStationHistoryMonths.Add(historyMonth); // } // logger.LogInformation("【CalcAvgPowerStationJob】【計算完成電站[{0}]在{1}月份的歷史資料總和】", powerStation.Code, dateNowMonth); //} ////電站該月份的的日照度歷史資料 //logger.LogInformation("【CalcAvgPowerStationJob】【開始計算電站[{0}]在{1}月份的日照度歷史資料】", powerStation.Code, dateNowMonth); //var exist_pyrheliometer_history = await powerStationRepository.GetOnePyrheliometerHistoryByMonth(dateNowMonth, powerStation.Id); //if (exist_pyrheliometer_history == null) //{ //新增 // var pyrheliometerHistoryMonth = await powerStationRepository.CalcPyrheliometerHistoryMonthDataByPowerStationId(dateNowMonth, powerStation.Id); // if (pyrheliometerHistoryMonth != null) // { // pyrheliometerHistoryMonth.Timestamp = Convert.ToDateTime(pyrheliometerHistoryMonth.Timestamp).ToString("yyyy-MM-dd"); // insertPyrheliometerHistoryMonths.Add(pyrheliometerHistoryMonth); // } // logger.LogInformation("【CalcAvgPowerStationJob】【計算完成電站[{0}]在{1}月份的日照度歷史資料】", powerStation.Code, dateNowMonth); //} //else //{ //修改 // var pyrheliometerHistoryMonth = await powerStationRepository.CalcPyrheliometerHistoryMonthDataByPowerStationId(dateNowMonth, powerStation.Id); // if (pyrheliometerHistoryMonth != null) // { // updatePyrheliometerHistoryMonths.Add(pyrheliometerHistoryMonth); // } // logger.LogInformation("【CalcAvgPowerStationJob】【計算完成電站[{0}]在{1}月份的日照度歷史資料】", powerStation.Code, dateNowMonth); //} ////電站該月份的的逆變器歷史資料 //logger.LogInformation("【CalcAvgPowerStationJob】【開始計算電站[{0}]在{1}月份的逆變器歷史資料】", powerStation.Code, dateNowMonth); //var exist_inverter_histories = await powerStationRepository.GetInverterHistoryByPowerStationIdAndMonth(dateNowMonth, powerStation.Id); //if (exist_inverter_histories.Count == 0) //{ //新增 // var inverterHistoriesMonth = await powerStationRepository.CalcInverterHistoryMonthDataByPowerStationId(dateNowMonth, powerStation.SiteDB, powerStation.Id); // if (inverterHistoriesMonth.Count > 0) // { // foreach (var inverterHistoryMonth in inverterHistoriesMonth) // { // inverterHistoryMonth.DC1KW = inverterHistoryMonth.DC1W / 1000; // inverterHistoryMonth.DC2KW = inverterHistoryMonth.DC2W / 1000; // inverterHistoryMonth.DC3KW = inverterHistoryMonth.DC3W / 1000; // inverterHistoryMonth.DC4KW = inverterHistoryMonth.DC4W / 1000; // inverterHistoryMonth.DC5KW = inverterHistoryMonth.DC5W / 1000; // inverterHistoryMonth.DCKW = (inverterHistoryMonth.DC1W + inverterHistoryMonth.DC2W + inverterHistoryMonth.DC3W + inverterHistoryMonth.DC4W + inverterHistoryMonth.DC5W) / 1000; // inverterHistoryMonth.ACKW = (inverterHistoryMonth.AC1W + inverterHistoryMonth.AC2W + inverterHistoryMonth.AC3W) / 1000; // inverterHistoryMonth.TIMESTAMP = Convert.ToDateTime(inverterHistoryMonth.TIMESTAMP).ToString("yyyy-MM-dd"); // insertInverterHistoryMonths.Add(inverterHistoryMonth); // } // } // logger.LogInformation("【CalcAvgPowerStationJob】【計算完成電站[{0}]在{1}月份的逆變器歷史資料】", powerStation.Code, dateNowMonth); //} //else //{ //修改 // var inverterHistoriesMonth = await powerStationRepository.CalcInverterHistoryMonthDataByPowerStationId(dateNowMonth, powerStation.SiteDB, powerStation.Id); // if (inverterHistoriesMonth.Count > 0) // { // foreach (var inverterHistoryMonth in inverterHistoriesMonth) // { // inverterHistoryMonth.DC1KW = inverterHistoryMonth.DC1W / 1000; // inverterHistoryMonth.DC2KW = inverterHistoryMonth.DC2W / 1000; // inverterHistoryMonth.DC3KW = inverterHistoryMonth.DC3W / 1000; // inverterHistoryMonth.DC4KW = inverterHistoryMonth.DC4W / 1000; // inverterHistoryMonth.DC5KW = inverterHistoryMonth.DC5W / 1000; // inverterHistoryMonth.DCKW = (inverterHistoryMonth.DC1W + inverterHistoryMonth.DC2W + inverterHistoryMonth.DC3W + inverterHistoryMonth.DC4W + inverterHistoryMonth.DC5W) / 1000; // inverterHistoryMonth.ACKW = (inverterHistoryMonth.AC1W + inverterHistoryMonth.AC2W + inverterHistoryMonth.AC3W) / 1000; // inverterHistoryMonth.TIMESTAMP = Convert.ToDateTime(inverterHistoryMonth.TIMESTAMP).ToString("yyyy-MM-dd"); // updateInverterHistoryMonths.Add(inverterHistoryMonth); // } // } // logger.LogInformation("【CalcAvgPowerStationJob】【計算完成電站[{0}]在{1}月份的逆變器歷史資料】", powerStation.Code, dateNowMonth); //} ////電站該月份的的sensoravg歷史資料 //logger.LogInformation("【CalcAvgPowerStationJob】【開始計算電站[{0}]在{1}月份的Sensor Avg table所有值的平均資料】", powerStation.Code, dateNowMonth); //var exist_sensoravg_history = await powerStationRepository.GetSensorAvgHistoryByPowerStationIdAndMonth(dateNowMonth, powerStation.Id); //if (exist_sensoravg_history == null) //{ //新增 // var sensorAvgHistoryMonth = await powerStationRepository.CalcSensorAvgHistoryMonthDataByPowerStationId(dateNowMonth, powerStation.Id); // if (sensorAvgHistoryMonth != null) // { // sensorAvgHistoryMonth.TIMESTAMP = Convert.ToDateTime(sensorAvgHistoryMonth.TIMESTAMP).ToString("yyyy-MM-dd"); // insertSensorAvgHistoryMonths.Add(sensorAvgHistoryMonth); // } // logger.LogInformation("【CalcAvgPowerStationJob】【計算完成電站[{0}]在{1}月份的Sensor Avg table所有值的平均資料】", powerStation.Code, dateNowMonth); //} //else //{ //修改 // var sensorAvgHistoryMonth = await powerStationRepository.CalcSensorAvgHistoryMonthDataByPowerStationId(dateNowMonth, powerStation.Id); // if (sensorAvgHistoryMonth != null) // { // sensorAvgHistoryMonth.TIMESTAMP = Convert.ToDateTime(sensorAvgHistoryMonth.TIMESTAMP).ToString("yyyy-MM-dd"); // updateSensorAvgHistoryMonths.Add(sensorAvgHistoryMonth); // } // logger.LogInformation("【CalcAvgPowerStationJob】【計算完成電站[{0}]在{1}月份的Sensor Avg table所有值的平均資料】", powerStation.Code, dateNowMonth); //} //電站該月份的的meter歷史資料 logger.LogInformation("【CalcAvgPowerStationJob】【開始計算電站[{0}]在{1}月份的meter table所有值的平均資料】", powerStation.Code, dateNowMonth); var exist_meter_history = await powerStationRepository.GetMeterHistoryByPowerStationIdAndMonth(dateNowMonth, powerStation.Id); if (exist_meter_history.Count() == 0) { //新增 var meterHistoriesMonth = await powerStationRepository.CalcMeterHistoryMonthDataByPowerStationId(dateNowMonth, powerStation.Id); if (meterHistoriesMonth != null && meterHistoriesMonth.Count() > 0) { foreach (var meterHistoryMonth in meterHistoriesMonth) { meterHistoryMonth.TIMESTAMP = Convert.ToDateTime(meterHistoryMonth.TIMESTAMP).ToString("yyyy-MM-dd"); insertmeterHistoryMonths.Add(meterHistoryMonth); } } logger.LogInformation("【CalcAvgPowerStationJob】【計算完成電站[{0}]在{1}月份的meter table所有值的平均資料】", powerStation.Code, dateNowMonth); } else { //修改 var meterHistoriesMonth = await powerStationRepository.CalcMeterHistoryMonthDataByPowerStationId(dateNowMonth, powerStation.Id); if (meterHistoriesMonth != null && meterHistoriesMonth.Count() > 0) { foreach (var meterHistoryMonth in meterHistoriesMonth) { meterHistoryMonth.TIMESTAMP = Convert.ToDateTime(meterHistoryMonth.TIMESTAMP).ToString("yyyy-MM-dd"); updatemeterHistoryMonths.Add(meterHistoryMonth); } } logger.LogInformation("【CalcAvgPowerStationJob】【計算完成電站[{0}]在{1}月份的meter table所有值的平均資料】", powerStation.Code, dateNowMonth); } } #endregion //每月 List history_properties_month = new List() { "PowerStationId", "TIMESTAMP", "SITEID", "SITETYPE", "MonthKWh", "TOTALKWH", "KWHKWP", "PR", "MP", "SolarHour", "MONEY", "CARBON", "TOTALMONEY", "TOTALCARBON" }; //if (insertPowerStationHistoryMonths.Count > 0) //{ // await powerStationRepository.AddPowerStationHistoryMonthList(insertPowerStationHistoryMonths, history_properties_month); //} //if (updatePowerStationHistoryMonths.Count > 0) //{ // await powerStationRepository.UpdatePowerStationHistoryMonthList(updatePowerStationHistoryMonths); //} //#region step5. 將各電站的每月的日照度資料insert or update 各資料表 ////每月 //if (insertPyrheliometerHistoryMonths.Count > 0) //{ // await powerStationRepository.AddPyrheliometerHistoryMonthList(insertPyrheliometerHistoryMonths, pyrheliometer_history_properties); //} //if (updatePyrheliometerHistoryMonths.Count > 0) //{ // await powerStationRepository.UpdatePyrheliometerHistoryMonthList(updatePyrheliometerHistoryMonths); //} //#endregion //#region step6. 將各電站的每月的逆變器資料insert or update 各資料表 ////每月 //if (insertInverterHistoryMonths.Count > 0) //{ // await powerStationRepository.AddInverterHistoryMonthList(insertInverterHistoryMonths, inverter_history_properties); //} //if (updateInverterHistoryMonths.Count > 0) //{ // await powerStationRepository.UpdateInverterHistoryMonthList(updateInverterHistoryMonths); //} //#endregion //#region step7. 將各電站的每月的Sensor Avg資料insert or update 各資料表 ////每月 //if (insertSensorAvgHistoryMonths.Count > 0) //{ // await powerStationRepository.AddSensorAvgHistoryMonthList(insertSensorAvgHistoryMonths, sensoravg_history_properties); //} //if (updateSensorAvgHistoryMonths.Count > 0) //{ // await powerStationRepository.UpdateSensorAvgHistoryMonthList(updateSensorAvgHistoryMonths); //} //#endregion #region step8. 將各電站的每月的meter資料insert or update 各資料表 //每月 if (insertmeterHistoryMonths.Count > 0) { await powerStationRepository.AddMeterHistoryMonthList(insertmeterHistoryMonths, meter_history_properties); } if (updatemeterHistoryMonths.Count > 0) { await powerStationRepository.UpdateMeterHistoryMonthList(updatemeterHistoryMonths); } #endregion #region 補償機制 var gobackDay = this.Configuration.GetValue("GoBackDay"); //回推天數 var Connection_string = Configuration.GetValue("mySql"); var start_date = DateTimeNow.AddDays(-1 * gobackDay); var end_date = DateTimeNow.AddDays(-1); logger.LogInformation("【CalcAvgPowerStationJob】【開始執行補償機制】"); procSensorSvc sensorSvc = new procSensorSvc(Connection_string); procInvSvc invSvc = new procInvSvc(Connection_string, logger); procStationSvc siteSvc = new procStationSvc(Connection_string); foreach (var powerStation in powerStations) { start_date = DateTimeNow.AddDays(-1 * gobackDay); for (; start_date <= end_date; start_date = start_date.AddDays(1)) { var day_str = start_date.ToString("yyyy-MM-dd"); try { logger.LogInformation("【CalcAvgPowerStationJob】【開始執行電站[{0}]在{1}的Sensor補償機制】", powerStation.Code, day_str); sensorSvc.archiveData(powerStation.Code, day_str); logger.LogInformation("【CalcAvgPowerStationJob】【執行完成電站[{0}]在{1}的Sensor補償機制】", powerStation.Code, day_str); } catch (Exception exception) { logger.LogInformation("【CalcAvgPowerStationJob】【執行失敗電站[{0}]在{1}的Sensor補償機制】", powerStation.Code, day_str); logger.LogError("【CalcAvgPowerStationJob】[Exception] - {0}", exception.Message); if (exception.InnerException != null) { logger.LogError("【CalcAvgPowerStationJob】[InnerException] - {0}", exception.InnerException.Message); } } try { logger.LogInformation("【CalcAvgPowerStationJob】【開始執行電站[{0}]在{1}的Meter補償機制】", powerStation.Code, day_str); sensorSvc.archiveMeterData(powerStation.Code, day_str); logger.LogInformation("【CalcAvgPowerStationJob】【執行完成電站[{0}]在{1}的Meter補償機制】", powerStation.Code, day_str); } catch (Exception exception) { logger.LogInformation("【CalcAvgPowerStationJob】【執行失敗電站[{0}]在{1}的Meter補償機制】", powerStation.Code, day_str); logger.LogError("【CalcAvgPowerStationJob】[Exception] - {0}", exception.Message); if (exception.InnerException != null) { logger.LogError("【CalcAvgPowerStationJob】[InnerException] - {0}", exception.InnerException.Message); } } try { logger.LogInformation("【CalcAvgPowerStationJob】【開始執行電站[{0}]在{1}的Inverter補償機制】", powerStation.Code, day_str); invSvc.archiveData(powerStation.Code, day_str); logger.LogInformation("【CalcAvgPowerStationJob】【執行完成電站[{0}]在{1}的Inverter補償機制】", powerStation.Code, day_str); } catch (Exception exception) { logger.LogInformation("【CalcAvgPowerStationJob】【執行失敗電站[{0}]在{1}的Inverter補償機制】", powerStation.Code, day_str); logger.LogError("【CalcAvgPowerStationJob】[Exception] - {0}", exception.Message); if (exception.InnerException != null) { logger.LogError("【CalcAvgPowerStationJob】[InnerException] - {0}", exception.InnerException.Message); } } try { logger.LogInformation("【CalcAvgPowerStationJob】【開始執行電站[{0}]在{1}的Site補償機制】", powerStation.Code, day_str); siteSvc.archiveData(powerStation.Code, day_str); logger.LogInformation("【CalcAvgPowerStationJob】【執行完成電站[{0}]在{1}的Site補償機制】", powerStation.Code, day_str); } catch (Exception exception) { logger.LogInformation("【CalcAvgPowerStationJob】【執行失敗電站[{0}]在{1}的Site補償機制】", powerStation.Code, day_str); logger.LogError("【CalcAvgPowerStationJob】[Exception] - {0}", exception.Message); if (exception.InnerException != null) { logger.LogError("【CalcAvgPowerStationJob】[InnerException] - {0}", exception.InnerException.Message); } } } } 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】【任務完成】"); } catch (Exception exception) { logger.LogError("【CalcAvgPowerStationJob - main】[Exception] - {0}", exception.Message); if(exception.InnerException != null) { logger.LogError("【CalcAvgPowerStationJob - main】[InnerException] - {0}", exception.InnerException.Message); } } } } }