This commit is contained in:
JiaHao Liu 2021-11-11 22:34:10 +08:00
commit ce541f8df1
9 changed files with 370 additions and 293 deletions

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

@ -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

@ -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

@ -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

@ -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 * * * ?"