This commit is contained in:
b110212000 2021-11-22 10:47:21 +08:00
commit 9c5c9ca84c
17 changed files with 839 additions and 463 deletions

View File

@ -110,7 +110,13 @@ namespace SolarPower.Controllers
StationCodeWithInverterIdsList.Add(stationCodeWithInverterIds); 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(); analysisInverter.XAxis = inverterHistories.Select(x => x.TIMESTAMP).Distinct().ToList();

View File

@ -74,7 +74,7 @@ namespace SolarPower.Controllers
temp.Add(powerStation); temp.Add(powerStation);
foreach (var device in psName_Group) foreach (var device in psName_Group)
{ {
if(!string.IsNullOrEmpty(device.DeviceId)) if (!string.IsNullOrEmpty(device.DeviceId))
{ {
temp.Add(device); temp.Add(device);
} }
@ -114,13 +114,17 @@ namespace SolarPower.Controllers
Dictionary<int, List<Device>> deviceDic = new Dictionary<int, List<Device>>(); Dictionary<int, List<Device>> deviceDic = new Dictionary<int, List<Device>>();
List<StationIdWithMeterIds> meterDic = new List<StationIdWithMeterIds>(); List<StationIdWithMeterIds> meterDic = new List<StationIdWithMeterIds>();
List<int> selected_powerStationIds = new List<int>(); List<int> selected_powerStationIds = new List<int>();
List<PowerStationHistory> powerStationHistories = new List<PowerStationHistory>();
List<MeterHistory> meterHistories = new List<MeterHistory>();
foreach (var psId_Group in device_powerStationId_Group) foreach (var psId_Group in device_powerStationId_Group)
{ {
var powerStation = await powerStationRepository.GetOneAsync(psId_Group.Key); var powerStation = await powerStationRepository.GetOneAsync(psId_Group.Key);
//區分電站總覽or設備 //區分電站總覽or設備
var temp_psIds = psId_Group.Where(x => x.DeviceType == "PWS").Select(x => Convert.ToInt32(x.DeviceId)).ToList(); 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); selected_powerStationIds.AddRange(temp_psIds);
} }
@ -170,13 +174,41 @@ namespace SolarPower.Controllers
var XAxis = new List<string>(); var XAxis = new List<string>();
#region //針對x軸先進行處理並同時抓取資
if (selected_powerStationIds.Count() > 0) 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()); 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<string, object>;
XAxis.Add(fields["TIMESTAMP"].ToString());
}
}
XAxis = XAxis.Distinct().ToList();
}
XAxis.Sort();
analysisDevice.XAxis = XAxis;
#region
if (powerStationHistories.Count() > 0)
{
var powerStationHistories_Id_Group = powerStationHistories.GroupBy(x => x.PowerStationId).ToList(); var powerStationHistories_Id_Group = powerStationHistories.GroupBy(x => x.PowerStationId).ToList();
foreach (var item in powerStationHistories_Id_Group) foreach (var item in powerStationHistories_Id_Group)
@ -185,32 +217,36 @@ namespace SolarPower.Controllers
var temp_item = item.OrderBy(x => x.Timestamp).ToList(); var temp_item = item.OrderBy(x => x.Timestamp).ToList();
DeviceHistoryInfo Irradiance = new DeviceHistoryInfo(); //DeviceHistoryInfo Irradiance = new DeviceHistoryInfo();
Irradiance.Name = string.Format("{0}:{1}", powerStation.Name, analysisDevice.MultipleYaxes["Irradiance"]); //Irradiance.Name = string.Format("{0}:{1}", powerStation.Name, analysisDevice.MultipleYaxes["Irradiance"]);
Irradiance.YaxesKey = "Irradiance"; //Irradiance.YaxesKey = "Irradiance";
Irradiance.Values = new List<double>(); //Irradiance.Values = new List<double>();
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();
{
Irradiance.Values.Add(history.Irradiance); // if (history != null)
} // {
else // Irradiance.Values.Add(history.Irradiance);
{ // }
Irradiance.Values.Add(0); // else
} // {
} // Irradiance.Values.Add(0);
analysisDevice.Series.Add(Irradiance); // }
//}
//analysisDevice.Series.Add(Irradiance);
DeviceHistoryInfo KWH = new DeviceHistoryInfo(); DeviceHistoryInfo KWH = new DeviceHistoryInfo();
KWH.Name = string.Format("{0}:{1}", powerStation.Name, analysisDevice.MultipleYaxes["KWH"]); KWH.Name = string.Format("{0}:{1}", powerStation.Name, analysisDevice.MultipleYaxes["KWH"]);
KWH.YaxesKey = "KWH"; KWH.YaxesKey = "KWH";
KWH.Values = new List<double>(); KWH.Values = new List<double>();
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 else
{ {
@ -223,9 +259,11 @@ namespace SolarPower.Controllers
solarHour.Name = string.Format("{0}:{1}", powerStation.Name, analysisDevice.MultipleYaxes["SolarHour"]); solarHour.Name = string.Format("{0}:{1}", powerStation.Name, analysisDevice.MultipleYaxes["SolarHour"]);
solarHour.YaxesKey = "SolarHour"; solarHour.YaxesKey = "SolarHour";
solarHour.Values = new List<double>(); solarHour.Values = new List<double>();
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)); solarHour.Values.Add(Math.Round(history.SolarHour, 2));
} }
@ -240,9 +278,11 @@ namespace SolarPower.Controllers
KWHKWP.Name = string.Format("{0}:{1}", powerStation.Name, analysisDevice.MultipleYaxes["KWHKWP"]); KWHKWP.Name = string.Format("{0}:{1}", powerStation.Name, analysisDevice.MultipleYaxes["KWHKWP"]);
KWHKWP.YaxesKey = "KWHKWP"; KWHKWP.YaxesKey = "KWHKWP";
KWHKWP.Values = new List<double>(); KWHKWP.Values = new List<double>();
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)); KWHKWP.Values.Add(Math.Round(history.KWHKWP, 2));
} }
@ -257,9 +297,11 @@ namespace SolarPower.Controllers
PR.Name = string.Format("{0}:{1}", powerStation.Name, analysisDevice.MultipleYaxes["PR"]); PR.Name = string.Format("{0}:{1}", powerStation.Name, analysisDevice.MultipleYaxes["PR"]);
PR.YaxesKey = "PR"; PR.YaxesKey = "PR";
PR.Values = new List<double>(); PR.Values = new List<double>();
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)); PR.Values.Add(Math.Round(history.PR, 2));
} }
@ -270,33 +312,31 @@ namespace SolarPower.Controllers
} }
analysisDevice.Series.Add(PR); analysisDevice.Series.Add(PR);
DeviceHistoryInfo modelTemperature = new DeviceHistoryInfo(); //DeviceHistoryInfo modelTemperature = new DeviceHistoryInfo();
modelTemperature.Name = string.Format("{0}:{1}", powerStation.Name, analysisDevice.MultipleYaxes["Temperature"]); //modelTemperature.Name = string.Format("{0}:{1}", powerStation.Name, analysisDevice.MultipleYaxes["Temperature"]);
modelTemperature.YaxesKey = "Temperature"; //modelTemperature.YaxesKey = "Temperature";
modelTemperature.Values = new List<double>(); //modelTemperature.Values = new List<double>();
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();
{
modelTemperature.Values.Add(Math.Round(history.Temperature, 2)); // if (history != null)
} // {
else // modelTemperature.Values.Add(Math.Round(history.Temperature, 2));
{ // }
modelTemperature.Values.Add(0); // else
} // {
} // modelTemperature.Values.Add(0);
analysisDevice.Series.Add(modelTemperature); // }
//}
//analysisDevice.Series.Add(modelTemperature);
} }
} }
#endregion #endregion
#region #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(); var meterHistories_Id_Group = meterHistories.GroupBy(x => x.METERID).ToList();
foreach (var item in meterHistories_Id_Group) foreach (var item in meterHistories_Id_Group)
@ -307,9 +347,11 @@ namespace SolarPower.Controllers
OUTPUT_KWH.Name = string.Format("{0}:{1}", item.Key, analysisDevice.MultipleYaxes["OUTPUT_KWH"]); OUTPUT_KWH.Name = string.Format("{0}:{1}", item.Key, analysisDevice.MultipleYaxes["OUTPUT_KWH"]);
OUTPUT_KWH.YaxesKey = "OUTPUT_KWH"; OUTPUT_KWH.YaxesKey = "OUTPUT_KWH";
OUTPUT_KWH.Values = new List<double>(); OUTPUT_KWH.Values = new List<double>();
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)); OUTPUT_KWH.Values.Add(Math.Round(history.OUTPUT_KWH, 2));
} }
@ -324,9 +366,11 @@ namespace SolarPower.Controllers
INPUT_KWH.Name = string.Format("{0}:{1}", item.Key, analysisDevice.MultipleYaxes["INPUT_KWH"]); INPUT_KWH.Name = string.Format("{0}:{1}", item.Key, analysisDevice.MultipleYaxes["INPUT_KWH"]);
INPUT_KWH.YaxesKey = "INPUT_KWH"; INPUT_KWH.YaxesKey = "INPUT_KWH";
INPUT_KWH.Values = new List<double>(); INPUT_KWH.Values = new List<double>();
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)); INPUT_KWH.Values.Add(Math.Round(history.INPUT_KWH, 2));
} }
@ -341,9 +385,11 @@ namespace SolarPower.Controllers
V_AB.Name = string.Format("{0}:{1}", item.Key, analysisDevice.MultipleYaxes["V_AB"]); V_AB.Name = string.Format("{0}:{1}", item.Key, analysisDevice.MultipleYaxes["V_AB"]);
V_AB.YaxesKey = "V_AB"; V_AB.YaxesKey = "V_AB";
V_AB.Values = new List<double>(); V_AB.Values = new List<double>();
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)); V_AB.Values.Add(Math.Round(history.V_AB, 2));
} }
@ -358,9 +404,11 @@ namespace SolarPower.Controllers
V_BC.Name = string.Format("{0}:{1}", item.Key, analysisDevice.MultipleYaxes["V_BC"]); V_BC.Name = string.Format("{0}:{1}", item.Key, analysisDevice.MultipleYaxes["V_BC"]);
V_BC.YaxesKey = "V_BC"; V_BC.YaxesKey = "V_BC";
V_BC.Values = new List<double>(); V_BC.Values = new List<double>();
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)); V_BC.Values.Add(Math.Round(history.V_BC, 2));
} }
@ -375,9 +423,11 @@ namespace SolarPower.Controllers
V_CA.Name = string.Format("{0}:{1}", item.Key, analysisDevice.MultipleYaxes["V_BC"]); V_CA.Name = string.Format("{0}:{1}", item.Key, analysisDevice.MultipleYaxes["V_BC"]);
V_CA.YaxesKey = "V_CA"; V_CA.YaxesKey = "V_CA";
V_CA.Values = new List<double>(); V_CA.Values = new List<double>();
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)); V_CA.Values.Add(Math.Round(history.V_CA, 2));
} }
@ -392,9 +442,11 @@ namespace SolarPower.Controllers
I_A.Name = string.Format("{0}:{1}", item.Key, analysisDevice.MultipleYaxes["I_A"]); I_A.Name = string.Format("{0}:{1}", item.Key, analysisDevice.MultipleYaxes["I_A"]);
I_A.YaxesKey = "I_A"; I_A.YaxesKey = "I_A";
I_A.Values = new List<double>(); I_A.Values = new List<double>();
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)); I_A.Values.Add(Math.Round(history.I_A, 2));
} }
@ -409,9 +461,11 @@ namespace SolarPower.Controllers
I_B.Name = string.Format("{0}:{1}", item.Key, analysisDevice.MultipleYaxes["I_B"]); I_B.Name = string.Format("{0}:{1}", item.Key, analysisDevice.MultipleYaxes["I_B"]);
I_B.YaxesKey = "I_B"; I_B.YaxesKey = "I_B";
I_B.Values = new List<double>(); I_B.Values = new List<double>();
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)); I_B.Values.Add(Math.Round(history.I_B, 2));
} }
@ -426,9 +480,11 @@ namespace SolarPower.Controllers
I_C.Name = string.Format("{0}:{1}", item.Key, analysisDevice.MultipleYaxes["I_C"]); I_C.Name = string.Format("{0}:{1}", item.Key, analysisDevice.MultipleYaxes["I_C"]);
I_C.YaxesKey = "I_C"; I_C.YaxesKey = "I_C";
I_C.Values = new List<double>(); I_C.Values = new List<double>();
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)); I_C.Values.Add(Math.Round(history.I_C, 2));
} }
@ -443,9 +499,11 @@ namespace SolarPower.Controllers
P.Name = string.Format("{0}:{1}", item.Key, analysisDevice.MultipleYaxes["P"]); P.Name = string.Format("{0}:{1}", item.Key, analysisDevice.MultipleYaxes["P"]);
P.YaxesKey = "P"; P.YaxesKey = "P";
P.Values = new List<double>(); P.Values = new List<double>();
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)); P.Values.Add(Math.Round(history.P, 2));
} }
@ -460,9 +518,11 @@ namespace SolarPower.Controllers
F.Name = string.Format("{0}:{1}", item.Key, analysisDevice.MultipleYaxes["F"]); F.Name = string.Format("{0}:{1}", item.Key, analysisDevice.MultipleYaxes["F"]);
F.YaxesKey = "F"; F.YaxesKey = "F";
F.Values = new List<double>(); F.Values = new List<double>();
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)); F.Values.Add(Math.Round(history.F, 2));
} }
@ -483,13 +543,7 @@ namespace SolarPower.Controllers
{ {
var result = await powerStationRepository.GetSensorAvgByDevices(post.SelectedDate, post.SearchType, devices.Value); var result = await powerStationRepository.GetSensorAvgByDevices(post.SelectedDate, post.SearchType, devices.Value);
foreach (var rows in result) var powerStation = await powerStationRepository.GetOneAsync(devices.Key);
{
var fields = rows as IDictionary<string, object>;
XAxis.Add(fields["TIMESTAMP"].ToString());
}
foreach (var device in devices.Value) foreach (var device in devices.Value)
{ {
DeviceHistoryInfo deviceHistoryInfo = new DeviceHistoryInfo(); DeviceHistoryInfo deviceHistoryInfo = new DeviceHistoryInfo();
@ -525,7 +579,7 @@ namespace SolarPower.Controllers
suffix = string.Empty; suffix = string.Empty;
break; 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.YaxesKey = YaxesKey;
deviceHistoryInfo.Values = new List<double>(); deviceHistoryInfo.Values = new List<double>();
foreach (var rows in result) foreach (var rows in result)
@ -546,10 +600,7 @@ namespace SolarPower.Controllers
} }
#endregion #endregion
analysisDevice.XAxis = XAxis.Distinct().ToList();
apiResult.Code = "0000"; apiResult.Code = "0000";
apiResult.Data = analysisDevice; apiResult.Data = analysisDevice;
} }
catch (Exception exception) catch (Exception exception)

View File

@ -3289,6 +3289,20 @@ namespace SolarPower.Controllers
} }
else 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);
await powerStationRepository.StationStatus(Id, 1, powerStation.SiteDB + "."); await powerStationRepository.StationStatus(Id, 1, powerStation.SiteDB + ".");
apiResult.Msg = "電站啟用成功"; apiResult.Msg = "電站啟用成功";

View File

@ -793,7 +793,7 @@ namespace SolarPower.Quartz.Jobs
var end_date = DateTimeNow.AddDays(-1); var end_date = DateTimeNow.AddDays(-1);
logger.LogInformation("【CalcAvgPowerStationJob】【開始執行補償機制】"); logger.LogInformation("【CalcAvgPowerStationJob】【開始執行補償機制】");
procSensorSvc sensorSvc = new procSensorSvc(Connection_string); 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); procStationSvc siteSvc = new procStationSvc(Connection_string);
foreach (var powerStation in powerStations) foreach (var powerStation in powerStations)
{ {
@ -869,196 +869,7 @@ namespace SolarPower.Quartz.Jobs
logger.LogInformation("【CalcAvgPowerStationJob】【執行完成補償機制】"); logger.LogInformation("【CalcAvgPowerStationJob】【執行完成補償機制】");
#endregion #endregion
#region
var users = userRepository.GetAllAsync();
var ttt = new List<string>() {
"s506488@gmail.com",
"cesarliuc@gmail.com"
};
foreach (var user in users.Result)
{
try
{
logger.LogInformation("【CalcAvgPowerStationJob】【開始產生使用者[{0}({1})]的日月報】", user.Account, user.Name);
List<OperationPersonnel> powerstations = new List<OperationPersonnel>();
powerstations = await noticeScheduleRepository.GetPowerStationOperationPersonnel(user.Id);
if (powerstations.Count == 0)
{
continue;
}
List<Excelpowerstation> sentdaypowerstations = powerstations.Where(x => x.EmailDayReport == 1).Select(a => new Excelpowerstation { Name = a.Name, Value = a.PowerStationId.ToString() }).ToList();
List<Excelpowerstation> 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<string> properties = new List<string>()
{
"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<string> properties = new List<string>()
{
"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<string> properties2 = new List<string>()
{
"UserId",
"EmailType",
"RecipientEmail",
"Subject",
"Attachment",
"RecipientName",
"Type"
};
await noticeScheduleRepository.AddOneAsync(MaxmonthSchedule, properties2);
}
}
if (DateTime.Now.ToString("dd") == "01")
{
List<Excelpowerstation> 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<string> properties2 = new List<string>()
{
"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】【任務完成】"); logger.LogInformation("【CalcAvgPowerStationJob】【任務完成】");

View File

@ -44,7 +44,7 @@ namespace SolarPower.Quartz.Jobs
if (this.environment.IsDevelopment()) if (this.environment.IsDevelopment())
{ {
dateTime = "2021-08-16 09"; dateTime = "2021-11-02 10";
} }
logger.LogInformation("【CalcPowerStationJob】【任務開始】"); logger.LogInformation("【CalcPowerStationJob】【任務開始】");
@ -107,12 +107,18 @@ namespace SolarPower.Quartz.Jobs
{ {
logger.LogInformation("【CalcPowerStationJob】【開始取得電站[{0}]在{1}的每小時歷史資料】", powerStation.Code, dateTime); logger.LogInformation("【CalcPowerStationJob】【開始取得電站[{0}]在{1}的每小時歷史資料】", powerStation.Code, dateTime);
var history = await powerStationRepository.GetPowerStationHistoryPerHour(dateTime, full_table_name); var history = await powerStationRepository.GetPowerStationHistoryPerHour(dateTime, full_table_name);
// 當前用不到
// var lastmoneyhistorybyhour = await powerStationRepository.GetLastMoneyAndCarbonInHour(powerStation.Id, 0, dateTime);
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}的每小時歷史資料】", powerStation.Code, dateTime);
logger.LogInformation("【CalcPowerStationJob】【電站[{0}]在{1}的每小時歷史資料】 - {2}", powerStation.Code, dateTime, System.Text.Json.JsonSerializer.Serialize(history)); logger.LogInformation("【CalcPowerStationJob】【電站[{0}]在{1}的每小時歷史資料】 - {2}", powerStation.Code, dateTime, System.Text.Json.JsonSerializer.Serialize(history));
var lastmoneyhistorybyhour = await powerStationRepository.GetLastMoneyAndCarbonInHour(powerStation.Id, 0, dateTime);
if (history != null)
{
logger.LogInformation("【CalcPowerStationJob】【開始計算電站[{0}]在{1}的每小時歷史資料】", powerStation.Code, dateTime); logger.LogInformation("【CalcPowerStationJob】【開始計算電站[{0}]在{1}的每小時歷史資料】", powerStation.Code, dateTime);
history.PowerStationId = powerStation.Id; history.PowerStationId = powerStation.Id;
history.Timestamp = Convert.ToDateTime(history.Timestamp + ":00:00").ToString("yyyy-MM-dd HH:mm:ss"); history.Timestamp = Convert.ToDateTime(history.Timestamp + ":00:00").ToString("yyyy-MM-dd HH:mm:ss");
@ -303,9 +309,13 @@ namespace SolarPower.Quartz.Jobs
//pyrheliometerHistory.Timestamp = Convert.ToDateTime(pyrheliometerHistory.Timestamp + ":00:00").ToString("yyyy-MM-dd HH:mm:ss"); //pyrheliometerHistory.Timestamp = Convert.ToDateTime(pyrheliometerHistory.Timestamp + ":00:00").ToString("yyyy-MM-dd HH:mm:ss");
//pyrheliometerHistory.PowerStationId = powerStation.Id; //pyrheliometerHistory.PowerStationId = powerStation.Id;
//pyrheliometerHistoriesHour.Add(pyrheliometerHistory); //pyrheliometerHistoriesHour.Add(pyrheliometerHistory);
}
logger.LogInformation("【CalcPowerStationJob】【計算完成電站[{0}]在{1}的日照計的平均值】", powerStation.Code, dateTime); logger.LogInformation("【CalcPowerStationJob】【計算完成電站[{0}]在{1}的日照計的平均值】", powerStation.Code, dateTime);
} }
else
{
logger.LogWarning("【CalcPowerStationJob】【查無結果電站[{0}]在{1}的日照計的平均值】", powerStation.Code, dateTime);
}
}
} }
catch (Exception ex) catch (Exception ex)
{ {
@ -334,6 +344,10 @@ namespace SolarPower.Quartz.Jobs
logger.LogInformation("【CalcPowerStationJob】【計算完成電站[{0}]在{1}的模組溫度計的平均值】", powerStation.Code, dateTime); logger.LogInformation("【CalcPowerStationJob】【計算完成電站[{0}]在{1}的模組溫度計的平均值】", powerStation.Code, dateTime);
} }
else
{
logger.LogWarning("【CalcPowerStationJob】【查無結果電站[{0}]在{1}的模組溫度計的平均值】", powerStation.Code, dateTime);
}
} }
} }
catch (Exception ex) catch (Exception ex)

View File

@ -1,9 +1,11 @@
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Quartz; using Quartz;
using SolarPower.Models; using SolarPower.Models;
using SolarPower.Repository.Interface; using SolarPower.Repository.Interface;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics;
using System.Linq; using System.Linq;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -15,11 +17,24 @@ namespace SolarPower.Quartz.Jobs
{ {
private readonly ILogger<OperationScheduleJob> logger; private readonly ILogger<OperationScheduleJob> logger;
private IOperationRepository operationRepository; private IOperationRepository operationRepository;
private readonly IPowerStationRepository powerStationRepository;
private readonly IUserRepository userRepository;
private readonly INoticeScheduleRepository noticeScheduleRepository;
private readonly IStationReportRepository stationReportRepository;
public OperationScheduleJob(ILogger<OperationScheduleJob> logger, IOperationRepository operationRepository) public OperationScheduleJob(ILogger<OperationScheduleJob> logger,
IOperationRepository operationRepository,
IPowerStationRepository powerStationRepository,
IUserRepository userRepository,
INoticeScheduleRepository noticeScheduleRepository,
IStationReportRepository stationReportRepository)
{ {
this.logger = logger; this.logger = logger;
this.operationRepository = operationRepository; this.operationRepository = operationRepository;
this.powerStationRepository = powerStationRepository;
this.userRepository = userRepository;
this.noticeScheduleRepository = noticeScheduleRepository;
this.stationReportRepository = stationReportRepository;
} }
public async Task Execute(IJobExecutionContext context) public async Task Execute(IJobExecutionContext context)
@ -180,6 +195,197 @@ namespace SolarPower.Quartz.Jobs
} }
#region
var users = userRepository.GetAllAsync();
var ttt = new List<string>() {
"s506488@gmail.com",
"cesarliuc@gmail.com"
};
foreach (var user in users.Result)
{
try
{
logger.LogInformation("【OperationScheduleJob】【開始產生使用者[{0}({1})]的日月報】", user.Account, user.Name);
List<OperationPersonnel> powerstations = new List<OperationPersonnel>();
powerstations = await noticeScheduleRepository.GetPowerStationOperationPersonnel(user.Id);
if (powerstations.Count == 0)
{
continue;
}
List<Excelpowerstation> sentdaypowerstations = powerstations.Where(x => x.EmailDayReport == 1).Select(a => new Excelpowerstation { Name = a.Name, Value = a.PowerStationId.ToString() }).ToList();
List<Excelpowerstation> 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<string> properties = new List<string>()
{
"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<string> properties = new List<string>()
{
"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<string> properties2 = new List<string>()
{
"UserId",
"EmailType",
"RecipientEmail",
"Subject",
"Attachment",
"RecipientName",
"Type"
};
await noticeScheduleRepository.AddOneAsync(MaxmonthSchedule, properties2);
}
}
if (DateTime.Now.ToString("dd") == "01")
{
List<Excelpowerstation> 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<string> properties2 = new List<string>()
{
"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) catch (Exception exception)
{ {

View File

@ -2890,19 +2890,20 @@ namespace SolarPower.Repository.Implement
var sql = $@"SELECT var sql = $@"SELECT
s.TIMESTAMP, s.TIMESTAMP,
s.INVERTERID, s.INVERTERID,
a.KWH, s.KWH,
s.TODAYKWH, s.TODAYKWH,
i.Capacity, i.Capacity,
a.KWH/(i.Capacity/4) AS KWHKWP s.KWH/(i.Capacity/4) AS KWHKWP
FROM (SELECT FROM (SELECT
MAX(FROM_UNIXTIME(sub_inv.TIMESTAMP/1000, '%Y-%m-%d %H:%i')) AS TIMESTAMP, MAX(FROM_UNIXTIME(sub_inv.TIMESTAMP/1000, '%Y-%m-%d %H:%i')) AS TIMESTAMP,
sub_inv.INVERTERID, sub_inv.INVERTERID,
SUM(sub_inv.WH)/1000 AS KWH,
MAX(sub_inv.TODAYKWH) AS TODAYKWH MAX(sub_inv.TODAYKWH) AS TODAYKWH
FROM {table_name} sub_inv FROM {table_name} sub_inv
WHERE FROM_UNIXTIME(sub_inv.TIMESTAMP/1000, '%Y-%m-%d %H:%i') BETWEEN @StartDateTime AND @EndDateTime WHERE FROM_UNIXTIME(sub_inv.TIMESTAMP/1000, '%Y-%m-%d %H:%i') BETWEEN @StartDateTime AND @EndDateTime
AND sub_inv.INVERTERID IN @InverterIds AND sub_inv.INVERTERID IN @InverterIds
GROUP BY sub_inv.INVERTERID) s 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, SELECT MAX(FROM_UNIXTIME(sub_inv.TIMESTAMP/1000, '%Y-%m-%d %H:%i')) AS TIMESTAMP,
sub_inv.INVERTERID, sub_inv.INVERTERID,
SUM(sub_inv.WH)/1000 AS KWH 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 WHERE FROM_UNIXTIME(sub_inv.TIMESTAMP/1000, '%Y-%m-%d %H:%i') BETWEEN @StartDateTime AND @EndDateTime
AND sub_inv.INVERTERID IN @InverterIds AND sub_inv.INVERTERID IN @InverterIds
GROUP BY sub_inv.INVERTERID) a 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', '');"; LEFT JOIN {db_name}.inverter i ON s.INVERTERID = REPLACE(i.InverterId, 's', '');";
result = (await conn.QueryAsync<InverterHistory>(sql, new { StartDateTime = stratDateTime, EndDateTime = dateTime, InverterIds = inverterIds })).ToList(); result = (await conn.QueryAsync<InverterHistory>(sql, new { StartDateTime = stratDateTime, EndDateTime = dateTime, InverterIds = inverterIds }, commandTimeout: 300)).ToList();
} }
catch (Exception exception) catch (Exception exception)
{ {
@ -3008,14 +3009,14 @@ namespace SolarPower.Repository.Implement
AVG(s.RA3) AS RA3, AVG(s.RA3) AS RA3,
AVG(s.RA4) AS RA4, AVG(s.RA4) AS RA4,
AVG(s.RA5) AS RA5, AVG(s.RA5) AS RA5,
a.KWH, SUM(s.WH)/1000 AS KWH,
MAX(s.TODAYKWH) AS TODAYKWH, MAX(s.TODAYKWH) AS TODAYKWH,
MAX(s.TOTALKWH) AS TOTALKWH, MAX(s.TOTALKWH) AS TOTALKWH,
i.Capacity, i.Capacity,
(a.KWH/i.Capacity) AS KWHKWP ((SUM(s.WH)/1000) / i.Capacity) AS KWHKWP
FROM {table_name} s FROM {table_name} s
-- KWH -- KWH
LEFT JOIN ( /*LEFT JOIN (
SELECT SELECT
FROM_UNIXTIME(inv.TIMESTAMP/1000, '%Y-%m-%d %H') AS TIMESTAMP, FROM_UNIXTIME(inv.TIMESTAMP/1000, '%Y-%m-%d %H') AS TIMESTAMP,
inv.INVERTERID, inv.INVERTERID,
@ -3024,26 +3025,26 @@ namespace SolarPower.Repository.Implement
WHERE DATE_FORMAT(FROM_UNIXTIME(inv.TIMESTAMP/1000), '%Y-%m-%d %H') = @DateTime WHERE DATE_FORMAT(FROM_UNIXTIME(inv.TIMESTAMP/1000), '%Y-%m-%d %H') = @DateTime
AND inv.INVERTERID IN @InverterIds AND inv.INVERTERID IN @InverterIds
GROUP BY FROM_UNIXTIME(inv.TIMESTAMP/1000, '%Y-%m-%d %H'), inv.INVERTERID) a 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 -- PR
LEFT JOIN ( LEFT JOIN (
SELECT SELECT
FROM_UNIXTIME(inv.TIMESTAMP/1000, '%Y-%m-%d %H') AS TIMESTAMP, inv.CrdTime AS TIMESTAMP,
inv.INVERTERID, inv.INVERTERID,
inv.PR inv.PR
FROM {table_name} inv 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 AND inv.INVERTERID IN @InverterIds
GROUP BY FROM_UNIXTIME(inv.TIMESTAMP/1000, '%Y-%m-%d %H'), inv.INVERTERID) inv_pr GROUP BY left(inv.CrdTime, 13), inv.INVERTERID) inv_pr
ON FROM_UNIXTIME(s.TIMESTAMP/1000, '%Y-%m-%d %H') = inv_pr.TIMESTAMP AND s.INVERTERID = inv_pr. INVERTERID 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 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 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<InverterHistory>(sql, new { DateTime = dateTime, InverterIds = inverterIds })).ToList(); result = (await conn.QueryAsync<InverterHistory>(sql, new { DateTime = dateTime, InverterIds = inverterIds }, commandTimeout: 300)).ToList();
} }
catch (Exception exception) catch (Exception exception)
{ {
@ -4402,7 +4403,7 @@ namespace SolarPower.Repository.Implement
} }
} }
public async Task<List<InverterHistory>> GetInverterHistoryRowData(string nowDay, List<StationCodeWithInverterIds> entities) public async Task<List<InverterHistory>> GetInverterHistoryRowData(long start_timestamp, long end_timestamp, List<StationCodeWithInverterIds> entities)
{ {
List<InverterHistory> result; List<InverterHistory> result;
using (IDbConnection conn = this._databaseHelper.GetConnection()) using (IDbConnection conn = this._databaseHelper.GetConnection())
@ -4466,16 +4467,19 @@ namespace SolarPower.Repository.Implement
inv.RA4, inv.RA4,
inv.RA5 inv.RA5
FROM {table_name} inv 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 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 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}')"; AND inv.INVERTERID IN ('{inverterIds}')";
sql_perSiteDB.Add(temp_sql); sql_perSiteDB.Add(temp_sql);
} }
sql = "SELECT * FROM (" + string.Join(" UNION ", sql_perSiteDB) + ") a ORDER BY a.TIMESTAMP ASC"; sql = "SELECT * FROM (" + string.Join(" UNION ", sql_perSiteDB) + ") a ORDER BY a.TIMESTAMP ASC";
result = (await conn.QueryAsync<InverterHistory>(sql, new { NowDay = nowDay }, commandTimeout: 300)).ToList(); result = (await conn.QueryAsync<InverterHistory>(sql, new { start_timestamp = start_timestamp, end_timestamp = end_timestamp }, commandTimeout: 300)).ToList();
} }
catch (Exception exception) catch (Exception exception)
{ {
@ -5834,5 +5838,129 @@ namespace SolarPower.Repository.Implement
return resule; return resule;
} }
} }
public async Task<int> 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<int>(sql);
}
catch (Exception exception)
{
throw exception;
}
finally
{
conn.Close();
}
return resule;
}
}
public async Task<int> 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<int>(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();
}
}
}
} }
} }

View File

@ -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 ) c on a.powerStationid = c.powerStationid and DATE_FORMAT(a.`TIMESTAMP`,''%Y-%m-%d'') = c.report_date
left join 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 from sensor_history_hour
where powerstationid = {post.PowerStation} and DATE_FORMAT(`TIMESTAMP`,''%Y-%m-%d'') = ''{post.Time}'' 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 join
( (
select id, name stationName, powerRate from power_station where id = {post.PowerStation} select id, name stationName, powerRate from power_station where id = {post.PowerStation}

View File

@ -574,7 +574,7 @@ namespace SolarPower.Repository.Interface
Task<List<PowerStation>> GetPowerStationsByCompanyId(MyUser myUser); Task<List<PowerStation>> GetPowerStationsByCompanyId(MyUser myUser);
Task<List<PowerStationInverter>> GetPowerStationInverter(Dictionary<string, List<int>> dic, string filter); Task<List<PowerStationInverter>> GetPowerStationInverter(Dictionary<string, List<int>> dic, string filter);
Task<List<PowerStationDevice>> GetPowerStationDevice(Dictionary<string, List<int>> dic, string filter); Task<List<PowerStationDevice>> GetPowerStationDevice(Dictionary<string, List<int>> dic, string filter);
Task<List<InverterHistory>> GetInverterHistoryRowData(string nowDay, List<StationCodeWithInverterIds> entities); Task<List<InverterHistory>> GetInverterHistoryRowData(long start_timestamp, long end_timestamp, List<StationCodeWithInverterIds> entities);
Task<List<InverterHistory>> GetInverterHistoryByDate(string startDay, string endDay, List<StationIdWithInverterIds> entities); Task<List<InverterHistory>> GetInverterHistoryByDate(string startDay, string endDay, List<StationIdWithInverterIds> entities);
Task<List<InverterHistory>> GetInverterHistoryByYear(string year, List<StationIdWithInverterIds> entities); Task<List<InverterHistory>> GetInverterHistoryByYear(string year, List<StationIdWithInverterIds> entities);
Task<List<PowerStationIdAndCity>> GetPowerStationsByCompanyIdWithfilter(MyUser myUser, string filter); Task<List<PowerStationIdAndCity>> GetPowerStationsByCompanyIdWithfilter(MyUser myUser, string filter);
@ -608,5 +608,9 @@ namespace SolarPower.Repository.Interface
Task UpdateInvStatus(string siteDB, List<string> codes, List<string> inverterIds = null, byte status = 0); Task UpdateInvStatus(string siteDB, List<string> codes, List<string> inverterIds = null, byte status = 0);
Task<List<InvStatusErr>> GetInvStatusErr(List<string> codes); Task<List<InvStatusErr>> GetInvStatusErr(List<string> codes);
Task<Check4table> Check4table(string code, string dbname); Task<Check4table> Check4table(string code, string dbname);
Task<int> CheckInvTableColumn(string dbname, string code);
Task<int> CheckSensorAvgTableColumn(string dbname, string code);
Task AlertColInvTableColumn(string dbname, string code);
Task AlertColSensoravgTableColumn(string dbname, string code);
} }
} }

View File

@ -388,15 +388,16 @@
}); });
$('#js_list_accordion').on("change", 'input[name="selectedInverterId[]"]', function (event) { $('#js_list_accordion').on("change", 'input[name="selectedInverterId[]"]', function (event) {
if (this.checked) {
if ($.inArray(this.value, selected_inverter) < 0) {
var powerStationId = $(this).attr('data-power-station-id'); var powerStationId = $(this).attr('data-power-station-id');
selected_inverter.push({ powerStationId: powerStationId, InverterId: this.value });
if (this.checked) {
if ($.map(selected_inverter, function (item, index) { return item.InverterId }).indexOf(this.value) < 0) {
selected_inverter.push({ 'powerStationId': powerStationId, 'InverterId': this.value });
} }
} else { } else {
if ($.inArray(this.value, selected_inverter) > -1) { var result = $.map(selected_inverter, function (item, index) { return item.InverterId }).indexOf(this.value)
var powerStationId = $(this).attr('data-power-station-id'); if (result > -1) {
selected_inverter.splice($.inArray({ powerStationId: powerStationId, InverterId: this.value }, selected_inverter), 1); selected_inverter.splice(result, 1);
} }
} }
}); });

View File

@ -67,7 +67,7 @@
</div> </div>
</div> </div>
<div class="pr-3"> <div class="pr-3">
<button type="button" class="btn btn-secondary waves-effect waves-themed" onclick="GetAnalysisStationInfo()">查詢</button> <button type="button" class="btn btn-secondary waves-effect waves-themed" id="btn-analysis-stationinfo" onclick="GetAnalysisStationInfo()">查詢</button>
@*<button type="button" class="btn btn-secondary waves-effect waves-themed" onclick="DataBackFill()">回填</button>*@ @*<button type="button" class="btn btn-secondary waves-effect waves-themed" onclick="DataBackFill()">回填</button>*@
</div> </div>
</div> </div>
@ -123,10 +123,10 @@
var selected_device = []; var selected_device = [];
var PWS_compare_col = [ var PWS_compare_col = [
{ key: "KWH", title: "發電量", default: true }, { key: "KWH", title: "發電量", default: true },
{ key: "Irradiance", title: "日照度", default: false }, @*{ key: "Irradiance", title: "日照度", default: false },*@
{ key: "KWHKWP", title: "有效日照時數", default: false }, { key: "KWHKWP", title: "有效日照時數", default: false },
{ key: "PR", title: "PR %", default: false }, { key: "PR", title: "PR %", default: false },
{ key: "Temperature", title: "模組溫度", default: false }, @*{ key: "Temperature", title: "模組溫度", default: false },*@
{ key: "SolarHour", title: "日照小時", default: false }, { key: "SolarHour", title: "日照小時", default: false },
] ]
var PWR_compare_col = [ var PWR_compare_col = [
@ -625,6 +625,13 @@
DeviceIdInfos: selected_device DeviceIdInfos: selected_device
} }
if (selected_device.length <= 0) {
toast_warning("請至少選擇一設備");
return;
}
$("#btn-analysis-stationinfo").html('<span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span>').attr("disabled", true);
$.post(url, send_data, function (rel) { $.post(url, send_data, function (rel) {
if (rel.code != "0000") { if (rel.code != "0000") {
toast_error(rel.msg); toast_error(rel.msg);
@ -641,6 +648,9 @@
$('input[name="compare_col[]"]').trigger('change'); $('input[name="compare_col[]"]').trigger('change');
ReloadHighCharts()
$("#btn-analysis-stationinfo").html('查詢').attr("disabled", false);
}, 'json'); }, 'json');
} }
@ -710,9 +720,7 @@
height: 600, height: 600,
animation: false animation: false
}, },
title: { title: false,
text: '交叉分析圖表'
},
tooltip: { tooltip: {
formatter: function () { formatter: function () {
return '<b>' + this.series.name + '</b><br>' + return '<b>' + this.series.name + '</b><br>' +

View File

@ -97,7 +97,7 @@
</div> </div>
<div class="row"> <div class="row">
<div class="col-auto" style="width: 60%;"> <div class="col-md-8 col-sm-12">
<div id="panel-1" class="panel"> <div id="panel-1" class="panel">
<div class="panel-hdr"> <div class="panel-hdr">
<h2>電站分佈圖</h2> <h2>電站分佈圖</h2>
@ -111,9 +111,9 @@
</div> </div>
</div> </div>
</div> </div>
<div class="col-auto" style="width: 40%;"> <div class="col-md-4 col-sm-12">
<div class="row"> <div class="row">
<div class="col-xl-6"> <div class="col-xl-6 mb-4">
<div class="card"> <div class="card">
<div class="card-header bg-fusion-25 py-2 pr-3 d-flex align-items-center flex-wrap"> <div class="card-header bg-fusion-25 py-2 pr-3 d-flex align-items-center flex-wrap">
<h4 class="mb-0 font-weight-bold"><span class="fal fa-bolt mr-1"></span> 電站總數</h4> <h4 class="mb-0 font-weight-bold"><span class="fal fa-bolt mr-1"></span> 電站總數</h4>
@ -125,7 +125,7 @@
</div> </div>
</div> </div>
<div class="col-xl-6"> <div class="col-xl-6 mb-4">
<div class="card"> <div class="card">
<div class="card-header bg-fusion-25 py-2 pr-3 d-flex align-items-center flex-wrap"> <div class="card-header bg-fusion-25 py-2 pr-3 d-flex align-items-center flex-wrap">
<h4 class="mb-0 font-weight-bold"><span class="fal fa-bolt mr-1"></span> 總裝置容量</h4> <h4 class="mb-0 font-weight-bold"><span class="fal fa-bolt mr-1"></span> 總裝置容量</h4>
@ -136,7 +136,7 @@
</div> </div>
</div> </div>
</div> </div>
<div class="col-xl-12 mt-4"> <div class="col-xl-12">
<div id="panel-1" class="panel"> <div id="panel-1" class="panel">
<div class="panel-hdr"> <div class="panel-hdr">
<h2>電站分佈小計</h2> <h2>電站分佈小計</h2>

View File

@ -26,7 +26,7 @@
"BackgroundServiceCron": { "BackgroundServiceCron": {
"CalcPowerStationJob": "0 5 * * * ?", "CalcPowerStationJob": "0 5 * * * ?",
"CalcAvgPowerStationJob": "0 0 2 * * ?", "CalcAvgPowerStationJob": "0 0 2 * * ?",
"OperationScheduleJob": "0 0 2 * * ?", "OperationScheduleJob": "0 0 8 * * ?",
"CalcInverter15minJob": "0 2/15 * * * ?", "CalcInverter15minJob": "0 2/15 * * * ?",
"SendEmailJob": "0 0/5 * * * ?", "SendEmailJob": "0 0/5 * * * ?",
"ExceptionSchedule": "0 0/5 * * * ?" "ExceptionSchedule": "0 0/5 * * * ?"

View File

@ -27,7 +27,7 @@
"BackgroundServiceCron": { "BackgroundServiceCron": {
"CalcPowerStationJob": "0 5 * * * ?", "CalcPowerStationJob": "0 5 * * * ?",
"CalcAvgPowerStationJob": "0 0 2 * * ?", "CalcAvgPowerStationJob": "0 0 2 * * ?",
"OperationScheduleJob": "0 0 2 * * ?", "OperationScheduleJob": "0 0 8 * * ?",
"CalcInverter15minJob": "0 2/15 * * * ?", "CalcInverter15minJob": "0 2/15 * * * ?",
"SendEmailJob": "0 0/5 * * * ?", "SendEmailJob": "0 0/5 * * * ?",
"ExceptionSchedule": "0 0/5 * * * ?" "ExceptionSchedule": "0 0/5 * * * ?"

View File

@ -1,3 +1,4 @@
using Serilog;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@ -14,12 +15,22 @@ namespace solarApp
[STAThread] [STAThread]
static void Main() static void Main()
{ {
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Verbose() // 設定最低顯示層級 預設: Information
.WriteTo.File("Logs/solarApp/log-.log",
rollingInterval: RollingInterval.Day, // 每天一個檔案
outputTemplate: "{Timestamp:HH:mm:ss} [{Level:u5}] {Message:lj}{NewLine}{Exception}"
) // 輸出到檔案 檔名範例: log-20211005.log
.CreateLogger();
Application.SetHighDpiMode(HighDpiMode.SystemAware); Application.SetHighDpiMode(HighDpiMode.SystemAware);
Application.EnableVisualStyles(); Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false); Application.SetCompatibleTextRenderingDefault(false);
//Application.Run(new fmExcel()); //Application.Run(new fmExcel());
Application.Run(new fmArchive()); Application.Run(new fmArchive());
//Application.Run(new fmMain()); //Application.Run(new fmMain());
Log.CloseAndFlush();
} }
} }
} }

View File

@ -6,14 +6,16 @@ using Dapper;
using solarApp.Model; using solarApp.Model;
using System.Configuration; using System.Configuration;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
namespace solarApp.Service namespace solarApp.Service
{ {
public class procInvSvc public class procInvSvc
{ {
string Connection1 = string.Empty; 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)) if (!string.IsNullOrEmpty(Connection_parame))
{ {
@ -23,6 +25,11 @@ namespace solarApp.Service
{ {
Connection1 = ConfigurationManager.ConnectionStrings["mySql"].ConnectionString; Connection1 = ConfigurationManager.ConnectionStrings["mySql"].ConnectionString;
} }
if (logger != null)
{
_logger = logger;
}
} }
public string _siteID { get; set; } public string _siteID { get; set; }
@ -41,18 +48,35 @@ namespace solarApp.Service
using (MySqlConnection conn = new MySqlConnection(Connection1)) using (MySqlConnection conn = new MySqlConnection(Connection1))
{ {
conn.Open(); conn.Open();
if (_logger != null)
{
_logger.LogInformation("【ProcInvSvc】開始執行[{0}]在{1}逆變器清除資料表的資料", _siteID, _date1);
}
string sql = @" string sql = @"
delete from inverter_history_15min where powerstationID = @powerStationID and DATE_FORMAT(`TIMESTAMP`,'%Y-%m-%d') = @date1; 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_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_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) ;"; 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 }); var ds = conn.Execute(sql, new { date1 = _date1, PowerStationID = _powerStationID });
if (_logger != null)
{
_logger.LogInformation("【ProcInvSvc】執行完成[{0}]在{1}逆變器清除資料表的資料", _siteID, _date1);
}
conn.Close(); conn.Close();
} }
result = true; result = true;
} }
catch (Exception ex) 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; throw ex;
} }
return result; return result;
@ -84,6 +108,12 @@ namespace solarApp.Service
using (MySqlConnection conn = new MySqlConnection(Connection1)) using (MySqlConnection conn = new MySqlConnection(Connection1))
{ {
conn.Open(); conn.Open();
if (_logger != null)
{
_logger.LogInformation("【ProcInvSvc】開始執行[{0}]在{1}逆變器取得電站編號", _siteID, _date1);
}
#region PowerStationID #region PowerStationID
string sql = @" select id , `code` siteID, siteDB, `name` siteName string sql = @" select id , `code` siteID, siteDB, `name` siteName
from solar_master.power_station where `code` = @siteID"; from solar_master.power_station where `code` = @siteID";
@ -94,6 +124,12 @@ namespace solarApp.Service
_siteDB = item.SiteDB; _siteDB = item.SiteDB;
_siteID01 = item.SiteID + "01"; _siteID01 = item.SiteID + "01";
} }
if (_logger != null)
{
_logger.LogInformation("【ProcInvSvc】執行完成[{0}]在{1}逆變器取得電站編號 - {2}", _siteID, _date1, _powerStationID);
}
#endregion #endregion
conn.Close(); conn.Close();
} }
@ -101,6 +137,12 @@ namespace solarApp.Service
} }
catch (Exception ex) 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; throw ex;
} }
return result; return result;
@ -116,8 +158,16 @@ namespace solarApp.Service
string ss = @"SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY,',''));"; string ss = @"SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY,',''));";
conn.Execute(ss); conn.Execute(ss);
string sql = string.Empty;
#region 15 min #region 15 min
string sql = @" try
{
if (_logger != null)
{
_logger.LogInformation("【ProcInvSvc】開始執行[{0}]在{1}逆變器15min補償", _siteID, _date1);
}
sql = @"
INSERT INTO solar_master.inverter_history_15min( PowerStationId, TIMESTAMP, INVERTERID, KWH, TODAYKWH, KWHKWP) 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, reportdate, a.inverterid, KWH, TODAYKWH, (kwh/(capacity/4)) kwpkwp from
( (
@ -146,9 +196,28 @@ namespace solarApp.Service
group by FROM_UNIXTIME(`TIMESTAMP`/1000,'%Y-%m-%d %H') , inverterid group by FROM_UNIXTIME(`TIMESTAMP`/1000,'%Y-%m-%d %H') , inverterid
) a join " + _siteDB + @".inverter b on a.inverterid = b.inverterid"; ) a join " + _siteDB + @".inverter b on a.inverterid = b.inverterid";
var ds = conn.Execute(sql, new { date1 = _date1, PowerStationID = _powerStationID }); 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 #endregion
#region hour #region hour
try
{
if (_logger != null)
{
_logger.LogInformation("【ProcInvSvc】開始執行[{0}]在{1}逆變器hour補償", _siteID, _date1);
}
sql = @" sql = @"
insert into solar_master.inverter_history_hour (PowerStationId, INVERTERID, TIMESTAMP, Irradiance, AC1V, AC1A, AC1W, AC1F, AC1WH, AC2V, AC2A, AC2W, AC2F, AC2WH, 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, 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,
@ -193,9 +262,28 @@ namespace solarApp.Service
order by a.INVERTERID, a.reportDate;"; order by a.INVERTERID, a.reportDate;";
int ct = conn.Execute(sql, new { date1 = _date1, PowerStationID = _powerStationID }); 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;
}
#endregion hour #endregion hour
#region day #region day
try
{
if (_logger != null)
{
_logger.LogInformation("【ProcInvSvc】開始執行[{0}]在{1}逆變器day補償", _siteID, _date1);
}
sql = @" sql = @"
INSERT INTO solar_master.inverter_history_day(PowerStationId, INVERTERID, TIMESTAMP, Irradiance, AC1V, AC1A, AC1W, AC1F, AC1WH, AC2V, AC2A, AC2W, AC2F, AC2WH, 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, AC3V, AC3A, AC3W, AC3F, AC3WH, DC1V, DC1A, DC1W, DC1WH, DC2V, DC2A, DC2W, DC2WH, DC3V, DC3A, DC3W,
@ -228,9 +316,28 @@ namespace solarApp.Service
where powerstationID = @powerstationID and DATE_FORMAT(a.TIMESTAMP, '%Y-%m-%d') = @date1 and Irradiance <> 0 limit 1 where powerstationID = @powerstationID and DATE_FORMAT(a.TIMESTAMP, '%Y-%m-%d') = @date1 and Irradiance <> 0 limit 1
)irr on a.reportDate = irr.reportDate ;"; )irr on a.reportDate = irr.reportDate ;";
conn.Execute(sql, new { date1 = _date1, PowerStationID = _powerStationID }); 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 #endregion day
#region month #region month
try
{
if (_logger != null)
{
_logger.LogInformation("【ProcInvSvc】開始執行[{0}]在{1}逆變器month補償", _siteID, _date1);
}
sql = @" sql = @"
delete from inverter_history_month where powerstationID = @powerStationID and left(`TIMESTAMP`, 7) = left(@date1, 7) ; delete from inverter_history_month where powerstationID = @powerStationID and left(`TIMESTAMP`, 7) = left(@date1, 7) ;
@ -265,6 +372,19 @@ namespace solarApp.Service
where powerstationID = @powerstationID and DATE_FORMAT(a.TIMESTAMP, '%Y-%m') = @date1 and Irradiance <> 0 where powerstationID = @powerstationID and DATE_FORMAT(a.TIMESTAMP, '%Y-%m') = @date1 and Irradiance <> 0
)irr on a.reportDate = irr.reportDate ;"; )irr on a.reportDate = irr.reportDate ;";
conn.Execute(sql, new { date1 = _date1.Substring(0, 7), PowerStationID = _powerStationID }); 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;
}
#endregion month #endregion month
conn.Close(); conn.Close();

View File

@ -21,6 +21,8 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Dapper" Version="2.0.90" /> <PackageReference Include="Dapper" Version="2.0.90" />
<PackageReference Include="MySql.Data" Version="8.0.26" /> <PackageReference Include="MySql.Data" Version="8.0.26" />
<PackageReference Include="Serilog.Extensions.Logging.File" Version="2.0.0" />
<PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
</ItemGroup> </ItemGroup>
</Project> </Project>